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
;
40 import java
.util
.Collection
;
41 import java
.util
.Collections
;
42 import java
.util
.List
;
45 public class MavenDomGutterAnnotator
implements Annotator
{
47 private static final PsiElementListCellRenderer
<XmlTag
> RENDERER
= new PsiElementListCellRenderer
<XmlTag
>() {
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);
54 String name
= model
.getName().getStringValue();
55 if (!StringUtil
.isEmptyOrSpaces(name
)) {
61 return tag
.getContainingFile().getName();
65 protected String
getContainerText(XmlTag element
, String name
) {
70 protected Icon
getIcon(PsiElement element
) {
71 return MavenIcons
.MAVEN_PROJECT_ICON
;
75 protected int getIconFlags() {
80 private static final NotNullFunction
<MavenDomDependency
, Collection
<?
extends PsiElement
>> CONVERTER
=
81 new NotNullFunction
<MavenDomDependency
, Collection
<?
extends PsiElement
>>() {
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
);
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
);
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();
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
);
147 annotateManagedDependency(dependency
, holder
);
153 private static boolean isDependencyManagementSection(@NotNull MavenDomDependency dependency
) {
154 return dependency
.getParentOfType(MavenDomDependencyManagement
.class, false) != null;