DefaultTreeTransferHandler.java :  » Content-Management-System » contelligent » de » finix » contelligent » client » util » bookmark » Java Open Source

Java Open Source » Content Management System » contelligent 
contelligent » de » finix » contelligent » client » util » bookmark » DefaultTreeTransferHandler.java
/*
 * 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;
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.