assertion
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / progress / impl / BackgroundableProcessIndicator.java
1 /*
2  * Copyright 2000-2009 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
17 /*
18  * Created by IntelliJ IDEA.
19  * User: max
20  * Date: Aug 20, 2006
21  * Time: 8:40:15 PM
22  */
23 package com.intellij.openapi.progress.impl;
24
25 import com.intellij.openapi.Disposable;
26 import com.intellij.openapi.progress.PerformInBackgroundOption;
27 import com.intellij.openapi.progress.Task;
28 import com.intellij.openapi.progress.TaskInfo;
29 import com.intellij.openapi.progress.util.ProgressWindow;
30 import com.intellij.openapi.project.*;
31 import com.intellij.openapi.util.Disposer;
32 import com.intellij.openapi.wm.IdeFrame;
33 import com.intellij.openapi.wm.WindowManager;
34 import com.intellij.openapi.wm.ex.StatusBarEx;
35 import com.intellij.openapi.wm.ex.WindowManagerEx;
36 import org.jetbrains.annotations.Nls;
37 import org.jetbrains.annotations.NotNull;
38 import org.jetbrains.annotations.Nullable;
39
40 public class BackgroundableProcessIndicator extends ProgressWindow {
41   protected StatusBarEx myStatusBar;
42
43   @SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized"})
44
45   private PerformInBackgroundOption myOption;
46   private TaskInfo myInfo;
47
48   private boolean myDisposed;
49   private DumbModeAction myDumbModeAction = DumbModeAction.NOTHING;
50
51   public BackgroundableProcessIndicator(Task.Backgroundable task) {
52     this(task.getProject(), task, task);
53
54     myDumbModeAction = task.getDumbModeAction();
55     if (myDumbModeAction == DumbModeAction.CANCEL) {
56       task.getProject().getMessageBus().connect(this).subscribe(DumbService.DUMB_MODE, new DumbService.DumbModeListener() {
57
58         public void enteredDumbMode() {
59           cancel();
60         }
61
62         public void exitDumbMode() {
63         }
64       });
65     }
66   }
67
68   public BackgroundableProcessIndicator(@Nullable final Project project, TaskInfo info, @NotNull PerformInBackgroundOption option) {
69     super(info.isCancellable(), true, project, info.getCancelText());
70     if (project != null) {
71       final ProjectManagerAdapter myListener = new ProjectManagerAdapter() {
72         public void projectClosing(Project closingProject) {
73           if (isRunning()) {
74             cancel();
75           }
76         }
77       };
78       ProjectManager.getInstance().addProjectManagerListener(project, myListener);
79       Disposer.register(this, new Disposable() {
80         @Override
81         public void dispose() {
82           ProjectManager.getInstance().removeProjectManagerListener(project, myListener);
83         }
84       });
85     }
86     setOwnerTask(info);
87     setProcessId(info.getProcessId());
88     myOption = option;
89     myInfo = info;
90     setTitle(info.getTitle());
91     final Project nonDefaultProject = project == null || project.isDisposed() ? null : project.isDefault() ? null : project;
92     final IdeFrame frame = ((WindowManagerEx)WindowManager.getInstance()).findFrameFor(nonDefaultProject);
93     myStatusBar = (StatusBarEx)frame.getStatusBar();
94     if (option.shouldStartInBackground()) {
95       doBackground();
96     }
97   }
98
99   public BackgroundableProcessIndicator(Project project,
100                                         @Nls final String progressTitle,
101                                         @NotNull PerformInBackgroundOption option,
102                                         @Nls final String cancelButtonText,
103                                         @Nls final String backgroundStopTooltip, final boolean cancellable) {
104     this(project, new TaskInfo() {
105       public String getProcessId() {
106         return "<unknown>";
107       }
108
109       public String getTitle() {
110         return progressTitle;
111       }
112
113       public String getCancelText() {
114         return cancelButtonText;
115       }
116
117       public String getCancelTooltipText() {
118         return backgroundStopTooltip;
119       }
120
121       public boolean isCancellable() {
122         return cancellable;
123       }
124     }, option);
125   }
126
127   public DumbModeAction getDumbModeAction() {
128     return myDumbModeAction;
129   }
130
131   protected void showDialog() {
132     if (myDisposed) return;
133
134     if (myOption.shouldStartInBackground()) {
135       return;
136     }
137
138     super.showDialog();
139   }
140
141   public void background() {
142     if (myDisposed) return;
143
144     myOption.processSentToBackground();
145     doBackground();
146     super.background();
147   }
148
149   private void doBackground() {
150     myStatusBar.addProgress(this, myInfo);
151   }
152
153   public void dispose() {
154     super.dispose();
155     myDisposed = true;
156     myInfo = null;
157     myStatusBar = null;
158     myOption = null;
159   }
160 }