summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/inspection/highlightTemplate/SSBasedInspectionOptions.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/inspection/highlightTemplate/SSBasedInspectionOptions.java')
-rw-r--r--platform/structuralsearch/source/com/intellij/structuralsearch/inspection/highlightTemplate/SSBasedInspectionOptions.java256
1 files changed, 256 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/inspection/highlightTemplate/SSBasedInspectionOptions.java b/platform/structuralsearch/source/com/intellij/structuralsearch/inspection/highlightTemplate/SSBasedInspectionOptions.java
new file mode 100644
index 000000000000..8dd7211eefb4
--- /dev/null
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/inspection/highlightTemplate/SSBasedInspectionOptions.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2000-2014 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.structuralsearch.inspection.highlightTemplate;
+
+import com.intellij.ide.DataManager;
+import com.intellij.openapi.actionSystem.ActionManager;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.ui.popup.JBPopupFactory;
+import com.intellij.structuralsearch.SSRBundle;
+import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration;
+import com.intellij.structuralsearch.plugin.replace.ui.ReplaceDialog;
+import com.intellij.structuralsearch.plugin.ui.*;
+import com.intellij.ui.AnActionButton;
+import com.intellij.ui.AnActionButtonRunnable;
+import com.intellij.ui.DoubleClickListener;
+import com.intellij.ui.ToolbarDecorator;
+import com.intellij.ui.components.JBList;
+import org.jdom.Element;
+import org.jetbrains.annotations.NonNls;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author cdr
+ */
+public class SSBasedInspectionOptions {
+ private JBList myTemplatesList;
+ // for externalization
+ private final List<Configuration> myConfigurations;
+
+ public SSBasedInspectionOptions(final List<Configuration> configurations) {
+ myConfigurations = configurations;
+ myTemplatesList = new JBList(new MyListModel());
+ myTemplatesList.setCellRenderer(new DefaultListCellRenderer() {
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+ JLabel component = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ Configuration configuration = myConfigurations.get(index);
+ component.setText(configuration.getName());
+ return component;
+ }
+ });
+ }
+
+ private static void copyConfiguration(final Configuration configuration, final Configuration newConfiguration) {
+ @NonNls Element temp = new Element("temp");
+ configuration.writeExternal(temp);
+ newConfiguration.readExternal(temp);
+ }
+
+ interface SearchDialogFactory {
+ SearchDialog createDialog(SearchContext searchContext);
+ }
+
+ private void addTemplate(SearchDialogFactory searchDialogFactory) {
+ SearchDialog dialog = createDialog(searchDialogFactory);
+ dialog.show();
+ if (!dialog.isOK()) 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);
+ }
+ myConfigurations.add(configuration);
+
+ configurationsChanged(dialog.getSearchContext());
+ }
+
+ private static SearchDialog createDialog(final SearchDialogFactory searchDialogFactory) {
+ SearchContext searchContext = createSearchContext();
+ return searchDialogFactory.createDialog(searchContext);
+ }
+
+ private static SearchContext createSearchContext() {
+ AnActionEvent event = new AnActionEvent(null, DataManager.getInstance().getDataContext(),
+ "", new DefaultActionGroup().getTemplatePresentation(), ActionManager.getInstance(), 0);
+ return SearchContext.buildFromDataContext(event.getDataContext());
+ }
+
+ public void configurationsChanged(final SearchContext searchContext) {
+ ((MyListModel)myTemplatesList.getModel()).fireContentsChanged();
+ }
+
+ public JPanel getComponent() {
+ JPanel panel = new JPanel(new BorderLayout());
+ panel.add(new JLabel(SSRBundle.message("SSRInspection.selected.templates")));
+ panel.add(
+ ToolbarDecorator.createDecorator(myTemplatesList)
+ .setAddAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ final AnAction[] children = new AnAction[]{
+ new AnAction(SSRBundle.message("SSRInspection.add.search.template.button")) {
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ addTemplate(new SearchDialogFactory() {
+ public SearchDialog createDialog(SearchContext searchContext) {
+ return new SearchDialog(searchContext, false, false);
+ }
+ });
+ }
+ },
+ new AnAction(SSRBundle.message("SSRInspection.add.replace.template.button")) {
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ addTemplate(new SearchDialogFactory() {
+ public SearchDialog createDialog(SearchContext searchContext) {
+ return new ReplaceDialog(searchContext, false, false);
+ }
+ });
+ }
+ }
+ };
+ JBPopupFactory.getInstance().createActionGroupPopup(null, new DefaultActionGroup(children),
+ DataManager.getInstance()
+ .getDataContext(button.getContextComponent()),
+ JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, true)
+ .show(button.getPreferredPopupPoint());
+ }
+ }).setEditAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ performEditAction();
+ }
+ }).setRemoveAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ Object[] selected = myTemplatesList.getSelectedValues();
+ for (Object o : selected) {
+ Configuration configuration = (Configuration)o;
+ Iterator<Configuration> iterator = myConfigurations.iterator();
+ while (iterator.hasNext()) {
+ Configuration configuration1 = iterator.next();
+ if (configuration1.getName().equals(configuration.getName())) {
+ iterator.remove();
+ }
+ }
+ }
+ configurationsChanged(createSearchContext());
+ }
+ }).setMoveUpAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ performMoveUpDown(false);
+ }
+ }).setMoveDownAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ performMoveUpDown(true);
+ }
+ }).createPanel()
+ );
+ new DoubleClickListener() {
+ @Override
+ protected boolean onDoubleClick(MouseEvent e) {
+ performEditAction();
+ return true;
+ }
+ }.installOn(myTemplatesList);
+ return panel;
+ }
+
+ private void performMoveUpDown(boolean down) {
+ final int[] indices = myTemplatesList.getSelectedIndices();
+ if (indices.length == 0) return;
+ final int delta = down ? 1 : -1;
+ myTemplatesList.removeSelectionInterval(0, myConfigurations.size() - 1);
+ for (int i = down ? indices[indices.length - 1] : 0;
+ down ? i >= 0 : i < indices.length;
+ i -= delta) {
+ final int index = indices[i];
+ final Configuration temp = myConfigurations.get(index);
+ myConfigurations.set(index, myConfigurations.get(index + delta));
+ myConfigurations.set(index + delta, temp);
+ myTemplatesList.addSelectionInterval(index + delta, index + delta);
+ }
+ final int index = down ? myTemplatesList.getMaxSelectionIndex() : myTemplatesList.getMinSelectionIndex();
+ final Rectangle cellBounds = myTemplatesList.getCellBounds(index, index);
+ if (cellBounds != null) {
+ myTemplatesList.scrollRectToVisible(cellBounds);
+ }
+ }
+
+ private void performEditAction() {
+ final Configuration configuration = (Configuration)myTemplatesList.getSelectedValue();
+ if (configuration == null) return;
+
+ SearchDialog dialog = createDialog(new SearchDialogFactory() {
+ public SearchDialog createDialog(SearchContext searchContext) {
+ if (configuration instanceof SearchConfiguration) {
+ return new SearchDialog(searchContext, false, false) {
+ public Configuration createConfiguration() {
+ SearchConfiguration newConfiguration = new SearchConfiguration();
+ copyConfiguration(configuration, newConfiguration);
+ return newConfiguration;
+ }
+ };
+ }
+ else {
+ return new ReplaceDialog(searchContext, false, false) {
+ public Configuration createConfiguration() {
+ ReplaceConfiguration newConfiguration = new ReplaceConfiguration();
+ copyConfiguration(configuration, newConfiguration);
+ return newConfiguration;
+ }
+ };
+ }
+ }
+ });
+ dialog.setValuesFromConfig(configuration);
+ dialog.setUseLastConfiguration(true);
+ dialog.show();
+ if (!dialog.isOK()) return;
+ Configuration newConfiguration = dialog.getConfiguration();
+ copyConfiguration(newConfiguration, configuration);
+ configurationsChanged(dialog.getSearchContext());
+ }
+
+ private class MyListModel extends AbstractListModel {
+ public int getSize() {
+ return myConfigurations.size();
+ }
+
+ public Object getElementAt(int index) {
+ return index < myConfigurations.size() ? myConfigurations.get(index) : null;
+ }
+
+ public void fireContentsChanged() {
+ fireContentsChanged(myTemplatesList, -1, -1);
+ }
+ }
+}