view src/treecms/gui/GUIEditor.java @ 16:bb9760760744

commit
author shoshi
date Sat, 21 May 2011 04:46:00 +0900
parents 17ed97ca9960
children
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.Tree;
import treecms.api.TreeEditor;
import treecms.memory.OnMemoryForest;
import treecms.tree.util.NodeData;
import treecms.tree.util.PathNotFoundException;

public class GUIEditor
{
	private static final String TITLE = "GUIEditor";
	
	//GUIコンポーネント
	private JFrame m_frame;
	private NodeViewerTree 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);
					
					//パスの取得
					Object[] treePath = m_nodeTree.getSelectionPath().getPath();
					Node[] nodePath = new Node[treePath.length];
					for(int i = 0;i < treePath.length;i ++){
						System.out.println(treePath[i].getClass().toString());
						DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)treePath[i];
						nodePath[i] = (Node)treeNode.getUserObject();
					}
					
					Node target = nodePath[nodePath.length-1];
					Node child = target.getForest().create(data);
					NodeData newData = target.getData();
					newData.add(child);
					try{
						m_editor.updateTree(target,newData,nodePath);
					}catch(PathNotFoundException _err){
						_err.printStackTrace();
						JOptionPane.showMessageDialog(m_frame,"追加に失敗しました:"+_err.getMessage());
						return;
					}
					
					NodeViewerTree.NVTreeModel model = (NodeViewerTree.NVTreeModel)m_nodeTree.getModel();
					model.setTree(m_editor.getRoot(),true);
				}
			}
			
			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());
			}
		}
	}
}