IDEA-108938 External system: Provide ability to detach linked external project
[idea/community.git] / platform / external-system-impl / src / com / intellij / openapi / externalSystem / service / task / ui / ExternalSystemRecentTaskListModel.java
1 /*
2  * Copyright 2000-2013 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.openapi.externalSystem.service.task.ui;
17
18 import com.intellij.openapi.externalSystem.model.ProjectSystemId;
19 import com.intellij.openapi.externalSystem.model.execution.ExternalTaskExecutionInfo;
20 import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
21 import com.intellij.openapi.externalSystem.util.ExternalSystemConstants;
22 import com.intellij.openapi.project.Project;
23 import com.intellij.util.containers.ContainerUtilRt;
24 import org.jetbrains.annotations.NotNull;
25
26 import javax.swing.*;
27 import java.util.List;
28
29 /**
30  * @author Denis Zhdanov
31  * @since 6/7/13 3:28 PM
32  */
33 public class ExternalSystemRecentTaskListModel extends DefaultListModel {
34
35   @NotNull private final ProjectSystemId myExternalSystemId;
36   @NotNull private final Project         myProject;
37
38   public ExternalSystemRecentTaskListModel(@NotNull ProjectSystemId externalSystemId, @NotNull Project project) {
39     myExternalSystemId = externalSystemId;
40     myProject = project;
41     ensureSize(ExternalSystemConstants.RECENT_TASKS_NUMBER);
42   }
43
44   @SuppressWarnings("unchecked")
45   public void setTasks(@NotNull List<ExternalTaskExecutionInfo> tasks) {
46     clear();
47     List<ExternalTaskExecutionInfo> tasksToUse = ContainerUtilRt.newArrayList(tasks);
48     for (ExternalTaskExecutionInfo task : tasksToUse) {
49       addElement(task);
50     }
51   }
52
53   @SuppressWarnings("unchecked")
54   public void setFirst(@NotNull ExternalTaskExecutionInfo task) {
55     insertElementAt(task, 0);
56     if (size() > 1) {
57       remove(size() - 1);
58     }
59     for (int i = 1; i < size(); i++) {
60       if (task.equals(getElementAt(i))) {
61         remove(i);
62         break;
63       }
64     }
65     ensureSize(ExternalSystemConstants.RECENT_TASKS_NUMBER);
66   }
67
68   @NotNull
69   public List<ExternalTaskExecutionInfo> getTasks() {
70     List<ExternalTaskExecutionInfo> result = ContainerUtilRt.newArrayList();
71     for (int i = 0; i < size(); i++) {
72       Object e = getElementAt(i);
73       if (e instanceof ExternalTaskExecutionInfo) {
74         result.add((ExternalTaskExecutionInfo)e);
75       }
76     }
77     return result;
78   }
79
80   @SuppressWarnings("unchecked")
81   public void ensureSize(int elementsNumber) {
82     int toAdd = elementsNumber - size();
83     if (toAdd <= 0) {
84       return;
85     }
86     while (--toAdd >= 0) {
87       addElement(new MyEmptyDescriptor());
88     }
89   }
90
91   /**
92    * Asks current model to remove all 'recent task info' entries which point to tasks from external project with the given path.
93    * 
94    * @param externalProjectPath  target external project's path
95    */
96   public void forgetTasksFrom(@NotNull String externalProjectPath) {
97     for (int i = size() - 1; i >= 0; i--) {
98       Object e = getElementAt(i);
99       if (e instanceof ExternalTaskExecutionInfo) {
100         String path = ((ExternalTaskExecutionInfo)e).getSettings().getExternalProjectPath();
101         if (externalProjectPath.equals(path)
102             || externalProjectPath.equals(ExternalSystemApiUtil.getRootProjectPath(path, myExternalSystemId, myProject)))
103         {
104           removeElementAt(i);
105         }
106       }
107     }
108     ensureSize(ExternalSystemConstants.RECENT_TASKS_NUMBER);
109   }
110
111   static class MyEmptyDescriptor {
112   }
113 }