SSR: improve "template save as" api

This commit is contained in:
Bas Leijdekkers
2017-06-21 19:26:29 +02:00
parent fa289dfa4c
commit afbd913719
4 changed files with 58 additions and 78 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 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.
@@ -71,18 +71,10 @@ public class SSBasedInspectionOptions {
if (!dialog.showAndGet()) {
return;
}
Configuration configuration = dialog.getConfiguration();
if (configuration.getName() == null || configuration.getName().equals(SearchDialog.USER_DEFINED)) {
String name = dialog.showSaveTemplateAsDialog();
if (name != null) {
name = ConfigurationManager.findAppropriateName(myConfigurations, name, dialog.getProject());
}
if (name == null) return;
configuration.setName(name);
if (!ConfigurationManager.showSaveTemplateAsDialog(myConfigurations, dialog.getConfiguration(), dialog.getProject())) {
return;
}
myConfigurations.add(configuration);
configurationsChanged(dialog.getSearchContext());
}
@@ -253,8 +245,7 @@ public class SSBasedInspectionOptions {
}
final Configuration newConfiguration = dialog.getConfiguration();
final int index = myConfigurations.indexOf(configuration);
myConfigurations.remove(index);
myConfigurations.add(index, newConfiguration);
myConfigurations.set(index, newConfiguration);
final SearchContext context = dialog.getSearchContext();
SSBasedInspectionCompiledPatternsCache.removeFromCache(configuration, context.getProject());
configurationsChanged(context);
@@ -15,7 +15,6 @@
*/
package com.intellij.structuralsearch.plugin.ui;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
@@ -43,11 +42,16 @@ public class ConfigurationManager implements PersistentStateComponent<Element> {
private final List<Configuration> configurations = new SmartList<>();
private final List<Configuration> historyConfigurations = new SmartList<>();
private final Project myProject;
public static ConfigurationManager getInstance(@NotNull Project project) {
return ServiceManager.getService(project, ConfigurationManager.class);
}
public ConfigurationManager(Project project) {
myProject = project;
}
@Override
public Element getState() {
final Element state = new Element("state");
@@ -72,11 +76,6 @@ public class ConfigurationManager implements PersistentStateComponent<Element> {
historyConfigurations.remove(configuration);
}
public void addConfiguration(Configuration configuration) {
configurations.remove(configuration);
configurations.add(configuration);
}
public void removeConfiguration(Configuration configuration) {
configurations.remove(configuration);
}
@@ -168,37 +167,46 @@ public class ConfigurationManager implements PersistentStateComponent<Element> {
return Collections.unmodifiableList(historyConfigurations);
}
@Nullable
public static String findAppropriateName(@NotNull final Collection<Configuration> configurations, @NotNull String _name,
@NotNull final Project project) {
public boolean showSaveTemplateAsDialog(@NotNull Configuration newConfiguration) {
return showSaveTemplateAsDialog(configurations, newConfiguration, myProject);
}
public static boolean showSaveTemplateAsDialog(@NotNull Collection<Configuration> configurations,
@NotNull Configuration newConfiguration,
@NotNull Project project) {
String name = showInputDialog(newConfiguration.getName(), project);
Configuration config;
String name = _name;
while ((config = findConfigurationByName(configurations, name)) != null) {
final int i = Messages.showYesNoDialog(
project,
SSRBundle.message("overwrite.message"),
SSRBundle.message("overwrite.title"),
AllIcons.General.QuestionDialog
);
if (i == Messages.YES) {
while ((config = findConfigurationByName(configurations, name)) != null && name != null) {
final int answer =
Messages.showYesNoDialog(
project,
SSRBundle.message("overwrite.message"),
SSRBundle.message("overwrite.title", name),
"Replace",
Messages.CANCEL_BUTTON,
Messages.getQuestionIcon()
);
if (answer == Messages.YES) {
configurations.remove(config);
break;
}
name = showSaveTemplateAsDialog(name, project);
if (name == null) break;
name = showInputDialog(name, project);
}
return name;
if (name != null) {
newConfiguration.setName(name);
configurations.add(newConfiguration);
return true;
}
return false;
}
@Nullable
public static String showSaveTemplateAsDialog(@NotNull String initial, @NotNull Project project) {
private static String showInputDialog(@NotNull String initial, @NotNull Project project) {
return Messages.showInputDialog(
project,
SSRBundle.message("template.name.button"),
SSRBundle.message("save.template.description.button"),
AllIcons.General.QuestionDialog,
Messages.getQuestionIcon(),
initial,
new NonEmptyInputValidator()
);
@@ -575,29 +575,16 @@ public class SearchDialog extends DialogWrapper {
@Override
public void actionPerformed(ActionEvent e) {
String name = showSaveTemplateAsDialog();
final Project project = searchContext.getProject();
final ConfigurationManager configurationManager = ConfigurationManager.getInstance(project);
if (name != null) {
final Project project = searchContext.getProject();
final ConfigurationManager configurationManager = ConfigurationManager.getInstance(project);
final Collection<Configuration> configurations = configurationManager.getConfigurations();
if (configurations != null) {
name = ConfigurationManager.findAppropriateName(configurations, name, project);
if (name == null) return;
}
final Configuration configuration = model.getConfig();
model = new SearchModel(createConfiguration());
model.setShadowConfig(configuration);
configuration.setName(name);
setValuesToConfig(configuration);
setDialogTitle(configuration);
filterOutUnusedVariableConstraints(configuration);
configurationManager.addConfiguration(configuration);
existingTemplatesComponent.setUserTemplates(configurationManager);
final Configuration configuration = getConfiguration();
if (!configurationManager.showSaveTemplateAsDialog(configuration)) {
return;
}
setDialogTitle(configuration);
existingTemplatesComponent.setUserTemplates(configurationManager);
}
})
);
@@ -688,13 +675,6 @@ public class SearchDialog extends DialogWrapper {
return searchContext.getProject();
}
public String showSaveTemplateAsDialog() {
return ConfigurationManager.showSaveTemplateAsDialog(
model.getShadowConfig() != null ? model.getShadowConfig().getName() : SSRBundle.message("user.defined.category"),
searchContext.getProject()
);
}
protected boolean isReplaceDialog() {
return false;
}
@@ -759,8 +739,7 @@ public class SearchDialog extends DialogWrapper {
final Configuration configuration = model.getConfig();
if (model.getShadowConfig() != null) {
if (model.getShadowConfig().isPredefined()) {
configuration.setName(model.getShadowConfig().getName()
);
configuration.setName(model.getShadowConfig().getName());
} //else {
// // user template, save it
// setValuesToConfig(model.getShadowConfig());
@@ -787,7 +766,13 @@ public class SearchDialog extends DialogWrapper {
}
public Configuration getConfiguration() {
return model.getConfig();
final Configuration config = model.getConfig();
if (config.getName().equals(USER_DEFINED) && model.getShadowConfig() != null) {
config.setName(model.getShadowConfig().getName());
}
filterOutUnusedVariableConstraints(config);
setValuesToConfig(config);
return config;
}
private SearchScope getSelectedScope() {
@@ -796,23 +781,20 @@ public class SearchDialog extends DialogWrapper {
protected boolean isValid() {
setValuesToConfig(model.getConfig());
boolean result = true;
try {
Matcher.validate(searchContext.getProject(), model.getConfig().getMatchOptions());
}
catch (MalformedPatternException ex) {
if (myRunFindActionOnClose) {
reportMessage("this.pattern.is.malformed.message", searchCriteriaEdit, (ex.getMessage() != null) ? ex.getMessage() : "");
result = false;
return false;
}
}
catch (UnsupportedPatternException ex) {
reportMessage("this.pattern.is.unsupported.message", searchCriteriaEdit, ex.getMessage());
result = false;
return false;
}
return result;
return true;
}
protected void reportMessage(@NonNls final String messageId, final Editor editor, final Object... params) {
@@ -826,7 +808,6 @@ public class SearchDialog extends DialogWrapper {
}
protected void setValuesToConfig(Configuration config) {
MatchOptions options = config.getMatchOptions();
boolean searchWithinHierarchy = IdeBundle.message("scope.class.hierarchy").equals(myScopeChooserCombo.getSelectedScopeName());
@@ -229,8 +229,8 @@ SSRInspection.add.search.template.button=Add Search Template...
SSRInspection.add.replace.template.button=Add Replace Template...
SSRInspection.selected.templates=Selected templates:
status.message=Status:
overwrite.message=Confirm overwrite configuration with the same name
overwrite.title=Confirm Overwrite Saved Configuration
overwrite.message=A template with the same name already exists. Replacing it will overwrite its current contents.
overwrite.title="{0}" Exists, Replace?
ssr.will.not.find.anything=It does not match anything in selected scope
predefined.configuration.class.static.blocks=static blocks in class
predefined.configuration.class.instance.initialization.blocks=instance initialization blocks