summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SelectTemplateDialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SelectTemplateDialog.java')
-rw-r--r--platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SelectTemplateDialog.java294
1 files changed, 294 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SelectTemplateDialog.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SelectTemplateDialog.java
new file mode 100644
index 000000000000..b74715ecf07a
--- /dev/null
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SelectTemplateDialog.java
@@ -0,0 +1,294 @@
+package com.intellij.structuralsearch.plugin.ui;
+
+import com.intellij.codeInsight.template.TemplateContextType;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.EditorFactory;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Splitter;
+import com.intellij.structuralsearch.MatchOptions;
+import com.intellij.structuralsearch.SSRBundle;
+import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Maxim.Mossienko
+ * Date: Apr 23, 2004
+ * Time: 5:03:52 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class SelectTemplateDialog extends DialogWrapper {
+ private final boolean showHistory;
+ private Editor searchPatternEditor;
+ private Editor replacePatternEditor;
+ private final boolean replace;
+ private final Project project;
+ private final ExistingTemplatesComponent existingTemplatesComponent;
+
+ private MySelectionListener selectionListener;
+ private CardLayout myCardLayout;
+ private JPanel myPreviewPanel;
+ @NonNls private static final String PREVIEW_CARD = "Preview";
+ @NonNls private static final String SELECT_TEMPLATE_CARD = "SelectCard";
+
+ public SelectTemplateDialog(Project project, boolean showHistory, boolean replace) {
+ super(project, false);
+
+ this.project = project;
+ this.showHistory = showHistory;
+ this.replace = replace;
+ existingTemplatesComponent = ExistingTemplatesComponent.getInstance(this.project);
+
+ setTitle(SSRBundle.message(this.showHistory ? "used.templates.history.dialog.title" : "existing.templates.dialog.title"));
+ init();
+
+ if (this.showHistory) {
+ final int selection = existingTemplatesComponent.getHistoryList().getSelectedIndex();
+ if (selection != -1) {
+ setPatternFromList(selection);
+ }
+ }
+ else {
+ final TreePath selection = existingTemplatesComponent.getPatternTree().getSelectionPath();
+ if (selection != null) {
+ setPatternFromNode((DefaultMutableTreeNode)selection.getLastPathComponent());
+ }
+ else {
+ showPatternPreviewFromConfiguration(null);
+ }
+ }
+
+ setupListeners();
+ }
+
+ class MySelectionListener implements TreeSelectionListener, ListSelectionListener {
+ public void valueChanged(TreeSelectionEvent e) {
+ if (e.getNewLeadSelectionPath() != null) {
+ setPatternFromNode(
+ (DefaultMutableTreeNode)e.getNewLeadSelectionPath().getLastPathComponent()
+ );
+ }
+ }
+
+ public void valueChanged(ListSelectionEvent e) {
+ if (e.getValueIsAdjusting() || e.getLastIndex() == -1) return;
+ int selectionIndex = existingTemplatesComponent.getHistoryList().getSelectedIndex();
+ if (selectionIndex != -1) {
+ setPatternFromList(selectionIndex);
+ }
+ }
+ }
+
+ private void setPatternFromList(int index) {
+ showPatternPreviewFromConfiguration(
+ (Configuration)existingTemplatesComponent.getHistoryList().getModel().getElementAt(index)
+ );
+ }
+
+ protected JComponent createCenterPanel() {
+ final JPanel centerPanel = new JPanel(new BorderLayout());
+ Splitter splitter;
+
+ centerPanel.add(BorderLayout.CENTER, splitter = new Splitter(false, 0.3f));
+ centerPanel.add(splitter);
+
+ splitter.setFirstComponent(
+ showHistory ?
+ existingTemplatesComponent.getHistoryPanel() :
+ existingTemplatesComponent.getTemplatesPanel()
+ );
+ final JPanel panel;
+ splitter.setSecondComponent(
+ panel = new JPanel(new BorderLayout())
+ );
+
+ searchPatternEditor = UIUtil.createEditor(
+ EditorFactory.getInstance().createDocument(""),
+ project,
+ false,
+ true,
+ ContainerUtil.findInstance(TemplateContextType.EP_NAME.getExtensions(), TemplateContextType.class)
+ );
+
+ JComponent centerComponent;
+
+ if (replace) {
+ replacePatternEditor = UIUtil.createEditor(
+ EditorFactory.getInstance().createDocument(""),
+ project,
+ false,
+ true,
+ ContainerUtil.findInstance(TemplateContextType.EP_NAME.getExtensions(), TemplateContextType.class)
+ );
+ centerComponent = new Splitter(true);
+ ((Splitter)centerComponent).setFirstComponent(searchPatternEditor.getComponent());
+ ((Splitter)centerComponent).setSecondComponent(replacePatternEditor.getComponent());
+ }
+ else {
+ centerComponent = searchPatternEditor.getComponent();
+ }
+
+ myCardLayout = new CardLayout();
+ myPreviewPanel = new JPanel(myCardLayout);
+ myPreviewPanel.add(centerComponent, PREVIEW_CARD);
+ JPanel selectPanel = new JPanel(new GridBagLayout());
+ GridBagConstraints gb = new GridBagConstraints(0,0,0,0,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE, new Insets(0,0,0,0),0,0);
+ selectPanel.add(new JLabel(SSRBundle.message("selecttemplate.template.label.please.select.template")), gb);
+ myPreviewPanel.add(selectPanel, SELECT_TEMPLATE_CARD);
+
+ panel.add(BorderLayout.CENTER, myPreviewPanel);
+
+ panel.add(BorderLayout.NORTH, new JLabel(SSRBundle.message("selecttemplate.template.preview")));
+ return centerPanel;
+ }
+
+ public void dispose() {
+ EditorFactory.getInstance().releaseEditor(searchPatternEditor);
+ if (replacePatternEditor != null) EditorFactory.getInstance().releaseEditor(replacePatternEditor);
+ removeListeners();
+ super.dispose();
+ }
+
+ public JComponent getPreferredFocusedComponent() {
+ return showHistory ?
+ existingTemplatesComponent.getHistoryList() :
+ existingTemplatesComponent.getPatternTree();
+ }
+
+ protected String getDimensionServiceKey() {
+ return "#com.intellij.structuralsearch.plugin.ui.SelectTemplateDialog";
+ }
+
+ private void setupListeners() {
+ existingTemplatesComponent.setOwner(this);
+ selectionListener = new MySelectionListener();
+
+ if (showHistory) {
+ existingTemplatesComponent.getHistoryList().getSelectionModel().addListSelectionListener(
+ selectionListener
+ );
+ }
+ else {
+ existingTemplatesComponent.getPatternTree().getSelectionModel().addTreeSelectionListener(
+ selectionListener
+ );
+ }
+ }
+
+ private void removeListeners() {
+ existingTemplatesComponent.setOwner(null);
+ if (showHistory) {
+ existingTemplatesComponent.getHistoryList().getSelectionModel().removeListSelectionListener(
+ selectionListener
+ );
+ }
+ else {
+ existingTemplatesComponent.getPatternTree().getSelectionModel().removeTreeSelectionListener(selectionListener);
+ }
+ }
+
+ private void setPatternFromNode(DefaultMutableTreeNode node) {
+ if (node == null) return;
+ final Object userObject = node.getUserObject();
+ final Configuration configuration;
+
+ // root could be without search template
+ if (userObject instanceof Configuration) {
+ configuration = (Configuration)userObject;
+ }
+ else {
+ configuration = null;
+ }
+
+ showPatternPreviewFromConfiguration(configuration);
+ }
+
+ private void showPatternPreviewFromConfiguration(@Nullable final Configuration configuration) {
+ if (configuration == null) {
+ myCardLayout.show(myPreviewPanel, SELECT_TEMPLATE_CARD);
+ return;
+ }
+ else {
+ myCardLayout.show(myPreviewPanel, PREVIEW_CARD);
+ }
+ final MatchOptions matchOptions = configuration.getMatchOptions();
+
+ UIUtil.setContent(
+ searchPatternEditor,
+ matchOptions.getSearchPattern(),
+ 0,
+ searchPatternEditor.getDocument().getTextLength(),
+ project
+ );
+
+ searchPatternEditor.putUserData(SubstitutionShortInfoHandler.CURRENT_CONFIGURATION_KEY, configuration);
+
+ if (replace) {
+ String replacement;
+
+ if (configuration instanceof ReplaceConfiguration) {
+ replacement = ((ReplaceConfiguration)configuration).getOptions().getReplacement();
+ }
+ else {
+ replacement = configuration.getMatchOptions().getSearchPattern();
+ }
+
+ UIUtil.setContent(
+ replacePatternEditor,
+ replacement,
+ 0,
+ replacePatternEditor.getDocument().getTextLength(),
+ project
+ );
+
+ replacePatternEditor.putUserData(SubstitutionShortInfoHandler.CURRENT_CONFIGURATION_KEY, configuration);
+ }
+ }
+
+ @NotNull public Configuration[] getSelectedConfigurations() {
+ if (showHistory) {
+ Object[] selectedValues = existingTemplatesComponent.getHistoryList().getSelectedValues();
+ if (selectedValues == null) {
+ return new Configuration[0];
+ }
+ Collection<Configuration> configurations = new ArrayList<Configuration>();
+ for (Object selectedValue : selectedValues) {
+ if (selectedValue instanceof Configuration) {
+ configurations.add((Configuration)selectedValue);
+ }
+ }
+ return configurations.toArray(new Configuration[configurations.size()]);
+ }
+ else {
+ TreePath[] paths = existingTemplatesComponent.getPatternTree().getSelectionModel().getSelectionPaths();
+ if (paths == null) {
+ return new Configuration[0];
+ }
+ Collection<Configuration> configurations = new ArrayList<Configuration>();
+ for (TreePath path : paths) {
+
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
+ final Object userObject = node.getUserObject();
+ if (userObject instanceof Configuration) {
+ configurations.add((Configuration)userObject);
+ }
+ }
+ return configurations.toArray(new Configuration[configurations.size()]);
+ }
+ }
+}