Mercurial > hg > jslab
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 |