package demo39;
import javax.swing.*;
import org.openswing.swing.client.*;
import java.awt.*;
import org.openswing.swing.tree.client.*;
import java.awt.event.*;
import org.openswing.swing.util.client.ClientSettings;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import org.openswing.swing.tree.java.OpenSwingTreeNode;
import org.openswing.swing.util.client.ClientUtils;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Frame that contains two trees.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
* <p> </p>
* @author Mauro Carniel
* @version 1.0
*/
public class TreeFrame extends JFrame {
private TreePanel firstTree = new TreePanel();
private TreePanel secondTree = new TreePanel();
private JSplitPane splitPane = new JSplitPane();
/** cursor to show on dragging */
private Cursor dragCursor = null;
private DefaultMutableTreeNode dragNode = null; // node in first tree currently dragged
public TreeFrame() {
try {
super.setDefaultCloseOperation(super.EXIT_ON_CLOSE);
jbInit();
setTitle("Draggable Tree");
setSize(600,600);
dragCursor = Toolkit.getDefaultToolkit().createCustomCursor(
ClientUtils.getImage("drag.gif"),
new Point(15, 10),
ClientSettings.getInstance().getResources().getResource("drag")
);
FirstTreeController firstController = new FirstTreeController();
firstTree.setTreeController(firstController);
firstTree.setTreeDataLocator(firstController);
firstTree.setLeavesImageName("node.gif");
firstTree.setExpandAllNodes(true);
SecondTreeController secondController = new SecondTreeController();
secondTree.setTreeController(secondController);
secondTree.setTreeDataLocator(secondController);
secondTree.setLeavesImageName("node.gif");
secondTree.setExpandAllNodes(true);
// enable drag from the first tree and drop ONLY onto the second tree...
firstTree.enableDrag("FIRST_TREE",new TreeDragNDropListener() { // FIRST_TREE is the identifier of the first tree, to use to decide whether allowing drop operation
public boolean dragEnabled() {
// drag operation has started...
dragNode = (DefaultMutableTreeNode)firstTree.getSelectedNode();
return true;
}
public boolean dropEnabled(DefaultMutableTreeNode node,String treeId) {
return false; // drop not allowed in trees different from the second tree...
}
});
// enable ONLY drop onto the second tree, starting from nodes of the first tree...
secondTree.enableDrag("SECOND_TREE",new TreeDragNDropListener() {
public boolean dragEnabled() {
return false; // draw not allowed in the second tree...
}
public boolean dropEnabled(DefaultMutableTreeNode node,String treeId) {
if (treeId.equals("FIRST_TREE")) {
// copy node...
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)node.getParent();
if (parentNode!=null) {
DefaultMutableTreeNode newNode = new OpenSwingTreeNode(dragNode.getUserObject());
if (((TestVO)node.getUserObject()).getCode()==null)
// dropped node is a folder...
node.add(newNode);
else
// dropped node is a leaf...
parentNode.insert(newNode,parentNode.getIndex(node)+1);
secondTree.repaintTree();
secondTree.getTree().setSelectionPath(new TreePath(newNode.getPath()));
dragCursor = null;
}
return true;
}
else
return false; // drop not allowed in trees different from the second tree...
}
public void dropEnter() {
if (dragNode!=null)
secondTree.setCursor(dragCursor);
}
});
setVisible(true);
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
splitPane.setDividerLocation(300);
firstTree.setSelectionBackground(Color.orange);
firstTree.setSelectionForeground(SystemColor.textHighlight);
secondTree.setSelectionBackground(Color.orange);
secondTree.setSelectionForeground(SystemColor.textHighlight);
splitPane.add(firstTree,JSplitPane.TOP);
splitPane.add(secondTree,JSplitPane.BOTTOM);
this.getContentPane().add(splitPane, BorderLayout.CENTER);
}
}