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.
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
;
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
;
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);
76 setTitle(REFACTORING_NAME
);
77 createNewNameComponent();
81 myTitleLabel
.setText(XmlBundle
.message("rename.current.tag", getFullName(tag
)));
86 protected void dispose() {
87 myNameSuggestionsField
.removeDataChangedListener(myNameChangedListener
);
91 protected boolean hasHelpAction() {
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
);
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() {
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() {
144 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
147 myTag
.setName(getNewName());
149 catch (IncorrectOperationException e
) {
155 }, RefactoringBundle
.message("rename.title"), null);
157 close(DialogWrapper
.OK_EXIT_CODE
);
161 protected JComponent
createCenterPanel() {
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());
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