PY-11855 Run manage.py task improvements
[idea/community.git] / java / compiler / impl / src / com / intellij / compiler / impl / ProblemsViewImpl.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.compiler.impl;
17
18 import com.intellij.compiler.ProblemsView;
19 import com.intellij.icons.AllIcons;
20 import com.intellij.ide.errorTreeView.ErrorTreeElement;
21 import com.intellij.ide.errorTreeView.ErrorViewStructure;
22 import com.intellij.ide.errorTreeView.GroupingElement;
23 import com.intellij.openapi.Disposable;
24 import com.intellij.openapi.application.ApplicationManager;
25 import com.intellij.openapi.compiler.CompileScope;
26 import com.intellij.openapi.project.Project;
27 import com.intellij.openapi.util.Disposer;
28 import com.intellij.openapi.util.IconLoader;
29 import com.intellij.openapi.vfs.VirtualFile;
30 import com.intellij.openapi.wm.ToolWindow;
31 import com.intellij.openapi.wm.ToolWindowAnchor;
32 import com.intellij.openapi.wm.ToolWindowManager;
33 import com.intellij.pom.Navigatable;
34 import com.intellij.ui.content.Content;
35 import com.intellij.ui.content.ContentFactory;
36 import com.intellij.util.concurrency.SequentialTaskExecutor;
37 import com.intellij.util.ui.UIUtil;
38 import org.jetbrains.annotations.NotNull;
39 import org.jetbrains.annotations.Nullable;
40 import org.jetbrains.ide.PooledThreadExecutor;
41
42 import javax.swing.*;
43 import java.util.UUID;
44
45 /**
46  * @author Eugene Zhuravlev
47  *         Date: 9/18/12
48  */
49 public class ProblemsViewImpl extends ProblemsView{
50   private static final String PROBLEMS_TOOLWINDOW_ID = "Problems";
51   
52   private final ProblemsViewPanel myPanel;
53   private final SequentialTaskExecutor myViewUpdater = new SequentialTaskExecutor(PooledThreadExecutor.INSTANCE);
54   private final Icon myActiveIcon = AllIcons.Toolwindows.Problems;
55   private final Icon myPassiveIcon = IconLoader.getDisabledIcon(myActiveIcon);
56
57   public ProblemsViewImpl(final Project project, final ToolWindowManager wm) {
58     super(project);
59     myPanel = new ProblemsViewPanel(project);
60     Disposer.register(project, new Disposable() {
61       @Override
62       public void dispose() {
63         Disposer.dispose(myPanel);
64       }
65     });
66     UIUtil.invokeLaterIfNeeded(new Runnable() {
67       @Override
68       public void run() {
69         if (project.isDisposed()) {
70           return;
71         }
72         final ToolWindow tw = wm.registerToolWindow(PROBLEMS_TOOLWINDOW_ID, false, ToolWindowAnchor.BOTTOM, project, true);
73         updateIcon(false);
74         final Content content = ContentFactory.SERVICE.getInstance().createContent(myPanel, "", false);
75         // todo: setup content?
76         tw.getContentManager().addContent(content);
77         Disposer.register(project, new Disposable() {
78           @Override
79           public void dispose() {
80             tw.getContentManager().removeAllContents(true);
81           }
82         });
83       }
84     });
85   }
86
87   @Override
88   public void clearOldMessages(@Nullable final CompileScope scope, @NotNull final UUID currentSessionId) {
89     myViewUpdater.execute(new Runnable() {
90       @Override
91       public void run() {
92         updateIcon(!cleanupChildrenRecursively(myPanel.getErrorViewStructure().getRootElement(), scope, currentSessionId));
93         myPanel.reload();
94       }
95     });
96   }
97
98   private boolean cleanupChildrenRecursively(@NotNull final Object fromElement, final @Nullable CompileScope scope, @NotNull UUID currentSessionId) {
99     final ErrorViewStructure structure = myPanel.getErrorViewStructure();
100     ErrorTreeElement[] elements = structure.getChildElements(fromElement);
101     if (elements.length ==0) return true;
102
103     boolean result = false;
104     for (ErrorTreeElement element : elements) {
105       if (element instanceof GroupingElement) {
106         if (scope != null) {
107           final VirtualFile file = ((GroupingElement)element).getFile();
108           if (file != null && !scope.belongs(file.getUrl())) {
109             continue; 
110           }
111         }
112         if (!currentSessionId.equals(element.getData())) {
113           structure.removeElement(element);
114           result = true;
115         }
116         else {
117           result |= cleanupChildrenRecursively(element, scope, currentSessionId);
118         }
119       }
120       else {
121         if (!currentSessionId.equals(element.getData())) {
122           structure.removeElement(element);
123           result = true;
124         }
125       }
126     }
127     return result;
128   }
129
130   @Override
131   public void addMessage(final int type,
132                          @NotNull final String[] text,
133                          @Nullable final String groupName,
134                          @Nullable final Navigatable navigatable,
135                          @Nullable final String exportTextPrefix, @Nullable final String rendererTextPrefix, @Nullable final UUID sessionId) {
136
137     myViewUpdater.execute(new Runnable() {
138       @Override
139       public void run() {
140         final ErrorViewStructure structure = myPanel.getErrorViewStructure();
141         final GroupingElement group = structure.lookupGroupingElement(groupName);
142         if (group != null && !sessionId.equals(group.getData())) {
143           structure.removeElement(group);
144         }
145         if (navigatable != null) {
146           myPanel.addMessage(type, text, groupName, navigatable, exportTextPrefix, rendererTextPrefix, sessionId);
147         }
148         else {
149           myPanel.addMessage(type, text, null, -1, -1, sessionId);
150         }
151         updateIcon(true);
152       }
153     });
154   }
155
156   private void updateIcon(final boolean active) {
157     ApplicationManager.getApplication().invokeLater(new Runnable() {
158       @Override
159       public void run() {
160         final ToolWindow tw = ToolWindowManager.getInstance(myProject).getToolWindow(PROBLEMS_TOOLWINDOW_ID);
161         if (tw != null) {
162           tw.setIcon(active ? myActiveIcon : myPassiveIcon);
163         }
164       }
165     }, myProject.getDisposed());
166   }
167
168   @Override
169   public void setProgress(String text, float fraction) {
170     myPanel.setProgress(text, fraction);
171   }
172
173   @Override
174   public void setProgress(String text) {
175     myPanel.setProgressText(text);
176   }
177
178   @Override
179   public void clearProgress() {
180     myPanel.clearProgressData();
181   }
182 }