2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
5 package com
.intellij
.util
.xml
.highlighting
;
7 import com
.intellij
.codeInsight
.daemon
.DaemonCodeAnalyzer
;
8 import com
.intellij
.codeInsight
.daemon
.impl
.DaemonCodeAnalyzerImpl
;
9 import com
.intellij
.codeInsight
.daemon
.impl
.RefreshStatusRenderer
;
10 import com
.intellij
.lang
.annotation
.HighlightSeverity
;
11 import com
.intellij
.openapi
.project
.Project
;
12 import com
.intellij
.openapi
.util
.Condition
;
13 import com
.intellij
.openapi
.util
.IconLoader
;
14 import com
.intellij
.openapi
.application
.ApplicationManager
;
15 import com
.intellij
.psi
.PsiDocumentManager
;
16 import com
.intellij
.psi
.PsiFile
;
17 import com
.intellij
.util
.Alarm
;
18 import com
.intellij
.util
.containers
.ContainerUtil
;
19 import com
.intellij
.util
.xml
.DomChangeAdapter
;
20 import com
.intellij
.util
.xml
.DomElement
;
21 import com
.intellij
.util
.xml
.DomManager
;
22 import com
.intellij
.util
.xml
.ui
.CommittablePanel
;
23 import com
.intellij
.util
.xml
.ui
.Highlightable
;
29 * User: Sergey.Vasiliev
31 public class DomElementsErrorPanel
extends JPanel
implements CommittablePanel
, Highlightable
{
32 private static final Icon ERRORS_FOUND_ICON
= IconLoader
.getIcon("/general/errorsInProgress.png");
34 private static final int ALARM_PERIOD
= 241;
36 private Project myProject
;
37 private DomElement
[] myDomElements
;
39 private final DomElementsRefreshStatusRenderer myErrorStripeRenderer
;
40 private final DomElementAnnotationsManagerImpl myAnnotationsManager
;
42 private final Alarm myAlarm
= new Alarm();
44 public DomElementsErrorPanel(final DomElement
... domElements
) {
45 assert domElements
.length
> 0;
47 myDomElements
= domElements
;
48 final DomManager domManager
= domElements
[0].getManager();
49 myProject
= domManager
.getProject();
50 myAnnotationsManager
= (DomElementAnnotationsManagerImpl
)DomElementAnnotationsManager
.getInstance(myProject
);
52 setPreferredSize(getDimension());
54 myErrorStripeRenderer
= new DomElementsRefreshStatusRenderer(domElements
[0].getRoot().getFile());
57 domManager
.addDomEventListener(new DomChangeAdapter() {
58 protected void elementChanged(DomElement element
) {
64 public void updateHighlighting() {
68 private boolean areValid() {
69 for (final DomElement domElement
: myDomElements
) {
70 if (!domElement
.isValid()) return false;
75 private void updatePanel() {
76 myAlarm
.cancelAllRequests();
78 if (!areValid()) return;
81 setToolTipText(myErrorStripeRenderer
.getTooltipMessage());
83 if (!isHighlightingFinished()) {
88 private boolean isHighlightingFinished() {
89 return !areValid() || myAnnotationsManager
.isHighlightingFinished(myDomElements
);
92 private void addUpdateRequest() {
93 ApplicationManager
.getApplication().invokeLater(new Runnable() {
96 myAlarm
.addRequest(new Runnable() {
98 if (myProject
.isOpen()) {
107 protected void paintComponent(Graphics g
) {
108 super.paintComponent(g
);
110 myErrorStripeRenderer
.paint(this, g
, new Rectangle(0, 0, getWidth(), getHeight()));
113 public void dispose() {
114 myAlarm
.cancelAllRequests();
117 public JComponent
getComponent() {
121 public void commit() {
124 public void reset() {
128 private static Dimension
getDimension() {
129 return new Dimension(ERRORS_FOUND_ICON
.getIconWidth() + 2, ERRORS_FOUND_ICON
.getIconHeight() + 2);
132 private class DomElementsRefreshStatusRenderer
extends RefreshStatusRenderer
{
134 public DomElementsRefreshStatusRenderer(final PsiFile xmlFile
) {
135 super(xmlFile
.getProject(), (DaemonCodeAnalyzerImpl
)DaemonCodeAnalyzer
.getInstance(xmlFile
.getProject()),
136 PsiDocumentManager
.getInstance(xmlFile
.getProject()).getDocument(xmlFile
), xmlFile
);
139 protected int getErrorsCount(final HighlightSeverity minSeverity
) {
141 for (DomElement element
: myDomElements
) {
142 final DomElementsProblemsHolder holder
= myAnnotationsManager
.getCachedProblemHolder(element
);
143 sum
+= (minSeverity
.compareTo(HighlightSeverity
.WARNING
) >= 0
144 ? holder
.getProblems(element
, true, true)
145 : holder
.getProblems(element
, true, minSeverity
)).size();
150 protected boolean isInspectionCompleted() {
151 return ContainerUtil
.and(myDomElements
, new Condition
<DomElement
>() {
152 public boolean value(final DomElement element
) {
153 return myAnnotationsManager
.getHighlightStatus(element
) == DomHighlightStatus
.INSPECTIONS_FINISHED
;
158 protected boolean isErrorAnalyzingFinished() {
159 return ContainerUtil
.and(myDomElements
, new Condition
<DomElement
>() {
160 public boolean value(final DomElement element
) {
161 return myAnnotationsManager
.getHighlightStatus(element
).compareTo(DomHighlightStatus
.ANNOTATORS_FINISHED
) >= 0;