performance for dom forms
[fedora-idea.git] / source / com / intellij / util / xml / highlighting / DomElementsErrorPanel.java
blob1da208417ce9bd1b9bbaff0f75d86354a5ffd592
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.util.xml.DomFileElement;
8 import com.intellij.util.xml.DomChangeListener;
9 import com.intellij.util.xml.DomElement;
10 import com.intellij.util.xml.DomManager;
11 import com.intellij.util.xml.ui.CommittablePanel;
12 import com.intellij.util.Alarm;
13 import com.intellij.openapi.editor.markup.ErrorStripeRenderer;
14 import com.intellij.openapi.editor.Document;
15 import com.intellij.openapi.editor.ex.EditorEx;
16 import com.intellij.openapi.project.Project;
17 import com.intellij.openapi.util.IconLoader;
18 import com.intellij.openapi.Disposable;
19 import com.intellij.codeInsight.daemon.impl.RefreshStatusRenderer;
20 import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl;
21 import com.intellij.codeInsight.daemon.impl.HighlightInfo;
22 import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
23 import com.intellij.codeInsight.hint.LineTooltipRenderer;
24 import com.intellij.codeInsight.hint.TooltipController;
25 import com.intellij.codeInsight.hint.HintManager;
26 import com.intellij.psi.PsiDocumentManager;
27 import com.intellij.psi.PsiFile;
28 import com.intellij.psi.xml.XmlFile;
29 import com.intellij.lang.annotation.HighlightSeverity;
31 import javax.swing.*;
32 import java.awt.*;
33 import java.awt.event.MouseMotionListener;
34 import java.awt.event.MouseEvent;
36 /**
37 * User: Sergey.Vasiliev
39 public class DomElementsErrorPanel extends JPanel implements CommittablePanel {
40 private static final Icon ERRORS_FOUND_ICON = IconLoader.getIcon("/general/errorsInProgress.png");
42 private static final int ALARM_PERIOD = 241;
44 private DomElement[] myDomElements;
45 private DomManager myDomManager;
47 private final DomChangeListener myDomChangeListener;
48 private final DomElementsRefreshStatusRenderer myErrorStripeRenderer;
50 private final Alarm myAlarm = new Alarm();
52 public DomElementsErrorPanel(final DomElement domElement) {
53 this(new DomElement[]{domElement}, domElement.getManager(), domElement.getRoot().getFile());
56 public DomElementsErrorPanel(final DomElement[] domElements, DomManager domManager, PsiFile file) {
57 myDomElements = domElements;
58 myDomManager = domManager;
60 final Document document = PsiDocumentManager.getInstance(myDomManager.getProject()).getDocument(file);
62 setPreferredSize(getDimention());
64 myErrorStripeRenderer = new DomElementsRefreshStatusRenderer(myDomManager.getProject(), document, file);
66 addUpdateRequest();
68 myDomChangeListener = new DomChangeListener() {
69 protected void elementChanged(DomElement element) {
70 updatePanel();
74 myDomManager.addDomEventListener(myDomChangeListener);
77 private void updatePanel() {
78 myAlarm.cancelAllRequests();
80 repaint();
81 setToolTipText(myErrorStripeRenderer.getTooltipMessage());
83 if (!myErrorStripeRenderer.getDaemonCodeAnalyzerStatus().inspectionFinished) {
84 addUpdateRequest();
88 private void addUpdateRequest() {
89 myAlarm.addRequest(new Runnable() {
90 public void run() {
91 updatePanel();
93 }, ALARM_PERIOD);
96 protected void paintComponent(Graphics g) {
97 super.paintComponent(g);
99 myErrorStripeRenderer.paint(this, g, new Rectangle(0, 0, getWidth(), getHeight()));
102 public ErrorStripeRenderer getErrorStripeRenderer() {
103 return myErrorStripeRenderer;
106 public void dispose() {
107 myDomManager.removeDomEventListener(myDomChangeListener);
110 public JComponent getComponent() {
111 return this;
114 public void commit() {
118 public void reset() {
122 protected Dimension getDimention() {
123 return new Dimension(ERRORS_FOUND_ICON.getIconWidth() + 2, ERRORS_FOUND_ICON.getIconHeight() + 2);
126 private class DomElementsRefreshStatusRenderer extends RefreshStatusRenderer {
127 public DomElementsRefreshStatusRenderer(final Project project, final Document document, final PsiFile xmlFile) {
128 super(project, (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(project), document, xmlFile);
131 protected int getErrorsCount(final HighlightSeverity minSeverity) {
132 int sum = 0;
133 for (DomElement element : myDomElements) {
134 sum += DomElementAnnotationsManager.getInstance().getProblems(element, true, true).size();
136 return sum;
139 public DaemonCodeAnalyzerStatus getDaemonCodeAnalyzerStatus() {
140 return super.getDaemonCodeAnalyzerStatus();
144 // private static class MyRefreshStatusRenderer extends RefreshStatusRenderer {
145 // public MyRefreshStatusRenderer(final Project project, final Document document, final XmlFile xmlFile) {
146 // super(project, (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(project), document, xmlFile);
147 // }
149 // public DaemonCodeAnalyzerStatus getDaemonCodeAnalyzerStatus() {
150 // return super.getDaemonCodeAnalyzerStatus();
151 // }