/**
*
*/
package bGUI;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import data.*;
import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import java.util.*;
/**
* @author Matthew Chun-Lum
*
*/
public class BEditorCatalog extends JPanel {
private JTree tree;
private BEditor editor;
private DefaultTreeModel treeModel;
private DefaultMutableTreeNode resources;
private DefaultMutableTreeNode lastNodeSelected;
boolean skip;
/**
* Constructor, takes in the editor to which this catalog belongs to
* @param editor
*/
public BEditorCatalog(BEditor editor) {
this.editor = editor;
skip = false;
treeModel = new DefaultTreeModel(null);
tree = new JTree(treeModel);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(true);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
//handleSelectionEvent();
}
});
tree.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
handleSelectionEvent();
}
});
tree.setCellRenderer(new BCatalogTreeCellRenderer());
JScrollPane treeView = new JScrollPane(tree);
treeView.setPreferredSize(new Dimension(200, 500));
add(treeView);
setBorder(BorderFactory.createTitledBorder("Catalog"));
}
/**
* Loads the tree from the passed dataModel
* @param dataModel
*/
public void loadFromDataModel(BDataModel dataModel) {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Document");
resources = new DefaultMutableTreeNode("Resources");
for(ResourceModel resourceModel : dataModel.getResourcesMap().values()) {
DefaultMutableTreeNode resource = new DefaultMutableTreeNode(resourceModel);
resources.add(resource);
}
for(BPageModel pageModel : dataModel.getPageModels().values()) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(pageModel);
for(BShape shape : pageModel.getShapes()) {
child.add(new DefaultMutableTreeNode(shape));
}
//root.add(child);
root.insert(child, 0);
}
root.insert(resources, 0);
treeModel.setRoot(root);
}
/**
* Adds a new page to the current tree
* @param pageModel
*/
public void addNewPage(BPageModel pageModel) {
DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
if(root != null) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(pageModel);
treeModel.insertNodeInto(child, root, treeModel.getChildCount(root));
tree.scrollPathToVisible(new TreePath(child.getPath()));
setSelected(child);
}
}
/**
* Removes the page from the tree
* @param pageModel
*/
public void removePage(BPageModel pageModel) {
DefaultMutableTreeNode node = getNodeForObject(pageModel);
if(node != null) {
treeModel.removeNodeFromParent(node);
clearSelection();
}
}
public BPageModel getNextPage(BPageModel currentPage) {
DefaultMutableTreeNode node = getNodeForObject(currentPage);
if(node == null) return null;
DefaultMutableTreeNode next = node.getNextSibling();
if(next != null) return (BPageModel) next.getUserObject();
return null;
}
public BPageModel getPreviousPage(BPageModel currentPage) {
DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
Enumeration<DefaultMutableTreeNode> children = (Enumeration<DefaultMutableTreeNode>) root.children();
children.nextElement(); // get rid of resources
DefaultMutableTreeNode prev = null;
while(children.hasMoreElements()) {
DefaultMutableTreeNode temp = children.nextElement();
if(temp.getUserObject() == currentPage)
if(prev == null)
return null;
else
return (BPageModel) prev.getUserObject();
prev = temp;
}
return null;
}
public void pageChanged(BPageModel pageModel) {
DefaultMutableTreeNode node = getNodeForObject(pageModel);
if(node != null) {
treeModel.nodeChanged(node);
setSelected(node);
}
}
/**
* Adds a new shape to the current tree with the passed parent
* @param shape
* @param parent
*/
public void addNewShape(BShape shape, BPageModel parent) {
DefaultMutableTreeNode node = getNodeForObject(parent);
if(node != null) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(shape);
treeModel.insertNodeInto(child, node, node.getChildCount());
tree.scrollPathToVisible(new TreePath(child.getPath()));
skip = true;
setSelected(child);
}
}
/**
* Removes a shape from the current tree
* @param shape
*/
public void removeShape(BShape shape) {
DefaultMutableTreeNode node = getNodeForObject(shape);
if(node != null) {
treeModel.removeNodeFromParent(node);
clearSelection();
}
}
/**
* Instructs the tree to redraw on change
* @param shape
*/
public void shapeChanged(BShape shape) {
DefaultMutableTreeNode node = getNodeForObject(shape);
if(node != null) {
treeModel.nodeChanged(node);
setSelected(node);
}
}
public void addNewResource(ResourceModel resource) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(resource);
treeModel.insertNodeInto(child, resources, resources.getChildCount());
tree.scrollPathToVisible(new TreePath(child.getPath()));
setSelected(child);
}
public void removeResource(ResourceModel resource) {
DefaultMutableTreeNode node = getNodeForObject(resource);
if(node != null) {
treeModel.removeNodeFromParent(node);
clearSelection();
}
}
public void setSelectedObject(Object obj, boolean flag) {
skip = true;
setSelectedObject(obj);
}
public void setSelectedObject(Object obj) {
if(obj == null) {
tree.clearSelection();
return;
}
setSelected(getNodeForObject(obj));
}
public void setSelected(DefaultMutableTreeNode node) {
if(node != null) {
tree.setSelectionRow(tree.getRowForPath(new TreePath(node.getPath())));
lastNodeSelected = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
}
}
public void clearSelection() {
tree.clearSelection();
}
//------------- Private ------------ //
private DefaultMutableTreeNode getNodeForObject(Object obj) {
DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
if(root != null) {
Enumeration<DefaultMutableTreeNode> enumeration = root.breadthFirstEnumeration();
while(enumeration.hasMoreElements()) {
DefaultMutableTreeNode node = enumeration.nextElement();
if(node.getUserObject() == obj) {
return node;
}
}
}
return null;
}
/**
* Handles selection of a node in the tree
*/
private void handleSelectionEvent() {
if(skip) {
skip = false;
return;
}
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if(node == null || node.equals(lastNodeSelected))
return;
lastNodeSelected = node;
Object nodeObject = node.getUserObject();
//Object nodeObject = e.getSource();
if(nodeObject instanceof BPageModel) {
editor.changePage((BPageModel) nodeObject);
} else if (nodeObject instanceof BShape) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
editor.changePage((BPageModel) parent.getUserObject());
editor.changeSelectedShape((BShape) nodeObject);
} else if (nodeObject instanceof ResourceModel) {
editor.showPropertiesForResource(((ResourceModel) nodeObject).getName());
}
}
}