Mercurial > hg > Members > shoshi > TreeCMSv2
comparison src/treecms/gui/GUIEditor.java @ 8:f96193babac0
changed byte[] to ByteBuffer
added TreeEditor.updateTree(Node,NodeData,Node[]) for node path is known.
added GUIEditor
author | shoshi |
---|---|
date | Thu, 31 Mar 2011 02:08:44 +0900 |
parents | |
children | 17ed97ca9960 |
comparison
equal
deleted
inserted
replaced
7:fc19e38b669b | 8:f96193babac0 |
---|---|
1 package treecms.gui; | |
2 | |
3 import java.awt.BorderLayout; | |
4 import java.awt.Container; | |
5 import java.awt.GridLayout; | |
6 import java.awt.event.ActionEvent; | |
7 import java.awt.event.ActionListener; | |
8 import java.awt.event.MouseAdapter; | |
9 import java.awt.event.MouseEvent; | |
10 import java.awt.event.MouseListener; | |
11 import java.nio.ByteBuffer; | |
12 import java.util.Map; | |
13 import javax.swing.JButton; | |
14 import javax.swing.JFrame; | |
15 import javax.swing.JMenuItem; | |
16 import javax.swing.JOptionPane; | |
17 import javax.swing.JPanel; | |
18 import javax.swing.JPopupMenu; | |
19 import javax.swing.JScrollPane; | |
20 import javax.swing.JSplitPane; | |
21 import javax.swing.JTree; | |
22 import javax.swing.SwingUtilities; | |
23 import javax.swing.border.TitledBorder; | |
24 import javax.swing.event.TreeSelectionEvent; | |
25 import javax.swing.event.TreeSelectionListener; | |
26 import javax.swing.tree.DefaultMutableTreeNode; | |
27 import javax.swing.tree.DefaultTreeModel; | |
28 | |
29 import treecms.api.Node; | |
30 import treecms.api.NodeData; | |
31 import treecms.api.Tree; | |
32 import treecms.api.TreeEditor; | |
33 import treecms.memory.OnMemoryForest; | |
34 | |
35 public class GUIEditor | |
36 { | |
37 private static final String TITLE = "GUIEditor"; | |
38 | |
39 //GUIコンポーネント | |
40 private JFrame m_frame; | |
41 private JTree m_nodeTree; | |
42 private AttributeEditorTable m_attrTable; | |
43 private JButton m_commit,m_pull,m_check,m_merge; | |
44 private JButton m_attrSave,m_attrCancel; | |
45 private JPopupMenu m_popup; | |
46 private JMenuItem m_addChild,m_removeChild; | |
47 | |
48 //TreeEditor | |
49 private TreeEditor m_editor; | |
50 | |
51 //イベントハンドラ | |
52 private ActionListener m_actionListener; | |
53 private MouseListener m_mouseListener; | |
54 private TreeSelectionListener m_treeSelectionListener; | |
55 | |
56 public static void main(String _args[]) | |
57 { | |
58 OnMemoryForest forest = new OnMemoryForest(); | |
59 Tree root = forest.getMainTree(); | |
60 TreeEditor editor = forest.getAsTreeEditor(root.getID()); | |
61 new GUIEditor(editor); | |
62 } | |
63 | |
64 public GUIEditor(TreeEditor _editor) | |
65 { | |
66 m_editor = _editor; | |
67 m_frame = new JFrame(TITLE+":"+m_editor.toString()); | |
68 m_frame.setSize(500,500); | |
69 | |
70 m_actionListener = new EditorActionListener(); | |
71 m_mouseListener = new EditorMouseListener(); | |
72 m_treeSelectionListener = new EditorTreeSelectionListener(); | |
73 | |
74 Container pane = m_frame.getContentPane(); | |
75 pane.setLayout(new BorderLayout()); | |
76 | |
77 JPanel treePanel = initNodeTree(); | |
78 JPanel menuPanel = initMenuButtons(); | |
79 JPanel attrPanel = initAttributeTable(); | |
80 | |
81 JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,treePanel,attrPanel); | |
82 | |
83 pane.add(menuPanel,BorderLayout.NORTH); | |
84 pane.add(splitPane,BorderLayout.CENTER); | |
85 m_frame.setVisible(true); | |
86 splitPane.setDividerLocation(0.5); | |
87 m_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
88 } | |
89 | |
90 private JPanel initMenuButtons() | |
91 { | |
92 JPanel panel = new JPanel(); | |
93 m_commit = new JButton("commit"); | |
94 m_pull = new JButton("pull"); | |
95 m_check = new JButton("check"); | |
96 m_merge = new JButton("merge"); | |
97 | |
98 panel.setBorder(new TitledBorder("Editor Menu")); | |
99 panel.setLayout(new GridLayout(1,4)); | |
100 panel.add(m_commit); | |
101 panel.add(m_pull); | |
102 panel.add(m_check); | |
103 panel.add(m_merge); | |
104 | |
105 return panel; | |
106 } | |
107 | |
108 private JPanel initAttributeTable() | |
109 { | |
110 JPanel panel = new JPanel(); | |
111 m_attrTable = new AttributeEditorTable(); | |
112 m_attrSave = new JButton("save"); | |
113 m_attrSave.addActionListener(m_actionListener); | |
114 m_attrCancel = new JButton("cancel"); | |
115 m_attrCancel.addActionListener(m_actionListener); | |
116 | |
117 JPanel btnPanel = new JPanel(); | |
118 btnPanel.setLayout(new GridLayout(1,2)); | |
119 btnPanel.add(m_attrSave); | |
120 btnPanel.add(m_attrCancel); | |
121 | |
122 panel.setBorder(new TitledBorder("Attributes")); | |
123 panel.setLayout(new BorderLayout()); | |
124 panel.add(new JScrollPane(m_attrTable),BorderLayout.CENTER); | |
125 panel.add(btnPanel,BorderLayout.SOUTH); | |
126 | |
127 return panel; | |
128 } | |
129 | |
130 private JPanel initNodeTree() | |
131 { | |
132 JPanel panel = new JPanel(); | |
133 m_nodeTree = new NodeViewerTree(m_editor.getRoot()); | |
134 m_nodeTree.addTreeSelectionListener(m_treeSelectionListener); | |
135 | |
136 m_popup = new JPopupMenu(); | |
137 m_addChild = new JMenuItem("Add Child"); | |
138 m_removeChild = new JMenuItem("Remove Child"); | |
139 m_popup.add(m_addChild); | |
140 m_popup.add(m_removeChild); | |
141 m_addChild.addActionListener(m_actionListener); | |
142 m_removeChild.addActionListener(m_actionListener); | |
143 m_nodeTree.addMouseListener(m_mouseListener); | |
144 | |
145 panel.setBorder(new TitledBorder("Tree Viewer")); | |
146 panel.setLayout(new BorderLayout()); | |
147 panel.add(new JScrollPane(m_nodeTree),BorderLayout.CENTER); | |
148 | |
149 return panel; | |
150 } | |
151 | |
152 private class EditorActionListener implements ActionListener | |
153 { | |
154 @Override | |
155 public void actionPerformed(ActionEvent _e) | |
156 { | |
157 Object source = _e.getSource(); | |
158 if(source == m_addChild){ | |
159 //新しいノードを追加する | |
160 AddChildDialog addDialog = new AddChildDialog(GUIEditor.this.m_frame,true); | |
161 Map<ByteBuffer,ByteBuffer> result = addDialog.setVisible(true); | |
162 if(result != null){ | |
163 //キャンセルされなかった場合 | |
164 NodeData data = new NodeData(); | |
165 data.putAll(result); | |
166 | |
167 DefaultMutableTreeNode node = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); | |
168 | |
169 Node parent = (Node)node.getUserObject(); | |
170 Node child = parent.getForest().create(data); | |
171 parent.add(child); | |
172 | |
173 DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(child); | |
174 node.add(newNode); | |
175 | |
176 DefaultTreeModel model = (DefaultTreeModel)m_nodeTree.getModel(); | |
177 model.reload(); | |
178 } | |
179 } | |
180 | |
181 if(source == m_removeChild){ | |
182 //ノードを削除する | |
183 DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); | |
184 DefaultMutableTreeNode guiParent = (DefaultMutableTreeNode)guiNode.getParent(); | |
185 if(guiParent == null){ | |
186 JOptionPane.showMessageDialog(m_frame,"RootNodeは削除できません"); | |
187 return; | |
188 } | |
189 | |
190 guiParent.remove(guiNode); | |
191 | |
192 Node treeNode = (Node)guiNode.getUserObject(); | |
193 Node treeParent = (Node)guiNode.getUserObject(); | |
194 treeParent.remove(treeNode); | |
195 | |
196 DefaultTreeModel model = (DefaultTreeModel)m_nodeTree.getModel(); | |
197 model.reload(); | |
198 } | |
199 | |
200 if(source == m_attrSave){ | |
201 //ノードの変更を保存する | |
202 DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); | |
203 if(guiNode == null){ | |
204 //ノードが選択されずに編集された | |
205 JOptionPane.showMessageDialog(m_frame,"編集対象のノードが選択されていません。"); | |
206 return; | |
207 } | |
208 | |
209 Node treeNode = (Node)guiNode.getUserObject(); | |
210 Map<ByteBuffer,ByteBuffer> attrMap = m_attrTable.getAttributeMap(); | |
211 treeNode.putAll(attrMap); | |
212 } | |
213 | |
214 if(source == m_attrCancel){ | |
215 //ノードへの編集を捨てる | |
216 DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); | |
217 Node treeNode = (Node)guiNode.getUserObject(); | |
218 m_attrTable.setAttributeMap(treeNode.getAll()); | |
219 } | |
220 } | |
221 } | |
222 | |
223 private class EditorTreeSelectionListener implements TreeSelectionListener | |
224 { | |
225 @Override | |
226 public void valueChanged(TreeSelectionEvent _e) | |
227 { | |
228 DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); | |
229 if(guiNode == null){ | |
230 return; | |
231 } | |
232 | |
233 Node treeNode = (Node)guiNode.getUserObject(); | |
234 m_attrTable.setAttributeMap(treeNode.getAll()); | |
235 } | |
236 } | |
237 | |
238 private class EditorMouseListener extends MouseAdapter | |
239 { | |
240 @Override | |
241 public void mouseClicked(MouseEvent _e) | |
242 { | |
243 if(SwingUtilities.isRightMouseButton(_e) && !m_nodeTree.isSelectionEmpty()){ | |
244 //ポップアップメニューを表示する | |
245 m_popup.show(m_nodeTree,_e.getX(),_e.getY()); | |
246 } | |
247 } | |
248 } | |
249 } |