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
.openapi
.application
.ApplicationBundle
;
19 import com
.intellij
.openapi
.editor
.SyntaxHighlighterColors
;
20 import com
.intellij
.openapi
.editor
.markup
.TextAttributes
;
21 import com
.intellij
.openapi
.ui
.VerticalFlowLayout
;
22 import com
.intellij
.openapi
.ui
.ex
.MultiLineLabel
;
23 import com
.intellij
.psi
.codeStyle
.CodeStyleSettings
;
24 import com
.intellij
.psi
.codeStyle
.PackageEntry
;
25 import com
.intellij
.psi
.codeStyle
.PackageEntryTable
;
26 import com
.intellij
.ui
.*;
27 import com
.intellij
.util
.ui
.Table
;
30 import javax
.swing
.event
.*;
31 import javax
.swing
.table
.*;
33 import java
.awt
.event
.ActionEvent
;
34 import java
.awt
.event
.ActionListener
;
35 import java
.awt
.event
.ItemEvent
;
36 import java
.awt
.event
.ItemListener
;
38 public class CodeStyleImportsPanel
extends JPanel
{
39 private JCheckBox myCbUseFQClassNames
;
40 private JCheckBox myCbUseFQClassNamesInJavaDoc
;
41 private JCheckBox myCbUseSingleClassImports
;
42 private JCheckBox myCbInsertInnerClassImports
;
43 private JTextField myClassCountField
;
44 private JTextField myNamesCountField
;
45 private final PackageEntryTable myImportLayoutList
= new PackageEntryTable();
46 private final PackageEntryTable myPackageList
= new PackageEntryTable();
48 private Table myImportLayoutTable
;
49 private JButton myMoveUpButton
;
50 private JButton myMoveDownButton
;
51 private JButton myRemovePackageFromImportLayoutButton
;
52 private JButton myRemovePackageFromPackagesButton
;
53 private Table myPackageTable
;
54 private final CodeStyleSettings mySettings
;
55 private JRadioButton myJspImportCommaSeparated
;
56 private JRadioButton myJspOneImportPerDirective
;
58 private JPanel myGeneralPanel
;
59 private JPanel myJSPPanel
;
60 private JPanel myPackagesPanel
;
61 private JPanel myImportsLayoutPanel
;
62 private JPanel myWholePanel
;
63 private JCheckBox myCbLayoutStaticImportsSeparately
;
65 public CodeStyleImportsPanel(CodeStyleSettings settings
){
66 mySettings
= settings
;
67 setLayout(new BorderLayout());
68 setBorder(BorderFactory
.createEmptyBorder(8, 4, 4, 4));
69 add(myWholePanel
, BorderLayout
.CENTER
);
71 myGeneralPanel
.add(createGeneralOptionsPanel(), BorderLayout
.CENTER
);
72 myJSPPanel
.add(createJspImportLayoutPanel(), BorderLayout
.CENTER
);
73 myImportsLayoutPanel
.add(createImportLayoutPanel(), BorderLayout
.NORTH
);
74 myPackagesPanel
.add(createPackagesPanel(), BorderLayout
.NORTH
);
77 private JPanel
createJspImportLayoutPanel() {
78 ButtonGroup buttonGroup
= new ButtonGroup();
79 myJspImportCommaSeparated
= new JRadioButton(ApplicationBundle
.message("radio.prefer.comma.separated.import.list"));
80 myJspOneImportPerDirective
= new JRadioButton(ApplicationBundle
.message("radio.prefer.one.import.statement.per.page.directive"));
81 buttonGroup
.add(myJspImportCommaSeparated
);
82 buttonGroup
.add(myJspOneImportPerDirective
);
83 JPanel btnPanel
= new JPanel(new BorderLayout());
84 btnPanel
.add(myJspImportCommaSeparated
, BorderLayout
.NORTH
);
85 btnPanel
.add(myJspOneImportPerDirective
, BorderLayout
.CENTER
);
87 //noinspection HardCodedStringLiteral
88 final MultiLineLabel commaSeparatedLabel
= new MultiLineLabel("<% page import=\"com.company.Boo, \n" +
89 " com.company.Far\"%>");
90 //noinspection HardCodedStringLiteral
91 final MultiLineLabel oneImportPerDirectiveLabel
= new MultiLineLabel("<% page import=\"com.company.Boo\"%>\n" +
92 "<% page import=\"com.company.Far\"%>");
93 final JPanel labelPanel
= new JPanel(new BorderLayout());
94 labelPanel
.setBorder(IdeBorderFactory
.createTitledBorder(ApplicationBundle
.message("title.preview")));
96 JPanel resultPanel
= new JPanel(new BorderLayout());
97 resultPanel
.add(btnPanel
, BorderLayout
.NORTH
);
98 resultPanel
.add(labelPanel
, BorderLayout
.CENTER
);
99 resultPanel
.setBorder(IdeBorderFactory
.createTitledBorder(ApplicationBundle
.message("title.jsp.imports.layout")));
102 ActionListener actionListener
= new ActionListener() {
103 public void actionPerformed(ActionEvent e
) {
104 boolean isComma
= myJspImportCommaSeparated
.isSelected();
105 labelPanel
.removeAll();
106 labelPanel
.add(isComma ? commaSeparatedLabel
: oneImportPerDirectiveLabel
, BorderLayout
.CENTER
);
107 labelPanel
.repaint();
108 labelPanel
.revalidate();
111 myJspImportCommaSeparated
.addActionListener(actionListener
);
112 myJspOneImportPerDirective
.addActionListener(actionListener
);
116 private JPanel
createGeneralOptionsPanel() {
117 OptionGroup group
= new OptionGroup(ApplicationBundle
.message("title.general"));
118 myCbUseSingleClassImports
= new JCheckBox(ApplicationBundle
.message("checkbox.use.single.class.import"));
119 group
.add(myCbUseSingleClassImports
);
121 myCbUseFQClassNames
= new JCheckBox(ApplicationBundle
.message("checkbox.use.fully.qualified.class.names"));
122 group
.add(myCbUseFQClassNames
);
124 myCbInsertInnerClassImports
= new JCheckBox(ApplicationBundle
.message("checkbox.insert.imports.for.inner.classes"));
125 group
.add(myCbInsertInnerClassImports
);
127 myCbUseFQClassNamesInJavaDoc
= new JCheckBox(ApplicationBundle
.message("checkbox.use.fully.qualified.class.names.in.javadoc"));
128 group
.add(myCbUseFQClassNamesInJavaDoc
);
130 myClassCountField
= new JTextField(3);
131 myNamesCountField
= new JTextField(3);
132 final JPanel panel
= new JPanel(new GridBagLayout());
133 panel
.add(new JLabel(ApplicationBundle
.message("editbox.class.count.to.use.import.with.star")), new GridBagConstraints(0, GridBagConstraints
.RELATIVE
, 1, 1, 0.0, 0.0, GridBagConstraints
.WEST
, GridBagConstraints
.NONE
, new Insets(0, 3, 0, 0), 0, 0));
134 panel
.add(myClassCountField
, new GridBagConstraints(1, GridBagConstraints
.RELATIVE
, 1, 1, 1.0, 0.0, GridBagConstraints
.WEST
, GridBagConstraints
.HORIZONTAL
, new Insets(0, 1, 0, 0), 0, 0));
135 panel
.add(new JLabel(ApplicationBundle
.message("editbox.names.count.to.use.static.import.with.star")), new GridBagConstraints(0, GridBagConstraints
.RELATIVE
, 1, 1, 0.0, 1.0, GridBagConstraints
.WEST
, GridBagConstraints
.NONE
, new Insets(0, 3, 0, 0), 0, 0));
136 panel
.add(myNamesCountField
, new GridBagConstraints(1, GridBagConstraints
.RELATIVE
, 1, 1, 1.0, 1.0, GridBagConstraints
.WEST
, GridBagConstraints
.HORIZONTAL
, new Insets(0, 1, 0, 0), 0, 0));
139 return group
.createPanel();
142 private JPanel
createPackagesPanel() {
143 JPanel panel
= new JPanel(new BorderLayout());
144 panel
.setBorder(IdeBorderFactory
.createTitledBorder(ApplicationBundle
.message("title.packages.to.use.import.with")));
146 panel
.add(createPackagesTable(), BorderLayout
.CENTER
);
147 panel
.add(createPackagesButtonsPanel(), BorderLayout
.EAST
);
148 panel
.setPreferredSize(new Dimension(-1, 200));
152 private JPanel
createImportLayoutPanel() {
153 JPanel panel
= new JPanel(new BorderLayout());
154 panel
.setBorder(IdeBorderFactory
.createTitledBorder(ApplicationBundle
.message("title.import.layout")));
155 myCbLayoutStaticImportsSeparately
= new JCheckBox("Layout static imports separately");
157 myCbLayoutStaticImportsSeparately
.addItemListener(new ItemListener(){
158 public void itemStateChanged(ItemEvent e
) {
159 if (areStaticImportsEnabled()) {
160 boolean found
= false;
161 for (int i
=myImportLayoutList
.getEntryCount()-1; i
>=0; i
--) {
162 PackageEntry entry
= myImportLayoutList
.getEntryAt(i
);
163 if (entry
== PackageEntry
.ALL_OTHER_STATIC_IMPORTS_ENTRY
) {
169 int index
= myImportLayoutList
.getEntryCount();
170 if (index
!= 0 && myImportLayoutList
.getEntryAt(index
-1) != PackageEntry
.BLANK_LINE_ENTRY
) {
171 myImportLayoutList
.addEntry(PackageEntry
.BLANK_LINE_ENTRY
);
173 myImportLayoutList
.addEntry(PackageEntry
.ALL_OTHER_STATIC_IMPORTS_ENTRY
);
177 for (int i
=myImportLayoutList
.getEntryCount()-1; i
>=0; i
--) {
178 PackageEntry entry
= myImportLayoutList
.getEntryAt(i
);
179 if (entry
.isStatic()) {
180 myImportLayoutList
.removeEntryAt(i
);
184 refreshTable(myImportLayoutTable
, myImportLayoutList
);
185 refreshTable(myPackageTable
, myPackageList
);
188 panel
.add(myCbLayoutStaticImportsSeparately
, BorderLayout
.NORTH
);
189 panel
.add(createImportLayoutTable(), BorderLayout
.CENTER
);
190 panel
.add(createImportLayoutButtonsPanel(), BorderLayout
.EAST
);
191 panel
.setPreferredSize(new Dimension(-1, 200));
195 private void refreshTable(final Table table
, final PackageEntryTable packageTable
) {
196 AbstractTableModel model
= (AbstractTableModel
)table
.getModel();
197 table
.createDefaultColumnsFromModel();
198 model
.fireTableDataChanged();
199 resizeColumns(packageTable
, table
);
202 private boolean areStaticImportsEnabled() {
203 return myCbLayoutStaticImportsSeparately
.isSelected();
206 private JPanel
createImportLayoutButtonsPanel() {
207 JPanel tableButtonsPanel
= new JPanel();
208 tableButtonsPanel
.setLayout(new BoxLayout(tableButtonsPanel
, BoxLayout
.Y_AXIS
));
210 JButton addPackageToImportLayoutButton
= new JButton(ApplicationBundle
.message("button.add.package"));
211 tableButtonsPanel
.add(addPackageToImportLayoutButton
);
212 addPackageToImportLayoutButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, addPackageToImportLayoutButton
.getMaximumSize().height
));
214 JButton addBlankLineButton
= new JButton(ApplicationBundle
.message("button.add.blank"));
215 tableButtonsPanel
.add(addBlankLineButton
);
216 addBlankLineButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, addBlankLineButton
.getMaximumSize().height
));
218 myMoveUpButton
= new JButton(ApplicationBundle
.message("button.move.up"));
219 tableButtonsPanel
.add(myMoveUpButton
);
220 myMoveUpButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, myMoveUpButton
.getMaximumSize().height
));
222 myMoveDownButton
= new JButton(ApplicationBundle
.message("button.move.down"));
223 tableButtonsPanel
.add(myMoveDownButton
);
224 myMoveDownButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, myMoveDownButton
.getMaximumSize().height
));
226 myRemovePackageFromImportLayoutButton
= new JButton(ApplicationBundle
.message("button.remove"));
227 tableButtonsPanel
.add(myRemovePackageFromImportLayoutButton
);
228 myRemovePackageFromImportLayoutButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, myRemovePackageFromImportLayoutButton
.getMaximumSize().height
));
230 addPackageToImportLayoutButton
.addActionListener(
231 new ActionListener(){
232 public void actionPerformed(ActionEvent e
){
233 addPackageToImportLayouts();
238 addBlankLineButton
.addActionListener(
239 new ActionListener(){
240 public void actionPerformed(ActionEvent e
){
246 myRemovePackageFromImportLayoutButton
.addActionListener(
247 new ActionListener(){
248 public void actionPerformed(ActionEvent e
){
249 removeEntryFromImportLayouts();
254 myMoveUpButton
.addActionListener(
255 new ActionListener(){
256 public void actionPerformed(ActionEvent e
){
262 myMoveDownButton
.addActionListener(
263 new ActionListener(){
264 public void actionPerformed(ActionEvent e
){
270 return tableButtonsPanel
;
273 private JPanel
createPackagesButtonsPanel() {
274 JPanel tableButtonsPanel
= new JPanel();
275 tableButtonsPanel
.setLayout(new BoxLayout(tableButtonsPanel
, BoxLayout
.Y_AXIS
));
277 JButton addPackageToPackagesButton
= new JButton(ApplicationBundle
.message("button.add.package.p"));
278 tableButtonsPanel
.add(addPackageToPackagesButton
);
279 addPackageToPackagesButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, addPackageToPackagesButton
.getMaximumSize().height
));
281 myRemovePackageFromPackagesButton
= new JButton(ApplicationBundle
.message("button.remove.r"));
282 tableButtonsPanel
.add(myRemovePackageFromPackagesButton
);
283 myRemovePackageFromPackagesButton
.setMaximumSize(new Dimension(Integer
.MAX_VALUE
, myRemovePackageFromPackagesButton
.getMaximumSize().height
));
285 addPackageToPackagesButton
.addActionListener(
286 new ActionListener(){
287 public void actionPerformed(ActionEvent e
){
288 addPackageToPackages();
293 myRemovePackageFromPackagesButton
.addActionListener(
294 new ActionListener(){
295 public void actionPerformed(ActionEvent e
){
296 removeEntryFromPackages();
301 return tableButtonsPanel
;
304 private void addPackageToImportLayouts() {
305 int selected
= myImportLayoutTable
.getSelectedRow() + 1;
307 selected
= myImportLayoutList
.getEntryCount();
309 PackageEntry entry
= new PackageEntry(false,"", true);
310 myImportLayoutList
.insertEntryAt(entry
, selected
);
311 refreshTableModel(selected
, myImportLayoutTable
);
314 private static void refreshTableModel(int selectedRow
, Table table
) {
315 AbstractTableModel model
= (AbstractTableModel
)table
.getModel();
316 model
.fireTableRowsInserted(selectedRow
, selectedRow
);
317 table
.setRowSelectionInterval(selectedRow
, selectedRow
);
318 TableUtil
.editCellAt(table
, selectedRow
, 0);
319 Component editorComp
= table
.getEditorComponent();
320 if(editorComp
!= null) {
321 editorComp
.requestFocus();
325 private void addPackageToPackages() {
326 int selected
= myPackageTable
.getSelectedRow() + 1;
328 selected
= myPackageList
.getEntryCount();
330 PackageEntry entry
= new PackageEntry(false,"", true);
331 myPackageList
.insertEntryAt(entry
, selected
);
332 refreshTableModel(selected
, myPackageTable
);
335 private void addBlankLine() {
336 int selected
= myImportLayoutTable
.getSelectedRow() + 1;
338 selected
= myImportLayoutList
.getEntryCount();
340 myImportLayoutList
.insertEntryAt(PackageEntry
.BLANK_LINE_ENTRY
, selected
);
341 AbstractTableModel model
= (AbstractTableModel
)myImportLayoutTable
.getModel();
342 model
.fireTableRowsInserted(selected
, selected
);
343 myImportLayoutTable
.setRowSelectionInterval(selected
, selected
);
346 private void removeEntryFromImportLayouts() {
347 int selected
= myImportLayoutTable
.getSelectedRow();
350 PackageEntry entry
= myImportLayoutList
.getEntryAt(selected
);
351 if(entry
== PackageEntry
.ALL_OTHER_STATIC_IMPORTS_ENTRY
|| entry
== PackageEntry
.ALL_OTHER_IMPORTS_ENTRY
) {
354 TableUtil
.stopEditing(myImportLayoutTable
);
355 myImportLayoutList
.removeEntryAt(selected
);
356 AbstractTableModel model
= (AbstractTableModel
)myImportLayoutTable
.getModel();
357 model
.fireTableRowsDeleted(selected
, selected
);
358 if(selected
>= myImportLayoutList
.getEntryCount()) {
362 myImportLayoutTable
.setRowSelectionInterval(selected
, selected
);
366 private void removeEntryFromPackages() {
367 int selected
= myPackageTable
.getSelectedRow();
368 if(selected
< 0) return;
369 TableUtil
.stopEditing(myPackageTable
);
370 myPackageList
.removeEntryAt(selected
);
371 AbstractTableModel model
= (AbstractTableModel
)myPackageTable
.getModel();
372 model
.fireTableRowsDeleted(selected
, selected
);
373 if(selected
>= myPackageList
.getEntryCount()) {
377 myPackageTable
.setRowSelectionInterval(selected
, selected
);
381 private void moveRowUp() {
382 int selected
= myImportLayoutTable
.getSelectedRow();
386 TableUtil
.stopEditing(myImportLayoutTable
);
387 PackageEntry entry
= myImportLayoutList
.getEntryAt(selected
);
388 PackageEntry previousEntry
= myImportLayoutList
.getEntryAt(selected
-1);
389 myImportLayoutList
.setEntryAt(previousEntry
, selected
);
390 myImportLayoutList
.setEntryAt(entry
, selected
-1);
392 AbstractTableModel model
= (AbstractTableModel
)myImportLayoutTable
.getModel();
393 model
.fireTableRowsUpdated(selected
-1, selected
);
394 myImportLayoutTable
.setRowSelectionInterval(selected
-1, selected
-1);
397 private void moveRowDown() {
398 int selected
= myImportLayoutTable
.getSelectedRow();
399 if(selected
>= myImportLayoutList
.getEntryCount()-1) {
402 TableUtil
.stopEditing(myImportLayoutTable
);
403 PackageEntry entry
= myImportLayoutList
.getEntryAt(selected
);
404 PackageEntry nextEntry
= myImportLayoutList
.getEntryAt(selected
+1);
405 myImportLayoutList
.setEntryAt(nextEntry
, selected
);
406 myImportLayoutList
.setEntryAt(entry
, selected
+1);
408 AbstractTableModel model
= (AbstractTableModel
)myImportLayoutTable
.getModel();
409 model
.fireTableRowsUpdated(selected
, selected
+1);
410 myImportLayoutTable
.setRowSelectionInterval(selected
+1, selected
+1);
413 private JComponent
createPackagesTable() {
414 myPackageTable
= createTableForPackageEntries(myPackageList
);
415 return ScrollPaneFactory
.createScrollPane(myPackageTable
);
418 private Table
createTableForPackageEntries(final PackageEntryTable packageTable
) {
419 final String
[] names
= {
420 ApplicationBundle
.message("listbox.import.package"),
421 ApplicationBundle
.message("listbox.import.with.subpackages"),
423 // Create a model of the data.
424 TableModel dataModel
= new AbstractTableModel() {
425 public int getColumnCount() {
426 return names
.length
+ (areStaticImportsEnabled()?
1:0);
429 public int getRowCount() {
430 return packageTable
.getEntryCount();
433 public Object
getValueAt(int row
, int col
) {
434 PackageEntry entry
= packageTable
.getEntryAt(row
);
435 if (entry
== null || !isCellEditable(row
, col
)) return null;
436 col
+= areStaticImportsEnabled() ?
0 : 1;
438 return entry
.isStatic();
441 return entry
.getPackageName();
444 return entry
.isWithSubpackages() ? Boolean
.TRUE
: Boolean
.FALSE
;
446 throw new IllegalArgumentException(String
.valueOf(col
));
449 public String
getColumnName(int column
) {
450 if (areStaticImportsEnabled() && column
== 0) return "Static";
451 column
-= areStaticImportsEnabled() ?
1 : 0;
452 return names
[column
];
455 public Class
getColumnClass(int col
) {
456 col
+= areStaticImportsEnabled() ?
0 : 1;
458 return Boolean
.class;
464 return Boolean
.class;
466 throw new IllegalArgumentException(String
.valueOf(col
));
469 public boolean isCellEditable(int row
, int col
) {
470 PackageEntry packageEntry
= packageTable
.getEntryAt(row
);
471 return !packageEntry
.isSpecial();
474 public void setValueAt(Object aValue
, int row
, int col
) {
475 PackageEntry packageEntry
= packageTable
.getEntryAt(row
);
476 col
+= areStaticImportsEnabled() ?
0 : 1;
478 PackageEntry newPackageEntry
= new PackageEntry((Boolean
)aValue
, packageEntry
.getPackageName(), packageEntry
.isWithSubpackages());
479 packageTable
.setEntryAt(newPackageEntry
, row
);
482 PackageEntry newPackageEntry
= new PackageEntry(packageEntry
.isStatic(), ((String
)aValue
).trim(), packageEntry
.isWithSubpackages());
483 packageTable
.setEntryAt(newPackageEntry
, row
);
486 PackageEntry newPackageEntry
= new PackageEntry(packageEntry
.isStatic(), packageEntry
.getPackageName(), ((Boolean
)aValue
).booleanValue());
487 packageTable
.setEntryAt(newPackageEntry
, row
);
490 throw new IllegalArgumentException(String
.valueOf(col
));
496 final Table result
= new Table(dataModel
);
497 result
.getSelectionModel().setSelectionMode(ListSelectionModel
.SINGLE_SELECTION
);
498 resizeColumns(packageTable
, result
);
500 TableCellEditor editor
= result
.getDefaultEditor(String
.class);
501 if (editor
instanceof DefaultCellEditor
) {
502 ((DefaultCellEditor
)editor
).setClickCountToStart(1);
505 TableCellEditor beditor
= result
.getDefaultEditor(Boolean
.class);
506 beditor
.addCellEditorListener(new CellEditorListener() {
507 public void editingStopped(ChangeEvent e
) {
508 if (areStaticImportsEnabled()) {
509 result
.repaint(); // add/remove static keyword
513 public void editingCanceled(ChangeEvent e
) {
517 result
.getSelectionModel().addListSelectionListener(
518 new ListSelectionListener(){
519 public void valueChanged(ListSelectionEvent e
){
528 private void resizeColumns(final PackageEntryTable packageTable
, Table result
) {
529 ColoredTableCellRenderer packageRenderer
= new ColoredTableCellRenderer() {
531 protected void customizeCellRenderer(JTable table
, Object value
, boolean selected
, boolean hasFocus
, int row
, int column
) {
532 PackageEntry entry
= packageTable
.getEntryAt(row
);
534 if (entry
== PackageEntry
.BLANK_LINE_ENTRY
) {
535 append(" <blank line>", SimpleTextAttributes
.LINK_ATTRIBUTES
);
538 TextAttributes attributes
= SyntaxHighlighterColors
.KEYWORD
.getDefaultAttributes();
539 append("import", SimpleTextAttributes
.fromTextAttributes(attributes
));
540 if (entry
.isStatic()) {
541 append(" ", SimpleTextAttributes
.REGULAR_ATTRIBUTES
);
542 append("static", SimpleTextAttributes
.fromTextAttributes(attributes
));
544 append(" ", SimpleTextAttributes
.REGULAR_ATTRIBUTES
);
546 if (entry
== PackageEntry
.ALL_OTHER_IMPORTS_ENTRY
|| entry
== PackageEntry
.ALL_OTHER_STATIC_IMPORTS_ENTRY
) {
547 append("all other imports", SimpleTextAttributes
.REGULAR_ATTRIBUTES
);
550 append(entry
.getPackageName() + ".*", SimpleTextAttributes
.REGULAR_ATTRIBUTES
);
555 if (areStaticImportsEnabled()) {
556 fixColumnWidthToHeader(result
, 0);
557 fixColumnWidthToHeader(result
, 2);
558 result
.getColumnModel().getColumn(1).setCellRenderer(packageRenderer
);
559 result
.getColumnModel().getColumn(0).setCellRenderer(new BooleanTableCellRenderer());
560 result
.getColumnModel().getColumn(2).setCellRenderer(new BooleanTableCellRenderer());
563 fixColumnWidthToHeader(result
, 1);
564 result
.getColumnModel().getColumn(0).setCellRenderer(packageRenderer
);
565 result
.getColumnModel().getColumn(1).setCellRenderer(new BooleanTableCellRenderer());
569 private static void fixColumnWidthToHeader(Table result
, int columnIdx
) {
570 final TableColumn column
= result
.getColumnModel().getColumn(columnIdx
);
571 final int width
= result
.getTableHeader().getFontMetrics(result
.getTableHeader().getFont()).stringWidth(result
.getColumnName(columnIdx
)) + 6;
572 column
.setMinWidth(width
);
573 column
.setMaxWidth(width
);
576 private void updateButtons(){
577 int selectedImport
= myImportLayoutTable
.getSelectedRow();
578 myMoveUpButton
.setEnabled(selectedImport
>= 1);
579 myMoveDownButton
.setEnabled(selectedImport
< myImportLayoutTable
.getRowCount()-1);
580 PackageEntry entry
= selectedImport
< 0 ?
null : myImportLayoutList
.getEntryAt(selectedImport
);
581 boolean canRemove
= entry
!= null && entry
!= PackageEntry
.ALL_OTHER_STATIC_IMPORTS_ENTRY
&& entry
!= PackageEntry
.ALL_OTHER_IMPORTS_ENTRY
;
582 myRemovePackageFromImportLayoutButton
.setEnabled(canRemove
);
584 int selectedPackage
= myPackageTable
.getSelectedRow();
585 myRemovePackageFromPackagesButton
.setEnabled(selectedPackage
>= 0);
588 private JComponent
createImportLayoutTable() {
589 myImportLayoutTable
= createTableForPackageEntries(myImportLayoutList
);
590 return ScrollPaneFactory
.createScrollPane(myImportLayoutTable
);
593 public void reset() {
594 myCbUseFQClassNames
.setSelected(mySettings
.USE_FQ_CLASS_NAMES
);
595 myCbUseFQClassNamesInJavaDoc
.setSelected(mySettings
.USE_FQ_CLASS_NAMES_IN_JAVADOC
);
596 myCbUseSingleClassImports
.setSelected(mySettings
.USE_SINGLE_CLASS_IMPORTS
);
597 myCbInsertInnerClassImports
.setSelected(mySettings
.INSERT_INNER_CLASS_IMPORTS
);
598 myClassCountField
.setText(Integer
.toString(mySettings
.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND
));
599 myNamesCountField
.setText(Integer
.toString(mySettings
.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND
));
601 myImportLayoutList
.copyFrom(mySettings
.IMPORT_LAYOUT_TABLE
);
602 myPackageList
.copyFrom(mySettings
.PACKAGES_TO_USE_IMPORT_ON_DEMAND
);
604 myCbLayoutStaticImportsSeparately
.setSelected(mySettings
.LAYOUT_STATIC_IMPORTS_SEPARATELY
);
606 AbstractTableModel model
= (AbstractTableModel
)myImportLayoutTable
.getModel();
607 model
.fireTableDataChanged();
609 model
= (AbstractTableModel
)myPackageTable
.getModel();
610 model
.fireTableDataChanged();
612 if(myImportLayoutTable
.getRowCount() > 0) {
613 myImportLayoutTable
.getSelectionModel().setSelectionInterval(0, 0);
615 if(myPackageTable
.getRowCount() > 0) {
616 myPackageTable
.getSelectionModel().setSelectionInterval(0, 0);
619 if (mySettings
.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST
) {
620 myJspImportCommaSeparated
.doClick();
623 myJspOneImportPerDirective
.doClick();
628 public void apply() {
631 mySettings
.LAYOUT_STATIC_IMPORTS_SEPARATELY
= areStaticImportsEnabled();
632 mySettings
.USE_FQ_CLASS_NAMES
= myCbUseFQClassNames
.isSelected();
633 mySettings
.USE_FQ_CLASS_NAMES_IN_JAVADOC
= myCbUseFQClassNamesInJavaDoc
.isSelected();
634 mySettings
.USE_SINGLE_CLASS_IMPORTS
= myCbUseSingleClassImports
.isSelected();
635 mySettings
.INSERT_INNER_CLASS_IMPORTS
= myCbInsertInnerClassImports
.isSelected();
637 mySettings
.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND
= Integer
.parseInt(myClassCountField
.getText());
639 catch(NumberFormatException e
){
643 mySettings
.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND
= Integer
.parseInt(myNamesCountField
.getText());
645 catch(NumberFormatException e
){
649 myImportLayoutList
.removeEmptyPackages();
650 mySettings
.IMPORT_LAYOUT_TABLE
.copyFrom(myImportLayoutList
);
652 myPackageList
.removeEmptyPackages();
653 mySettings
.PACKAGES_TO_USE_IMPORT_ON_DEMAND
.copyFrom(myPackageList
);
655 mySettings
.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST
= myJspImportCommaSeparated
.isSelected();
659 private void stopTableEditing() {
660 TableUtil
.stopEditing(myImportLayoutTable
);
661 TableUtil
.stopEditing(myPackageTable
);
664 public boolean isModified() {
666 isModified
= isModified(myCbLayoutStaticImportsSeparately
, mySettings
.LAYOUT_STATIC_IMPORTS_SEPARATELY
);
667 isModified
|= isModified(myCbUseFQClassNames
, mySettings
.USE_FQ_CLASS_NAMES
);
668 isModified
|= isModified(myCbUseFQClassNamesInJavaDoc
, mySettings
.USE_FQ_CLASS_NAMES_IN_JAVADOC
);
669 isModified
|= isModified(myCbUseSingleClassImports
, mySettings
.USE_SINGLE_CLASS_IMPORTS
);
670 isModified
|= isModified(myCbInsertInnerClassImports
, mySettings
.INSERT_INNER_CLASS_IMPORTS
);
671 isModified
|= isModified(myClassCountField
, mySettings
.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND
);
672 isModified
|= isModified(myNamesCountField
, mySettings
.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND
);
674 isModified
|= isModified(myImportLayoutList
, mySettings
.IMPORT_LAYOUT_TABLE
);
675 isModified
|= isModified(myPackageList
, mySettings
.PACKAGES_TO_USE_IMPORT_ON_DEMAND
);
676 isModified
|= mySettings
.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST
!= myJspImportCommaSeparated
.isSelected();
681 private static boolean isModified(JTextField textField
, int value
) {
683 int fieldValue
= Integer
.parseInt(textField
.getText().trim());
684 return fieldValue
!= value
;
686 catch(NumberFormatException e
) {
691 private static boolean isModified(JCheckBox checkBox
, boolean value
) {
692 return checkBox
.isSelected() != value
;
695 private static boolean isModified(PackageEntryTable list
, PackageEntryTable table
) {
696 if(list
.getEntryCount() != table
.getEntryCount()) {
700 for(int i
=0; i
<list
.getEntryCount(); i
++) {
701 PackageEntry entry1
= list
.getEntryAt(i
);
702 PackageEntry entry2
= table
.getEntryAt(i
);
703 if(!entry1
.equals(entry2
)) {