tests fixed + duplicated error stripes removed from end of xml tags
[fedora-idea.git] / dom / impl / src / com / intellij / util / xml / highlighting / DomElementsErrorPanel.java
blob1cfe5b3a15be02d7a64c86409a3f0543cdff072f
1 /*
2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
3 */
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;
25 import javax.swing.*;
26 import java.awt.*;
28 /**
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());
56 addUpdateRequest();
57 domManager.addDomEventListener(new DomChangeAdapter() {
58 protected void elementChanged(DomElement element) {
59 updatePanel();
61 }, this);
64 public void updateHighlighting() {
65 updatePanel();
68 private boolean areValid() {
69 for (final DomElement domElement : myDomElements) {
70 if (!domElement.isValid()) return false;
72 return true;
75 private void updatePanel() {
76 myAlarm.cancelAllRequests();
78 if (!areValid()) return;
80 repaint();
81 setToolTipText(myErrorStripeRenderer.getTooltipMessage());
83 if (!isHighlightingFinished()) {
84 addUpdateRequest();
88 private boolean isHighlightingFinished() {
89 return !areValid() || myAnnotationsManager.isHighlightingFinished(myDomElements);
92 private void addUpdateRequest() {
93 ApplicationManager.getApplication().invokeLater(new Runnable() {
95 public void run() {
96 myAlarm.addRequest(new Runnable() {
97 public void run() {
98 if (myProject.isOpen()) {
99 updatePanel();
102 }, ALARM_PERIOD);
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() {
118 return this;
121 public void commit() {
124 public void reset() {
125 updatePanel();
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) {
140 int sum = 0;
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();
147 return sum;
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;