package trackerModule.sim.map;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import trackerModule.core.datastructure.TDB;
import trackerModule.core.datastructure.Unit;
import trackerModule.sim.tracker.World;
import unbbayes.util.Debug;
/**
* The Class MapTreePane.
*/
public class MapTreePane extends JPanel {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 7622056294282854984L;
/** The world tree node. */
DefaultMutableTreeNode worldTreeNode;
/** The tree model. */
DefaultTreeModel treeModel;
/** The tree. */
JTree tree;
/** The parent dialog. */
MapFrame parentDlg;
/**
* Instantiates a new map tree pane.
*
* @param p the map frame
*/
public MapTreePane(MapFrame p) {
super(new GridLayout(1,0));
parentDlg = p;
worldTreeNode = new DefaultMutableTreeNode("World");
treeModel = new DefaultTreeModel(worldTreeNode);
treeModel.addTreeModelListener(new MyTreeModelListener());
// new tree
tree = new JTree(treeModel);
tree.setEditable(false);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(true);
initTree();
// Expand all
for (int i = 0; i < tree.getRowCount(); i++)
tree.expandRow(i);
// click tree
tree.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if( selPath != null ){
DefaultMutableTreeNode node =(DefaultMutableTreeNode) selPath.getLastPathComponent();
if (node.isLeaf()) {
String curName = (String)node.getUserObject();
String parentName = (String)node.getParent().toString();
if( parentName.equals("Entity")){
Unit ship = TDB.This().get("TDBROOT.MODEL.WORLD.SHIPS." + curName);
parentDlg.setCurEntity(ship);
parentDlg.moveViewport(ship);
}else{
parentDlg.map.setCurTile(curName);
parentDlg.setCurEntity(null);
}
}
}
}
});
JScrollPane scrollPane = new JScrollPane(tree);
add(scrollPane);
}
/**
* Select item.
*
* @param u the unit
*/
public void selectItem(Unit u){
if(u == null){
return;
}
String str = u.getName();
int s = tree.getRowCount();
for( int i = 0; i < s; i++ ){
TreePath selPath = tree.getPathForRow(i);
DefaultMutableTreeNode node =(DefaultMutableTreeNode) selPath.getLastPathComponent();
String curName = (String)node.getUserObject();
if( str.equalsIgnoreCase(curName) ){
tree.setSelectionRow(i);
return;
}
}
}
/**
* Initialize the tree.
*/
public void initTree(){
worldTreeNode.removeAllChildren();
treeModel.reload();
worldTreeNode.add(createEntityTree());
worldTreeNode.add(createTileTree());
worldTreeNode.add(createBigPort());
worldTreeNode.add(createSmallPort());
worldTreeNode.add(createFishingArea());
worldTreeNode.add(createMerchantArea());
worldTreeNode.add(createArea());
worldTreeNode.add(createUnusualArea());
worldTreeNode.add(createRoute());
// Expand all
for (int i = 0; i < tree.getRowCount(); i++)
tree.expandRow(i);
}
/**
* Creates the route.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createRoute() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("RouteView");
DefaultMutableTreeNode temp = null;
for( String str : World.This().mapRoute.keySet() ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the big port.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createBigPort() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("BigPort");
DefaultMutableTreeNode temp = null;
for( String str : World.This().listBigPort ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the small port.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createSmallPort() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("SmallPort");
DefaultMutableTreeNode temp = null;
for( String str : World.This().listSmallPort ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the fishing area.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createFishingArea() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("FishingArea");
DefaultMutableTreeNode temp = null;
for( String str : World.This().listFishingArea ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the merchant area.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createMerchantArea() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("MerchantArea");
DefaultMutableTreeNode temp = null;
for( String str : World.This().listMerchantArea ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the area.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createArea() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("Area");
DefaultMutableTreeNode temp = null;
for( String str : World.This().listArea ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the unusual area.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createUnusualArea() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("UnusualArea");
DefaultMutableTreeNode temp = null;
for( String str : World.This().listUnusualArea ){
temp = new DefaultMutableTreeNode(str); t.add(temp);
}
return t;
}
/**
* Creates the tile tree.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createTileTree()
{
DefaultMutableTreeNode t = new DefaultMutableTreeNode("Tile");
DefaultMutableTreeNode temp = null;
temp = new DefaultMutableTreeNode("Water"); t.add(temp);
temp = new DefaultMutableTreeNode("Land"); t.add(temp);
return t;
}
/**
* Creates the entity tree.
*
* @return the default mutable tree node
*/
private DefaultMutableTreeNode createEntityTree() {
DefaultMutableTreeNode t = new DefaultMutableTreeNode("Entity");
DefaultMutableTreeNode temp = null;
Unit ships = TDB.This().get("TDBROOT.MODEL.WORLD.SHIPS");
if( ships != null )
for( Unit ship : ships.getList() ){
temp = new DefaultMutableTreeNode(ship.getName()); t.add(temp);
}
return t;
}
/**
* Adds the entity tree.
*
* @param tUnit the t unit
* @param targetTree the target tree
*/
private void addEntityTree( Unit tUnit, DefaultMutableTreeNode targetTree )
{
/* if( tUnit == null )
return;
if( tUnit.mapR == null )
return;
for( String key : tUnit.mapR.keySet() ){
TDBUnit HostNow = (TDBUnit)(tUnit.mapR.get(key));
DefaultMutableTreeNode temp = new DefaultMutableTreeNode(key);
targetTree.add(temp);
addEntityTree( HostNow, temp );
}*/
}
/**
* The listener interface for receiving myTreeModel events.
* The class that is interested in processing a myTreeModel
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addMyTreeModelListener<code> method. When
* the myTreeModel event occurs, that object's appropriate
* method is invoked.
*
* @see MyTreeModelEvent
*/
class MyTreeModelListener implements TreeModelListener {
/* (non-Javadoc)
* @see javax.swing.event.TreeModelListener#treeNodesChanged(javax.swing.event.TreeModelEvent)
*/
public void treeNodesChanged(TreeModelEvent e) {
DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());
/*
* If the event lists children, then the changed
* node is the child of the node we've already
* gotten. Otherwise, the changed node and the
* specified node are the same.
*/
int index = e.getChildIndices()[0];
node = (DefaultMutableTreeNode)(node.getChildAt(index));
Debug.println("The user has finished editing the node.");
Debug.println("New value: " + node.getUserObject());
}
/* (non-Javadoc)
* @see javax.swing.event.TreeModelListener#treeNodesInserted(javax.swing.event.TreeModelEvent)
*/
public void treeNodesInserted(TreeModelEvent e) {
}
/* (non-Javadoc)
* @see javax.swing.event.TreeModelListener#treeNodesRemoved(javax.swing.event.TreeModelEvent)
*/
public void treeNodesRemoved(TreeModelEvent e) {
}
/* (non-Javadoc)
* @see javax.swing.event.TreeModelListener#treeStructureChanged(javax.swing.event.TreeModelEvent)
*/
public void treeStructureChanged(TreeModelEvent e) {
}
}
}