From 1000f4ac6220829b7eff28f7f76a2bc3f0f4e759 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Tue, 14 Feb 2017 17:23:52 +0300 Subject: [PATCH] [imports layout java|groovy] do not delete newly added import immediately (was fixed by not modifying UI model in settings apply method IDEA-167619), unite java and groovy implementation since they are Ctrl-V identical --- ...el.java => CodeStyleImportsPanelBase.java} | 119 +++++----- ...orm => CodeStyleImportsPanelBaseForm.form} | 2 +- .../options/CodeStyleImportsPanelWrapper.java | 15 +- ...QualifiedNamesInJavadocOptionProvider.java | 3 +- .../options/JavaCodeStyleImportsPanel.java | 47 ++++ .../psi/codeStyle/CodeStyleSettings.java | 74 ++++++- .../psi/codeStyle/ImportsLayoutSettings.java | 33 +++ .../codeStyle/GrCodeStyleImportsPanel.form | 54 ----- .../codeStyle/GrCodeStyleImportsPanel.java | 208 ++---------------- .../GrCodeStyleImportsPanelWrapper.java | 6 +- .../codeStyle/GroovyCodeStyleSettings.java | 73 +++++- 11 files changed, 321 insertions(+), 313 deletions(-) rename java/java-impl/src/com/intellij/application/options/{CodeStyleImportsPanel.java => CodeStyleImportsPanelBase.java} (67%) rename java/java-impl/src/com/intellij/application/options/{CodeStyleImportForm.form => CodeStyleImportsPanelBaseForm.form} (99%) create mode 100644 java/java-impl/src/com/intellij/application/options/JavaCodeStyleImportsPanel.java create mode 100644 platform/lang-api/src/com/intellij/psi/codeStyle/ImportsLayoutSettings.java delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.form diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelBase.java similarity index 67% rename from java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java rename to java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelBase.java index 66be531b006b..3f727308d6c9 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 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. @@ -17,27 +17,27 @@ package com.intellij.application.options; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.ImportsLayoutSettings; import com.intellij.psi.codeStyle.PackageEntry; import com.intellij.psi.codeStyle.PackageEntryTable; import com.intellij.ui.OptionGroup; import com.intellij.ui.TableUtil; import com.intellij.ui.table.JBTable; import com.intellij.util.ui.JBUI; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.table.AbstractTableModel; import java.awt.*; -public class CodeStyleImportsPanel extends JPanel { +public abstract class CodeStyleImportsPanelBase extends JPanel { + private final PackageEntryTable myPackageList = new PackageEntryTable(); private JCheckBox myCbUseFQClassNames; private JCheckBox myCbUseSingleClassImports; private JCheckBox myCbInsertInnerClassImports; private JTextField myClassCountField; private JTextField myNamesCountField; - private final PackageEntryTable myPackageList = new PackageEntryTable(); - private JBTable myPackageTable; - private final CodeStyleSettings mySettings; private JPanel myGeneralPanel; private JPanel myPackagesPanel; @@ -46,8 +46,7 @@ public class CodeStyleImportsPanel extends JPanel { private ImportLayoutPanel myImportLayoutPanel; private FullyQualifiedNamesInJavadocOptionProvider myFqnInJavadocOption; - public CodeStyleImportsPanel(CodeStyleSettings settings) { - mySettings = settings; + public CodeStyleImportsPanelBase() { setLayout(new BorderLayout()); add(myWholePanel, BorderLayout.CENTER); @@ -56,6 +55,12 @@ public class CodeStyleImportsPanel extends JPanel { createPackagePanel(); } + public abstract void reset(CodeStyleSettings settings); + + public abstract void apply(CodeStyleSettings settings); + + public abstract boolean isModified(CodeStyleSettings settings); + private void createImportPanel() { myImportLayoutPanel = new ImportLayoutPanel() { @Override @@ -83,9 +88,8 @@ public class CodeStyleImportsPanel extends JPanel { myCbInsertInnerClassImports = new JCheckBox(ApplicationBundle.message("checkbox.insert.imports.for.inner.classes")); group.add(myCbInsertInnerClassImports); - myFqnInJavadocOption = new FullyQualifiedNamesInJavadocOptionProvider(mySettings); - group.add(myFqnInJavadocOption.getPanel()); - + fillCustomOptions(group); + myClassCountField = new JTextField(3); myNamesCountField = new JTextField(3); final JPanel panel = new JPanel(new GridBagLayout()); @@ -113,18 +117,17 @@ public class CodeStyleImportsPanel extends JPanel { ImportLayoutPanel.resizeColumns(packageTable, table, myImportLayoutPanel.areStaticImportsEnabled()); } - public void reset(CodeStyleSettings settings) { - myCbUseFQClassNames.setSelected(settings.USE_FQ_CLASS_NAMES); - myCbUseSingleClassImports.setSelected(settings.USE_SINGLE_CLASS_IMPORTS); - myCbInsertInnerClassImports.setSelected(settings.INSERT_INNER_CLASS_IMPORTS); - myClassCountField.setText(Integer.toString(settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND)); - myNamesCountField.setText(Integer.toString(settings.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND)); + public void resetLayoutSettings(ImportsLayoutSettings settings) { + myCbUseFQClassNames.setSelected(settings.isUseFqClassNames()); + myCbUseSingleClassImports.setSelected(settings.isUseSingleClassImports()); + myCbInsertInnerClassImports.setSelected(settings.isInsertInnerClassImports()); + myClassCountField.setText(Integer.toString(settings.getClassCountToUseImportOnDemand())); + myNamesCountField.setText(Integer.toString(settings.getNamesCountToUseImportOnDemand())); - myImportLayoutPanel.getImportLayoutList().copyFrom(settings.IMPORT_LAYOUT_TABLE); - myPackageList.copyFrom(settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND); - myFqnInJavadocOption.reset(settings); + myImportLayoutPanel.getImportLayoutList().copyFrom(settings.getImportLayoutTable()); + myPackageList.copyFrom(settings.getPackagesToUseImportOnDemand()); - myImportLayoutPanel.getCbLayoutStaticImportsSeparately().setSelected(settings.LAYOUT_STATIC_IMPORTS_SEPARATELY); + myImportLayoutPanel.getCbLayoutStaticImportsSeparately().setSelected(settings.isLayoutStaticImportsSeparately()); final JBTable importLayoutTable = myImportLayoutPanel.getImportLayoutTable(); AbstractTableModel model = (AbstractTableModel)importLayoutTable.getModel(); @@ -141,42 +144,46 @@ public class CodeStyleImportsPanel extends JPanel { } } - public void reset() { - reset(mySettings); - } - - public void apply(CodeStyleSettings settings) { + public void applyLayoutSettings(ImportsLayoutSettings settings) { stopTableEditing(); - settings.LAYOUT_STATIC_IMPORTS_SEPARATELY = myImportLayoutPanel.areStaticImportsEnabled(); - settings.USE_FQ_CLASS_NAMES = myCbUseFQClassNames.isSelected(); - settings.USE_SINGLE_CLASS_IMPORTS = myCbUseSingleClassImports.isSelected(); - settings.INSERT_INNER_CLASS_IMPORTS = myCbInsertInnerClassImports.isSelected(); + settings.setLayoutStaticImportsSeparately(myImportLayoutPanel.areStaticImportsEnabled()); + settings.setUseFqClassNames(myCbUseFQClassNames.isSelected()); + settings.setUseSingleClassImports(myCbUseSingleClassImports.isSelected()); + settings.setInsertInnerClassImports(myCbInsertInnerClassImports.isSelected()); try { - settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND = Integer.parseInt(myClassCountField.getText()); + int value = Integer.parseInt(myClassCountField.getText()); + settings.setClassCountToUseImportOnDemand(value); } catch (NumberFormatException e) { //just a bad number } try { - settings.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND = Integer.parseInt(myNamesCountField.getText()); + int value = Integer.parseInt(myNamesCountField.getText()); + settings.setNamesCountToUseImportOnDemand(value); } catch (NumberFormatException e) { //just a bad number } - final PackageEntryTable list = myImportLayoutPanel.getImportLayoutList(); - list.removeEmptyPackages(); - settings.IMPORT_LAYOUT_TABLE.copyFrom(list); - - myPackageList.removeEmptyPackages(); - settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND.copyFrom(myPackageList); - - myFqnInJavadocOption.apply(settings); + PackageEntryTable list = myImportLayoutPanel.getImportLayoutList(); + settings.getImportLayoutTable().copyFrom(getCopyWithoutEmptyPackages(list)); + settings.getPackagesToUseImportOnDemand().copyFrom(getCopyWithoutEmptyPackages(myPackageList)); } - public void apply() { - apply(mySettings); + public boolean isModifiedLayoutSettings(ImportsLayoutSettings settings) { + boolean isModified = isModified(myImportLayoutPanel.getCbLayoutStaticImportsSeparately(), settings.isLayoutStaticImportsSeparately()); + isModified |= isModified(myCbUseFQClassNames, settings.isUseFqClassNames()); + isModified |= isModified(myCbUseSingleClassImports, settings.isUseSingleClassImports()); + isModified |= isModified(myCbInsertInnerClassImports, settings.isInsertInnerClassImports()); + isModified |= isModified(myClassCountField, settings.getClassCountToUseImportOnDemand()); + isModified |= isModified(myNamesCountField, settings.getNamesCountToUseImportOnDemand()); + + PackageEntryTable list = myImportLayoutPanel.getImportLayoutList(); + isModified |= isModified(getCopyWithoutEmptyPackages(list), settings.getImportLayoutTable()); + isModified |= isModified(getCopyWithoutEmptyPackages(myPackageList), settings.getPackagesToUseImportOnDemand()); + + return isModified; } private void stopTableEditing() { @@ -184,23 +191,19 @@ public class CodeStyleImportsPanel extends JPanel { TableUtil.stopEditing(myPackageTable); } - public boolean isModified(CodeStyleSettings settings) { - boolean isModified = isModified(myImportLayoutPanel.getCbLayoutStaticImportsSeparately(), settings.LAYOUT_STATIC_IMPORTS_SEPARATELY); - isModified |= isModified(myCbUseFQClassNames, settings.USE_FQ_CLASS_NAMES); - isModified |= myFqnInJavadocOption.isModified(settings); - isModified |= isModified(myCbUseSingleClassImports, settings.USE_SINGLE_CLASS_IMPORTS); - isModified |= isModified(myCbInsertInnerClassImports, settings.INSERT_INNER_CLASS_IMPORTS); - isModified |= isModified(myClassCountField, settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND); - isModified |= isModified(myNamesCountField, settings.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND); - - isModified |= isModified(myImportLayoutPanel.getImportLayoutList(), settings.IMPORT_LAYOUT_TABLE); - isModified |= isModified(myPackageList, settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND); - - return isModified; + protected void fillCustomOptions(OptionGroup group) { } - public boolean isModified() { - return isModified(mySettings); + @NotNull + private static PackageEntryTable getCopyWithoutEmptyPackages(PackageEntryTable table) { + try { + PackageEntryTable copy = (PackageEntryTable)table.clone(); + copy.removeEmptyPackages(); + return copy; + } + catch (CloneNotSupportedException ignored) { + throw new IllegalStateException("Clone should be supported"); + } } private static boolean isModified(JTextField textField, int value) { @@ -213,7 +216,7 @@ public class CodeStyleImportsPanel extends JPanel { } } - private static boolean isModified(JCheckBox checkBox, boolean value) { + protected static boolean isModified(JCheckBox checkBox, boolean value) { return checkBox.isSelected() != value; } @@ -232,4 +235,4 @@ public class CodeStyleImportsPanel extends JPanel { return false; } -} +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelBaseForm.form similarity index 99% rename from java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form rename to java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelBaseForm.form index 7009dba79298..2c0f6bda66dc 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelBaseForm.form @@ -1,5 +1,5 @@ -
+ diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelWrapper.java b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelWrapper.java index a9c84bfa5ba6..9c51de5bd2b6 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelWrapper.java +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanelWrapper.java @@ -30,14 +30,13 @@ import javax.swing.*; */ public class CodeStyleImportsPanelWrapper extends CodeStyleAbstractPanel { - private final CodeStyleImportsPanel myImporsPanel; + private final JavaCodeStyleImportsPanel myImportsPanel; protected CodeStyleImportsPanelWrapper(CodeStyleSettings settings) { super(settings); - myImporsPanel = new CodeStyleImportsPanel(settings); + myImportsPanel = new JavaCodeStyleImportsPanel(); } - - + @Override protected int getRightMargin() { return 0; @@ -61,22 +60,22 @@ public class CodeStyleImportsPanelWrapper extends CodeStyleAbstractPanel { @Override public void apply(CodeStyleSettings settings) { - myImporsPanel.apply(settings); + myImportsPanel.apply(settings); } @Override public boolean isModified(CodeStyleSettings settings) { - return myImporsPanel.isModified(settings); + return myImportsPanel.isModified(settings); } @Override public JComponent getPanel() { - return myImporsPanel; + return myImportsPanel; } @Override protected void resetImpl(CodeStyleSettings settings) { - myImporsPanel.reset(settings); + myImportsPanel.reset(settings); } @Override diff --git a/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java b/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java index 79785eaddfd6..613675f20f83 100644 --- a/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java +++ b/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java @@ -33,9 +33,8 @@ public class FullyQualifiedNamesInJavadocOptionProvider { private JPanel myPanel; private ComboBox myComboBox; - public FullyQualifiedNamesInJavadocOptionProvider(@NotNull CodeStyleSettings settings) { + public FullyQualifiedNamesInJavadocOptionProvider() { composePanel(); - reset(settings); } public void reset(@NotNull CodeStyleSettings settings) { diff --git a/java/java-impl/src/com/intellij/application/options/JavaCodeStyleImportsPanel.java b/java/java-impl/src/com/intellij/application/options/JavaCodeStyleImportsPanel.java new file mode 100644 index 000000000000..c8739cc8fa3f --- /dev/null +++ b/java/java-impl/src/com/intellij/application/options/JavaCodeStyleImportsPanel.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2016 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 com.intellij.application.options; + +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.ui.OptionGroup; + +class JavaCodeStyleImportsPanel extends CodeStyleImportsPanelBase { + private FullyQualifiedNamesInJavadocOptionProvider myFqnInJavadocOption; + + @Override + protected void fillCustomOptions(OptionGroup group) { + myFqnInJavadocOption = new FullyQualifiedNamesInJavadocOptionProvider(); + group.add(myFqnInJavadocOption.getPanel()); + } + + @Override + public void apply(CodeStyleSettings settings) { + applyLayoutSettings(settings); + myFqnInJavadocOption.apply(settings); + } + + @Override + public void reset(CodeStyleSettings settings) { + resetLayoutSettings(settings); + myFqnInJavadocOption.reset(settings); + } + + @Override + public boolean isModified(CodeStyleSettings settings) { + return isModifiedLayoutSettings(settings) || myFqnInJavadocOption.isModified(settings); + } + +} \ No newline at end of file diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java index a460d7b28294..da0fafd28bf2 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java @@ -49,7 +49,7 @@ import java.util.*; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -public class CodeStyleSettings extends CommonCodeStyleSettings implements Cloneable, JDOMExternalizable { +public class CodeStyleSettings extends CommonCodeStyleSettings implements Cloneable, JDOMExternalizable, ImportsLayoutSettings { public static final int MAX_RIGHT_MARGIN = 1000; private static final Logger LOG = Logger.getInstance(CodeStyleSettings.class); @@ -278,8 +278,78 @@ public class CodeStyleSettings extends CommonCodeStyleSettings implements Clonea public int NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND = 3; public final PackageEntryTable PACKAGES_TO_USE_IMPORT_ON_DEMAND = new PackageEntryTable(); public final PackageEntryTable IMPORT_LAYOUT_TABLE = new PackageEntryTable(); + + @Override + public boolean isLayoutStaticImportsSeparately() { + return LAYOUT_STATIC_IMPORTS_SEPARATELY; + } -// endregion + @Override + public void setLayoutStaticImportsSeparately(boolean value) { + LAYOUT_STATIC_IMPORTS_SEPARATELY = value; + } + + @Override + public int getNamesCountToUseImportOnDemand() { + return NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND; + } + + @Override + public void setNamesCountToUseImportOnDemand(int value) { + NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND = value; + } + + @Override + public int getClassCountToUseImportOnDemand() { + return CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND; + } + + @Override + public void setClassCountToUseImportOnDemand(int value) { + CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND = value; + } + + @Override + public boolean isInsertInnerClassImports() { + return INSERT_INNER_CLASS_IMPORTS; + } + + @Override + public void setInsertInnerClassImports(boolean value) { + INSERT_INNER_CLASS_IMPORTS = value; + } + + @Override + public boolean isUseSingleClassImports() { + return USE_SINGLE_CLASS_IMPORTS; + } + + @Override + public void setUseSingleClassImports(boolean value) { + USE_SINGLE_CLASS_IMPORTS = value; + } + + @Override + public boolean isUseFqClassNames() { + return USE_FQ_CLASS_NAMES; + } + + @Override + public void setUseFqClassNames(boolean value) { + USE_FQ_CLASS_NAMES = value; + } + + @Override + public PackageEntryTable getImportLayoutTable() { + return IMPORT_LAYOUT_TABLE; + } + + @Override + public PackageEntryTable getPackagesToUseImportOnDemand() { + return PACKAGES_TO_USE_IMPORT_ON_DEMAND; + } + + // endregion // region ORDER OF MEMBERS diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/ImportsLayoutSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/ImportsLayoutSettings.java new file mode 100644 index 000000000000..325a1f5a6603 --- /dev/null +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/ImportsLayoutSettings.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2017 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 com.intellij.psi.codeStyle; + +public interface ImportsLayoutSettings { + boolean isLayoutStaticImportsSeparately(); + void setLayoutStaticImportsSeparately(boolean value); + int getNamesCountToUseImportOnDemand(); + void setNamesCountToUseImportOnDemand(int value); + int getClassCountToUseImportOnDemand(); + void setClassCountToUseImportOnDemand(int value); + boolean isInsertInnerClassImports(); + void setInsertInnerClassImports(boolean value); + boolean isUseSingleClassImports(); + void setUseSingleClassImports(boolean value); + boolean isUseFqClassNames(); + void setUseFqClassNames(boolean value); + PackageEntryTable getImportLayoutTable(); + PackageEntryTable getPackagesToUseImportOnDemand(); +} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.form b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.form deleted file mode 100644 index ba7e9161780a..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.form +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.java index 0f6567bd6bf3..439ed42c865a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanel.java @@ -15,208 +15,48 @@ */ package org.jetbrains.plugins.groovy.codeStyle; -import com.intellij.application.options.ImportLayoutPanel; -import com.intellij.application.options.PackagePanel; +import com.intellij.application.options.CodeStyleImportsPanelBase; import com.intellij.openapi.application.ApplicationBundle; -import com.intellij.psi.codeStyle.PackageEntry; -import com.intellij.psi.codeStyle.PackageEntryTable; +import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.ui.*; -import com.intellij.ui.table.JBTable; import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import java.awt.*; /** * @author Max Medvedev */ -public class GrCodeStyleImportsPanel extends JPanel { - private JCheckBox myCbUseFQClassNames; +public class GrCodeStyleImportsPanel extends CodeStyleImportsPanelBase { private JCheckBox myCbUseFQClassNamesInJavaDoc; - private JCheckBox myCbUseSingleClassImports; - private JCheckBox myCbInsertInnerClassImports; - private JTextField myClassCountField; - private JTextField myNamesCountField; - private final PackageEntryTable myPackageList = new PackageEntryTable(); - - private JBTable myPackageTable; - - private JPanel myGeneralPanel; - private JPanel myPackagesPanel; - private JPanel myImportsLayoutPanel; - private JPanel myWholePanel; - private ImportLayoutPanel myImportLayoutPanel; - - public GrCodeStyleImportsPanel() { - setLayout(new BorderLayout()); - add(myWholePanel, BorderLayout.CENTER); - - myGeneralPanel.add(createGeneralOptionsPanel(), BorderLayout.CENTER); - createImportPanel(); - createPackagePanel(); - } - - private void createImportPanel() { - myImportLayoutPanel = new ImportLayoutPanel() { - @Override - public void refresh() { - refreshTable(myPackageTable, myPackageList); - refreshTable(getImportLayoutTable(), getImportLayoutList()); - } - }; - myImportsLayoutPanel.add(myImportLayoutPanel, BorderLayout.CENTER); - } - - private void createPackagePanel() { - myPackageTable = ImportLayoutPanel.createTableForPackageEntries(myPackageList, myImportLayoutPanel); - myPackagesPanel.add(PackagePanel.createPackagesPanel(myPackageTable, myPackageList), BorderLayout.CENTER); - } - - private JPanel createGeneralOptionsPanel() { - OptionGroup group = new OptionGroup(ApplicationBundle.message("title.general")); - myCbUseSingleClassImports = new JCheckBox(ApplicationBundle.message("checkbox.use.single.class.import")); - group.add(myCbUseSingleClassImports); - - myCbUseFQClassNames = new JCheckBox(ApplicationBundle.message("checkbox.use.fully.qualified.class.names")); - group.add(myCbUseFQClassNames); - - myCbInsertInnerClassImports = new JCheckBox(ApplicationBundle.message("checkbox.insert.imports.for.inner.classes")); - group.add(myCbInsertInnerClassImports); - + + @Override + protected void fillCustomOptions(OptionGroup group) { myCbUseFQClassNamesInJavaDoc = new JCheckBox(ApplicationBundle.message("checkbox.use.fully.qualified.class.names.in.javadoc")); group.add(myCbUseFQClassNamesInJavaDoc); - - myClassCountField = new JTextField(3); - myNamesCountField = new JTextField(3); - final JPanel panel = new JPanel(new GridBagLayout()); - 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)); - 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)); - 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)); - 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)); - - group.add(panel); - return group.createPanel(); } - private void refreshTable(final JBTable table, final PackageEntryTable packageTable) { - AbstractTableModel model = (AbstractTableModel)table.getModel(); - table.createDefaultColumnsFromModel(); - model.fireTableDataChanged(); - ImportLayoutPanel.resizeColumns(packageTable, table, myImportLayoutPanel.areStaticImportsEnabled()); + @Override + public void apply(CodeStyleSettings settings) { + GroovyCodeStyleSettings groovySettings = getGroovySettings(settings); + applyLayoutSettings(groovySettings); + groovySettings.USE_FQ_CLASS_NAMES_IN_JAVADOC = myCbUseFQClassNamesInJavaDoc.isSelected(); } - public void reset(GroovyCodeStyleSettings settings) { - myCbUseFQClassNames.setSelected(settings.USE_FQ_CLASS_NAMES); - myCbUseFQClassNamesInJavaDoc.setSelected(settings.USE_FQ_CLASS_NAMES_IN_JAVADOC); - myCbUseSingleClassImports.setSelected(settings.USE_SINGLE_CLASS_IMPORTS); - myCbInsertInnerClassImports.setSelected(settings.INSERT_INNER_CLASS_IMPORTS); - myClassCountField.setText(Integer.toString(settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND)); - myNamesCountField.setText(Integer.toString(settings.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND)); - - myImportLayoutPanel.getImportLayoutList().copyFrom(settings.IMPORT_LAYOUT_TABLE); - myPackageList.copyFrom(settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND); - - myImportLayoutPanel.getCbLayoutStaticImportsSeparately().setSelected(settings.LAYOUT_STATIC_IMPORTS_SEPARATELY); - - final JBTable importLayoutTable = myImportLayoutPanel.getImportLayoutTable(); - AbstractTableModel model = (AbstractTableModel)importLayoutTable.getModel(); - model.fireTableDataChanged(); - - model = (AbstractTableModel)myPackageTable.getModel(); - model.fireTableDataChanged(); - - if (importLayoutTable.getRowCount() > 0) { - importLayoutTable.getSelectionModel().setSelectionInterval(0, 0); - } - if (myPackageTable.getRowCount() > 0) { - myPackageTable.getSelectionModel().setSelectionInterval(0, 0); - } + private static GroovyCodeStyleSettings getGroovySettings(CodeStyleSettings settings) { + return settings.getCustomSettings(GroovyCodeStyleSettings.class); } - public void apply(GroovyCodeStyleSettings settings) { - stopTableEditing(); - - settings.LAYOUT_STATIC_IMPORTS_SEPARATELY = myImportLayoutPanel.areStaticImportsEnabled(); - settings.USE_FQ_CLASS_NAMES = myCbUseFQClassNames.isSelected(); - settings.USE_FQ_CLASS_NAMES_IN_JAVADOC = myCbUseFQClassNamesInJavaDoc.isSelected(); - settings.USE_SINGLE_CLASS_IMPORTS = myCbUseSingleClassImports.isSelected(); - settings.INSERT_INNER_CLASS_IMPORTS = myCbInsertInnerClassImports.isSelected(); - try { - settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND = Integer.parseInt(myClassCountField.getText()); - } - catch (NumberFormatException e) { - //just a bad number - } - try { - settings.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND = Integer.parseInt(myNamesCountField.getText()); - } - catch (NumberFormatException e) { - //just a bad number - } - - final PackageEntryTable list = myImportLayoutPanel.getImportLayoutList(); - list.removeEmptyPackages(); - settings.IMPORT_LAYOUT_TABLE.copyFrom(list); - - myPackageList.removeEmptyPackages(); - settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND.copyFrom(myPackageList); + @Override + public void reset(CodeStyleSettings settings) { + GroovyCodeStyleSettings groovySettings = getGroovySettings(settings); + resetLayoutSettings(groovySettings); + myCbUseFQClassNamesInJavaDoc.setSelected(groovySettings.USE_FQ_CLASS_NAMES_IN_JAVADOC); } - private void stopTableEditing() { - TableUtil.stopEditing(myImportLayoutPanel.getImportLayoutTable()); - TableUtil.stopEditing(myPackageTable); - } - - public boolean isModified(GroovyCodeStyleSettings settings) { - boolean isModified = isModified(myImportLayoutPanel.getCbLayoutStaticImportsSeparately(), settings.LAYOUT_STATIC_IMPORTS_SEPARATELY); - isModified |= isModified(myCbUseFQClassNames, settings.USE_FQ_CLASS_NAMES); - isModified |= isModified(myCbUseFQClassNamesInJavaDoc, settings.USE_FQ_CLASS_NAMES_IN_JAVADOC); - isModified |= isModified(myCbUseSingleClassImports, settings.USE_SINGLE_CLASS_IMPORTS); - isModified |= isModified(myCbInsertInnerClassImports, settings.INSERT_INNER_CLASS_IMPORTS); - isModified |= isModified(myClassCountField, settings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND); - isModified |= isModified(myNamesCountField, settings.NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND); - - isModified |= isModified(myImportLayoutPanel.getImportLayoutList(), settings.IMPORT_LAYOUT_TABLE); - isModified |= isModified(myPackageList, settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND); - - return isModified; - } - - private static boolean isModified(JTextField textField, int value) { - try { - int fieldValue = Integer.parseInt(textField.getText().trim()); - return fieldValue != value; - } - catch (NumberFormatException e) { - return false; - } - } - - private static boolean isModified(JCheckBox checkBox, boolean value) { - return checkBox.isSelected() != value; - } - - private static boolean isModified(PackageEntryTable list, PackageEntryTable table) { - if (list.getEntryCount() != table.getEntryCount()) { - return true; - } - - for (int i = 0; i < list.getEntryCount(); i++) { - PackageEntry entry1 = list.getEntryAt(i); - PackageEntry entry2 = table.getEntryAt(i); - if (!entry1.equals(entry2)) { - return true; - } - } - - return false; + @Override + public boolean isModified(CodeStyleSettings settings) { + GroovyCodeStyleSettings grSettings = getGroovySettings(settings); + return isModified(myCbUseFQClassNamesInJavaDoc, grSettings.USE_FQ_CLASS_NAMES_IN_JAVADOC) + || isModifiedLayoutSettings(grSettings); } + } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanelWrapper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanelWrapper.java index fae1dc5ea0b1..c428671034be 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanelWrapper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GrCodeStyleImportsPanelWrapper.java @@ -62,12 +62,12 @@ public class GrCodeStyleImportsPanelWrapper extends CodeStyleAbstractPanel { @Override public void apply(CodeStyleSettings settings) { - myImportsPanel.apply(settings.getCustomSettings(GroovyCodeStyleSettings.class)); + myImportsPanel.apply(settings); } @Override public boolean isModified(CodeStyleSettings settings) { - return myImportsPanel.isModified(settings.getCustomSettings(GroovyCodeStyleSettings.class)); + return myImportsPanel.isModified(settings); } @Override @@ -77,7 +77,7 @@ public class GrCodeStyleImportsPanelWrapper extends CodeStyleAbstractPanel { @Override protected void resetImpl(CodeStyleSettings settings) { - myImportsPanel.reset(settings.getCustomSettings(GroovyCodeStyleSettings.class)); + myImportsPanel.reset(settings); } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GroovyCodeStyleSettings.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GroovyCodeStyleSettings.java index ca788aa5f883..5206370df971 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GroovyCodeStyleSettings.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeStyle/GroovyCodeStyleSettings.java @@ -20,7 +20,7 @@ import com.intellij.psi.codeStyle.*; /** * @author Max Medvedev */ -public class GroovyCodeStyleSettings extends CustomCodeStyleSettings { +public class GroovyCodeStyleSettings extends CustomCodeStyleSettings implements ImportsLayoutSettings { /** * Defines if 'flying geese' style should be used for curly braces formatting, e.g. if we want to format code like *

@@ -79,4 +79,75 @@ public class GroovyCodeStyleSettings extends CustomCodeStyleSettings { initImportsByDefault(); } + + @Override + public int getNamesCountToUseImportOnDemand() { + return NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND; + } + + @Override + public void setNamesCountToUseImportOnDemand(int value) { + NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND = value; + } + + @Override + public int getClassCountToUseImportOnDemand() { + return CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND; + } + + @Override + public void setClassCountToUseImportOnDemand(int value) { + CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND = value; + } + + @Override + public boolean isInsertInnerClassImports() { + return INSERT_INNER_CLASS_IMPORTS; + } + + @Override + public void setInsertInnerClassImports(boolean value) { + INSERT_INNER_CLASS_IMPORTS = value; + } + + @Override + public boolean isUseSingleClassImports() { + return USE_SINGLE_CLASS_IMPORTS; + } + + @Override + public void setUseSingleClassImports(boolean value) { + USE_SINGLE_CLASS_IMPORTS = value; + } + + @Override + public boolean isUseFqClassNames() { + return USE_FQ_CLASS_NAMES; + } + + @Override + public void setUseFqClassNames(boolean value) { + USE_FQ_CLASS_NAMES = value; + } + + @Override + public PackageEntryTable getImportLayoutTable() { + return IMPORT_LAYOUT_TABLE; + } + + @Override + public PackageEntryTable getPackagesToUseImportOnDemand() { + return PACKAGES_TO_USE_IMPORT_ON_DEMAND; + } + + @Override + public boolean isLayoutStaticImportsSeparately() { + return LAYOUT_STATIC_IMPORTS_SEPARATELY; + } + + @Override + public void setLayoutStaticImportsSeparately(boolean value) { + LAYOUT_STATIC_IMPORTS_SEPARATELY = value; + } + }