diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java index 1338616ad535..2bdcd287fa72 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java @@ -19,6 +19,7 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StoragePathMacros; +import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; @@ -28,8 +29,7 @@ import org.jetbrains.java.generate.template.TemplateResource; import org.jetbrains.java.generate.template.TemplatesManager; import java.io.IOException; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.*; @State( name = "EqualsHashCodeTemplates", @@ -83,11 +83,19 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { } public TemplateResource getDefaultEqualsTemplate() { - return getDefaultTemplate(EQUALS_SUFFIX, HASH_CODE_SUFFIX); + return getEqualsTemplate(getDefaultTemplate()); } public TemplateResource getDefaultHashcodeTemplate() { - return getDefaultTemplate(HASH_CODE_SUFFIX, EQUALS_SUFFIX); + return getHashcodeTemplate(getDefaultTemplate()); + } + + public TemplateResource getEqualsTemplate(TemplateResource template) { + return getDefaultTemplate(EQUALS_SUFFIX, HASH_CODE_SUFFIX, template); + } + + public TemplateResource getHashcodeTemplate(TemplateResource template) { + return getDefaultTemplate(HASH_CODE_SUFFIX, EQUALS_SUFFIX, template); } public String[] getTemplateNames() { @@ -99,12 +107,11 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { } @NotNull - private String getTemplateBaseName(TemplateResource resource) { + public static String getTemplateBaseName(TemplateResource resource) { return StringUtil.trimEnd(StringUtil.trimEnd(resource.getFileName(), EQUALS_SUFFIX), HASH_CODE_SUFFIX).trim(); } - private TemplateResource getDefaultTemplate(String selfSuffix, String oppositeSuffix) { - final TemplateResource defaultTemplate = getDefaultTemplate(); + private TemplateResource getDefaultTemplate(String selfSuffix, String oppositeSuffix, TemplateResource defaultTemplate) { final String fileName = defaultTemplate.getFileName(); if (fileName.endsWith(selfSuffix)) { return defaultTemplate; @@ -132,4 +139,30 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { public String getDefaultTemplateBaseName() { return getTemplateBaseName(getDefaultTemplate()); } + + public static String toEqualsName(String name) { + return name + " " + EQUALS_SUFFIX; + } + + public static String toHashCodeName(String name) { + return name + " " + HASH_CODE_SUFFIX; + } + + public Collection> getTemplateCouples() { + final LinkedHashMap> resources = new LinkedHashMap>(); + for (TemplateResource resource : getAllTemplates()) { + final String baseName = getTemplateBaseName(resource); + TemplateResource eq = toEqualsName(baseName).equals(resource.getFileName()) ? resource : null; + TemplateResource hc = toHashCodeName(baseName).equals(resource.getFileName()) ? resource : null; + final Couple couple = resources.get(baseName); + if (couple != null) { + resources.put(baseName, Couple.of(couple.first != null ? couple.first : eq, + couple.second != null ? couple.second : hc)); + } + else { + resources.put(baseName, Couple.of(eq, hc)); + } + } + return resources.values(); + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java b/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java new file mode 100644 index 000000000000..144c8da3586e --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java @@ -0,0 +1,204 @@ +/* + * Copyright 2000-2015 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.codeInsight.generation.ui; + +import com.intellij.codeInsight.generation.EqualsHashCodeTemplatesManager; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.UnnamedConfigurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.NamedItemsListEditor; +import com.intellij.openapi.ui.Namer; +import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.util.Cloner; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Couple; +import com.intellij.openapi.util.Factory; +import com.intellij.ui.TitledSeparator; +import gnu.trove.Equality; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.java.generate.template.TemplateResource; +import org.jetbrains.java.generate.view.GenerateTemplateConfigurable; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +public class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor> { + private static final Namer> NAMER = new Namer>() { + + @Override + public String getName(Couple couple) { + return EqualsHashCodeTemplatesManager.getTemplateBaseName(couple.first); + } + + @Override + public boolean canRename(Couple item) { + return !item.first.isDefault(); + } + + @Override + public void setName(Couple couple, String name) { + couple.first.setFileName(EqualsHashCodeTemplatesManager.toEqualsName(name)); + couple.second.setFileName(EqualsHashCodeTemplatesManager.toHashCodeName(name)); + } + }; + + private static final Factory> FACTORY = new Factory>() { + @Override + public Couple create() { + return Couple.of(new TemplateResource(), new TemplateResource()); + } + }; + + private static final Cloner> CLONER = new Cloner>() { + @Override + public Couple cloneOf(Couple couple) { + if (couple.first.isDefault()) return couple; + return copyOf(couple); + } + + @Override + public Couple copyOf(Couple couple) { + return Couple.of(copyOf(couple.first), copyOf(couple.second)); + } + + @NotNull + private TemplateResource copyOf(TemplateResource resource) { + TemplateResource result = new TemplateResource(); + result.setFileName(resource.getFileName()); + result.setTemplate(resource.getTemplate()); + return result; + } + }; + + private static final Equality> COMPARER = new Equality>() { + @Override + public boolean equals(Couple o1, Couple o2) { + return equals(o1.first, o2.first) && equals(o1.second, o2.second); + } + + private boolean equals(TemplateResource r1, TemplateResource r2) { + return Comparing.equal(r1.getTemplate(), r2.getTemplate()) && Comparing.equal(r1.getFileName(), r2.getFileName()); + } + }; + private final Project myProject; + private final EqualsHashCodeTemplatesManager myManager; + + public EqualsHashCodeTemplatesPanel(Project project, EqualsHashCodeTemplatesManager manager) { + super(NAMER, FACTORY, CLONER, COMPARER, new ArrayList>(manager.getTemplateCouples())); + myProject = project; + myManager = manager; + } + + @Nls + public String getDisplayName() { + return "Templates"; + } + + @Override + protected String subjDisplayName() { + return "template"; + } + + @Nullable + @NonNls + public String getHelpTopic() { + return null; + } + + @Override + public boolean isModified() { + return super.isModified() || !Comparing.equal(myManager.getDefaultTemplate(), getSelectedItem().first); + } + + @Override + protected boolean canDelete(Couple item) { + return !item.first.isDefault(); + } + + @Override + protected UnnamedConfigurable createConfigurable(Couple item) { + final GenerateTemplateConfigurable equalsConfigurable = new GenerateTemplateConfigurable(item.first, myProject); + final GenerateTemplateConfigurable hashCodeConfigurable = new GenerateTemplateConfigurable(item.second, myProject); + return new UnnamedConfigurable() { + @Nullable + @Override + public JComponent createComponent() { + final Splitter splitter = new Splitter(true); + + final JPanel eqPanel = new JPanel(new BorderLayout()); + eqPanel.add(new TitledSeparator("Equals Template:"), BorderLayout.NORTH); + final JComponent eqPane = equalsConfigurable.createComponent(); + eqPane.setPreferredSize(new Dimension(300, 200)); + eqPanel.add(eqPane, BorderLayout.CENTER); + splitter.setFirstComponent(eqPanel); + + final JPanel hcPanel = new JPanel(new BorderLayout()); + hcPanel.add(new TitledSeparator("HashCode Template:"), BorderLayout.NORTH); + final JComponent hcPane = hashCodeConfigurable.createComponent(); + hcPane.setPreferredSize(new Dimension(300, 200)); + hcPanel.add(hcPane, BorderLayout.CENTER); + splitter.setSecondComponent(hcPanel); + + return splitter; + } + + @Override + public boolean isModified() { + return equalsConfigurable.isModified() || hashCodeConfigurable.isModified(); + } + + @Override + public void apply() throws ConfigurationException { + equalsConfigurable.apply(); + hashCodeConfigurable.apply(); + } + + @Override + public void reset() { + equalsConfigurable.reset(); + hashCodeConfigurable.reset(); + } + + @Override + public void disposeUIResources() { + equalsConfigurable.disposeUIResources(); + hashCodeConfigurable.disposeUIResources(); + } + }; + } + + @Override + public void apply() throws ConfigurationException { + super.apply(); + List resources = new ArrayList(); + for (Couple resource : getItems()) { + resources.add(resource.first); + resources.add(resource.second); + } + myManager.setTemplates(resources); + + final Couple selection = getSelectedItem(); + if (selection != null) { + myManager.setDefaultTemplate(selection.first); + } + } +} + diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java b/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java index 26677c86f572..5261839f25ad 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java @@ -22,10 +22,12 @@ import com.intellij.codeInsight.generation.EqualsHashCodeTemplatesManager; import com.intellij.codeInsight.generation.GenerateEqualsHelper; import com.intellij.ide.wizard.StepAdapter; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.JavaVersionService; import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.ui.VerticalFlowLayout; import com.intellij.psi.*; import com.intellij.refactoring.classMembers.AbstractMemberInfoModel; @@ -251,7 +253,7 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard comboBoxWithBrowseButton = new ComponentWithBrowseButton(comboBox, + new MyEditTemplatesListener(project, myPanel, comboBox)); final EqualsHashCodeTemplatesManager manager = EqualsHashCodeTemplatesManager.getInstance(); comboBox.setModel(new DefaultComboBoxModel(manager.getTemplateNames())); comboBox.setSelectedItem(manager.getDefaultTemplateBaseName()); @@ -358,11 +367,7 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard