32
|
1 package treecms.proto.gui;
|
|
2
|
|
3 import java.awt.BorderLayout;
|
|
4 import java.awt.GridLayout;
|
|
5 import java.awt.event.ActionEvent;
|
|
6 import java.awt.event.ActionListener;
|
|
7 import java.util.concurrent.atomic.AtomicReference;
|
|
8
|
|
9 import javax.swing.JButton;
|
|
10 import javax.swing.JComponent;
|
|
11 import javax.swing.JFrame;
|
|
12 import javax.swing.JOptionPane;
|
|
13 import javax.swing.JPanel;
|
|
14 import javax.swing.JScrollPane;
|
|
15 import javax.swing.JSplitPane;
|
|
16 import javax.swing.JTable;
|
|
17 import javax.swing.JTree;
|
|
18 import javax.swing.border.TitledBorder;
|
|
19 import javax.swing.event.TreeSelectionEvent;
|
|
20 import javax.swing.event.TreeSelectionListener;
|
|
21 import javax.swing.table.DefaultTableModel;
|
|
22 import javax.swing.tree.DefaultMutableTreeNode;
|
|
23 import javax.swing.tree.DefaultTreeModel;
|
|
24
|
|
25 import treecms.proto.api.Editor;
|
|
26 import treecms.proto.api.Node;
|
33
|
27 import treecms.proto.simple.RandomSimpleTreeBuilder;
|
32
|
28 import treecms.proto.simple.SimpleEditor;
|
|
29 import treecms.proto.simple.SimpleNode;
|
|
30
|
33
|
31 public class GraphicalMonotonicTreeEditor extends JFrame
|
32
|
32 {
|
|
33 private static final long serialVersionUID = 1095393471116557554L;
|
|
34
|
|
35 public static void main(String _args[])
|
|
36 {
|
33
|
37 AtomicReference<Node> repo = new AtomicReference<Node>(RandomSimpleTreeBuilder.randomTree(2,2,3,3));
|
32
|
38
|
33
|
39 new GraphicalMonotonicTreeEditor(new SimpleEditor(repo));
|
|
40 new GraphicalMonotonicTreeEditor(new SimpleEditor(repo));
|
32
|
41 }
|
|
42
|
|
43 private static final String WINDOW_TITLE = "Monotonic-Tree Editor";
|
|
44
|
|
45 //menu bar
|
|
46 private JButton m_commit,m_update,m_check,m_merge;
|
|
47
|
|
48 //buttons
|
33
|
49 private JButton m_saveButton,m_clearButton,m_addButton;
|
32
|
50
|
|
51 //contents view
|
|
52 private JTree m_tree;
|
|
53
|
|
54 //properties view
|
|
55 private JTable m_table;
|
|
56
|
|
57 //editor
|
|
58 private Editor m_editor;
|
|
59
|
33
|
60 public GraphicalMonotonicTreeEditor(Editor _editor)
|
32
|
61 {
|
|
62 super(WINDOW_TITLE);
|
|
63
|
|
64 m_editor = _editor;
|
|
65
|
|
66 getContentPane().setLayout(new BorderLayout());
|
|
67
|
|
68 JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT,buildTreeViewer(),buildNodeEditor());
|
|
69 split.setDividerLocation(400);
|
|
70
|
|
71 getContentPane().add(buildMenuBar(),BorderLayout.NORTH);
|
|
72 getContentPane().add(split,BorderLayout.CENTER);
|
|
73
|
|
74 setSize(500,600);
|
|
75 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
76 setVisible(true);
|
33
|
77
|
|
78 for(int i = 0;i < m_tree.getRowCount();i ++){
|
|
79 m_tree.expandRow(i);
|
|
80 }
|
32
|
81 }
|
|
82
|
|
83 public JComponent buildMenuBar()
|
|
84 {
|
|
85 JPanel panel = new JPanel(new GridLayout(1,4));
|
|
86 m_commit = new JButton("commit");
|
|
87 m_update = new JButton("update");
|
|
88 m_check = new JButton("check");
|
|
89 m_merge = new JButton("merge");
|
|
90
|
|
91 EditorMenuActionListener listener = new EditorMenuActionListener();
|
|
92 m_commit.addActionListener(listener);
|
|
93 m_update.addActionListener(listener);
|
|
94 m_check.addActionListener(listener);
|
|
95 m_merge.addActionListener(listener);
|
|
96
|
|
97 panel.add(m_commit);
|
|
98 panel.add(m_update);
|
|
99 panel.add(m_check);
|
|
100 panel.add(m_merge);
|
|
101
|
|
102 return panel;
|
|
103 }
|
|
104
|
|
105 public JComponent buildNodeEditor()
|
|
106 {
|
|
107 m_table = new JTable(new NodeEditorTableModel());
|
|
108 m_saveButton = new JButton("save");
|
|
109 m_clearButton = new JButton("clear");
|
33
|
110 m_addButton = new JButton("add child");
|
32
|
111
|
|
112 EditorButtonActionListener listener = new EditorButtonActionListener();
|
|
113 m_saveButton.addActionListener(listener);
|
|
114 m_clearButton.addActionListener(listener);
|
33
|
115 m_addButton.addActionListener(listener);
|
32
|
116
|
|
117 JPanel panel = new JPanel(new BorderLayout());
|
|
118 panel.setBorder(new TitledBorder("Node Editor"));
|
|
119
|
|
120 JPanel btnPanel = new JPanel(new GridLayout(1,2));
|
|
121 btnPanel.add(m_saveButton);
|
|
122 btnPanel.add(m_clearButton);
|
33
|
123 btnPanel.add(m_addButton);
|
32
|
124
|
|
125 panel.add(new JScrollPane(m_table),BorderLayout.CENTER);
|
|
126 panel.add(btnPanel,BorderLayout.SOUTH);
|
|
127
|
|
128 return panel;
|
|
129 }
|
|
130
|
|
131 private class NodeEditorTableModel extends DefaultTableModel
|
|
132 {
|
|
133 private static final long serialVersionUID = -7158401828787373107L;
|
|
134
|
|
135 private Node m_node;
|
|
136
|
|
137 public NodeEditorTableModel()
|
|
138 {
|
|
139 m_node = null;
|
|
140 setColumnIdentifiers(new String[]{"Key","Value"});
|
|
141 }
|
|
142
|
|
143 public NodeEditorTableModel(Node _node)
|
|
144 {
|
|
145 this();
|
|
146 m_node = _node;
|
|
147 printNode();
|
|
148 }
|
|
149
|
|
150 @Override
|
|
151 public boolean isCellEditable(int _row,int _col)
|
|
152 {
|
|
153 if(_col == 0 || _row == 0){
|
|
154 return false; //disable editing id and parameter names
|
|
155 }
|
|
156 return true;
|
|
157 }
|
|
158
|
|
159 public void setNode(Node _node)
|
|
160 {
|
|
161 m_node = _node;
|
|
162 printNode();
|
|
163 }
|
|
164
|
|
165 public void clear()
|
|
166 {
|
|
167 printNode();
|
|
168 }
|
|
169
|
|
170 private void printNode()
|
|
171 {
|
|
172 setRowCount(0);
|
|
173 addRow(new String[]{"id",m_node.getID().toString()});
|
|
174 addRow(new String[]{"title",m_node.getTitle()});
|
|
175 addRow(new String[]{"class",m_node.getClassName()});
|
|
176 }
|
|
177
|
|
178 public String getTitle()
|
|
179 {
|
|
180 return (String)getValueAt(1,1);
|
|
181 }
|
|
182
|
|
183 public String getClassName()
|
|
184 {
|
|
185 return (String)getValueAt(2,1);
|
|
186 }
|
|
187
|
|
188 public Node getNode()
|
|
189 {
|
|
190 return m_node;
|
|
191 }
|
|
192 }
|
|
193
|
|
194 public JComponent buildTreeViewer()
|
|
195 {
|
|
196 m_tree = new JTree(new ContentsViewerTreeModel(m_editor.useContents()));
|
|
197 m_tree.addTreeSelectionListener(new TreeSelectionListener(){
|
|
198 @Override
|
|
199 public void valueChanged(TreeSelectionEvent _e)
|
|
200 {
|
|
201 DefaultMutableTreeNode selected = (DefaultMutableTreeNode)m_tree.getLastSelectedPathComponent();
|
|
202 if(selected == null){
|
|
203 return;
|
|
204 }
|
|
205 Node node = (Node)selected.getUserObject(); //get node
|
|
206
|
|
207 //
|
|
208 NodeEditorTableModel model = (NodeEditorTableModel)m_table.getModel();
|
|
209 model.setNode(node);
|
|
210 }
|
|
211 });
|
|
212
|
|
213 return new JScrollPane(m_tree);
|
|
214 }
|
|
215
|
|
216 private class ContentsViewerTreeModel extends DefaultTreeModel
|
|
217 {
|
|
218 private static final long serialVersionUID = -4710796110922619395L;
|
|
219
|
|
220 public ContentsViewerTreeModel(Node _contents)
|
|
221 {
|
|
222 super(new DefaultMutableTreeNode());
|
|
223 setRootNode(_contents,false);
|
|
224 }
|
|
225
|
|
226 public void setRootNode(Node _contents,boolean _reload)
|
|
227 {
|
|
228 DefaultMutableTreeNode root = (DefaultMutableTreeNode)getRoot();
|
|
229 root.removeAllChildren();
|
|
230 root.setUserObject(_contents);
|
|
231
|
|
232 for(Node child : _contents.getChildren()){
|
|
233 treewalk(child,root);
|
|
234 }
|
|
235
|
|
236 if(_reload){
|
|
237 reload();
|
|
238 }
|
|
239 }
|
|
240
|
|
241 private void treewalk(Node _node,DefaultMutableTreeNode _treeNode)
|
|
242 {
|
|
243 DefaultMutableTreeNode treeChild = new DefaultMutableTreeNode();
|
|
244 treeChild.setUserObject(_node);
|
|
245 _treeNode.add(treeChild);
|
|
246
|
|
247 for(Node child : _node.getChildren()){
|
|
248 treewalk(child,treeChild);
|
|
249 }
|
|
250 }
|
|
251 }
|
|
252
|
|
253 private class EditorMenuActionListener implements ActionListener
|
|
254 {
|
|
255 @Override
|
|
256 public void actionPerformed(ActionEvent _e)
|
|
257 {
|
|
258 JButton source = (JButton)_e.getSource();
|
|
259 if(source.equals(m_commit)){
|
|
260 //commit
|
|
261 m_editor.commit(true);
|
|
262 }
|
|
263 if(source.equals(m_update)){
|
|
264 //update
|
|
265 m_editor.update();
|
|
266 ContentsViewerTreeModel model = (ContentsViewerTreeModel)m_tree.getModel();
|
|
267 model.setRootNode(m_editor.useContents(),true);
|
|
268 }
|
|
269 if(source.equals(m_check)){
|
|
270 //check
|
|
271 if(m_editor.check()){
|
33
|
272 JOptionPane.showMessageDialog(GraphicalMonotonicTreeEditor.this,"updates aviable!","update check",JOptionPane.OK_OPTION);
|
32
|
273 }else{
|
33
|
274 JOptionPane.showMessageDialog(GraphicalMonotonicTreeEditor.this,"updates not aviable!","update check",JOptionPane.OK_OPTION);
|
32
|
275 }
|
|
276 }
|
|
277 if(source.equals(m_merge)){
|
|
278 //merge
|
|
279 m_editor.merge();
|
|
280 ContentsViewerTreeModel model = (ContentsViewerTreeModel)m_tree.getModel();
|
|
281 model.setRootNode(m_editor.useContents(),true);
|
|
282 }
|
33
|
283
|
|
284 for(int i = 0;i < m_tree.getRowCount();i ++){
|
|
285 m_tree.expandRow(i);
|
|
286 }
|
32
|
287 }
|
|
288 }
|
|
289
|
|
290 private class EditorButtonActionListener implements ActionListener
|
|
291 {
|
|
292 @Override
|
|
293 public void actionPerformed(ActionEvent _e)
|
|
294 {
|
|
295 JButton source = (JButton)_e.getSource();
|
33
|
296 NodeEditorTableModel tableModel = (NodeEditorTableModel)m_table.getModel();
|
32
|
297
|
|
298 if(source.equals(m_saveButton)){
|
|
299 Node target = tableModel.getNode();
|
|
300 Node newNode = m_editor.edit(target);
|
|
301 newNode.setTitle(tableModel.getTitle());
|
|
302 newNode.setClassName(tableModel.getClassName());
|
|
303
|
|
304 ContentsViewerTreeModel treeModel = (ContentsViewerTreeModel)m_tree.getModel();
|
|
305 treeModel.setRootNode(m_editor.getUncommited(),true);
|
|
306 }
|
|
307
|
|
308 if(source.equals(m_clearButton)){
|
|
309 tableModel.clear();
|
|
310 }
|
33
|
311
|
|
312 if(source.equals(m_addButton)){
|
|
313 Node newNode = m_editor.edit(tableModel.getNode());
|
|
314 Node child = newNode.addChild(new SimpleNode());
|
|
315
|
|
316 ContentsViewerTreeModel treeModel = (ContentsViewerTreeModel)m_tree.getModel();
|
|
317 treeModel.setRootNode(m_editor.getUncommited(),true);
|
|
318 }
|
|
319
|
|
320 for(int i = 0;i < m_tree.getRowCount();i ++){
|
|
321 m_tree.expandRow(i);
|
|
322 }
|
32
|
323 }
|
|
324
|
|
325 }
|
|
326 }
|