update copyright
[fedora-idea.git] / java / java-impl / src / com / intellij / application / options / CodeStyleGenerationConfigurable.java
blob33c1309bb02cf61b9c8f94914fbdc71181438d9a
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.application.options;
18 import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
19 import com.intellij.openapi.application.ApplicationBundle;
20 import com.intellij.openapi.fileTypes.StdFileTypes;
21 import com.intellij.openapi.options.Configurable;
22 import com.intellij.openapi.project.Project;
23 import com.intellij.openapi.project.ProjectManager;
24 import com.intellij.psi.codeStyle.CodeStyleSettings;
25 import com.intellij.ui.ListUtil;
27 import javax.swing.*;
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
30 import java.util.Arrays;
31 import java.util.Comparator;
33 public class CodeStyleGenerationConfigurable implements Configurable {
34 JPanel myPanel;
35 private JTextField myFieldPrefixField;
36 private JTextField myStaticFieldPrefixField;
37 private JTextField myParameterPrefixField;
38 private JTextField myLocalVariablePrefixField;
40 private JTextField myFieldSuffixField;
41 private JTextField myStaticFieldSuffixField;
42 private JTextField myParameterSuffixField;
43 private JTextField myLocalVariableSuffixField;
45 private JCheckBox myCbPreferLongerNames;
46 private JCheckBox myCbLineCommentAtFirstColumn;
47 private JCheckBox myCbBlockCommentAtFirstColumn;
50 private final MembersOrderList myMembersOrderList;
51 private JScrollPane myMembersListScroll;
52 private JButton myMoveUpButton;
53 private JButton myMoveDownButton;
55 private final CodeStyleSettings mySettings;
56 private JCheckBox myCbGenerateFinalParameters;
57 private JCheckBox myCbGenerateFinalLocals;
58 private JCheckBox myCbUseExternalAnnotations;
59 private JCheckBox myInsertOverrideAnnotationCheckBox;
61 public CodeStyleGenerationConfigurable(CodeStyleSettings settings) {
62 mySettings = settings;
63 myMembersOrderList = new MembersOrderList();
66 public JComponent createComponent() {
67 myMembersListScroll.getViewport().add(myMembersOrderList);
69 myMoveUpButton.addActionListener(new ActionListener() {
70 public void actionPerformed(ActionEvent e) {
71 ListUtil.moveSelectedItemsUp(myMembersOrderList);
73 });
75 myMoveDownButton.addActionListener(new ActionListener() {
76 public void actionPerformed(ActionEvent e) {
77 ListUtil.moveSelectedItemsDown(myMembersOrderList);
79 });
80 return myPanel;
83 public void disposeUIResources() {
86 public String getDisplayName() {
87 return ApplicationBundle.message("title.code.generation");
90 public String getHelpTopic() {
91 return "reference.settingsdialog.IDE.globalcodestyle.codegen";
94 public Icon getIcon() {
95 return StdFileTypes.JAVA.getIcon();
99 /*private JPanel createNamingPanel() {
100 OptionGroup optionGroup = new OptionGroup("Naming");
102 myCbPreferLongerNames = new JCheckBox("Prefer longer names");
104 optionGroup.add(myCbPreferLongerNames);
106 optionGroup.add(new JLabel("Name prefix for:"));
108 myFieldPrefixField = new JTextField(8);
109 optionGroup.add(new JLabel("Field"), myFieldPrefixField, true);
111 myStaticFieldPrefixField = new JTextField(8);
112 optionGroup.add(new JLabel("Static field"), myStaticFieldPrefixField, true);
114 myParameterPrefixField = new JTextField(8);
115 optionGroup.add(new JLabel("Parameter"), myParameterPrefixField, true);
117 myLocalVariablePrefixField = new JTextField(8);
118 optionGroup.add(new JLabel("Local variable"), myLocalVariablePrefixField, true);
120 optionGroup.add(new JLabel("Name suffix for:"));
122 myFieldSuffixField = new JTextField(8);
123 optionGroup.add(new JLabel("Field"), myFieldSuffixField, true);
125 myStaticFieldSuffixField = new JTextField(8);
126 optionGroup.add(new JLabel("Static field"), myStaticFieldSuffixField, true);
128 myParameterSuffixField = new JTextField(8);
129 optionGroup.add(new JLabel("Parameter"), myParameterSuffixField, true);
131 myLocalVariableSuffixField = new JTextField(8);
132 optionGroup.add(new JLabel("Local variable"), myLocalVariableSuffixField, true);
134 return optionGroup.createPanel();
137 private JPanel createCommentPanel() {
138 OptionGroup optionGroup = new OptionGroup("Comment Code");
140 myCbLineCommentAtFirstColumn = new JCheckBox("Line comment at first column");
141 optionGroup.add(myCbLineCommentAtFirstColumn);
143 myCbBlockCommentAtFirstColumn = new JCheckBox("Block comment at first column");
144 optionGroup.add(myCbBlockCommentAtFirstColumn);
146 return optionGroup.createPanel();
149 private JPanel createRightMarginPanel() {
150 OptionGroup optionGroup = new OptionGroup("Wrapping ");
152 myRightMarginField = new JTextField(4);
153 optionGroup.add(new JLabel("Right margin (columns)") ,myRightMarginField);
155 return optionGroup.createPanel();
158 private JPanel createLineSeparatorPanel(){
159 OptionGroup optionGroup = new OptionGroup("Line Separator (for new files) ");
162 myLineSeparatorCombo = new JComboBox();
163 myLineSeparatorCombo.addItem(SYSTEM_DEPENDANT_STRING);
164 myLineSeparatorCombo.addItem(UNIX_STRING);
165 myLineSeparatorCombo.addItem(WINDOWS_STRING);
166 myLineSeparatorCombo.addItem(MACINTOSH_STRING);
168 optionGroup.add(myLineSeparatorCombo);
170 return optionGroup.createPanel();
173 private JPanel createKeepWhenReformattingPanel() {
174 OptionGroup optionGroup = new OptionGroup("Keep When Reformatting");
176 myCbKeepLineBreaks = new JCheckBox("Line breaks");
177 optionGroup.add(myCbKeepLineBreaks);
179 myCbKeepFirstColumnComment = new JCheckBox("Comment at first column");
180 optionGroup.add(myCbKeepFirstColumnComment);
182 myCbKeepControlStatementInOneLine = new JCheckBox("Control statement in one line");
183 optionGroup.add(myCbKeepControlStatementInOneLine);
185 return optionGroup.createPanel();
188 private JPanel createMembersOrderPanel() {
190 OptionGroup optionGroup = new OptionGroup("Order of Members");
192 JPanel panel = new JPanel(new GridBagLayout());
194 myMembersOrderList = new MembersOrderList();
195 panel.add(new JScrollPane(myMembersOrderList), new GridBagConstraints(0,0,1,2,1,1,GridBagConstraints.NORTH,GridBagConstraints.BOTH,new Insets(0,0,0,0), 0,0));
197 JButton moveUpButton = new JButton("Move Up");
199 moveUpButton.addActionListener(new ActionListener() {
200 public void actionPerformed(ActionEvent e){
201 ListUtil.moveSelectedItemsUp(myMembersOrderList);
204 panel.add(moveUpButton, new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,0), 0,0));
206 JButton movDownButton = new JButton("Move Down");
207 moveDownButton.addActionListener(new ActionListener() {
208 public void actionPerformed(ActionEvent e){
209 ListUtil.moveSelectedItemsDown(myMembersOrderList);
212 panel.add(movDownButton, new GridBagConstraints(1,1,1,1,0,1,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,0), 0,0));
214 optionGroup.add(panel);
216 return optionGroup.createPanel();
219 public void reset() {
220 myCbPreferLongerNames.setSelected(mySettings.PREFER_LONGER_NAMES);
222 myFieldPrefixField.setText(mySettings.FIELD_NAME_PREFIX);
223 myStaticFieldPrefixField.setText(mySettings.STATIC_FIELD_NAME_PREFIX);
224 myParameterPrefixField.setText(mySettings.PARAMETER_NAME_PREFIX);
225 myLocalVariablePrefixField.setText(mySettings.LOCAL_VARIABLE_NAME_PREFIX);
227 myFieldSuffixField.setText(mySettings.FIELD_NAME_SUFFIX);
228 myStaticFieldSuffixField.setText(mySettings.STATIC_FIELD_NAME_SUFFIX);
229 myParameterSuffixField.setText(mySettings.PARAMETER_NAME_SUFFIX);
230 myLocalVariableSuffixField.setText(mySettings.LOCAL_VARIABLE_NAME_SUFFIX);
232 myCbLineCommentAtFirstColumn.setSelected(mySettings.LINE_COMMENT_AT_FIRST_COLUMN);
233 myCbBlockCommentAtFirstColumn.setSelected(mySettings.BLOCK_COMMENT_AT_FIRST_COLUMN);
235 myCbGenerateFinalLocals.setSelected(mySettings.GENERATE_FINAL_LOCALS);
236 myCbGenerateFinalParameters.setSelected(mySettings.GENERATE_FINAL_PARAMETERS);
237 myMembersOrderList.reset(mySettings);
239 myCbUseExternalAnnotations.setSelected(mySettings.USE_EXTERNAL_ANNOTATIONS);
240 myInsertOverrideAnnotationCheckBox.setSelected(mySettings.INSERT_OVERRIDE_ANNOTATION);
243 public void apply() {
244 mySettings.PREFER_LONGER_NAMES = myCbPreferLongerNames.isSelected();
246 mySettings.FIELD_NAME_PREFIX = myFieldPrefixField.getText().trim();
247 mySettings.STATIC_FIELD_NAME_PREFIX = myStaticFieldPrefixField.getText().trim();
248 mySettings.PARAMETER_NAME_PREFIX = myParameterPrefixField.getText().trim();
249 mySettings.LOCAL_VARIABLE_NAME_PREFIX = myLocalVariablePrefixField.getText().trim();
251 mySettings.FIELD_NAME_SUFFIX = myFieldSuffixField.getText().trim();
252 mySettings.STATIC_FIELD_NAME_SUFFIX = myStaticFieldSuffixField.getText().trim();
253 mySettings.PARAMETER_NAME_SUFFIX = myParameterSuffixField.getText().trim();
254 mySettings.LOCAL_VARIABLE_NAME_SUFFIX = myLocalVariableSuffixField.getText().trim();
256 mySettings.LINE_COMMENT_AT_FIRST_COLUMN = myCbLineCommentAtFirstColumn.isSelected();
257 mySettings.BLOCK_COMMENT_AT_FIRST_COLUMN = myCbBlockCommentAtFirstColumn.isSelected();
259 mySettings.GENERATE_FINAL_LOCALS = myCbGenerateFinalLocals.isSelected();
260 mySettings.GENERATE_FINAL_PARAMETERS = myCbGenerateFinalParameters.isSelected();
262 mySettings.USE_EXTERNAL_ANNOTATIONS = myCbUseExternalAnnotations.isSelected();
263 mySettings.INSERT_OVERRIDE_ANNOTATION = myInsertOverrideAnnotationCheckBox.isSelected();
265 myMembersOrderList.apply(mySettings);
267 for (Project project : ProjectManager.getInstance().getOpenProjects()) {
268 DaemonCodeAnalyzer.getInstance(project).settingsChanged();
272 public boolean isModified() {
273 boolean isModified = isModified(myCbPreferLongerNames, mySettings.PREFER_LONGER_NAMES);
275 isModified |= isModified(myFieldPrefixField, mySettings.FIELD_NAME_PREFIX);
276 isModified |= isModified(myStaticFieldPrefixField, mySettings.STATIC_FIELD_NAME_PREFIX);
277 isModified |= isModified(myParameterPrefixField, mySettings.PARAMETER_NAME_PREFIX);
278 isModified |= isModified(myLocalVariablePrefixField, mySettings.LOCAL_VARIABLE_NAME_PREFIX);
280 isModified |= isModified(myFieldSuffixField, mySettings.FIELD_NAME_SUFFIX);
281 isModified |= isModified(myStaticFieldSuffixField, mySettings.STATIC_FIELD_NAME_SUFFIX);
282 isModified |= isModified(myParameterSuffixField, mySettings.PARAMETER_NAME_SUFFIX);
283 isModified |= isModified(myLocalVariableSuffixField, mySettings.LOCAL_VARIABLE_NAME_SUFFIX);
285 isModified |= isModified(myCbLineCommentAtFirstColumn, mySettings.LINE_COMMENT_AT_FIRST_COLUMN);
286 isModified |= isModified(myCbBlockCommentAtFirstColumn, mySettings.BLOCK_COMMENT_AT_FIRST_COLUMN);
289 isModified |= isModified(myCbGenerateFinalLocals, mySettings.GENERATE_FINAL_LOCALS);
290 isModified |= isModified(myCbGenerateFinalParameters, mySettings.GENERATE_FINAL_PARAMETERS);
292 isModified |= isModified(myCbUseExternalAnnotations, mySettings.USE_EXTERNAL_ANNOTATIONS);
293 isModified |= isModified(myInsertOverrideAnnotationCheckBox, mySettings.INSERT_OVERRIDE_ANNOTATION);
295 isModified |= myMembersOrderList.isModified(mySettings);
297 return isModified;
300 private static boolean isModified(JCheckBox checkBox, boolean value) {
301 return checkBox.isSelected() != value;
304 private static boolean isModified(JTextField textField, String value) {
305 return !textField.getText().trim().equals(value);
308 private static class MembersOrderList extends JList {
309 private static final String FIELDS = ApplicationBundle.message("listbox.members.order.fields");
310 private static final String METHODS = ApplicationBundle.message("listbox.members.order.methods");
311 private static final String CONSTRUCTORS = ApplicationBundle.message("listbox.members.order.constructors");
312 private static final String INNER_CLASSES = ApplicationBundle.message("listbox.members.order.inner.classes");
314 private final DefaultListModel myModel;
316 public MembersOrderList() {
317 myModel = new DefaultListModel();
318 setModel(myModel);
319 setVisibleRowCount(4);
322 public void reset(final CodeStyleSettings settings) {
323 myModel.removeAllElements();
324 String[] strings = getStrings(settings);
325 for (String string : strings) {
326 myModel.addElement(string);
329 setSelectedIndex(0);
332 private static String[] getStrings(final CodeStyleSettings settings) {
333 String[] strings = new String[]{FIELDS, METHODS, CONSTRUCTORS, INNER_CLASSES};
335 Arrays.sort(strings, new Comparator<String>() {
336 public int compare(String o1, String o2) {
337 int weight1 = getWeight(o1);
338 int weight2 = getWeight(o2);
339 return weight1 - weight2;
342 private int getWeight(String o) {
343 if (FIELDS.equals(o)) {
344 return settings.FIELDS_ORDER_WEIGHT;
346 else if (METHODS.equals(o)) {
347 return settings.METHODS_ORDER_WEIGHT;
349 else if (CONSTRUCTORS.equals(o)) {
350 return settings.CONSTRUCTORS_ORDER_WEIGHT;
352 else if (INNER_CLASSES.equals(o)) {
353 return settings.INNER_CLASSES_ORDER_WEIGHT;
355 else {
356 throw new IllegalArgumentException("unexpected " + o);
360 return strings;
363 public void apply(CodeStyleSettings settings) {
364 for (int i = 0; i < myModel.size(); i++) {
365 Object o = myModel.getElementAt(i);
366 int weight = i + 1;
368 if (FIELDS.equals(o)) {
369 settings.FIELDS_ORDER_WEIGHT = weight;
371 else if (METHODS.equals(o)) {
372 settings.METHODS_ORDER_WEIGHT = weight;
374 else if (CONSTRUCTORS.equals(o)) {
375 settings.CONSTRUCTORS_ORDER_WEIGHT = weight;
377 else if (INNER_CLASSES.equals(o)) {
378 settings.INNER_CLASSES_ORDER_WEIGHT = weight;
380 else {
381 throw new IllegalArgumentException("unexpected " + o);
386 public boolean isModified(CodeStyleSettings settings) {
387 String[] oldStrings = getStrings(settings);
388 String[] newStrings = new String[myModel.size()];
389 for (int i = 0; i < newStrings.length; i++) {
390 newStrings[i] = (String)myModel.getElementAt(i);
393 return !Arrays.equals(newStrings, oldStrings);