maven dependency management gutter support (override icons)
[fedora-idea.git] / plugins / maven / src / main / java / org / jetbrains / idea / maven / dom / annotator / MavenDomGutterAnnotator.java
blob120bcbbfb52f31c9bbfcac2e5f83041752799d29
1 /*
2 * Copyright 2000-2010 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 org.jetbrains.idea.maven.dom.annotator;
19 import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
20 import com.intellij.ide.util.PsiElementListCellRenderer;
21 import com.intellij.lang.annotation.AnnotationHolder;
22 import com.intellij.lang.annotation.Annotator;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.util.text.StringUtil;
25 import com.intellij.psi.PsiElement;
26 import com.intellij.psi.xml.XmlTag;
27 import com.intellij.util.NotNullFunction;
28 import com.intellij.util.containers.ContainerUtil;
29 import com.intellij.util.xml.DomElement;
30 import com.intellij.util.xml.DomManager;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.idea.maven.dom.MavenDomBundle;
33 import org.jetbrains.idea.maven.dom.MavenDomProjectProcessorUtils;
34 import org.jetbrains.idea.maven.dom.model.MavenDomDependency;
35 import org.jetbrains.idea.maven.dom.model.MavenDomDependencyManagement;
36 import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
37 import org.jetbrains.idea.maven.utils.MavenIcons;
39 import javax.swing.*;
40 import java.util.Collection;
41 import java.util.Collections;
42 import java.util.List;
43 import java.util.Set;
45 public class MavenDomGutterAnnotator implements Annotator {
47 private static final PsiElementListCellRenderer<XmlTag> RENDERER = new PsiElementListCellRenderer<XmlTag>() {
48 @Override
49 public String getElementText(XmlTag tag) {
50 DomElement domElement = DomManager.getDomManager(tag.getProject()).getDomElement(tag);
51 if (domElement != null) {
52 MavenDomProjectModel model = domElement.getParentOfType(MavenDomProjectModel.class, false);
53 if (model != null) {
54 String name = model.getName().getStringValue();
55 if (!StringUtil.isEmptyOrSpaces(name)) {
56 return name;
61 return tag.getContainingFile().getName();
64 @Override
65 protected String getContainerText(XmlTag element, String name) {
66 return null;
69 @Override
70 protected Icon getIcon(PsiElement element) {
71 return MavenIcons.MAVEN_PROJECT_ICON;
74 @Override
75 protected int getIconFlags() {
76 return 0;
80 private static final NotNullFunction<MavenDomDependency, Collection<? extends PsiElement>> CONVERTER =
81 new NotNullFunction<MavenDomDependency, Collection<? extends PsiElement>>() {
83 @NotNull
84 public Collection<? extends PsiElement> fun(final MavenDomDependency pointer) {
85 return ContainerUtil.createMaybeSingletonList(pointer.getXmlTag());
89 private static void annotateDependencyUsages(@NotNull MavenDomDependency dependency, AnnotationHolder holder) {
90 final XmlTag tag = dependency.getXmlTag();
91 if (tag == null) return;
93 final Set<MavenDomDependency> children = getDependencyUsages(dependency);
94 if (children.size() > 0) {
95 final NavigationGutterIconBuilder<MavenDomDependency> iconBuilder =
96 NavigationGutterIconBuilder.create(MavenIcons.OVERRIDEN_DEPENDENCY, CONVERTER);
97 iconBuilder.
98 setTargets(children).
99 setPopupTitle(MavenDomBundle.message("navigate.parent.dependency.title")).
100 setCellRenderer(RENDERER).
101 setTooltipText(MavenDomBundle.message("overriding.dependency.title")).
102 install(holder, dependency.getXmlTag());
108 private static void annotateManagedDependency(MavenDomDependency dependency, AnnotationHolder holder) {
109 final XmlTag tag = dependency.getXmlTag();
110 if (tag == null) return;
112 final List<MavenDomDependency> children = getManagingDependencies(dependency);
113 if (children.size() > 0) {
115 final NavigationGutterIconBuilder<MavenDomDependency> iconBuilder =
116 NavigationGutterIconBuilder.create(MavenIcons.OVERRIDING_DEPENDENCY, CONVERTER);
117 iconBuilder.
118 setTargets(children).
119 setTooltipText(MavenDomBundle.message("overriden.dependency.title")).
120 install(holder, dependency.getXmlTag());
124 private static List<MavenDomDependency> getManagingDependencies(@NotNull MavenDomDependency dependency) {
125 Project project = dependency.getManager().getProject();
126 MavenDomDependency parentDependency = MavenDomProjectProcessorUtils.searchManagingDependency(dependency, project);
128 if (parentDependency != null) {
129 return Collections.singletonList(parentDependency);
131 return Collections.emptyList();
134 @NotNull
135 private static Set<MavenDomDependency> getDependencyUsages(@NotNull MavenDomDependency dependency) {
136 return MavenDomProjectProcessorUtils.searchDependencyUsages(dependency, dependency.getManager().getProject());
139 public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder holder) {
140 if (psiElement instanceof XmlTag) {
141 final DomElement element = DomManager.getDomManager(psiElement.getProject()).getDomElement((XmlTag)psiElement);
142 if (element instanceof MavenDomDependency) {
143 MavenDomDependency dependency = (MavenDomDependency)element;
144 if (isDependencyManagementSection(dependency)) {
145 annotateDependencyUsages(dependency, holder);
146 } else {
147 annotateManagedDependency(dependency, holder);
153 private static boolean isDependencyManagementSection(@NotNull MavenDomDependency dependency) {
154 return dependency.getParentOfType(MavenDomDependencyManagement.class, false) != null;