KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > kawa > swingviews > SwingDisplay


1 package gnu.kawa.swingviews;
2 import gnu.kawa.models.*;
3 import gnu.kawa.models.Box;
4 import javax.swing.*;
5 import javax.swing.text.*;
6 import java.awt.Component JavaDoc;
7 import java.awt.event.*;
8 import gnu.mapping.Procedure;
9
10 public class SwingDisplay extends Display
11 {
12   static final SwingDisplay instance = new SwingDisplay();
13
14   public static Display getInstance() { return instance; }
15
16   public Window makeWindow ()
17   {
18     SwingFrame window = new SwingFrame(null, null, null);
19     window.display = this;
20     return window;
21   }
22
23   public void addButton (Button model, Object JavaDoc where)
24   {
25     addView(new SwingButton(model), where);
26   }
27
28   public void addLabel (Label model, Object JavaDoc where)
29   {
30     addView(new SwingLabel(model), where);
31   }
32
33   public void addImage (DrawImage model, Object JavaDoc where)
34   {
35     addView(new JLabel(new ImageIcon(model.getImage())), where);
36   }
37
38   public void addText (Text model, Object JavaDoc where)
39   {
40     addView(new JTextField(getSwingDocument(model), null, 50),
41             where);
42   }
43
44   private static java.util.WeakHashMap JavaDoc documents = null;
45
46   static synchronized javax.swing.text.Document JavaDoc getSwingDocument (Text model)
47   {
48     if (documents == null)
49       documents = new java.util.WeakHashMap JavaDoc();
50     Object JavaDoc existing = documents.get(model);
51     if (existing != null)
52       return (javax.swing.text.Document JavaDoc) existing;
53     javax.swing.text.Document JavaDoc doc
54       = new javax.swing.text.PlainDocument JavaDoc(new SwingContent(model.buffer));
55     documents.put(model, doc);
56     return doc;
57   }
58
59   public void addBox (Box model, Object JavaDoc where)
60   {
61     addView(new SwingBox(model, this), where);
62   }
63
64   public void addSpacer (Spacer model, Object JavaDoc where)
65   {
66     addView(new javax.swing.Box.Filler(model.getMinimumSize(),
67                                        model.getPreferredSize(),
68                                        model.getMaximumSize()),
69             where);
70   }
71
72   public void addView (Object JavaDoc view, Object JavaDoc where)
73   {
74     ((java.awt.Container JavaDoc) where).add((Component JavaDoc) view);
75   }
76
77   public static ActionListener makeActionListener (Object JavaDoc command)
78   {
79     if (command instanceof ActionListener)
80       return (ActionListener) command;
81     return new ProcActionListener((Procedure) command);
82   }
83
84
85   public Model coerceToModel (Object JavaDoc component)
86   {
87     if (component instanceof Component JavaDoc)
88       return new ComponentModel((Component JavaDoc) component);
89     if (component instanceof Paintable)
90       // Kludge - should create a Viewable. FIXME.
91
return new ComponentModel(new SwingPaintable((Paintable) component));
92     return super.coerceToModel(component);
93   }
94 }
95
96 class ProcActionListener implements ActionListener
97 {
98   Procedure proc;
99
100   public ProcActionListener (Procedure proc) { this.proc = proc; }
101
102   public void actionPerformed (ActionEvent e)
103   {
104     try
105       {
106     proc.apply1(e);
107       }
108     catch (Throwable JavaDoc ex)
109       {
110     throw new gnu.mapping.WrappedException(ex);
111       }
112   }
113 }
114
115 class SwingBox
116 extends javax.swing.Box JavaDoc
117 implements ModelListener
118 {
119   Box model;
120
121   public SwingBox (Box model, Display display)
122   {
123     super(model.getAxis());
124     model.addListener(this);
125     Viewable cellSpacing = model.getCellSpacing();
126     int n = model.getComponentCount();
127     for (int i = 0; i < n; i++)
128       {
129         if (i > 0 && cellSpacing != null)
130           cellSpacing.makeView(display, this);
131         model.getComponent(i).makeView(display, this);
132       }
133   }
134
135   public void modelUpdated (Model model, Object JavaDoc key)
136   {
137   }
138 }
139
140 class SwingLabel
141 extends JLabel
142 implements ModelListener
143 {
144   Label model;
145
146   public SwingLabel (Label model)
147   {
148     this.model = model;
149     String JavaDoc text = model.getText();
150     if (text != null)
151       super.setText(text);
152     model.addListener(this);
153   }
154
155   public void modelUpdated (Model model, Object JavaDoc key)
156   {
157     if (key == "text" && model == this.model)
158       super.setText(this.model.getText());
159   }
160
161   public void setText(String JavaDoc text)
162   {
163     if (model == null)
164       super.setText(text);
165     else
166       model.setText(text);
167   }
168 }
169
170 /** A Model wrapper around a Swing/AWT Component. */
171
172 class ComponentModel extends Model
173 {
174   Component JavaDoc component;
175
176   public ComponentModel (Component JavaDoc component)
177   {
178     this.component = component;
179   }
180
181   public void makeView (Display display, Object JavaDoc where)
182   {
183     display.addView(component, where);
184   }
185 }
186
Popular Tags