blob: c677744fe9583e8a84892461f43ea7b188b905e0 [file] [log] [blame]
package com.intellij.tasks.generic;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.Condition;
import com.intellij.tasks.TaskManager;
import com.intellij.tasks.config.BaseRepositoryEditor;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.TextFieldWithAutoCompletion;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.Consumer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.net.HTTPMethod;
import com.intellij.util.ui.FormBuilder;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import static com.intellij.tasks.generic.GenericRepositoryUtil.concat;
import static com.intellij.tasks.generic.GenericRepositoryUtil.createPlaceholdersList;
import static com.intellij.tasks.generic.GenericRepositoryUtil.prettifyVariableName;
import static com.intellij.ui.TextFieldWithAutoCompletion.StringsCompletionProvider;
/**
* @author Evgeny.Zakrevsky
* @author Mikhail Golubev
*/
public class GenericRepositoryEditor<T extends GenericRepository> extends BaseRepositoryEditor<T> {
protected EditorTextField myLoginURLText;
private EditorTextField myTasksListURLText;
private EditorTextField mySingleTaskURLText;
protected JBLabel myLoginURLLabel;
protected ComboBox myLoginMethodTypeComboBox;
private ComboBox myTasksListMethodTypeComboBox;
private ComboBox mySingleTaskMethodComboBox;
private JPanel myPanel;
private JRadioButton myXmlRadioButton;
private JRadioButton myTextRadioButton;
private JButton myTest2Button;
private JRadioButton myJsonRadioButton;
private JButton myManageTemplateVariablesButton;
private JButton myResetToDefaultsButton;
private JPanel myCardPanel;
private JBLabel mySingleTaskURLLabel;
private JBCheckBox myDownloadTasksInSeparateRequests;
private Map<JTextField, TemplateVariable> myField2Variable;
private Map<JRadioButton, ResponseType> myRadio2ResponseType;
public GenericRepositoryEditor(final Project project,
final T repository,
final Consumer<T> changeListener) {
super(project, repository, changeListener);
myTest2Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
afterTestConnection(TaskManager.getManager(project).testConnection(repository));
}
});
myLoginAnonymouslyJBCheckBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
loginUrlEnablingChanged();
}
});
myUseHttpAuthenticationCheckBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
loginUrlEnablingChanged();
}
});
ActionListener radioButtonListener = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
singleTaskUrlEnablingChanged();
doApply();
selectCardByResponseType();
}
};
myXmlRadioButton.addActionListener(radioButtonListener);
myTextRadioButton.addActionListener(radioButtonListener);
myJsonRadioButton.addActionListener(radioButtonListener);
myLoginMethodTypeComboBox.setSelectedItem(myRepository.getLoginMethodType().toString());
myTasksListMethodTypeComboBox.setSelectedItem(myRepository.getTasksListMethodType().toString());
mySingleTaskMethodComboBox.setSelectedItem(myRepository.getSingleTaskMethodType().toString());
// set default listener updating model fields
installListener(myLoginMethodTypeComboBox);
installListener(myTasksListMethodTypeComboBox);
installListener(mySingleTaskMethodComboBox);
installListener(myLoginURLText);
installListener(myTasksListURLText);
installListener(mySingleTaskURLText);
installListener(myDownloadTasksInSeparateRequests);
myTabbedPane.addTab("Server configuration", myPanel);
// Put appropriate configuration components on the card panel
ResponseHandler xmlHandler = myRepository.getResponseHandler(ResponseType.XML);
ResponseHandler jsonHandler = myRepository.getResponseHandler(ResponseType.JSON);
ResponseHandler textHandler = myRepository.getResponseHandler(ResponseType.TEXT);
// Select appropriate card pane
myCardPanel.add(xmlHandler.getConfigurationComponent(myProject), ResponseType.XML.getMimeType());
myCardPanel.add(jsonHandler.getConfigurationComponent(myProject), ResponseType.JSON.getMimeType());
myCardPanel.add(textHandler.getConfigurationComponent(myProject), ResponseType.TEXT.getMimeType());
myRadio2ResponseType = new IdentityHashMap<JRadioButton, ResponseType>();
myRadio2ResponseType.put(myJsonRadioButton, ResponseType.JSON);
myRadio2ResponseType.put(myXmlRadioButton, ResponseType.XML);
myRadio2ResponseType.put(myTextRadioButton, ResponseType.TEXT);
myManageTemplateVariablesButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final ManageTemplateVariablesDialog dialog = new ManageTemplateVariablesDialog(myManageTemplateVariablesButton);
dialog.setTemplateVariables(myRepository.getAllTemplateVariables());
if (dialog.showAndGet()) {
myRepository.setTemplateVariables(ContainerUtil.filter(dialog.getTemplateVariables(), new Condition<TemplateVariable>() {
@Override
public boolean value(TemplateVariable variable) {
return !variable.isReadOnly();
}
}));
myCustomPanel.removeAll();
myCustomPanel.add(createCustomPanel());
//myCustomPanel.repaint();
myTabbedPane.getComponentAt(0).repaint();
//myLoginURLText = createEditorFieldWithPlaceholderCompletion(myRepository.getLoginUrl());
List<String> placeholders = createPlaceholdersList(myRepository);
((TextFieldWithAutoCompletion)myLoginURLText).setVariants(placeholders);
((TextFieldWithAutoCompletion)myTasksListURLText).setVariants(concat(placeholders, "{max}", "{since}"));
((TextFieldWithAutoCompletion)mySingleTaskURLText).setVariants(concat(placeholders, "{id}"));
myPanel.repaint();
}
}
});
myResetToDefaultsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
myRepository.resetToDefaults();
// TODO: look closely
reset(myRepository.clone());
}
});
selectRadioButtonByResponseType();
selectCardByResponseType();
loginUrlEnablingChanged();
singleTaskUrlEnablingChanged();
myDownloadTasksInSeparateRequests.setSelected(myRepository.getDownloadTasksInSeparateRequests());
}
private void singleTaskUrlEnablingChanged() {
boolean enabled = !myTextRadioButton.isSelected();
// single task URL doesn't make sense when legacy regex handler is used
mySingleTaskURLText.setEnabled(enabled);
mySingleTaskMethodComboBox.setEnabled(enabled);
mySingleTaskURLLabel.setEnabled(enabled);
}
protected void loginUrlEnablingChanged() {
boolean enabled = !myLoginAnonymouslyJBCheckBox.isSelected() && !myUseHttpAuthenticationCheckBox.isSelected();
myLoginURLLabel.setEnabled(enabled);
myLoginURLText.setEnabled(enabled);
myLoginMethodTypeComboBox.setEnabled(enabled);
}
@Nullable
@Override
protected JComponent createCustomPanel() {
myField2Variable = new IdentityHashMap<JTextField, TemplateVariable>();
FormBuilder builder = FormBuilder.createFormBuilder();
for (final TemplateVariable variable : myRepository.getTemplateVariables()) {
if (variable.isShownOnFirstTab()) {
JTextField field = variable.isHidden() ? new JPasswordField(variable.getValue()) : new JTextField(variable.getValue());
myField2Variable.put(field, variable);
installListener(field);
JBLabel label = new JBLabel(prettifyVariableName(variable.getName()) + ":", SwingConstants.RIGHT);
label.setAnchor(getAnchor());
builder.addLabeledComponent(label, field);
}
}
return builder.getPanel();
}
protected void reset(final GenericRepository clone) {
myLoginURLText.setText(clone.getLoginUrl());
myTasksListURLText.setText(clone.getTasksListUrl());
mySingleTaskURLText.setText(clone.getSingleTaskUrl());
//myTaskPatternText.setText(clone.getTaskPattern());
myLoginMethodTypeComboBox.setSelectedItem(clone.getLoginMethodType());
myTasksListMethodTypeComboBox.setSelectedItem(clone.getTasksListMethodType());
mySingleTaskMethodComboBox.setSelectedItem(clone.getSingleTaskMethodType());
selectRadioButtonByResponseType();
selectCardByResponseType();
loginUrlEnablingChanged();
myDownloadTasksInSeparateRequests.setSelected(myRepository.getDownloadTasksInSeparateRequests());
}
private void selectRadioButtonByResponseType() {
for (Map.Entry<JRadioButton, ResponseType> entry : myRadio2ResponseType.entrySet()) {
if (entry.getValue() == myRepository.getResponseType()) {
entry.getKey().setSelected(true);
}
}
}
private void selectCardByResponseType() {
CardLayout cardLayout = (CardLayout) myCardPanel.getLayout();
cardLayout.show(myCardPanel, myRepository.getResponseType().getMimeType());
}
@Override
public void apply() {
myRepository.setLoginUrl(myLoginURLText.getText());
myRepository.setTasksListUrl(myTasksListURLText.getText());
myRepository.setSingleTaskUrl(mySingleTaskURLText.getText());
myRepository.setLoginMethodType(HTTPMethod.valueOf((String)myLoginMethodTypeComboBox.getSelectedItem()));
myRepository.setTasksListMethodType(HTTPMethod.valueOf((String)myTasksListMethodTypeComboBox.getSelectedItem()));
myRepository.setSingleTaskMethodType(HTTPMethod.valueOf((String)mySingleTaskMethodComboBox.getSelectedItem()));
myRepository.setDownloadTasksInSeparateRequests(myDownloadTasksInSeparateRequests.isSelected());
for (Map.Entry<JTextField, TemplateVariable> entry : myField2Variable.entrySet()) {
TemplateVariable variable = entry.getValue();
JTextField field = entry.getKey();
variable.setValue(field.getText());
}
for (Map.Entry<JRadioButton, ResponseType> entry : myRadio2ResponseType.entrySet()) {
if (entry.getKey().isSelected()) {
myRepository.setResponseType(entry.getValue());
}
}
super.apply();
}
private void createUIComponents() {
List<String> placeholders = createPlaceholdersList(myRepository);
myLoginURLText = createTextFieldWithCompletion(myRepository.getLoginUrl(), placeholders);
myTasksListURLText = createTextFieldWithCompletion(myRepository.getTasksListUrl(), concat(placeholders, "{max}", "{since}"));
mySingleTaskURLText = createTextFieldWithCompletion(myRepository.getSingleTaskUrl(), concat(placeholders, "{id}"));
}
private TextFieldWithAutoCompletion<String> createTextFieldWithCompletion(String text, final List<String> variants) {
final StringsCompletionProvider provider = new StringsCompletionProvider(variants, null) {
@Nullable
@Override
public String getPrefix(@NotNull CompletionParameters parameters) {
final String text = parameters.getOriginalFile().getText();
final int i = text.lastIndexOf('{', parameters.getOffset() - 1);
if (i < 0) {
return "";
}
return text.substring(i, parameters.getOffset());
}
};
return new TextFieldWithAutoCompletion<String>(myProject, provider, true, text);
}
@Override
public void setAnchor(@Nullable JComponent anchor) {
super.setAnchor(anchor);
List<JBLabel> labels = UIUtil.findComponentsOfType(myCustomPanel, JBLabel.class);
for (JBLabel label : labels) {
label.setAnchor(anchor);
}
}
}