package org.fanhongtao.tools.treeviewer;
import java.awt.Dimension;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import org.fanhongtao.swing.BaseFrame;
import org.fanhongtao.tools.treeviewer.bean.AttrBean;
import org.fanhongtao.tools.treeviewer.bean.NodeBean;
import org.fanhongtao.tools.treeviewer.bean.TreeBean;
import org.fanhongtao.xml.DigesterUtils;
/**
* TreeViewer is used to show the tree in a special XML format.<br>
* I write this tool to help analyzing the complicated data structure of the working project.
*
* This file is in PUBLIC DOMAIN. You can use it freely. No guarantee.
* @author Fan Hongtao <fanhongtao@gmail.com>
* @created 2011-11-22
*/
public class TreeViewer extends BaseFrame implements TreeSelectionListener
{
private static final List<AttrBean> EMPTY_ATTR_LIST = new ArrayList<AttrBean>();
private TreeBean treeBean;
private JTree tree;
private AttrTableModel tableModel;
@Override
protected void createContents(JFrame frame)
{
// Create tree;
loadTree();
// Create table
List<AttrBean> attrList = EMPTY_ATTR_LIST;
if (treeBean.getNodeList().size() != 0)
{
attrList = treeBean.getNodeList().get(0).getAttrList();
}
tableModel = new AttrTableModel(attrList);
JTable table = new JTable(tableModel);
JScrollPane scrollPane = new JScrollPane(table);
// Create splite pane
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tree, table);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(200);
frame.add(splitPane);
// Maxmize window
frame.setSize(new Dimension(800, 600));
frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}
private void loadTree()
{
treeBean = new TreeBean();
try
{
// InputStream input = rootBean.getClass().getResourceAsStream("tagviewer.xml");
InputStream input = new FileInputStream("res/treeviewer.xml");
URL url = treeBean.getClass().getResource("treeviewer_rules.xml");
treeBean = (TreeBean)DigesterUtils.parse(treeBean, input, url);
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(treeBean.dump());
DefaultMutableTreeNode top = null;
List<NodeBean> nodeList = treeBean.getNodeList();
if (nodeList.size() == 0)
{
top = new DefaultMutableTreeNode("EMPTY tree");
}
else
{
top = new DefaultMutableTreeNode("root");
createNodes(top, nodeList);
}
tree = new JTree(top);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addTreeSelectionListener(this);
}
private void createNodes(DefaultMutableTreeNode parent, List<NodeBean> nodeList)
{
for (NodeBean node : nodeList)
{
DefaultMutableTreeNode child = new DefaultMutableTreeNode(node);
parent.add(child);
createNodes(child, node.getNodeList());
}
}
public static void main(String[] args)
{
// LogUtils.initBasicLog();
new TreeViewer().run("Tree Viewer");
}
@Override
public void valueChanged(TreeSelectionEvent e)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
if (node == null)
return;
Object object = node.getUserObject();
if (object instanceof NodeBean)
{
NodeBean nodeBean = (NodeBean)object;
tableModel.setAttrList(nodeBean.getAttrList());
}
else
{
tableModel.setAttrList(EMPTY_ATTR_LIST);
}
}
}