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