diff src/samer/core_/util/shell/ViewableManager.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/core_/util/shell/ViewableManager.java	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,203 @@
+/*
+ *	AppShell.java	
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY; 
+ *	without even the implied warranty of MERCHANTABILITY or 
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.core.util.shell;
+import  samer.core.util.*;
+import  samer.core.types.*;
+import  samer.core.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+public class ViewableManager
+{
+	private		Vector	viewables = new Vector();
+	protected	Vector	exposedViewers = new Vector();
+
+	public ViewableManager() {
+		Shell.put("ViewableManager", this);
+	}
+	protected static class VblEntry
+	{
+		public Viewable viewable;
+		public boolean	exposed=false;
+
+		public VblEntry(Viewable v) { viewable=v; }
+	}
+
+	protected static class VwrEntry
+	{
+		public Viewer	viewer;
+		public VblEntry	entry;
+		public VwrEntry(VblEntry ve, Viewer vwr) { entry=ve; viewer=vwr; }
+	}
+
+	public void listViewables() {
+		Shell.print("registered viewables:");
+		Iterator i=viewables.iterator();
+		while(i.hasNext()) {
+			Shell.print(((VblEntry)(i.next())).viewable.getNode().fullName()	);
+		}
+	}
+
+	public void registerViewable(Viewable v)
+	{
+		if (findEntry(v)==null)	{
+			// not already in list, so add
+			VblEntry vbl=new VblEntry(v);
+			viewables.addElement(vbl);
+
+			// if viewables currently exposed, then expose this one
+			if (vc!=null) {
+				final Viewer vwr=v.getViewer();
+				if (vwr!=null) {
+					// add via singleton enumeration
+					vc.add( new Iterator() {
+						boolean more=true;
+						public boolean hasNext() { return more; }
+						public Object next() { more=false; return vwr.getComponent(); }
+						public void remove() {}
+					} );
+				}
+			}
+		}
+	}
+
+	public void deregisterViewable(Viewable v)
+	{
+		VblEntry ve=findEntry(v);
+		if (ve!=null) viewables.removeElement(ve);
+		// ought to remove from vc but can't be bothered
+	}
+
+	public Viewable getViewable(String name)
+	{
+		Iterator i=viewables.iterator();
+		Viewable		best=null;
+		int			score=0;
+
+		while (i.hasNext()) {
+			VblEntry ve=(VblEntry)i.next();
+			String fullname=ve.viewable.getNode().fullName();
+			if (name.endsWith(fullname)) {
+				int ss=fullname.length();
+				if (ss>score) {
+					best=ve.viewable;
+					score=ss;
+				}
+			}
+		}
+		return best;
+	}
+
+	private VblEntry findEntry(Viewable v)
+	{
+		Iterator i=viewables.iterator();
+		while (i.hasNext()) {
+			VblEntry ve=(VblEntry)i.next();
+			if (ve.viewable==v) return ve;
+		}
+		return null;
+	}
+
+
+	public interface ViewerContainer {
+		// add(Viewer viewer);
+		void add(Iterator components);
+		void removeAll(); // redundant?
+	}
+
+	private ViewerContainer vc=null;
+
+	public Iterator getViewables() {
+		return new Iterator() {
+			Iterator vbls=viewables.iterator();
+			VblEntry	vbl;
+
+			public boolean hasNext() { return vbls.hasNext(); }
+			public Object next() 	{ return ((VblEntry)vbls.next()).viewable; }
+			public void remove() {}
+		};
+	}
+
+	/**
+		Register the supplied ViewerContainer and fill with
+		all currently registered exposable Viewables.
+		Any subsequently registered Viewables will be exposed
+		in this ViewerContainer.
+	  */
+
+	public void exposeViewables(ViewerContainer c)
+	{
+		Iterator viewers = new Iterator() {
+			Iterator vbls=viewables.iterator();
+			VblEntry	vbl;
+			Viewer		nextvwr;
+
+			{ prepareNext(); }
+
+			public void remove() {}
+			public boolean hasNext() { return nextvwr!=null; }
+			public Object next()
+			{
+				Component ret=nextvwr.getComponent();
+				exposedViewers.addElement(new VwrEntry(vbl,nextvwr));
+				vbl.exposed=true;
+				prepareNext();
+
+				return ret;
+			}
+
+			private void prepareNext()
+			{
+				while (vbls.hasNext()) {
+					vbl=(VblEntry)vbls.next();
+					if (!vbl.exposed) {
+						nextvwr=vbl.viewable.getViewer();
+						if (nextvwr!=null) return;
+					}
+				}
+				nextvwr=null;
+			}
+		};
+		c.add(viewers);
+		vc=c;
+	}
+
+	/**
+		Empties and deregisters the currently registered ViewerContainer.
+		All Viewers are detached, and removed, so they should be up
+		for garbage collection after this. The ViewableManager also
+		forgets about the ViewerContainer so that it can be disposed
+		of and subsequently registered Viewable will not be shown.
+	  */
+
+	public void releaseViewerContainer()
+	{
+		if (vc==null) return;
+
+		Shell.trace("releasing viewer container");
+		Iterator i=exposedViewers.iterator();
+		while (i.hasNext()) {
+			VwrEntry entry = (VwrEntry)i.next();
+			entry.viewer.detach();
+			entry.entry.exposed=false;
+		}
+		vc.removeAll();
+		vc=null;
+
+		return;
+	}
+
+	public boolean hasViewerContainer() { return vc!=null; }
+}
+