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.
17 package com
.intellij
.codeInspection
.util
;
19 import com
.intellij
.codeInsight
.daemon
.HighlightDisplayKey
;
20 import com
.intellij
.codeInsight
.intention
.IntentionAction
;
21 import com
.intellij
.codeInspection
.InspectionProfile
;
22 import com
.intellij
.codeInspection
.InspectionsBundle
;
23 import com
.intellij
.codeInspection
.LocalQuickFix
;
24 import com
.intellij
.codeInspection
.ProblemDescriptor
;
25 import com
.intellij
.codeInspection
.ex
.InspectionProfileImpl
;
26 import com
.intellij
.codeInspection
.unusedSymbol
.UnusedSymbolLocalInspection
;
27 import com
.intellij
.openapi
.actionSystem
.ActionManager
;
28 import com
.intellij
.openapi
.actionSystem
.ActionPlaces
;
29 import com
.intellij
.openapi
.actionSystem
.DefaultActionGroup
;
30 import com
.intellij
.openapi
.actionSystem
.ActionToolbar
;
31 import com
.intellij
.openapi
.editor
.Editor
;
32 import com
.intellij
.openapi
.project
.Project
;
33 import com
.intellij
.openapi
.ui
.Messages
;
34 import com
.intellij
.openapi
.util
.Factory
;
35 import com
.intellij
.profile
.codeInspection
.InspectionProfileManager
;
36 import com
.intellij
.profile
.codeInspection
.InspectionProjectProfileManager
;
37 import com
.intellij
.psi
.*;
38 import com
.intellij
.ui
.ReorderableListController
;
39 import com
.intellij
.ui
.ScrollPaneFactory
;
40 import com
.intellij
.ui
.SeparatorFactory
;
41 import com
.intellij
.ui
.SortedListModel
;
42 import com
.intellij
.util
.IncorrectOperationException
;
43 import com
.intellij
.util
.Processor
;
44 import org
.jetbrains
.annotations
.NonNls
;
45 import org
.jetbrains
.annotations
.NotNull
;
48 import javax
.swing
.event
.ListDataEvent
;
49 import javax
.swing
.event
.ListDataListener
;
51 import java
.util
.Collections
;
52 import java
.util
.Comparator
;
53 import java
.util
.List
;
56 * @author Gregory.Shrago
58 public class SpecialAnnotationsUtil
{
59 public static JPanel
createSpecialAnnotationsListControl(final List
<String
> list
, final String borderTitle
) {
60 final SortedListModel
<String
> listModel
= new SortedListModel
<String
>(new Comparator
<String
>() {
61 public int compare(final String o1
, final String o2
) {
62 return o1
.compareTo(o2
);
65 final JList injectionList
= new JList(listModel
);
66 for (String s
: list
) {
69 injectionList
.setSelectionMode(ListSelectionModel
.SINGLE_INTERVAL_SELECTION
);
70 final DefaultActionGroup actionGroup
= new DefaultActionGroup();
71 final ReorderableListController
<String
> controller
= ReorderableListController
.create(injectionList
, actionGroup
);
72 controller
.addAddAction(InspectionsBundle
.message("special.annotations.list.add.annotation.class"), new Factory
<String
>() {
73 public String
create() {
74 return Messages
.showInputDialog(InspectionsBundle
.message("special.annotations.list.annotation.class"),
75 InspectionsBundle
.message("special.annotations.list.add.annotation.class"),
76 Messages
.getQuestionIcon());
79 controller
.addRemoveAction(InspectionsBundle
.message("special.annotations.list.remove.annotation.class"));
80 injectionList
.getModel().addListDataListener(new ListDataListener() {
81 public void intervalAdded(ListDataEvent e
) {
85 private void listChanged() {
87 for (int i
= 0; i
< listModel
.getSize(); i
++) {
88 list
.add((String
)listModel
.getElementAt(i
));
92 public void intervalRemoved(ListDataEvent e
) {
96 public void contentsChanged(ListDataEvent e
) {
101 final JScrollPane listScrollPane
= ScrollPaneFactory
.createScrollPane(injectionList
);
102 // listScrollPane.setBorder(BorderFactory.createEtchedBorder());
103 listScrollPane
.setVerticalScrollBarPolicy(JScrollPane
.VERTICAL_SCROLLBAR_AS_NEEDED
);
104 listScrollPane
.setHorizontalScrollBarPolicy(JScrollPane
.HORIZONTAL_SCROLLBAR_AS_NEEDED
);
105 final FontMetrics fontMetrics
= injectionList
.getFontMetrics(injectionList
.getFont());
106 listScrollPane
.setPreferredSize(new Dimension(0, fontMetrics
.getHeight() * 5));
107 listScrollPane
.setMinimumSize(new Dimension(0, fontMetrics
.getHeight() * 3));
108 //int height = injectionList.getCellRenderer().getListCellRendererComponent(injectionList, "foo", 0, false, false).getSize().height;
109 //injectionList.setFixedCellHeight(height);
110 //injectionList.setPreferredSize(new Dimension(0, height * 3));
111 //injectionList.setMinimumSize(new Dimension(0, height * 3));
112 // injectionList.setVisibleRowCount(3);
114 final JPanel listPanel
= new JPanel(new BorderLayout());
116 ActionToolbar actionToolbar
= ActionManager
.getInstance().createActionToolbar(ActionPlaces
.UNKNOWN
, actionGroup
, true);
117 listPanel
.add(actionToolbar
.getComponent(), BorderLayout
.NORTH
);
118 listPanel
.add(listScrollPane
, BorderLayout
.CENTER
);
120 JPanel panel
= new JPanel(new BorderLayout());
121 panel
.add(SeparatorFactory
.createSeparator(borderTitle
, null), BorderLayout
.NORTH
);
122 panel
.add(listPanel
, BorderLayout
.CENTER
);
126 public static IntentionAction
createAddToSpecialAnnotationsListIntentionAction(final String text
, final String family
, final List
<String
> targetList
,
127 final String qualifiedName
) {
128 return new IntentionAction() {
130 public String
getText() {
135 public String
getFamilyName() {
139 public boolean isAvailable(@NotNull Project project
, Editor editor
, PsiFile file
) {
143 public void invoke(@NotNull Project project
, Editor editor
, PsiFile file
) throws IncorrectOperationException
{
144 doQuickFixInternal(project
, targetList
, qualifiedName
);
147 public boolean startInWriteAction() {
153 public static LocalQuickFix
createAddToSpecialAnnotationsListQuickFix(final String text
, final String family
, final List
<String
> targetList
,
154 final String qualifiedName
,
155 final PsiElement context
) {
156 return new LocalQuickFix() {
158 public String
getName() {
163 public String
getFamilyName() {
167 public void applyFix(@NotNull final Project project
, @NotNull final ProblemDescriptor descriptor
) {
168 doQuickFixInternal(project
, targetList
, qualifiedName
);
173 private static void doQuickFixInternal(final Project project
, final List
<String
> targetList
, final String qualifiedName
) {
174 targetList
.add(qualifiedName
);
175 Collections
.sort(targetList
);
176 final InspectionProfile inspectionProfile
= InspectionProjectProfileManager
.getInstance(project
).getInspectionProfile();
177 //correct save settings
178 ((InspectionProfileImpl
)inspectionProfile
).isProperSetting(HighlightDisplayKey
.find(UnusedSymbolLocalInspection
.SHORT_NAME
));
181 InspectionProfileManager
.getInstance().fireProfileChanged(inspectionProfile
);
184 inspectionProfile.save();
186 catch (IOException e) {
187 Messages.showErrorDialog(project, e.getMessage(), CommonBundle.getErrorTitle());
193 public static void createAddToSpecialAnnotationFixes(final PsiModifierListOwner owner
, final Processor
<String
> processor
) {
194 final PsiModifierList modifierList
= owner
.getModifierList();
195 if (modifierList
!= null) {
196 final PsiAnnotation
[] psiAnnotations
= modifierList
.getAnnotations();
197 for (PsiAnnotation psiAnnotation
: psiAnnotations
) {
198 @NonNls final String name
= psiAnnotation
.getQualifiedName();
199 if (name
== null) continue;
200 if (name
.startsWith("java.") || name
.startsWith("javax.") || name
.startsWith("org.jetbrains.")) continue;
201 if (!processor
.process(name
)) break;