1
14 package demo.view.realizer;
15
16 import demo.view.DemoBase;
17 import y.base.DataProvider;
18 import y.base.Node;
19 import y.util.DataProviderAdapter;
20 import y.view.CellEditorMode;
21 import y.view.EditMode;
22 import y.view.GenericNodeRealizer;
23 import y.view.Graph2DView;
24 import y.view.NodeCellEditor;
25 import y.view.NodeCellRenderer;
26 import y.view.NodeCellRendererPainter;
27 import y.view.NodeRealizer;
28 import y.view.ShapeNodeRealizer;
29 import y.view.SimpleUserDataHandler;
30
31 import javax.swing.AbstractAction;
32 import javax.swing.AbstractCellEditor;
33 import javax.swing.BorderFactory;
34 import javax.swing.ImageIcon;
35 import javax.swing.JComboBox;
36 import javax.swing.JComponent;
37 import javax.swing.JLabel;
38 import javax.swing.JPanel;
39 import javax.swing.JTable;
40 import javax.swing.JTextField;
41 import javax.swing.JToggleButton;
42 import javax.swing.JToolBar;
43 import javax.swing.table.DefaultTableModel;
44 import java.awt.BorderLayout;
45 import java.awt.Insets;
46 import java.awt.event.ActionEvent;
47 import java.awt.event.ActionListener;
48 import java.awt.event.KeyAdapter;
49 import java.awt.event.KeyEvent;
50 import java.beans.PropertyChangeEvent;
51 import java.beans.PropertyChangeListener;
52 import java.net.URL;
53 import java.util.Map;
54
55
56
62 public class SwingRendererDemo extends DemoBase
63 {
64 private GenericNodeRealizer gnr;
65 private ShapeNodeRealizer snr = new ShapeNodeRealizer();
66
67 private static final boolean INITIAL_ANTIALIASING_STATE = true;
68
69
72 public SwingRendererDemo()
73 {
74 NodeCellRenderer simpleNodeCellRenderer = new SimpleNodeCellRenderer();
76
77 GenericNodeRealizer.Factory factory = GenericNodeRealizer.getFactory();
79
80 view.setAntialiasedPainting(INITIAL_ANTIALIASING_STATE);
81
82 Map map = factory.createDefaultConfigurationMap();
84 map.put(GenericNodeRealizer.Painter.class, new NodeCellRendererPainter(simpleNodeCellRenderer, NodeCellRendererPainter.USER_DATA_MAP));
85 map.put(GenericNodeRealizer.UserDataHandler.class, new SimpleUserDataHandler(SimpleUserDataHandler.REFERENCE_ON_FAILURE));
86 factory.addConfiguration("JTextField", map);
88
89 map.put(GenericNodeRealizer.Painter.class, new NodeCellRendererPainter(new ComplexNodeCellRenderer(), NodeCellRendererPainter.USER_DATA_MAP));
91 factory.addConfiguration("JTable", map);
93
94 gnr = new GenericNodeRealizer();
96 gnr.setSize(200, 50);
97 gnr.setConfiguration("JTextField");
98 gnr.setUserData("Hello Renderer World!");
99
100 view.getGraph2D().setDefaultNodeRealizer(gnr);
102 view.getGraph2D().createNode(150, 50, 200, 50, "");
103
104 gnr.setConfiguration("JTable");
106 view.getGraph2D().createNode(150, 200, 150, 150, "");
107
108 }
109
110
115 protected void registerViewModes() {
116 final NodeCellEditor simpleNodeCellEditor = new SimpleNodeCellEditor();
117 final NodeCellEditor complexNodeCellEditor = new SwingRendererDemo.ComplexNodeCellEditor();
119
120 DataProvider nodeCellEditorProvider = new DataProviderAdapter() {
122 public Object get(Object dataHolder) {
123 NodeRealizer realizer = view.getGraph2D().getRealizer((Node) dataHolder);
124 if (realizer instanceof GenericNodeRealizer){
125 if ("JTextField".equals(((GenericNodeRealizer) realizer).getConfiguration())){
126 return simpleNodeCellEditor;
127 } else {
128 return complexNodeCellEditor;
129 }
130 } else {
131 return null;
132 }
133 }
134 };
135
136 EditMode editMode = new EditMode();
137 CellEditorMode cellEditorMode = new CellEditorMode(nodeCellEditorProvider, NodeCellRendererPainter.USER_DATA_MAP);
140 editMode.setEditNodeMode(cellEditorMode);
142 editMode.assignNodeLabel(false);
145
146
147 view.addViewMode( editMode );
148 }
149
150
151 protected JToolBar createToolBar()
152 {
153 JToolBar retValue;
154
155 retValue = super.createToolBar();
156 final JComboBox cb = new JComboBox(new Object[]{"JTextField", "JTable", "Rectangle"});
157 cb.setSelectedIndex(1);
158 retValue.add(cb);
159 cb.addActionListener(new ActionListener()
160 {
161 public void actionPerformed(ActionEvent ae)
162 {
163 if ( !"Rectangle".equals( cb.getSelectedItem().toString() ) ) {
164 gnr.setConfiguration( cb.getSelectedItem().toString() );
165 view.getGraph2D().setDefaultNodeRealizer( gnr );
166 } else {
167 view.getGraph2D().setDefaultNodeRealizer( snr );
168 }
169 }
170 });
171 final URL iconUrl = getClass().getResource("resource/antialiasing.png");
172 final JToggleButton toggleAa = new JToggleButton(new AbstractAction("AA") {
173 {
174 if (iconUrl != null) {
175 putValue(AbstractAction.SMALL_ICON, new ImageIcon(iconUrl));
176 }
177 putValue(AbstractAction.SHORT_DESCRIPTION, "Toggle Anti-Aliasing");
178 }
179
180 public void actionPerformed(ActionEvent e) {
181 final boolean newAaState = !view.isAntialiasedPainting();
182 view.setAntialiasedPainting(newAaState);
183 view.updateView();
184 }
185 });
186 if (iconUrl != null) {
187 toggleAa.setText("");
188 toggleAa.setMargin(new Insets(0,0,0,0));
189 }
190 toggleAa.setSelected(INITIAL_ANTIALIASING_STATE);
191 retValue.addSeparator();
192 retValue.add(toggleAa);
193
194 return retValue;
195 }
196
197
201 public static class SimpleNodeCellEditor extends AbstractCellEditor implements NodeCellEditor
202 {
203 private final SimpleNodeCellRenderer ncr;
205
206 public SimpleNodeCellEditor()
207 {
208 this.ncr = new SimpleNodeCellRenderer();
210 this.ncr.tf.addActionListener(new ActionListener()
212 {
213 public void actionPerformed(ActionEvent ae)
214 {
215 SimpleNodeCellEditor.this.fireEditingStopped();
216 }
217 });
218 this.ncr.tf.addKeyListener(new KeyAdapter()
219 {
220 public void keyPressed(KeyEvent ke)
221 {
222 if (ke.getKeyCode() == KeyEvent.VK_ESCAPE)
223 {
224 SimpleNodeCellEditor.this.fireEditingCanceled();
225 }
226 }
227 });
228 }
229
230 public JComponent getNodeCellEditorComponent(Graph2DView view, NodeRealizer context, Object value, boolean isSelected)
231 {
232 return ncr.getNodeCellRendererComponent(view, context, value, isSelected);
234 }
235
236 public Object getCellEditorValue()
237 {
238 return ncr.getValue();
240 }
241 }
242
243
246 public static final class SimpleNodeCellRenderer extends JPanel implements NodeCellRenderer
247 {
248
251 protected JTextField tf;
252
253 public SimpleNodeCellRenderer()
254 {
255 super(new BorderLayout());
256 setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(3,3,3,3), BorderFactory.createEtchedBorder()));
258 add(new JLabel("Content"), BorderLayout.NORTH);
259 add(tf = new JTextField(), BorderLayout.CENTER);
260 }
261
262 public JComponent getNodeCellRendererComponent(Graph2DView view, NodeRealizer nodeRealizer, Object userObject, boolean selected)
263 {
264 tf.setText(String.valueOf(userObject));
266 return this;
267 }
268
269 public Object getValue()
270 {
271 return tf.getText();
273 }
274 }
275
276
281 public static class ComplexNodeCellEditor extends AbstractCellEditor implements NodeCellEditor
282 {
283 private final ComplexNodeCellRenderer ncr;
285
286 public ComplexNodeCellEditor()
287 {
288 this.ncr = new ComplexNodeCellRenderer();
289 this.ncr.table.addPropertyChangeListener("tableCellEditor", new PropertyChangeListener() {
291 public void propertyChange(PropertyChangeEvent evt) {
292 if (evt.getNewValue() == null && evt.getOldValue() != null){
293 ComplexNodeCellEditor.this.fireEditingStopped();
294 }
295 }
296 });
297 }
298
299
302 public boolean stopCellEditing() {
303 if (ncr.table.isEditing() && ncr.table.getCellEditor() != null){
304 return ncr.table.getCellEditor().stopCellEditing();
305 } else {
306 fireEditingStopped();
307 return true;
308 }
309 }
310
311
314 public void cancelCellEditing() {
315 if (ncr.table.isEditing() && ncr.table.getCellEditor() != null){
316 ncr.table.getCellEditor().cancelCellEditing();
317 } else {
318 fireEditingCanceled();
319 }
320 }
321
322 public JComponent getNodeCellEditorComponent(Graph2DView view, NodeRealizer context, Object value, boolean isSelected)
323 {
324 ncr.getNodeCellRendererComponent(view, context, value, isSelected);
325 return ncr;
326 }
327
328 public Object getCellEditorValue()
329 {
330 return ncr.getValue();
331 }
332 }
333
334
337 public static final class ComplexNodeCellRenderer extends JPanel implements NodeCellRenderer
338 {
339 protected JTable table;
341 protected DefaultTableModel tableModel;
343
344 public ComplexNodeCellRenderer()
345 {
346 super(new BorderLayout());
347
348 tableModel = new DefaultTableModel(new Object[][]{{"Keys", "Values"}}, new Object[]{"Key", "Value"}) {
350 public boolean isCellEditable(int row, int column) {
351 return column == 1;
352 }
353 };
354
355 setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(3,3,3,3), BorderFactory.createEtchedBorder()));
356 add(table = new JTable(tableModel), BorderLayout.CENTER);
357 add(table.getTableHeader(), BorderLayout.NORTH);
358 }
359
360 public JComponent getNodeCellRendererComponent(Graph2DView view, NodeRealizer nodeRealizer, Object userObject, boolean selected)
361 {
362 tableModel.setValueAt(userObject, 0, 1);
364 return this;
365 }
366
367 public Object getValue()
368 {
369 return tableModel.getValueAt(0, 1);
371 }
372 }
373
374
375
378 public static void main(String[] args)
379 {
380 initLnF();
381 SwingRendererDemo demo = new SwingRendererDemo();
382 demo.start("Swing Renderer Demo");
383 }
384 }
385