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