1 4 package demo.sharededitor.models; 5 6 import demo.sharededitor.events.IListListener; 7 8 import java.util.ArrayList ; 9 import java.util.List ; 10 import java.util.Collections ; 11 import java.util.Iterator ; 12 13 public class ObjectManager 14 implements IListListener 15 { 16 private List objList; 17 private transient List grabList; 18 private transient List listeners; 19 private transient BaseObject lastGrabbed; 20 21 public ObjectManager() 22 { 23 objList = Collections.synchronizedList(new ArrayList ()); 24 init_transients(); 25 notifyListeners(null); 26 } 27 28 public void init_transients() 29 { 30 listeners = Collections.synchronizedList(new ArrayList ()); 31 grabList = Collections.synchronizedList(new ArrayList ()); 32 } 33 34 public void addListener(IListListener listListener) 35 { 36 synchronized(listeners) { 37 if (!listeners.contains(listListener)) 38 { 39 listeners.add(listListener); 40 listListener.changed(this, null); 41 } 42 } 43 } 44 45 public void removeListener(IListListener listListener) 46 { 47 synchronized(objList) { 48 if (listeners.contains(listListener)) 49 listeners.remove(listListener); 50 } 51 } 52 53 private void notifyListeners(Object obj) 54 { 55 synchronized(objList) { 56 Iterator i = listeners.iterator(); 57 while (i.hasNext()) 58 { 59 IListListener listListener = (IListListener)i.next(); 60 listListener.changed(this, obj); 61 } 62 } 63 } 64 65 public synchronized void add(BaseObject obj) 66 { 67 synchronized(objList) { 68 if (objList.contains(obj)) 69 return; 70 71 obj.addListener(this); 72 objList.add(obj); 73 obj.notifyListeners(obj); 74 75 notifyListeners(obj); 76 } 77 } 78 79 public synchronized void remove(BaseObject obj) 80 { 81 synchronized(objList) { 82 if (!objList.contains(obj)) 83 return; 84 85 objList.remove(obj); 86 obj.notifyListeners(obj); 87 obj.removeListener(this); 88 89 notifyListeners(obj); 90 } 91 } 92 93 public BaseObject[] reversedList() 94 { 95 synchronized(objList) { 96 List list = new ArrayList (objList); 97 Collections.reverse(list); 98 return (BaseObject[])list.toArray(new BaseObject[0]); 99 } 100 } 101 102 public BaseObject[] list() 103 { 104 synchronized(objList) { 105 return (BaseObject[])objList.toArray(new BaseObject[0]); 106 } 107 } 108 109 public boolean canGrabAt(int x, int y) 110 { 111 BaseObject[] list = reversedList(); 112 for(int i=0; i<list.length; i++) 113 { 114 BaseObject obj = list[i]; 115 if (obj.isAt(x, y)) 116 return true; 117 } 118 return false; 119 } 120 121 public BaseObject create(int x, int y, String name) 122 { 123 BaseObject obj = BaseObject.createObject(name); 124 obj.move(x, y); 125 add(obj); 126 ungrabAll(); 127 grab(obj, x, y); 128 return obj; 129 } 130 131 public BaseObject grabAt(int x, int y, boolean ungrabAll) 132 { 133 BaseObject[] list = reversedList(); 134 for(int i=0; i<list.length; i++) 135 { 136 BaseObject obj = list[i]; 137 if (obj.isAt(x, y)) 138 { 139 if (ungrabAll) 140 ungrabAll(); 141 grab(obj, x, y); 142 return obj; 143 } 144 } 145 if (ungrabAll) 146 ungrabAll(); 147 return null; 148 } 149 150 public BaseObject lastGrabbed() 151 { 152 return lastGrabbed; 153 } 154 155 private void ungrabAll() 156 { 157 synchronized(grabList) { 158 lastGrabbed = null; 159 grabList.clear(); 160 notifyListeners(null); 161 } 162 } 163 164 private void grab(BaseObject obj, int x, int y) 165 { 166 synchronized(grabList) { 167 obj.selectAction(true); 168 169 if (grabList.contains(obj)) 170 return; 171 172 grabList.add(obj); 173 obj.setGrabbedAnchorAt(x, y); 174 175 notifyListeners(obj); 176 lastGrabbed = obj; 177 } 178 } 179 180 private void ungrab(BaseObject obj) 181 { 182 synchronized(grabList) { 183 obj.selectAction(false); 184 185 if (!grabList.contains(obj)) 186 return; 187 188 grabList.remove(obj); 189 notifyListeners(obj); 190 lastGrabbed = null; 191 } 192 } 193 194 private void grab(BaseObject obj) 195 { 196 synchronized(grabList) { 197 if (grabList.contains(obj)) 198 return; 199 200 obj.selectAction(true); 201 grabList.add(obj); 202 notifyListeners(obj); 203 lastGrabbed = obj; 204 } 205 } 206 207 public void deleteSelection() 208 { 209 synchronized(grabList) { 210 Iterator i = grabList.iterator(); 211 while (i.hasNext()) 212 remove((BaseObject)i.next()); 213 } 214 } 215 216 public void selectAll() 217 { 218 BaseObject[] list = list(); 219 for(int i=0; i<list.length; i++) 220 grab(list[i]); 221 } 222 223 public void selectAllWithin(BaseObject boundary) 224 { 225 BaseObject[] list = list(); 226 for(int i=0; i<list.length; i++) 227 { 228 java.awt.Shape s1 = boundary.getShape(); 229 java.awt.Shape s2 = list[i].getShape(); 230 if (s1.contains(s2.getBounds2D())) 231 grab(list[i]); 232 } 233 } 234 235 public void clearSelection() 236 { 237 BaseObject[] list = list(); 238 for(int i=0; i<list.length; i++) 239 ungrab(list[i]); 240 } 241 242 public void invertSelection() 243 { 244 BaseObject[] list = list(); 245 for(int i=0; i<list.length; i++) 246 { 247 BaseObject obj = list[i]; 248 if (isGrabbed(obj)) 249 ungrab(obj); 250 else 251 grab(obj); 252 } 253 } 254 255 public void toggleSelection() 256 { 257 synchronized(objList) { 258 synchronized(grabList) { 259 if (objList.size() == grabList.size()) 260 clearSelection(); 261 else 262 selectAll(); 263 } 264 } 265 } 266 267 public boolean isGrabbed(BaseObject obj) 268 { 269 synchronized(grabList) { 270 return grabList.contains(obj); 271 } 272 } 273 274 public void changed(Object source, Object obj) 275 { 276 notifyListeners(obj); 277 } 278 } 279 | Popular Tags |