update copyright
[fedora-idea.git] / java / java-impl / src / com / intellij / codeInspection / util / SpecialAnnotationsUtil.java
blob33ce2967d30ed6b2d099f4297278f42b6bbeb796
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.
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;
47 import javax.swing.*;
48 import javax.swing.event.ListDataEvent;
49 import javax.swing.event.ListDataListener;
50 import java.awt.*;
51 import java.util.Collections;
52 import java.util.Comparator;
53 import java.util.List;
55 /**
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);
64 });
65 final JList injectionList = new JList(listModel);
66 for (String s : list) {
67 listModel.add(s);
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());
78 }, true);
79 controller.addRemoveAction(InspectionsBundle.message("special.annotations.list.remove.annotation.class"));
80 injectionList.getModel().addListDataListener(new ListDataListener() {
81 public void intervalAdded(ListDataEvent e) {
82 listChanged();
85 private void listChanged() {
86 list.clear();
87 for (int i = 0; i < listModel.getSize(); i++) {
88 list.add((String)listModel.getElementAt(i));
92 public void intervalRemoved(ListDataEvent e) {
93 listChanged();
96 public void contentsChanged(ListDataEvent e) {
97 listChanged();
99 });
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);
123 return panel;
126 public static IntentionAction createAddToSpecialAnnotationsListIntentionAction(final String text, final String family, final List<String> targetList,
127 final String qualifiedName) {
128 return new IntentionAction() {
129 @NotNull
130 public String getText() {
131 return text;
134 @NotNull
135 public String getFamilyName() {
136 return family;
139 public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
140 return true;
143 public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
144 doQuickFixInternal(project, targetList, qualifiedName);
147 public boolean startInWriteAction() {
148 return true;
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() {
157 @NotNull
158 public String getName() {
159 return text;
162 @NotNull
163 public String getFamilyName() {
164 return family;
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));
180 //TODO lesya
181 InspectionProfileManager.getInstance().fireProfileChanged(inspectionProfile);
183 try {
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;