1 19 20 package org.netbeans.modules.tasklist.docscan; 21 22 import org.netbeans.modules.tasklist.core.ObservableList; 23 import org.netbeans.modules.tasklist.core.TaskListener; 24 import org.netbeans.modules.tasklist.core.Task; 25 import org.netbeans.modules.tasklist.core.TaskList; 26 27 import java.util.*; 28 29 35 final class FilteredTasksList implements ObservableList { 36 37 45 46 private final TaskList peer; 47 private List listeners = new ArrayList(1); 48 private List tasks = new LinkedList(); 49 private EventHandler handler; 50 private boolean silent = false; 51 52 public FilteredTasksList(TaskList peer) { 53 this.peer = peer; 54 } 55 56 public List getTasks() { 57 return tasks; 58 } 59 60 public synchronized void addTaskListener(TaskListener l) { 61 assert l != null; 64 assert listeners.contains(l) == false; ArrayList clisteners = new ArrayList(listeners); 66 clisteners.add(l); 67 if (clisteners.size() == 1) { 68 handler = new EventHandler(); 69 peer.addTaskListener(handler); 70 } 71 listeners = clisteners; 72 } 73 74 public synchronized void removeTaskListener(TaskListener l) { 75 ArrayList clisteners = new ArrayList(listeners); 76 clisteners.remove(l); 77 if (clisteners.size() == 0) { 78 peer.removeTaskListener(handler); handler = null; 80 } 81 listeners = clisteners; 82 } 83 84 87 synchronized void byebye() { 88 if (listeners.size() > 0) { 89 } 91 listeners.clear(); 92 peer.removeTaskListener(handler); handler = null; 94 } 95 96 private void fireStructureChanged(Task task) { 97 99 Iterator it = listeners.iterator(); 100 while (it.hasNext()) { 101 TaskListener listener = (TaskListener) it.next(); 102 listener.structureChanged(task); 103 } 104 } 105 106 107 private void refreshSnapshot() { 108 tasks.clear(); 109 loadSourceTasks(peer.getTasks()); 110 } 111 112 private void loadSourceTasks(List tasks) { 113 if (tasks.size() == 0) return; 114 Iterator it = tasks.iterator(); 115 while (it.hasNext()) { 116 Task task = (Task) it.next(); 117 if (task.getSeed() instanceof SourceTaskProvider) { 118 tasks.add(task); 119 } else { 120 if (task.hasSubtasks()) { 124 loadSourceTasks(task.getSubtasks()); } 126 } 127 } 128 } 129 130 133 private class EventHandler implements TaskListener { 134 public void selectedTask(Task t) { 135 if (getTasks().contains(t)) { 136 Iterator it = listeners.iterator(); 137 while (it.hasNext()) { 138 TaskListener listener = (TaskListener) it.next(); 139 listener.selectedTask(t); 140 } 141 } 142 } 143 144 public void warpedTask(Task t) { 145 assert false : "Not implemented"; 146 } 147 148 public void addedTask(Task t) { 149 if (t.getSeed() instanceof SourceTaskProvider) { 150 try { 151 silent = true; 152 tasks.add(t); 153 } finally { 154 silent = false; 155 } 156 157 159 Iterator it = listeners.iterator(); 160 while (it.hasNext()) { 161 TaskListener listener = (TaskListener) it.next(); 162 listener.addedTask(t); 163 } 164 } else if (t.hasSubtasks()) { 165 Iterator it = t.subtasksIterator(); 167 while (it.hasNext()) { 168 Task task = (Task) it.next(); 169 addedTask(task); } 171 } 172 } 173 174 public void removedTask(Task pt, Task t, int index) { 175 if (t.getSeed() instanceof SourceTaskProvider) { 176 boolean removed = false; 177 try { 178 silent = true; 179 removed = tasks.remove(t); 180 } finally { 181 silent = false; 182 } 183 184 186 if (removed) { 187 Iterator it = listeners.iterator(); 188 while (it.hasNext()) { 189 TaskListener listener = (TaskListener) it.next(); 190 listener.removedTask(null, t, index); 191 } 192 } 193 } else if (t.hasSubtasks()) { 194 Iterator it = t.subtasksIterator(); 196 int ind = 0; 197 while (it.hasNext()) { 198 Task task = (Task) it.next(); 199 removedTask(null, task, ind++); } 202 } 203 } 204 205 public void structureChanged(Task t) { 206 try { 208 silent = true; 209 refreshSnapshot(); 210 } finally { 211 silent = false; 212 } 213 fireStructureChanged(t); 214 } 215 } 216 217 } 218 | Popular Tags |