update copyright
[fedora-idea.git] / xml / impl / src / com / intellij / xml / refactoring / XmlTagRenameDialog.java
blob2924ebe81180879e87ca7a7f7a23ebcde1036ab9
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * Created by IntelliJ IDEA.
19 * User: spleaner
20 * Date: Aug 9, 2007
21 * Time: 4:45:40 PM
23 package com.intellij.xml.refactoring;
25 import com.intellij.codeInsight.completion.simple.SimpleLookupItem;
26 import com.intellij.codeInsight.lookup.LookupElement;
27 import com.intellij.codeInsight.lookup.LookupManager;
28 import com.intellij.openapi.application.ApplicationManager;
29 import com.intellij.openapi.command.CommandProcessor;
30 import com.intellij.openapi.diagnostic.Logger;
31 import com.intellij.openapi.editor.Editor;
32 import com.intellij.openapi.fileTypes.FileTypes;
33 import com.intellij.openapi.help.HelpManager;
34 import com.intellij.openapi.ui.DialogWrapper;
35 import com.intellij.openapi.util.text.StringUtil;
36 import com.intellij.psi.PsiElement;
37 import com.intellij.psi.PsiReference;
38 import com.intellij.psi.xml.XmlTag;
39 import com.intellij.refactoring.RefactoringBundle;
40 import com.intellij.refactoring.ui.NameSuggestionsField;
41 import com.intellij.refactoring.ui.RefactoringDialog;
42 import com.intellij.ui.IdeBorderFactory;
43 import com.intellij.usageView.UsageViewUtil;
44 import com.intellij.util.IncorrectOperationException;
45 import com.intellij.xml.XmlBundle;
46 import org.jetbrains.annotations.NotNull;
47 import org.jetbrains.annotations.Nullable;
49 import javax.swing.*;
50 import java.awt.event.ActionEvent;
51 import java.awt.event.ActionListener;
52 import java.awt.event.InputEvent;
53 import java.awt.event.KeyEvent;
54 import java.util.LinkedHashSet;
55 import java.util.Set;
57 public class XmlTagRenameDialog extends RefactoringDialog {
58 private static final Logger LOG = Logger.getInstance("#com.intellij.xml.refactoring.XmlTagRenameDialog");
59 private static final String REFACTORING_NAME = RefactoringBundle.message("rename.title");
61 private final PsiElement myElement;
62 private final Editor myEditor;
63 private JLabel myTitleLabel;
64 private NameSuggestionsField myNameSuggestionsField;
65 private String myHelpID;
66 private final XmlTag myTag;
67 private NameSuggestionsField.DataChanged myNameChangedListener;
69 public XmlTagRenameDialog(@NotNull final Editor editor, @NotNull final PsiElement element, @NotNull final XmlTag tag) {
70 super(element.getProject(), true);
72 myEditor = editor;
73 myElement = element;
74 myTag = tag;
76 setTitle(REFACTORING_NAME);
77 createNewNameComponent();
79 init();
81 myTitleLabel.setText(XmlBundle.message("rename.current.tag", getFullName(tag)));
83 validateButtons();
86 protected void dispose() {
87 myNameSuggestionsField.removeDataChangedListener(myNameChangedListener);
88 super.dispose();
91 protected boolean hasHelpAction() {
92 return false;
95 private static String getFullName(@NotNull final XmlTag tag) {
96 final String name = UsageViewUtil.getDescriptiveName(tag);
97 return (UsageViewUtil.getType(tag) + " " + name).trim();
100 public static void renameXmlTag(final Editor editor, @NotNull final PsiElement element, @NotNull final XmlTag tag) {
101 final XmlTagRenameDialog dialog = new XmlTagRenameDialog(editor, element, tag);
102 dialog.show();
105 private void createNewNameComponent() {
106 myNameSuggestionsField = new NameSuggestionsField(new String[] { myTag.getName() }, myProject, FileTypes.PLAIN_TEXT, myEditor);
107 myNameChangedListener = new NameSuggestionsField.DataChanged() {
108 public void dataChanged() {
109 validateButtons();
112 myNameSuggestionsField.addDataChangedListener(myNameChangedListener);
114 myNameSuggestionsField.getComponent().registerKeyboardAction(new ActionListener() {
115 public void actionPerformed(ActionEvent e) {
116 completeVariable(myNameSuggestionsField.getEditor());
118 }, KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.CTRL_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW);
121 private void completeVariable(final Editor editor) {
122 String prefix = myNameSuggestionsField.getEnteredName();
124 Set<LookupElement> set = new LinkedHashSet<LookupElement>();
125 final PsiReference reference = myTag.getReference();
126 if (reference != null) {
127 final Object[] variants = reference.getVariants();
128 for (Object variant : variants) {
129 set.add(new SimpleLookupItem(variant));
132 LookupElement[] lookupItems = set.toArray(new LookupElement[set.size()]);
133 editor.getCaretModel().moveToOffset(prefix.length());
134 editor.getSelectionModel().removeSelection();
135 LookupManager.getInstance(getProject()).showLookup(editor, lookupItems, prefix);
139 protected void doAction() {
140 LOG.assertTrue(myElement.isValid());
142 CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
143 public void run() {
144 ApplicationManager.getApplication().runWriteAction(new Runnable() {
145 public void run() {
146 try {
147 myTag.setName(getNewName());
149 catch (IncorrectOperationException e) {
150 LOG.error(e);
155 }, RefactoringBundle.message("rename.title"), null);
157 close(DialogWrapper.OK_EXIT_CODE);
160 @Nullable
161 protected JComponent createCenterPanel() {
162 return null;
165 public JComponent getPreferredFocusedComponent() {
166 return myNameSuggestionsField.getFocusableComponent();
169 protected JComponent createNorthPanel() {
170 final JPanel panel = new JPanel();
171 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
173 panel.setBorder(BorderFactory.createCompoundBorder(IdeBorderFactory.createBorder(), BorderFactory.createEmptyBorder(4, 8, 4, 8)));
175 myTitleLabel = new JLabel();
176 panel.add(myTitleLabel);
177 panel.add(Box.createVerticalStrut(8));
178 panel.add(myNameSuggestionsField.getComponent());
180 return panel;
183 protected void doHelpAction() {
184 HelpManager.getInstance().invokeHelp(myHelpID);
187 public String getNewName() {
188 return myNameSuggestionsField.getEnteredName().trim();
191 protected void validateButtons() {
192 super.validateButtons();
194 getPreviewAction().setEnabled(false);
197 protected boolean areButtonsValid() {
198 final String newName = getNewName();
199 return !StringUtil.containsAnyChar(newName, "\t ;*'\"\\/,()^&<>={}"); // RenameUtil.isValidName(myProject, myTag, newName); // IDEADEV-34531