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 ; 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 where) 24 { 25 addView(new SwingButton(model), where); 26 } 27 28 public void addLabel (Label model, Object where) 29 { 30 addView(new SwingLabel(model), where); 31 } 32 33 public void addImage (DrawImage model, Object where) 34 { 35 addView(new JLabel(new ImageIcon(model.getImage())), where); 36 } 37 38 public void addText (Text model, Object where) 39 { 40 addView(new JTextField(getSwingDocument(model), null, 50), 41 where); 42 } 43 44 private static java.util.WeakHashMap documents = null; 45 46 static synchronized javax.swing.text.Document getSwingDocument (Text model) 47 { 48 if (documents == null) 49 documents = new java.util.WeakHashMap (); 50 Object existing = documents.get(model); 51 if (existing != null) 52 return (javax.swing.text.Document ) existing; 53 javax.swing.text.Document doc 54 = new javax.swing.text.PlainDocument (new SwingContent(model.buffer)); 55 documents.put(model, doc); 56 return doc; 57 } 58 59 public void addBox (Box model, Object where) 60 { 61 addView(new SwingBox(model, this), where); 62 } 63 64 public void addSpacer (Spacer model, Object 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 view, Object where) 73 { 74 ((java.awt.Container ) where).add((Component ) view); 75 } 76 77 public static ActionListener makeActionListener (Object 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 component) 86 { 87 if (component instanceof Component ) 88 return new ComponentModel((Component ) component); 89 if (component instanceof Paintable) 90 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 ex) 109 { 110 throw new gnu.mapping.WrappedException(ex); 111 } 112 } 113 } 114 115 class SwingBox 116 extends javax.swing.Box 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 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 text = model.getText(); 150 if (text != null) 151 super.setText(text); 152 model.addListener(this); 153 } 154 155 public void modelUpdated (Model model, Object key) 156 { 157 if (key == "text" && model == this.model) 158 super.setText(this.model.getText()); 159 } 160 161 public void setText(String text) 162 { 163 if (model == null) 164 super.setText(text); 165 else 166 model.setText(text); 167 } 168 } 169 170 171 172 class ComponentModel extends Model 173 { 174 Component component; 175 176 public ComponentModel (Component component) 177 { 178 this.component = component; 179 } 180 181 public void makeView (Display display, Object where) 182 { 183 display.addView(component, where); 184 } 185 } 186 | Popular Tags |