annotate src/samer/core_/util/shell/ViewableManager.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
samer@0 1 /*
samer@0 2 * AppShell.java
samer@0 3 *
samer@0 4 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 5 * All rights reserved.
samer@0 6 *
samer@0 7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 8 * without even the implied warranty of MERCHANTABILITY or
samer@0 9 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 10 */
samer@0 11
samer@0 12 package samer.core.util.shell;
samer@0 13 import samer.core.util.*;
samer@0 14 import samer.core.types.*;
samer@0 15 import samer.core.*;
samer@0 16
samer@0 17 import java.awt.*;
samer@0 18 import java.awt.event.*;
samer@0 19 import java.util.*;
samer@0 20
samer@0 21 public class ViewableManager
samer@0 22 {
samer@0 23 private Vector viewables = new Vector();
samer@0 24 protected Vector exposedViewers = new Vector();
samer@0 25
samer@0 26 public ViewableManager() {
samer@0 27 Shell.put("ViewableManager", this);
samer@0 28 }
samer@0 29 protected static class VblEntry
samer@0 30 {
samer@0 31 public Viewable viewable;
samer@0 32 public boolean exposed=false;
samer@0 33
samer@0 34 public VblEntry(Viewable v) { viewable=v; }
samer@0 35 }
samer@0 36
samer@0 37 protected static class VwrEntry
samer@0 38 {
samer@0 39 public Viewer viewer;
samer@0 40 public VblEntry entry;
samer@0 41 public VwrEntry(VblEntry ve, Viewer vwr) { entry=ve; viewer=vwr; }
samer@0 42 }
samer@0 43
samer@0 44 public void listViewables() {
samer@0 45 Shell.print("registered viewables:");
samer@0 46 Iterator i=viewables.iterator();
samer@0 47 while(i.hasNext()) {
samer@0 48 Shell.print(((VblEntry)(i.next())).viewable.getNode().fullName() );
samer@0 49 }
samer@0 50 }
samer@0 51
samer@0 52 public void registerViewable(Viewable v)
samer@0 53 {
samer@0 54 if (findEntry(v)==null) {
samer@0 55 // not already in list, so add
samer@0 56 VblEntry vbl=new VblEntry(v);
samer@0 57 viewables.addElement(vbl);
samer@0 58
samer@0 59 // if viewables currently exposed, then expose this one
samer@0 60 if (vc!=null) {
samer@0 61 final Viewer vwr=v.getViewer();
samer@0 62 if (vwr!=null) {
samer@0 63 // add via singleton enumeration
samer@0 64 vc.add( new Iterator() {
samer@0 65 boolean more=true;
samer@0 66 public boolean hasNext() { return more; }
samer@0 67 public Object next() { more=false; return vwr.getComponent(); }
samer@0 68 public void remove() {}
samer@0 69 } );
samer@0 70 }
samer@0 71 }
samer@0 72 }
samer@0 73 }
samer@0 74
samer@0 75 public void deregisterViewable(Viewable v)
samer@0 76 {
samer@0 77 VblEntry ve=findEntry(v);
samer@0 78 if (ve!=null) viewables.removeElement(ve);
samer@0 79 // ought to remove from vc but can't be bothered
samer@0 80 }
samer@0 81
samer@0 82 public Viewable getViewable(String name)
samer@0 83 {
samer@0 84 Iterator i=viewables.iterator();
samer@0 85 Viewable best=null;
samer@0 86 int score=0;
samer@0 87
samer@0 88 while (i.hasNext()) {
samer@0 89 VblEntry ve=(VblEntry)i.next();
samer@0 90 String fullname=ve.viewable.getNode().fullName();
samer@0 91 if (name.endsWith(fullname)) {
samer@0 92 int ss=fullname.length();
samer@0 93 if (ss>score) {
samer@0 94 best=ve.viewable;
samer@0 95 score=ss;
samer@0 96 }
samer@0 97 }
samer@0 98 }
samer@0 99 return best;
samer@0 100 }
samer@0 101
samer@0 102 private VblEntry findEntry(Viewable v)
samer@0 103 {
samer@0 104 Iterator i=viewables.iterator();
samer@0 105 while (i.hasNext()) {
samer@0 106 VblEntry ve=(VblEntry)i.next();
samer@0 107 if (ve.viewable==v) return ve;
samer@0 108 }
samer@0 109 return null;
samer@0 110 }
samer@0 111
samer@0 112
samer@0 113 public interface ViewerContainer {
samer@0 114 // add(Viewer viewer);
samer@0 115 void add(Iterator components);
samer@0 116 void removeAll(); // redundant?
samer@0 117 }
samer@0 118
samer@0 119 private ViewerContainer vc=null;
samer@0 120
samer@0 121 public Iterator getViewables() {
samer@0 122 return new Iterator() {
samer@0 123 Iterator vbls=viewables.iterator();
samer@0 124 VblEntry vbl;
samer@0 125
samer@0 126 public boolean hasNext() { return vbls.hasNext(); }
samer@0 127 public Object next() { return ((VblEntry)vbls.next()).viewable; }
samer@0 128 public void remove() {}
samer@0 129 };
samer@0 130 }
samer@0 131
samer@0 132 /**
samer@0 133 Register the supplied ViewerContainer and fill with
samer@0 134 all currently registered exposable Viewables.
samer@0 135 Any subsequently registered Viewables will be exposed
samer@0 136 in this ViewerContainer.
samer@0 137 */
samer@0 138
samer@0 139 public void exposeViewables(ViewerContainer c)
samer@0 140 {
samer@0 141 Iterator viewers = new Iterator() {
samer@0 142 Iterator vbls=viewables.iterator();
samer@0 143 VblEntry vbl;
samer@0 144 Viewer nextvwr;
samer@0 145
samer@0 146 { prepareNext(); }
samer@0 147
samer@0 148 public void remove() {}
samer@0 149 public boolean hasNext() { return nextvwr!=null; }
samer@0 150 public Object next()
samer@0 151 {
samer@0 152 Component ret=nextvwr.getComponent();
samer@0 153 exposedViewers.addElement(new VwrEntry(vbl,nextvwr));
samer@0 154 vbl.exposed=true;
samer@0 155 prepareNext();
samer@0 156
samer@0 157 return ret;
samer@0 158 }
samer@0 159
samer@0 160 private void prepareNext()
samer@0 161 {
samer@0 162 while (vbls.hasNext()) {
samer@0 163 vbl=(VblEntry)vbls.next();
samer@0 164 if (!vbl.exposed) {
samer@0 165 nextvwr=vbl.viewable.getViewer();
samer@0 166 if (nextvwr!=null) return;
samer@0 167 }
samer@0 168 }
samer@0 169 nextvwr=null;
samer@0 170 }
samer@0 171 };
samer@0 172 c.add(viewers);
samer@0 173 vc=c;
samer@0 174 }
samer@0 175
samer@0 176 /**
samer@0 177 Empties and deregisters the currently registered ViewerContainer.
samer@0 178 All Viewers are detached, and removed, so they should be up
samer@0 179 for garbage collection after this. The ViewableManager also
samer@0 180 forgets about the ViewerContainer so that it can be disposed
samer@0 181 of and subsequently registered Viewable will not be shown.
samer@0 182 */
samer@0 183
samer@0 184 public void releaseViewerContainer()
samer@0 185 {
samer@0 186 if (vc==null) return;
samer@0 187
samer@0 188 Shell.trace("releasing viewer container");
samer@0 189 Iterator i=exposedViewers.iterator();
samer@0 190 while (i.hasNext()) {
samer@0 191 VwrEntry entry = (VwrEntry)i.next();
samer@0 192 entry.viewer.detach();
samer@0 193 entry.entry.exposed=false;
samer@0 194 }
samer@0 195 vc.removeAll();
samer@0 196 vc=null;
samer@0 197
samer@0 198 return;
samer@0 199 }
samer@0 200
samer@0 201 public boolean hasViewerContainer() { return vc!=null; }
samer@0 202 }
samer@0 203