Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv23342/src/net/sourceforge/bprocessor/model
Modified Files:
Project.java
Log Message:
added method to schedule the addition of a new observer so there is no exception thrown when an observer is added in an update method.
Index: Project.java
===================================================================
RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Project.java,v
retrieving revision 1.103
retrieving revision 1.104
diff -C2 -d -r1.103 -r1.104
*** Project.java 19 Dec 2006 13:20:32 -0000 1.103
--- Project.java 30 Dec 2006 15:30:35 -0000 1.104
***************
*** 44,47 ****
--- 44,50 ----
private List observers;
+ /** The scheduled observers */
+ private List scheduledObservers;
+
/** The Mesh */
private Space world;
***************
*** 104,107 ****
--- 107,113 ----
private Collection copyBuffer;
+ /** Flag set when updating */
+ private boolean updating = false;
+
/**
* Get the instance
***************
*** 130,133 ****
--- 136,140 ----
new double[]{0, 0, 1}, Camera.PERSPECTIVE);
observers = new LinkedList();
+ scheduledObservers = new LinkedList();
world = new Space("Project", Space.FUNCTIONAL, Space.PROJECT_LEVEL, true);
world.setId(new Long(0));
***************
*** 200,203 ****
--- 207,231 ----
/**
+ * Schedule adding an observer. Will be added at a safe time.
+ * @param observer The observer
+ */
+ public void scheduleObserver(Observer observer) {
+ scheduledObservers.add(observer);
+ if (!updating) {
+ addSchedule();
+ }
+ }
+
+ /**
+ * Adds observers scheduled.
+ */
+ private void addSchedule() {
+ Iterator it = scheduledObservers.iterator();
+ while (it.hasNext()) {
+ addObserver((Observer)it.next());
+ }
+ }
+
+ /**
* Remove observer
* @param observer The observer
***************
*** 213,220 ****
--- 241,251 ----
public void changed(Object entity) {
Iterator iter = observers.iterator();
+ updating = true;
while (iter.hasNext()) {
Observer current = (Observer) iter.next();
current.update(entity);
}
+ updating = false;
+ addSchedule();
makeDirty();
}
|