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.Graph2DViewActions;
25 import y.view.NodeCellEditor;
26 import y.view.NodeCellRenderer;
27 import y.view.NodeCellRendererPainter;
28 import y.view.NodeLabel;
29 import y.view.NodeRealizer;
30 import y.view.ShapeNodeRealizer;
31 import y.view.SimpleUserDataHandler;
32 import y.view.SmartNodeLabelModel;
33
34 import javax.swing.AbstractCellEditor;
35 import javax.swing.ActionMap;
36 import javax.swing.BorderFactory;
37 import javax.swing.JComboBox;
38 import javax.swing.JComponent;
39 import javax.swing.JLabel;
40 import javax.swing.JPanel;
41 import javax.swing.JTable;
42 import javax.swing.JTextField;
43 import javax.swing.JToolBar;
44 import javax.swing.table.DefaultTableModel;
45 import java.awt.BorderLayout;
46 import java.awt.EventQueue;
47 import java.awt.event.ActionEvent;
48 import java.awt.event.ActionListener;
49 import java.awt.event.KeyAdapter;
50 import java.awt.event.KeyEvent;
51 import java.beans.PropertyChangeEvent;
52 import java.beans.PropertyChangeListener;
53 import java.util.Locale;
54 import java.util.Map;
55
56
57
66 public class SwingRendererDemo extends DemoBase
67 {
68 private GenericNodeRealizer gnr;
69 private ShapeNodeRealizer snr = new ShapeNodeRealizer();
70
71
74 public SwingRendererDemo()
75 {
76 NodeCellRenderer simpleNodeCellRenderer = new SimpleNodeCellRenderer();
78
79 GenericNodeRealizer.Factory factory = GenericNodeRealizer.getFactory();
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.0, 50.0);
97 gnr.setConfiguration("JTextField");
98 gnr.setUserData("Hello Renderer World!");
99 NodeLabel label = gnr.getLabel();
100 SmartNodeLabelModel model = new SmartNodeLabelModel();
101 label.setLabelModel(model);
102 label.setModelParameter(model.getDefaultParameter());
103
104 view.getGraph2D().setDefaultNodeRealizer(gnr);
106 view.getGraph2D().createNode(150.0, 50.0, 200.0, 50.0, "");
107
108 gnr.setConfiguration("JTable");
110 view.getGraph2D().createNode(150.0, 200.0, 150.0, 150.0, "");
111
112 }
113
114
119 protected void registerViewModes() {
120 final NodeCellEditor simpleNodeCellEditor = new SimpleNodeCellEditor();
121 final NodeCellEditor complexNodeCellEditor = new SwingRendererDemo.ComplexNodeCellEditor();
123
124 DataProvider nodeCellEditorProvider = new DataProviderAdapter() {
126 public Object get(Object dataHolder) {
127 NodeRealizer realizer = view.getGraph2D().getRealizer((Node) dataHolder);
128 if (realizer instanceof GenericNodeRealizer){
129 if ("JTextField".equals(((GenericNodeRealizer) realizer).getConfiguration())){
130 return simpleNodeCellEditor;
131 } else {
132 return complexNodeCellEditor;
133 }
134 } else {
135 return null;
136 }
137 }
138 };
139
140 EditMode editMode = new EditMode();
141 CellEditorMode cellEditorMode = new CellEditorMode(nodeCellEditorProvider, NodeCellRendererPainter.USER_DATA_MAP);
144 editMode.setEditNodeMode(cellEditorMode);
146 editMode.assignNodeLabel(false);
149
150 view.addViewMode( editMode );
151 }
152
153 protected void registerViewActions() {
154 super.registerViewActions();
155
156 ActionMap amap = view.getCanvasComponent().getActionMap();
158 if (amap != null) {
159 amap.remove(Graph2DViewActions.EDIT_LABEL);
160 }
161 }
162
163
164 protected JToolBar createToolBar()
165 {
166 JToolBar toolBar = super.createToolBar();
167 toolBar.addSeparator();
168 toolBar.add(new JLabel("Node Style:"));
169 toolBar.addSeparator(TOOLBAR_SMALL_SEPARATOR);
170
171 final JComboBox cb = new JComboBox(new Object[]{"JTextField", "JTable", "Rectangle"});
172 cb.setMaximumSize(cb.getPreferredSize());
173 cb.setSelectedIndex(1);
174 toolBar.add(cb);
175 cb.addActionListener(new ActionListener()
176 {
177 public void actionPerformed(ActionEvent ae)
178 {
179 if ( !"Rectangle".equals( cb.getSelectedItem().toString() ) ) {
180 gnr.setConfiguration( cb.getSelectedItem().toString() );
181 view.getGraph2D().setDefaultNodeRealizer( gnr );
182 } else {
183 view.getGraph2D().setDefaultNodeRealizer( snr );
184 }
185 }
186 });
187
188 return toolBar;
189 }
190
191
195 public static class SimpleNodeCellEditor extends AbstractCellEditor implements NodeCellEditor
196 {
197 private final SimpleNodeCellRenderer ncr;
199
200 public SimpleNodeCellEditor()
201 {
202 this.ncr = new SimpleNodeCellRenderer();
204 this.ncr.tf.addActionListener(new ActionListener()
206 {
207 public void actionPerformed(ActionEvent ae)
208 {
209 SimpleNodeCellEditor.this.fireEditingStopped();
210 }
211 });
212 this.ncr.tf.addKeyListener(new KeyAdapter()
213 {
214 public void keyPressed(KeyEvent ke)
215 {
216 if (ke.getKeyCode() == KeyEvent.VK_ESCAPE)
217 {
218 SimpleNodeCellEditor.this.fireEditingCanceled();
219 }
220 }
221 });
222 }
223
224 public JComponent getNodeCellEditorComponent(Graph2DView view, NodeRealizer context, Object value, boolean isSelected)
225 {
226 return ncr.getNodeCellRendererComponent(view, context, value, isSelected);
228 }
229
230 public Object getCellEditorValue()
231 {
232 return ncr.getValue();
234 }
235 }
236
237
240 public static final class SimpleNodeCellRenderer extends JPanel implements NodeCellRenderer
241 {
242
245 JTextField tf;
246
247 public SimpleNodeCellRenderer()
248 {
249 super(new BorderLayout());
250 setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(3,3,3,3), BorderFactory.createEtchedBorder()));
252 add(new JLabel("Content"), BorderLayout.NORTH);
253 add(tf = new JTextField(), BorderLayout.CENTER);
254 }
255
256 public JComponent getNodeCellRendererComponent(Graph2DView view, NodeRealizer nodeRealizer, Object userObject, boolean selected)
257 {
258 tf.setText(String.valueOf(userObject));
260 return this;
261 }
262
263 public Object getValue()
264 {
265 return tf.getText();
267 }
268 }
269
270
275 public static class ComplexNodeCellEditor extends AbstractCellEditor implements NodeCellEditor
276 {
277 private final ComplexNodeCellRenderer ncr;
279
280 public ComplexNodeCellEditor()
281 {
282 this.ncr = new ComplexNodeCellRenderer();
283 this.ncr.table.addPropertyChangeListener("tableCellEditor", new PropertyChangeListener() {
285 public void propertyChange(PropertyChangeEvent evt) {
286 if (evt.getNewValue() == null && evt.getOldValue() != null){
287 ComplexNodeCellEditor.this.fireEditingStopped();
288 }
289 }
290 });
291 }
292
293
296 public boolean stopCellEditing() {
297 if (ncr.table.isEditing() && ncr.table.getCellEditor() != null){
298 return ncr.table.getCellEditor().stopCellEditing();
299 } else {
300 fireEditingStopped();
301 return true;
302 }
303 }
304
305
308 public void cancelCellEditing() {
309 if (ncr.table.isEditing() && ncr.table.getCellEditor() != null){
310 ncr.table.getCellEditor().cancelCellEditing();
311 } else {
312 fireEditingCanceled();
313 }
314 }
315
316 public JComponent getNodeCellEditorComponent(Graph2DView view, NodeRealizer context, Object value, boolean isSelected)
317 {
318 ncr.getNodeCellRendererComponent(view, context, value, isSelected);
319 return ncr;
320 }
321
322 public Object getCellEditorValue()
323 {
324 return ncr.getValue();
325 }
326 }
327
328
331 public static final class ComplexNodeCellRenderer extends JPanel implements NodeCellRenderer
332 {
333 JTable table;
335 DefaultTableModel tableModel;
337
338 public ComplexNodeCellRenderer()
339 {
340 super(new BorderLayout());
341
342 tableModel = new DefaultTableModel(new Object[][]{{"Keys", "Values"}}, new Object[]{"Key", "Value"}) {
344 public boolean isCellEditable(int row, int column) {
345 return column == 1;
346 }
347 };
348
349 setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(3,3,3,3), BorderFactory.createEtchedBorder()));
350 add(table = new JTable(tableModel), BorderLayout.CENTER);
351 add(table.getTableHeader(), BorderLayout.NORTH);
352 }
353
354 public JComponent getNodeCellRendererComponent(Graph2DView view, NodeRealizer nodeRealizer, Object userObject, boolean selected)
355 {
356 tableModel.setValueAt(userObject, 0, 1);
358 return this;
359 }
360
361 public Object getValue()
362 {
363 return tableModel.getValueAt(0, 1);
365 }
366 }
367
368
369
374 public static void main(String[] args) {
375 EventQueue.invokeLater(new Runnable() {
376 public void run() {
377 Locale.setDefault(Locale.ENGLISH);
378 initLnF();
379 (new SwingRendererDemo()).start("Swing Renderer Demo");
380 }
381 });
382 }
383 }
384