/*
* Copyright 2003-2011 JetBrains s.r.o.
*
* 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 jetbrains.mps.ide.codeStyle;
import jetbrains.mps.baseLanguage.util.CodeStyleSettings;
import jetbrains.mps.util.EqualUtil;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
public class CodeStylePreferencesPage {
private enum LineSeparatorOption {
SYSTEM_DEPENDENT(null, "System Dependent"),
UNIX("\n", "Unix"),
WINDOWS("\r\n", "Windows"),
MACINTOSH("\r", "Mac"),;
private String mySetting;
private String myName;
private LineSeparatorOption(String setting, String name) {
mySetting = setting;
myName = name;
}
public String toString() {
return myName;
}
public String getSetting() {
return mySetting;
}
}
private JPanel myPage;
private JCheckBox myPreferLongerName;
private CodeStyleItem myFieldItem;
private CodeStyleItem myStaticField;
private CodeStyleItem myParameter;
private CodeStyleItem myLocalVariable;
private JComboBox myLineSeparatorComboBox;
private CodeStyleSettings mySettings;
public CodeStylePreferencesPage(CodeStyleSettings settings) {
mySettings = settings;
myPage = new JPanel();
myPage.setLayout(new BoxLayout(myPage, BoxLayout.Y_AXIS));
JPanel namingPanel = new JPanel(new GridBagLayout());
namingPanel.setBorder(BorderFactory.createTitledBorder("Naming"));
myPreferLongerName = new JCheckBox("Prefer longer names", true);
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTHWEST;
c.insets = getInsets();
c.gridwidth = 2;
namingPanel.add(myPreferLongerName, c);
c.gridwidth = 1;
c.gridy = 1;
c.gridx = 1;
namingPanel.add(new JLabel("Name prefix:"), c);
c.gridx = 2;
namingPanel.add(new JLabel("Name suffix:"), c);
myFieldItem = new CodeStyleItem(namingPanel, "Field", 2);
myStaticField = new CodeStyleItem(namingPanel, "Static field", 3);
myParameter = new CodeStyleItem(namingPanel, "Parameter", 4);
myLocalVariable = new CodeStyleItem(namingPanel, "Local variable", 5);
namingPanel.setMaximumSize(namingPanel.getPreferredSize());
namingPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
JPanel lineSeparatorPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
lineSeparatorPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
lineSeparatorPanel.add(new JLabel("Line separator: "));
myLineSeparatorComboBox = new JComboBox(LineSeparatorOption.values());
lineSeparatorPanel.add(myLineSeparatorComboBox);
myPage.setBorder(new EmptyBorder(10, 10, 10, 10));
myPage.add(namingPanel);
myPage.add(lineSeparatorPanel);
myPage.add(Box.createVerticalGlue());
update();
}
@Nullable
private String getSelectedLineSeparator() {
Object selectedItem = myLineSeparatorComboBox.getSelectedItem();
for (LineSeparatorOption option : LineSeparatorOption.values()) {
if (option.equals(selectedItem)) {
return option.getSetting();
}
}
return null;
}
private Insets getInsets() {
return new Insets(4, 4, 4, 4);
}
public JComponent getComponent() {
return myPage;
}
public void commit() {
mySettings.setFieldPrefix(myFieldItem.getPrefix());
mySettings.setFieldSuffix(myFieldItem.getSuffix());
mySettings.setStaticFieldPrefix(myStaticField.getPrefix());
mySettings.setStaticFieldSuffix(myStaticField.getSuffix());
mySettings.setParameterPrefix(myParameter.getPrefix());
mySettings.setParameterSuffix(myParameter.getSuffix());
mySettings.setLocalVariablePrefix(myLocalVariable.getPrefix());
mySettings.setLocalVariableSuffix(myLocalVariable.getSuffix());
mySettings.setLineSeparator(getSelectedLineSeparator());
}
public boolean isModified() {
return !(equals(mySettings.getFieldPrefix(), mySettings.getFieldSuffix(), myFieldItem) &&
equals(mySettings.getStaticFieldPrefix(), mySettings.getStaticFieldSuffix(), myStaticField) &&
equals(mySettings.getParameterPrefix(), mySettings.getParameterSuffix(), myParameter) &&
equals(mySettings.getLocalVariablePrefix(), mySettings.getLocalVariableSuffix(), myLocalVariable) &&
equals(mySettings.getLineSeparator(), getSelectedLineSeparator()));
}
private boolean equals(String prefix, String suffix, CodeStyleItem item) {
return equals(prefix, item.getPrefix()) && equals(suffix, item.getSuffix());
}
private boolean equals(String s1, String s2) {
return s1 == null ? s2 == null : s1.equals(s2);
}
public void update() {
myFieldItem.setSettings(mySettings.getFieldPrefix(), mySettings.getFieldSuffix());
myStaticField.setSettings(mySettings.getStaticFieldPrefix(), mySettings.getStaticFieldSuffix());
myParameter.setSettings(mySettings.getParameterPrefix(), mySettings.getParameterSuffix());
myLocalVariable.setSettings(mySettings.getLocalVariablePrefix(), mySettings.getLocalVariableSuffix());
for (LineSeparatorOption option : LineSeparatorOption.values()) {
if (EqualUtil.equals(option.getSetting(), mySettings.getLineSeparator())) {
myLineSeparatorComboBox.setSelectedItem(option);
}
}
}
private class CodeStyleItem {
private JLabel myName = new JLabel();
private JTextField myPrefix = new JTextField(15);
private JTextField mySuffix = new JTextField(15);
CodeStyleItem(JComponent owner, String name, int index) {
myName.setText(name + ":");
myName.setHorizontalAlignment(SwingConstants.RIGHT);
addComponent(owner, myName, 0, index);
addComponent(owner, myPrefix, 1, index);
addComponent(owner, mySuffix, 2, index);
}
String getPrefix() {
return myPrefix.getText();
}
String getSuffix() {
return mySuffix.getText();
}
void setSettings(String prefix, String suffix) {
myPrefix.setText(prefix);
mySuffix.setText(suffix);
}
private void addComponent(JComponent owner, JComponent child, int x, int y) {
GridBagConstraints c = new GridBagConstraints();
c.insets = getInsets();
c.fill = GridBagConstraints.BOTH;
c.gridx = x;
c.gridy = y;
owner.add(child, c);
}
}
}