blob: b74715ecf07a0c0f31f4ec583ce18c5370e77461 [file] [log] [blame]
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()]);
}
}
}