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());
			}
		}
	}
}