Update of /cvsroot/octave/octave-forge/extra/jhandles/src/org/octave/graphics In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv24999/src/org/octave/graphics Modified Files: HandleObject.java OctaveSink.java Added Files: HandleEvent.java HandleEventSink.java HandleEventSource.java Log Message: implement new named event mechanism + add "ObjectDeleted" event + use it to keep areaseries objects in sync Index: OctaveSink.java =================================================================== RCS file: /cvsroot/octave/octave-forge/extra/jhandles/src/org/octave/graphics/OctaveSink.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- OctaveSink.java 11 Jun 2007 12:26:30 -0000 1.4 +++ OctaveSink.java 6 Sep 2007 10:16:53 -0000 1.5 @@ -23,7 +23,7 @@ import org.octave.*; -public class OctaveSink implements HandleNotifier.Sink +public class OctaveSink implements HandleNotifier.Sink, HandleEventSink { private OctaveReference ref; @@ -44,11 +44,15 @@ Property p = h.getProperty(pnames[i]); if (p != null) n.addSource(p); + else if (h.hasHandleEvent(pnames[i])) + h.addHandleEventSink(pnames[i], this); else System.out.println("WARNING: `" + pnames[i] + "' is not a valid property name of " + h.Type.toString()); } } + /* HandleNotifier.Sink interface */ + public void addNotifier(HandleNotifier h) { } @@ -66,4 +70,17 @@ ref.invokeAndWait(new Object[] {new Double(h.getHandle())}); } } + + /* HandleEventSink interface */ + + public void eventOccured(HandleEvent evt) + { + HandleObject h = evt.getHandleObject(); + if (h != null) + ref.invokeAndWait(new Object[] {new Double(h.getHandle()), null}); + else + ref.invokeAndWait(new Object[] {null, evt}); + } + + public void sourceDeleted(Object src) {} } --- NEW FILE: HandleEventSink.java --- /* * jhandles * * Copyright (C) 2007 Michael Goffioul * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package org.octave.graphics; public interface HandleEventSink { public void eventOccured(HandleEvent evt); public void sourceDeleted(Object source); } --- NEW FILE: HandleEvent.java --- /* * jhandles * * Copyright (C) 2007 Michael Goffioul * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package org.octave.graphics; import java.util.EventObject; public class HandleEvent extends EventObject { private String name; public HandleEvent(Object source, String name) { super(source); this.name = name; } public String getName() { return name; } public HandleObject getHandleObject() { Object obj = getSource(); if (obj instanceof HandleObject) return (HandleObject)obj; else if (obj instanceof Property) { obj = ((Property)obj).getParent(); if (obj instanceof HandleObject) return (HandleObject)obj; } return null; } public Property getProperty() { Object obj = getSource(); if (obj instanceof Property) return (Property)obj; return null; } } Index: HandleObject.java =================================================================== RCS file: /cvsroot/octave/octave-forge/extra/jhandles/src/org/octave/graphics/HandleObject.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- HandleObject.java 31 Aug 2007 15:04:00 -0000 1.19 +++ HandleObject.java 6 Sep 2007 10:16:53 -0000 1.20 @@ -30,7 +30,8 @@ private int handle; private Renderer.CachedData cachedData = null; private boolean valid = false; - private List notifierList = new LinkedList(); + private List notifierList; + private HandleEventSource eventSource; protected int autoMode = 0; protected PropertySet defaultSet = new PropertySet(); @@ -58,14 +59,15 @@ public HandleObject(HandleObject parent, String type) { - handle = newHandle(); - addHandleObject(getHandle(), this); - initProperties(parent, type); + this(parent, newHandle(), type); } public HandleObject(HandleObject parent, int handle, String type) { this.handle = handle; + this.notifierList = new LinkedList(); + this.eventSource = new HandleEventSource(this, new String[] {"ObjectDeleted"}); + addHandleObject(getHandle(), this); initProperties(parent, type); } @@ -157,6 +159,7 @@ public void delete() { BeingDeleted.reset("on"); + eventSource.fireEvent("ObjectDeleted"); DeleteFcn.execute(new Object[] { new Double(getHandle()), null}); @@ -169,6 +172,7 @@ HandleNotifier n = (HandleNotifier)notifierList.remove(0); n.removeSink(this); } + eventSource.delete(); deleteChildren(); if (cachedData != null) @@ -358,6 +362,21 @@ super.set(name, value); } + public void addHandleEventSink(String name, HandleEventSink sink) + { + eventSource.addHandleEventSink(name, sink); + } + + public void removeHandleEventSink(HandleEventSink sink) + { + eventSource.removeHandleEventSink(sink); + } + + public boolean hasHandleEvent(String name) + { + return eventSource.hasHandleEvent(name); + } + /* HandleNotifier.Sink interface */ public void addNotifier(HandleNotifier hn) --- NEW FILE: HandleEventSource.java --- /* * jhandles * * Copyright (C) 2007 Michael Goffioul * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package org.octave.graphics; import java.util.*; public class HandleEventSource { private Object source; protected Map eventMap; public HandleEventSource(Object source, String[] events) { this.source = source; this.eventMap = Collections.synchronizedMap(new HashMap()); for (int i=0; i<events.length; i++) eventMap.put(events[i], null); } public boolean hasHandleEvent(String name) { return eventMap.containsKey(name); } public void fireEvent(String name) { if (eventMap.containsKey(name)) { LinkedList l = (LinkedList)eventMap.get(name); if (l != null) synchronized (l) { HandleEvent evt = new HandleEvent(source, name); Iterator it = l.iterator(); while (it.hasNext()) ((HandleEventSink)it.next()).eventOccured(evt); } } else System.out.println("ERROR: unknown event `" + name + "' for objects of type " + source.getClass()); } public void addHandleEventSink(String name, HandleEventSink sink) { if (eventMap.containsKey(name)) { List l = (List)eventMap.get(sink); if (l == null) eventMap.put(name, (l = new LinkedList())); l.add(sink); } else System.out.println("ERROR: unknown event `" + name + "' for objects of type " + source.getClass()); } public void removeHandleEventSink(HandleEventSink sink) { Iterator it = eventMap.values().iterator(); while (it.hasNext()) { List l = (List)it.next(); if (l != null) while (l.remove(sink)); } } public void delete() { Iterator it = eventMap.values().iterator(); while (it.hasNext()) { List l = (List)it.next(); if (l != null) { Iterator lit = l.iterator(); while (lit.hasNext()) ((HandleEventSink)lit.next()).sourceDeleted(source); } } } } |