diff src/treecms/proto/gui/GraphicalMonotonicTreeEditor.java @ 33:c0a0fa870e6e

commit again
author shoshi
date Fri, 19 Nov 2010 15:31:42 +0900
parents src/treecms/proto/gui/GUIEditor.java@02ef906d0341
children 9d248304be96
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/gui/GraphicalMonotonicTreeEditor.java	Fri Nov 19 15:31:42 2010 +0900
@@ -0,0 +1,326 @@
+package treecms.proto.gui;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTree;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+
+import treecms.proto.api.Editor;
+import treecms.proto.api.Node;
+import treecms.proto.simple.RandomSimpleTreeBuilder;
+import treecms.proto.simple.SimpleEditor;
+import treecms.proto.simple.SimpleNode;
+
+public class GraphicalMonotonicTreeEditor extends JFrame
+{
+	private static final long serialVersionUID = 1095393471116557554L;
+
+	public static void main(String _args[])
+	{
+		AtomicReference<Node> repo = new AtomicReference<Node>(RandomSimpleTreeBuilder.randomTree(2,2,3,3));
+		
+		new GraphicalMonotonicTreeEditor(new SimpleEditor(repo));
+		new GraphicalMonotonicTreeEditor(new SimpleEditor(repo));
+	}
+	
+	private static final String WINDOW_TITLE = "Monotonic-Tree Editor";
+	
+	//menu bar
+	private JButton m_commit,m_update,m_check,m_merge;
+	
+	//buttons
+	private JButton m_saveButton,m_clearButton,m_addButton;
+	
+	//contents view
+	private JTree m_tree;
+	
+	//properties view
+	private JTable m_table;
+	
+	//editor
+	private Editor m_editor;
+	
+	public GraphicalMonotonicTreeEditor(Editor _editor)
+	{
+		super(WINDOW_TITLE);
+		
+		m_editor = _editor;
+		
+		getContentPane().setLayout(new BorderLayout());
+		
+		JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT,buildTreeViewer(),buildNodeEditor());
+		split.setDividerLocation(400);
+		
+		getContentPane().add(buildMenuBar(),BorderLayout.NORTH);
+		getContentPane().add(split,BorderLayout.CENTER);
+		
+		setSize(500,600);
+		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		setVisible(true);
+		
+		for(int i = 0;i < m_tree.getRowCount();i ++){
+			m_tree.expandRow(i);
+		}
+	}
+	
+	public JComponent buildMenuBar()
+	{
+		JPanel panel = new JPanel(new GridLayout(1,4));
+		m_commit = new JButton("commit");
+		m_update = new JButton("update");
+		m_check = new JButton("check");
+		m_merge = new JButton("merge");
+		
+		EditorMenuActionListener listener = new EditorMenuActionListener();
+		m_commit.addActionListener(listener);
+		m_update.addActionListener(listener);
+		m_check.addActionListener(listener);
+		m_merge.addActionListener(listener);
+		
+		panel.add(m_commit);
+		panel.add(m_update);
+		panel.add(m_check);
+		panel.add(m_merge);
+		
+		return panel;
+	}
+	
+	public JComponent buildNodeEditor()
+	{
+		m_table = new JTable(new NodeEditorTableModel());
+		m_saveButton = new JButton("save");
+		m_clearButton = new JButton("clear");
+		m_addButton = new JButton("add child");
+		
+		EditorButtonActionListener listener = new EditorButtonActionListener();
+		m_saveButton.addActionListener(listener);
+		m_clearButton.addActionListener(listener);
+		m_addButton.addActionListener(listener);
+		
+		JPanel panel = new JPanel(new BorderLayout());
+		panel.setBorder(new TitledBorder("Node Editor"));
+		
+		JPanel btnPanel = new JPanel(new GridLayout(1,2));
+		btnPanel.add(m_saveButton);
+		btnPanel.add(m_clearButton);
+		btnPanel.add(m_addButton);
+		
+		panel.add(new JScrollPane(m_table),BorderLayout.CENTER);
+		panel.add(btnPanel,BorderLayout.SOUTH);
+		
+		return panel;
+	}
+	
+	private class NodeEditorTableModel extends DefaultTableModel
+	{
+		private static final long serialVersionUID = -7158401828787373107L;
+		
+		private Node m_node;
+		
+		public NodeEditorTableModel()
+		{
+			m_node = null;
+			setColumnIdentifiers(new String[]{"Key","Value"});
+		}
+		
+		public NodeEditorTableModel(Node _node)
+		{
+			this();
+			m_node = _node;
+			printNode();
+		}
+		
+		@Override
+		public boolean isCellEditable(int _row,int _col)
+		{
+			if(_col == 0 || _row == 0){
+				return false; //disable editing id and parameter names
+			}
+			return true;
+		}
+		
+		public void setNode(Node _node)
+		{
+			m_node = _node;
+			printNode();
+		}
+		
+		public void clear()
+		{
+			printNode();
+		}
+		
+		private void printNode()
+		{
+			setRowCount(0);
+			addRow(new String[]{"id",m_node.getID().toString()});
+			addRow(new String[]{"title",m_node.getTitle()});
+			addRow(new String[]{"class",m_node.getClassName()});
+		}
+		
+		public String getTitle()
+		{
+			return (String)getValueAt(1,1);
+		}
+		
+		public String getClassName()
+		{
+			return (String)getValueAt(2,1);
+		}
+		
+		public Node getNode()
+		{
+			return m_node;
+		}
+	}
+	
+	public JComponent buildTreeViewer()
+	{
+		m_tree = new JTree(new ContentsViewerTreeModel(m_editor.useContents()));
+		m_tree.addTreeSelectionListener(new TreeSelectionListener(){
+			@Override
+			public void valueChanged(TreeSelectionEvent _e)
+			{
+				DefaultMutableTreeNode selected = (DefaultMutableTreeNode)m_tree.getLastSelectedPathComponent();
+				if(selected == null){
+					return;
+				}
+				Node node = (Node)selected.getUserObject(); //get node
+				
+				//
+				NodeEditorTableModel model = (NodeEditorTableModel)m_table.getModel();
+				model.setNode(node);
+			}
+		});
+		
+		return new JScrollPane(m_tree);
+	}
+	
+	private class ContentsViewerTreeModel extends DefaultTreeModel
+	{
+		private static final long serialVersionUID = -4710796110922619395L;
+		
+		public ContentsViewerTreeModel(Node _contents)
+		{
+			super(new DefaultMutableTreeNode());
+			setRootNode(_contents,false);
+		}
+
+		public void setRootNode(Node _contents,boolean _reload)
+		{
+			DefaultMutableTreeNode root = (DefaultMutableTreeNode)getRoot();
+			root.removeAllChildren();
+			root.setUserObject(_contents);
+			
+			for(Node child : _contents.getChildren()){
+				treewalk(child,root);
+			}
+			
+			if(_reload){
+				reload();
+			}
+		}
+		
+		private void treewalk(Node _node,DefaultMutableTreeNode _treeNode)
+		{
+			DefaultMutableTreeNode treeChild = new DefaultMutableTreeNode();
+			treeChild.setUserObject(_node);
+			_treeNode.add(treeChild);
+			
+			for(Node child : _node.getChildren()){
+				treewalk(child,treeChild);
+			}
+		}
+	}
+	
+	private class EditorMenuActionListener implements ActionListener
+	{
+		@Override
+		public void actionPerformed(ActionEvent _e)
+		{
+			JButton source = (JButton)_e.getSource();
+			if(source.equals(m_commit)){
+				//commit
+				m_editor.commit(true);
+			}
+			if(source.equals(m_update)){
+				//update
+				m_editor.update();
+				ContentsViewerTreeModel model = (ContentsViewerTreeModel)m_tree.getModel();
+				model.setRootNode(m_editor.useContents(),true);
+			}
+			if(source.equals(m_check)){
+				//check
+				if(m_editor.check()){
+					JOptionPane.showMessageDialog(GraphicalMonotonicTreeEditor.this,"updates aviable!","update check",JOptionPane.OK_OPTION);
+				}else{
+					JOptionPane.showMessageDialog(GraphicalMonotonicTreeEditor.this,"updates not aviable!","update check",JOptionPane.OK_OPTION);
+				}
+			}
+			if(source.equals(m_merge)){
+				//merge
+				m_editor.merge();
+				ContentsViewerTreeModel model = (ContentsViewerTreeModel)m_tree.getModel();
+				model.setRootNode(m_editor.useContents(),true);
+			}
+			
+			for(int i = 0;i < m_tree.getRowCount();i ++){
+				m_tree.expandRow(i);
+			}
+		}
+	}
+	
+	private class EditorButtonActionListener implements ActionListener
+	{
+		@Override
+		public void actionPerformed(ActionEvent _e)
+		{
+			JButton source = (JButton)_e.getSource();
+			NodeEditorTableModel tableModel = (NodeEditorTableModel)m_table.getModel();
+			
+			if(source.equals(m_saveButton)){
+				Node target = tableModel.getNode();
+				Node newNode = m_editor.edit(target);
+				newNode.setTitle(tableModel.getTitle());
+				newNode.setClassName(tableModel.getClassName());
+				
+				ContentsViewerTreeModel treeModel = (ContentsViewerTreeModel)m_tree.getModel();
+				treeModel.setRootNode(m_editor.getUncommited(),true);
+			}
+			
+			if(source.equals(m_clearButton)){
+				tableModel.clear();
+			}
+			
+			if(source.equals(m_addButton)){
+				Node newNode = m_editor.edit(tableModel.getNode());
+				Node child = newNode.addChild(new SimpleNode());
+				
+				ContentsViewerTreeModel treeModel = (ContentsViewerTreeModel)m_tree.getModel();
+				treeModel.setRootNode(m_editor.getUncommited(),true);
+			}
+			
+			for(int i = 0;i < m_tree.getRowCount();i ++){
+				m_tree.expandRow(i);
+			}
+		}
+		
+	}
+}