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
;
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
{
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
);
75 myMoveDownButton
.addActionListener(new ActionListener() {
76 public void actionPerformed(ActionEvent e
) {
77 ListUtil
.moveSelectedItemsDown(myMembersOrderList
);
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
);
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();
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
);
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
;
356 throw new IllegalArgumentException("unexpected " + o
);
363 public void apply(CodeStyleSettings settings
) {
364 for (int i
= 0; i
< myModel
.size(); i
++) {
365 Object o
= myModel
.getElementAt(i
);
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
;
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
);