[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

This commit is contained in:
Yaroslav Lepenkin
2017-02-16 11:36:47 +03:00
parent 8a0decded2
commit 1000f4ac62
11 changed files with 321 additions and 313 deletions
@@ -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;
}
}
}
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.application.options.CodeStyleImportsPanel">
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.application.options.CodeStyleImportsPanelBase">
<grid id="27dc6" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
@@ -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
@@ -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) {
@@ -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);
}
}
@@ -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
@@ -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();
}
@@ -1,54 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.plugins.groovy.codeStyle.GrCodeStyleImportsPanel">
<grid id="27dc6" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="25" y="44" width="495" height="272"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<scrollpane id="cb09e" class="com.intellij.ui.components.JBScrollPane">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<grid id="72ab4" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="10" bottom="10" right="10"/>
<constraints/>
<properties/>
<border type="none"/>
<children>
<grid id="27541" binding="myPackagesPanel" layout-manager="BorderLayout" hgap="-1" vgap="-1">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
<grid id="ff1de" binding="myImportsLayoutPanel" layout-manager="BorderLayout" hgap="-1" vgap="-1">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
<grid id="861ec" binding="myGeneralPanel" layout-manager="BorderLayout" hgap="-1" vgap="-1">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
</children>
</grid>
</children>
</scrollpane>
</children>
</grid>
</form>
@@ -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);
}
}
@@ -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
@@ -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
* <p/>
@@ -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;
}
}