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