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
|