/* * Copyright 2011 Uwe Krueger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mandelsoft.swing; import java.awt.datatransfer.Transferable; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Hashtable; import java.util.Vector; import javax.swing.DropMode; import javax.swing.JComponent; import javax.swing.TransferHandler; import javax.swing.tree.TreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; /** * * @author Uwe Krüger */ public class DnDJTree extends IJTree { private TreeTransferHandler transfer; public DnDJTree() { _setupDnDJTree(); } public DnDJTree(Object[] value) { super(value); _setupDnDJTree(); } public DnDJTree(Vector<?> value) { super(value); _setupDnDJTree(); } public DnDJTree(Hashtable<?, ?> value) { super(value); _setupDnDJTree(); } public DnDJTree(TreeNode root) { super(root); _setupDnDJTree(); } public DnDJTree(TreeNode root, boolean asksAllowsChildren) { super(root, asksAllowsChildren); _setupDnDJTree(); } public DnDJTree(TreeModel newModel) { super(newModel); _setupDnDJTree(); } private void _setupDnDJTree() { setTransferHandler(transfer=createTreeTransferHandler()); setDropMode(); } @Override public DnDTreeModel getModel() { return (DnDTreeModel)super.getModel(); } @Override public void setModel(TreeModel dataModel) { setModel((DnDTreeModel)dataModel); } @Override public void setModel(ITreeModel dataModel) { setModel((DnDTreeModel)dataModel); } public void setModel(DnDTreeModel dataModel) { super.setModel(dataModel); setDropMode(); } private void setDropMode() { DropMode mode=null; if (getModel()!=null) mode=getModel().getDropMode(); if (mode!=null) { setDragEnabled(true); setDropMode(mode); } else { setDragEnabled(false); } } protected TreeTransferHandler createTreeTransferHandler() { return new TreeTransferHandler(); } ///////////////////////////////////////////////////////////////////////// // Default Model ///////////////////////////////////////////////////////////////////////// public static class DefaultModel extends IJTree.DefaultModel implements DnDTreeModel { public DefaultModel(TreeNode root) { super(root); } public DefaultModel(TreeNode root, boolean asksAllowsChildren) { super(root, asksAllowsChildren); } public DropMode getDropMode() { return null; } public int getSourceActions() { return 0; } public Transferable createTransferable(DragLocation loc) { return null; } public void exportDone(Transferable data, int action) { throw new UnsupportedOperationException("Not supported yet."); } public boolean canImport(TransferSupport info) { return false; } public boolean importData(TransferSupport info) { throw new UnsupportedOperationException("Not supported yet."); } } ///////////////////////////////////////////////////////////////////////// // drag'n drop ///////////////////////////////////////////////////////////////////////// protected class TreeTransferHandler extends TransferHandler { private Transferable trans=null; @Override public boolean canImport(TransferHandler.TransferSupport info) { return ((DnDJTree)info.getComponent()).getModel(). canImport(new DnDTreeModel.TransferSupport(info)); } /** * Bundle up the selected items in a single list for export. * Each line is separated by a newline. */ @Override protected Transferable createTransferable(JComponent c) { return trans=((DnDJTree)c).getModel(). createTransferable(new DnDTreeModel.DragLocation((DnDJTree)c)); } @Override public int getSourceActions(JComponent c) { return ((DnDJTree)c).getModel().getSourceActions(); } /** * Perform the actual import. This demo only supports drag and drop. */ @Override public boolean importData(TransferHandler.TransferSupport info) { if (!info.isDrop()) { return false; } if (((DnDJTree)info.getComponent()).getModel(). importData(new DnDTreeModel.TransferSupport(info))) { return true; } else { //trans=null; return false; } } /** * Remove the items moved from the list. */ @Override protected void exportDone(JComponent c, Transferable data, int action) { if (trans!=null) ((DnDJTree)c).getModel().exportDone(trans, action); trans=null; } } /////////////////////////////////////////////////////////////////////// // Context Menu /////////////////////////////////////////////////////////////////////// private class Listener extends MouseAdapter { @Override public void mouseReleased(MouseEvent e) { handlePopup(e); } @Override public void mousePressed(MouseEvent e) { handlePopup(e); } public void handlePopup(MouseEvent e) { if (e.isPopupTrigger()&&ctxmenu!=null) { TreePath p=getPathForLocation(e.getX(), e.getY()); ctxmenu.handleContextMenu(DnDJTree.this, e,p); } } } public interface ContextMenuHandler { void handleContextMenu(DnDJTree table, MouseEvent evt, TreePath path); } private ContextMenuHandler ctxmenu; private Listener listener; synchronized public void setContextMenuHandler(ContextMenuHandler h) { if (h==null) { if (ctxmenu!=null) removeMouseListener(listener); } else { if (ctxmenu==null) { if (listener==null) listener=new Listener(); addMouseListener(listener); } } ctxmenu=h; } }