blob: fc5979d34a467f042ba1d0cad458cff96084ea59 [file] [log] [blame]
/*
* Copyright 2001-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.generate.tostring.view;
import com.intellij.openapi.project.Project;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.LanguageTextField;
import org.intellij.lang.regexp.RegExpLanguage;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.generate.tostring.config.Config;
import org.jetbrains.generate.tostring.config.DuplicationPolicy;
import org.jetbrains.generate.tostring.config.InsertWhere;
import org.jetbrains.generate.tostring.config.PolicyOptions;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Configuration User Interface.
* </p>
* The configuration is in the menu <b>File - Settings - GenerateToString</b>
*/
public class ConfigUI extends JPanel {
private final JCheckBox fullyQualifiedName = new JCheckBox("Use fully qualified class name in code generation ($classname)");
private final JCheckBox enableMethods = new JCheckBox("Enable getters in code generation ($methods)");
private final JCheckBox moveCaretToMethod = new JCheckBox("Move caret to generated method");
private JRadioButton[] initialValueForReplaceDialog;
private JRadioButton[] initialValueForNewMethodDialog;
private final JCheckBox filterConstant = new JCheckBox("Exclude constant fields");
private final JCheckBox filterEnum = new JCheckBox("Exclude enum fields");
private final JCheckBox filterStatic = new JCheckBox("Exclude static fields");
private final JCheckBox filterTransient = new JCheckBox("Exclude transient fields");
private final JCheckBox filterLoggers = new JCheckBox("Exclude logger fields (Log4j, JDK Logging, Jakarta Commons Logging)");
private final LanguageTextField filterFieldName;
private final LanguageTextField filterFieldType;
private final LanguageTextField filterMethodName;
private final LanguageTextField filterMethodType;
private final JComboBox sortElementsComboBox = new JComboBox();
private final JCheckBox sortElements = new JCheckBox("Sort elements");
/**
* Constructor.
*
* @param config Configuration for this UI to display.
* @param project
*/
public ConfigUI(Config config, Project project) {
super(new BorderLayout());
filterFieldName = new LanguageTextField(RegExpLanguage.INSTANCE, project, config.getFilterFieldName());
filterFieldType = new LanguageTextField(RegExpLanguage.INSTANCE, project, config.getFilterFieldType());
filterMethodName = new LanguageTextField(RegExpLanguage.INSTANCE, project, config.getFilterMethodName());
filterMethodType = new LanguageTextField(RegExpLanguage.INSTANCE, project, config.getFilterMethodType());
init();
setConfig(config);
}
/**
* Initializes the GUI.
* <p/>
* Creating all the swing controls, panels etc.
*/
private void init() {
JPanel header = new JPanel(new BorderLayout());
header.add(initSettingPanel(), BorderLayout.WEST);
add(header, BorderLayout.NORTH);
}
/**
* Initializes the UI for Settings pane
*
* @return the panel
*/
private JPanel initSettingPanel() {
GridBagConstraints constraint = new GridBagConstraints();
JPanel outer = new JPanel(new GridBagLayout());
// UI Layout - Settings
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(IdeBorderFactory.createTitledBorder("Settings", true));
Container innerPanel = Box.createHorizontalBox();
innerPanel.add(fullyQualifiedName);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(enableMethods);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(moveCaretToMethod);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(sortElements);
sortElements.addActionListener(new OnSortElements());
innerPanel.add(Box.createHorizontalStrut(3));
innerPanel.add(sortElementsComboBox);
panel.add(innerPanel);
sortElementsComboBox.addItem("Ascending");
sortElementsComboBox.addItem("Descending");
constraint.gridwidth = GridBagConstraints.REMAINDER;
constraint.fill = GridBagConstraints.BOTH;
constraint.gridx = 0;
constraint.gridy = 0;
constraint.insets.left = 5;
constraint.insets.right = 5;
outer.add(panel, constraint);
// UI Layout - Conflict Resolution
DuplicationPolicy[] options = PolicyOptions.getConflictOptions();
initialValueForReplaceDialog = new JRadioButton[options.length];
ButtonGroup selection = new ButtonGroup();
for (int i = 0; i < options.length; i++) {
initialValueForReplaceDialog[i] = new JRadioButton(new ConflictResolutionOptionAction(options[i]));
selection.add(initialValueForReplaceDialog[i]);
}
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(IdeBorderFactory.createTitledBorder("When method already exists", true));
for (JRadioButton anInitialValueForReplaceDialog : initialValueForReplaceDialog) {
panel.add(anInitialValueForReplaceDialog);
}
constraint.gridx = 0;
constraint.gridy = 1;
outer.add(panel, constraint);
// UI Layout - Insert Position
InsertWhere[] options2 = PolicyOptions.getNewMethodOptions();
initialValueForNewMethodDialog = new JRadioButton[options2.length];
ButtonGroup selection2 = new ButtonGroup();
for (int i = 0; i < options2.length; i++) {
initialValueForNewMethodDialog[i] = new JRadioButton(new InsertNewMethodOptionAction(options2[i]));
selection2.add(initialValueForNewMethodDialog[i]);
}
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(IdeBorderFactory.createTitledBorder("Where to insert?", true));
for (JRadioButton anInitialValueForNewMethodDialog : initialValueForNewMethodDialog) {
panel.add(anInitialValueForNewMethodDialog);
}
constraint.gridx = 0;
constraint.gridy = 2;
outer.add(panel, constraint);
// UI Layout - Exclude fields
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(IdeBorderFactory.createTitledBorder("Exclude", true));
innerPanel = Box.createHorizontalBox();
innerPanel.add(filterConstant);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(filterStatic);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(filterTransient);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(filterEnum);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(filterLoggers);
innerPanel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(new JLabel("Exclude fields by name (reg exp)"));
innerPanel.add(Box.createHorizontalStrut(3));
innerPanel.add(filterFieldName);
filterFieldName.setMinimumSize(new Dimension(100, 20)); // avoid input field to small
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(new JLabel("Exclude fields by type name (reg exp)"));
innerPanel.add(Box.createHorizontalStrut(3));
innerPanel.add(filterFieldType);
filterFieldType.setMinimumSize(new Dimension(100, 20)); // avoid input field to small
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(new JLabel("Exclude methods by name (reg exp)"));
innerPanel.add(Box.createHorizontalStrut(3));
innerPanel.add(filterMethodName);
filterMethodName.setMinimumSize(new Dimension(100, 20)); // avoid input field to small
panel.add(innerPanel);
innerPanel = Box.createHorizontalBox();
innerPanel.add(new JLabel("Exclude methods by return type name (reg exp)"));
innerPanel.add(Box.createHorizontalStrut(3));
innerPanel.add(filterMethodType);
filterMethodType.setMinimumSize(new Dimension(100, 20)); // avoid input field to small
panel.add(innerPanel);
constraint.gridx = 0;
constraint.gridy = 3;
outer.add(panel, constraint);
return outer;
}
/**
* Set's the GUI's controls to represent the given configuration.
*
* @param config configuration parameters.
*/
public final void setConfig(Config config) {
fullyQualifiedName.setSelected(config.isUseFullyQualifiedName());
DuplicationPolicy option = config.getReplaceDialogInitialOption();
for (JRadioButton anInitialValueForReplaceDialog : initialValueForReplaceDialog) {
if (anInitialValueForReplaceDialog.getText().equals(option.toString())) {
anInitialValueForReplaceDialog.setSelected(true);
}
}
InsertWhere option2 = config.getInsertNewMethodInitialOption();
for (JRadioButton anInitialValueForNewMethodDialog : initialValueForNewMethodDialog) {
if (anInitialValueForNewMethodDialog.getText().equals(option2.toString())) {
anInitialValueForNewMethodDialog.setSelected(true);
}
}
filterConstant.setSelected(config.isFilterConstantField());
filterEnum.setSelected(config.isFilterEnumField());
filterStatic.setSelected(config.isFilterStaticModifier());
filterTransient.setSelected(config.isFilterTransientModifier());
filterLoggers.setSelected(config.isFilterLoggers());
enableMethods.setSelected(config.isEnableMethods());
moveCaretToMethod.setSelected(config.isJumpToMethod());
sortElements.setSelected(config.getSortElements() != 0);
sortElementsComboBox.setEnabled(sortElements.isSelected());
if (config.getSortElements() == 0 || config.getSortElements() == 1) {
sortElementsComboBox.setSelectedIndex(0);
} else if (config.getSortElements() == 2) {
sortElementsComboBox.setSelectedIndex(1);
}
}
@Nullable
private static String emptyToNull(final String s) {
if (s != null && s.length() == 0) return null;
return s;
}
/**
* Get's the configuration that the GUI controls represent right now.
*
* @return the configuration.
*/
public final Config getConfig() {
Config config = new Config();
config.setUseFullyQualifiedName(fullyQualifiedName.isSelected());
for (JRadioButton anInitialValueForReplaceDialog : initialValueForReplaceDialog) {
if (anInitialValueForReplaceDialog.isSelected()) {
config.setReplaceDialogInitialOption(((ConflictResolutionOptionAction) anInitialValueForReplaceDialog.getAction()).option);
}
}
for (JRadioButton anInitialValueForNewMethodDialog : initialValueForNewMethodDialog) {
if (anInitialValueForNewMethodDialog.isSelected()) {
config.setInsertNewMethodInitialOption(((InsertNewMethodOptionAction) anInitialValueForNewMethodDialog.getAction()).option);
}
}
config.setFilterConstantField(filterConstant.isSelected());
config.setFilterEnumField(filterEnum.isSelected());
config.setFilterTransientModifier(filterTransient.isSelected());
config.setFilterLoggers(filterLoggers.isSelected());
config.setFilterStaticModifier(filterStatic.isSelected());
config.setFilterFieldName(emptyToNull(filterFieldName.getText()));
config.setFilterFieldType(emptyToNull(filterFieldType.getText()));
config.setFilterMethodName(emptyToNull(filterMethodName.getText()));
config.setFilterMethodType(emptyToNull(filterMethodType.getText()));
config.setEnableMethods(enableMethods.isSelected());
config.setJumpToMethod(moveCaretToMethod.isSelected());
if (!sortElements.isSelected()) {
config.setSortElements(0);
} else if (sortElementsComboBox.getSelectedIndex() == 0) {
config.setSortElements(1); // selected index of 0 is ascending
} else {
config.setSortElements(2); // selected index of 0 is ascending
}
return config;
}
/**
* Action for the options for the conflict resolution policy
*/
private static class ConflictResolutionOptionAction extends AbstractAction {
public final DuplicationPolicy option;
ConflictResolutionOptionAction(DuplicationPolicy option) {
super(option.toString());
this.option = option;
}
public void actionPerformed(ActionEvent e) {
}
}
/**
* Action for the options for the inserting new method
*/
private static class InsertNewMethodOptionAction extends AbstractAction {
public final InsertWhere option;
InsertNewMethodOptionAction(InsertWhere option) {
super(option.toString());
this.option = option;
}
public void actionPerformed(ActionEvent e) {
}
}
/**
* Action listener for user checking sort elements
*/
private class OnSortElements implements ActionListener {
public void actionPerformed(ActionEvent e) {
sortElementsComboBox.setEnabled(sortElements.isSelected());
}
}
}