01: package gnu.kawa.models;
02:
03: import java.awt.Dimension;
04: import java.awt.geom.Dimension2D;
05: import gnu.mapping.ThreadLocation;
06:
07: /** An abstract "display device".
08: * In the AWT/Swing world, this may bundle a GraphicsConfiguration
09: * and a Toolkit.
10: * In the web servlet world, this may correspond to a browser on
11: * on the other end of an http connection. */
12:
13: public abstract class Display {
14: public static ThreadLocation myDisplay = new ThreadLocation(
15: "my-display");
16:
17: public static Display getInstance() {
18: Object d = myDisplay.get(null);
19: if (d instanceof Display)
20: return (Display) d;
21: String name = d == null ? "swing" : d.toString();
22: Class[] noClasses = new Class[0];
23: for (;;) {
24: int comma = name.indexOf(',');
25: String rest = null;
26: if (comma >= 0) {
27: rest = name.substring(comma + 1);
28: name = name.substring(0, comma);
29: }
30:
31: if (name.equals("swing"))
32: name = "gnu.kawa.swingviews.SwingDisplay";
33: else if (name.equals("swt"))
34: name = "gnu.kawa.swtviews.SwtDisplay";
35: else if (name.equals("echo2"))
36: name = "gnu.kawa.echo2.Echo2Display";
37:
38: try {
39: Class clas = Class.forName(name);
40: java.lang.reflect.Method method = clas
41: .getDeclaredMethod("getInstance", noClasses);
42: return (Display) method.invoke(null, new Object[0]);
43: } catch (ClassNotFoundException ex) {
44: if (rest == null)
45: throw new RuntimeException("no display toolkit: "
46: + d);
47: name = rest;
48: } catch (Throwable ex) {
49: throw gnu.mapping.WrappedException.wrapIfNeeded(ex);
50: }
51: }
52: }
53:
54: public abstract Window makeWindow();
55:
56: public abstract void addButton(Button model, Object where);
57:
58: public abstract void addLabel(Label model, Object where);
59:
60: public abstract void addImage(DrawImage model, Object where);
61:
62: public void addText(Text model, Object where) {
63: throw new Error("makeView called on DrawImage");
64: }
65:
66: public void addSpacer(Spacer model, Object where) {
67: throw new Error("makeView called on Spacer");
68: }
69:
70: public abstract void addBox(Box model, Object where);
71:
72: public abstract void addView(Object view, Object where);
73:
74: public static Dimension asDimension(Dimension2D dim) {
75: if (dim instanceof Dimension || dim == null)
76: return (Dimension) dim;
77: else
78: return new Dimension((int) (dim.getWidth() + 0.5),
79: (int) (dim.getHeight() + 0.5));
80: }
81:
82: public Model coerceToModel(Object component) {
83: if (component instanceof gnu.lists.FString
84: || component instanceof String)
85: return new Label(component.toString());
86: return (Model) component;
87: }
88: }
|