Mercurial > hg > Members > shoshi > TreeCMSv2
view 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 |
line wrap: on
line source
package treecms.gui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.nio.ByteBuffer; import java.util.Map; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.border.TitledBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import treecms.api.Node; import treecms.api.NodeData; import treecms.api.Tree; import treecms.api.TreeEditor; import treecms.memory.OnMemoryForest; public class GUIEditor { private static final String TITLE = "GUIEditor"; //GUIコンポーネント private JFrame m_frame; private JTree m_nodeTree; private AttributeEditorTable m_attrTable; private JButton m_commit,m_pull,m_check,m_merge; private JButton m_attrSave,m_attrCancel; private JPopupMenu m_popup; private JMenuItem m_addChild,m_removeChild; //TreeEditor private TreeEditor m_editor; //イベントハンドラ private ActionListener m_actionListener; private MouseListener m_mouseListener; private TreeSelectionListener m_treeSelectionListener; public static void main(String _args[]) { OnMemoryForest forest = new OnMemoryForest(); Tree root = forest.getMainTree(); TreeEditor editor = forest.getAsTreeEditor(root.getID()); new GUIEditor(editor); } public GUIEditor(TreeEditor _editor) { m_editor = _editor; m_frame = new JFrame(TITLE+":"+m_editor.toString()); m_frame.setSize(500,500); m_actionListener = new EditorActionListener(); m_mouseListener = new EditorMouseListener(); m_treeSelectionListener = new EditorTreeSelectionListener(); Container pane = m_frame.getContentPane(); pane.setLayout(new BorderLayout()); JPanel treePanel = initNodeTree(); JPanel menuPanel = initMenuButtons(); JPanel attrPanel = initAttributeTable(); JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,treePanel,attrPanel); pane.add(menuPanel,BorderLayout.NORTH); pane.add(splitPane,BorderLayout.CENTER); m_frame.setVisible(true); splitPane.setDividerLocation(0.5); m_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private JPanel initMenuButtons() { JPanel panel = new JPanel(); m_commit = new JButton("commit"); m_pull = new JButton("pull"); m_check = new JButton("check"); m_merge = new JButton("merge"); panel.setBorder(new TitledBorder("Editor Menu")); panel.setLayout(new GridLayout(1,4)); panel.add(m_commit); panel.add(m_pull); panel.add(m_check); panel.add(m_merge); return panel; } private JPanel initAttributeTable() { JPanel panel = new JPanel(); m_attrTable = new AttributeEditorTable(); m_attrSave = new JButton("save"); m_attrSave.addActionListener(m_actionListener); m_attrCancel = new JButton("cancel"); m_attrCancel.addActionListener(m_actionListener); JPanel btnPanel = new JPanel(); btnPanel.setLayout(new GridLayout(1,2)); btnPanel.add(m_attrSave); btnPanel.add(m_attrCancel); panel.setBorder(new TitledBorder("Attributes")); panel.setLayout(new BorderLayout()); panel.add(new JScrollPane(m_attrTable),BorderLayout.CENTER); panel.add(btnPanel,BorderLayout.SOUTH); return panel; } private JPanel initNodeTree() { JPanel panel = new JPanel(); m_nodeTree = new NodeViewerTree(m_editor.getRoot()); m_nodeTree.addTreeSelectionListener(m_treeSelectionListener); m_popup = new JPopupMenu(); m_addChild = new JMenuItem("Add Child"); m_removeChild = new JMenuItem("Remove Child"); m_popup.add(m_addChild); m_popup.add(m_removeChild); m_addChild.addActionListener(m_actionListener); m_removeChild.addActionListener(m_actionListener); m_nodeTree.addMouseListener(m_mouseListener); panel.setBorder(new TitledBorder("Tree Viewer")); panel.setLayout(new BorderLayout()); panel.add(new JScrollPane(m_nodeTree),BorderLayout.CENTER); return panel; } private class EditorActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent _e) { Object source = _e.getSource(); if(source == m_addChild){ //新しいノードを追加する AddChildDialog addDialog = new AddChildDialog(GUIEditor.this.m_frame,true); Map<ByteBuffer,ByteBuffer> result = addDialog.setVisible(true); if(result != null){ //キャンセルされなかった場合 NodeData data = new NodeData(); data.putAll(result); DefaultMutableTreeNode node = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); Node parent = (Node)node.getUserObject(); Node child = parent.getForest().create(data); parent.add(child); DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(child); node.add(newNode); DefaultTreeModel model = (DefaultTreeModel)m_nodeTree.getModel(); model.reload(); } } if(source == m_removeChild){ //ノードを削除する DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); DefaultMutableTreeNode guiParent = (DefaultMutableTreeNode)guiNode.getParent(); if(guiParent == null){ JOptionPane.showMessageDialog(m_frame,"RootNodeは削除できません"); return; } guiParent.remove(guiNode); Node treeNode = (Node)guiNode.getUserObject(); Node treeParent = (Node)guiNode.getUserObject(); treeParent.remove(treeNode); DefaultTreeModel model = (DefaultTreeModel)m_nodeTree.getModel(); model.reload(); } if(source == m_attrSave){ //ノードの変更を保存する DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); if(guiNode == null){ //ノードが選択されずに編集された JOptionPane.showMessageDialog(m_frame,"編集対象のノードが選択されていません。"); return; } Node treeNode = (Node)guiNode.getUserObject(); Map<ByteBuffer,ByteBuffer> attrMap = m_attrTable.getAttributeMap(); treeNode.putAll(attrMap); } if(source == m_attrCancel){ //ノードへの編集を捨てる DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); Node treeNode = (Node)guiNode.getUserObject(); m_attrTable.setAttributeMap(treeNode.getAll()); } } } private class EditorTreeSelectionListener implements TreeSelectionListener { @Override public void valueChanged(TreeSelectionEvent _e) { DefaultMutableTreeNode guiNode = (DefaultMutableTreeNode)m_nodeTree.getLastSelectedPathComponent(); if(guiNode == null){ return; } Node treeNode = (Node)guiNode.getUserObject(); m_attrTable.setAttributeMap(treeNode.getAll()); } } private class EditorMouseListener extends MouseAdapter { @Override public void mouseClicked(MouseEvent _e) { if(SwingUtilities.isRightMouseButton(_e) && !m_nodeTree.isSelectionEmpty()){ //ポップアップメニューを表示する m_popup.show(m_nodeTree,_e.getX(),_e.getY()); } } } }