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