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 }