/*
* Copyright 2001-2006 C:1 Financial Services GmbH
*
* This software is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License Version 2.1, as published by the Free Software Foundation.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
*/
package de.finix.contelligent.client.util.bookmark;
import java.awt.Point;
import java.awt.dnd.DnDConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import org.w3c.dom.Node;
public class DefaultTreeTransferHandler extends AbstractTreeTransferHandler {
public DefaultTreeTransferHandler(BookmarkTree tree, int action) {
super(tree, action, true);
}
public boolean canPerformAction(BookmarkTree target, DefaultMutableTreeNode draggedNode, int action, Point location) {
TreePath pathTarget = target.getPathForLocation(location.x, location.y);
if (pathTarget == null) {
target.setSelectionPath(null);
return false;
}
// if leaf is a bookmark, do nothing
if (((DefaultMutableTreeNode) pathTarget.getLastPathComponent()).isLeaf()
&& BookmarkTree.isBookmarkNode((DefaultMutableTreeNode) pathTarget.getLastPathComponent())) {
target.setSelectionPath(null);
return false;
}
if (action == DnDConstants.ACTION_COPY) {
target.setSelectionPath(pathTarget);
return true;
} else {
if (action == DnDConstants.ACTION_MOVE) {
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) pathTarget.getLastPathComponent();
if (draggedNode.isRoot() || parentNode == draggedNode.getParent()
|| draggedNode.isNodeDescendant(parentNode)) {
target.setSelectionPath(null);
return false;
} else {
target.setSelectionPath(pathTarget);
return true;
}
} else {
target.setSelectionPath(null);
return false;
}
}
}
public boolean executeDrop(BookmarkTree target, DefaultMutableTreeNode draggedNode,
DefaultMutableTreeNode newParentNode, int action) {
if (action == DnDConstants.ACTION_COPY) {
DefaultMutableTreeNode newNode = target.makeCopy(draggedNode, newParentNode);
// update tree visualization
int insertIndex = 0;
int childCount = newParentNode.getChildCount();
if (childCount > 0) {
String compareName = null;
// if dragged node is a Bookmark
if (draggedNode.getUserObject() instanceof Bookmark) {
String draggedNodeName = ((Bookmark) draggedNode.getUserObject()).getName();
for (int i = 0; i < childCount; i++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) newParentNode.getChildAt(i);
if (childNode.getUserObject() instanceof Bookmark) {
Bookmark bookmark = (Bookmark) childNode.getUserObject();
compareName = bookmark.getName();
if (draggedNodeName.compareTo(compareName) > 0) {
// draggedNode name is bigger than compareName
if ((i + 1) == childCount) {
// add new node at the end of list
insertIndex = (i + 1);
break;
}
} else {
// add new node
insertIndex = i;
break;
}
} else {
if (childNode.getUserObject() instanceof BookmarkFolder) {
insertIndex = (i + 1);
}
}
}
} else {
// if dragged node is a BookmarkFolder
if (draggedNode.getUserObject() instanceof BookmarkFolder) {
String draggedNodeName = ((BookmarkFolder) draggedNode.getUserObject()).getName();
for (int i = 0; i < childCount; i++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) newParentNode.getChildAt(i);
if (childNode.getUserObject() instanceof Bookmark) {
insertIndex = i;
break;
} else {
if (childNode.getUserObject() instanceof BookmarkFolder) {
BookmarkFolder bookmarkFolder = (BookmarkFolder) childNode.getUserObject();
compareName = bookmarkFolder.getName();
if (draggedNodeName.compareTo(compareName) > 0) {
// draggedNode name is bigger than compareName
if ((i + 1) == childCount) {
// add new node at the end of list
insertIndex = (i + 1);
break;
}
} else {
// add new node
insertIndex = i;
break;
}
}
}
}
}
}
}
// Because we know, that the model is of type DefaultTreeModel, we can explicit cast on it.
DefaultTreeModel treeModel = (DefaultTreeModel) target.getModel();
treeModel.insertNodeInto(newNode, newParentNode, insertIndex);
TreePath treePath = new TreePath(newNode.getPath());
target.scrollPathToVisible(treePath);
target.setSelectionPath(treePath);
return true;
}
if (action == DnDConstants.ACTION_MOVE) {
BookmarkFolder parentBookmarkFolder = (BookmarkFolder) newParentNode.getUserObject();
if (parentBookmarkFolder == null) {
return false;
}
int insertIndex = 0;
BookmarkManager bookmarkManager = BookmarkManager.getInstance();
if (draggedNode.getUserObject() instanceof Bookmark) {
Bookmark draggedBookmark = (Bookmark) draggedNode.getUserObject();
Node dragged = null;
if (draggedBookmark == null) {
return false;
} else {
dragged = bookmarkManager.getBookmarkNode(draggedBookmark.getId());
if (dragged == null) {
return false;
}
}
Node parent = bookmarkManager.getBookmarkFolderNode(parentBookmarkFolder.getId());
if (parent == null) {
// parent = root node
parent = dragged.getOwnerDocument().getDocumentElement();
}
bookmarkManager.move(draggedBookmark, parent);
// update tree visualization
int childCount = newParentNode.getChildCount();
if (childCount > 0) {
String compareName = null;
// if dragged node is a Bookmark
String draggedNodeName = ((Bookmark) draggedNode.getUserObject()).getName();
for (int i = 0; i < childCount; i++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) newParentNode.getChildAt(i);
if (childNode.getUserObject() instanceof Bookmark) {
Bookmark bookmark = (Bookmark) childNode.getUserObject();
compareName = bookmark.getName();
if (draggedNodeName.compareTo(compareName) > 0) {
// draggedNode name is bigger than compareName
if ((i + 1) == childCount) {
// add new node at the end of list
insertIndex = (i + 1);
break;
}
} else {
// add new node
insertIndex = i;
break;
}
} else {
if (childNode.getUserObject() instanceof BookmarkFolder) {
insertIndex = (i + 1);
}
}
}
}
} else {
if (draggedNode.getUserObject() instanceof BookmarkFolder) {
BookmarkFolder draggedBookmarkFolder = (BookmarkFolder) draggedNode.getUserObject();
Node dragged = null;
if (draggedBookmarkFolder == null) {
return false;
} else {
dragged = bookmarkManager.getBookmarkFolderNode(draggedBookmarkFolder.getId());
if (dragged == null) {
return false;
}
}
Node parent = bookmarkManager.getBookmarkFolderNode(parentBookmarkFolder.getId());
if (parent == null) {
// parent = root node
parent = dragged.getOwnerDocument().getDocumentElement();
}
bookmarkManager.move(draggedBookmarkFolder, parent);
// update tree visualization
int childCount = newParentNode.getChildCount();
if (childCount > 0) {
String compareName = null;
// if dragged node is a BookmarkFolder
String draggedNodeName = ((BookmarkFolder) draggedNode.getUserObject()).getName();
for (int i = 0; i < childCount; i++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) newParentNode.getChildAt(i);
if (childNode.getUserObject() instanceof Bookmark) {
insertIndex = i;
break;
} else {
if (childNode.getUserObject() instanceof BookmarkFolder) {
BookmarkFolder bookmarkFolder = (BookmarkFolder) childNode.getUserObject();
compareName = bookmarkFolder.getName();
if (draggedNodeName.compareTo(compareName) > 0) {
// draggedNode name is bigger than compareName
if ((i + 1) == childCount) {
// add new node at the end of list
insertIndex = (i + 1);
break;
}
} else {
// add new node
insertIndex = i;
break;
}
}
}
}
}
}
}
draggedNode.removeFromParent();
// Because we know, that the model is of type DefaultTreeModel, we can explicit cast on it.
DefaultTreeModel treeModel = (DefaultTreeModel) target.getModel();
treeModel.insertNodeInto(draggedNode, newParentNode, insertIndex);
TreePath treePath = new TreePath(draggedNode.getPath());
target.scrollPathToVisible(treePath);
target.setSelectionPath(treePath);
return true;
}
return false;
}
}
|