⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treetransferhandler.java

📁 用Swing实现的CHM制作工具
💻 JAVA
字号:
package g2w.app.gchm.gui;

import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;

import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;


/**
 * TreeTransferHandler is used to handle transfering 
 * nodes.
 * @author GreatGhoul
 * @version 025 2009-3-21 9:18:07
 */
public class TreeTransferHandler extends TransferHandler {

	private ContentTreeNode selNode;
	private ContentTreeNode oldParent;
	private ContentTreeNode newParent;
	private JTree.DropLocation dl;
	private int childIndex;
	
	/**
	 * Constructs a new tree transfer handler.
	 */
	public TreeTransferHandler() {}

	/**
	 * Returns if the tranferable data can be accepted by the target.
	 * returns true, if the data can be accepted by the target
	 * 
	 * @param support The object containing the details of the transfer, not null. 
	 * @return True if the import can happen, false otherwise 
	 */
	public boolean canImport(TransferHandler.TransferSupport support) {
		// 设置显示放置标记.
		support.setShowDropLocation(true);
		
		// 如果此support不表示放置操作,拒绝放置.
		if (!support.isDrop()) return false;
		
		// 如果传送数据的格式不兼容,拒绝放置.
		if (!support.isDataFlavorSupported(TransferableNode.FLAVOR)) 
			return false;
		
		if (selNode.isRoot()) return false;
		
		// 获取放置点的父节点.
		dl = (JTree.DropLocation) support.getDropLocation();
		
		newParent = (ContentTreeNode) dl.getPath().getLastPathComponent();
		
		// 如果父节点为空,拒绝放置.
		if (newParent == null) return false;
		
		// 如果放置点为源节点,拒绝放置.
		if (newParent.equals(selNode)) return false;
		
		// 如果一颗子树欲拖放至其子树中,拒绝放置.
		if (!selNode.isLeaf() && selNode.getLevel() < newParent.getLevel())
			return false;
		
		return true;
	}
	
	/**
	 *  创建一个要用作数据传输源的 Transferable.
	 *  
	 *  @param c 存储要传输的数据的组件
	 */
	protected Transferable createTransferable(JComponent c) {
		try {
			ContentTree tree = (ContentTree) c;
			
			// 获取源节点.
			TreePath path = tree.getSelectionPath();
			selNode = (ContentTreeNode) path.getLastPathComponent();
			
			// 获取源节点的父节点.
			oldParent = (ContentTreeNode) selNode.getParent();
			
			// 封装并返回待传送的数据.
			return new TransferableNode((ContentTreeNode) selNode.clone());
		} catch (NullPointerException e) {
			return null;
		}
	}

	/**
	 * 移动节点成功后更新xml数据.
	 */
	protected void exportDone(JComponent source, Transferable data, int action) {
		if (action == MOVE) {
			// Get the user object.
			ContentElement selElem = selNode.getUserObject();
			ContentElement tagElem = newParent.getUserObject();
			// Move the element to the new path.
			selElem.moveTo(tagElem, childIndex);
			
			ContentTree tree = (ContentTree) source;
			tree.setSelection(selNode);
		}
	}

	public int getSourceActions(JComponent c) {
		return MOVE;
	}

	public boolean importData(TransferHandler.TransferSupport support) {
		if (!canImport(support)) return false;
		
		try {
			Transferable transferable = support.getTransferable();
			ContentTreeNode node = (ContentTreeNode) transferable.getTransferData(
					TransferableNode.FLAVOR);
		} catch (UnsupportedFlavorException ufe) {
			System.out.println("UnsupportedFlavor: " + ufe.getMessage());
		} catch (java.io.IOException ioe) {
			System.out.println("I/O error: " + ioe.getMessage());
		}
		
		// Get the tree model.
		ContentTree tree = (ContentTree) support.getComponent();
		ContentTreeModel model = (ContentTreeModel) tree.getModel();	
		
		// Get the drop location's index.
		childIndex = dl.getChildIndex();
		// Fix the drop index.
		if (childIndex == -1) 
			childIndex = newParent.getChildCount();	
		if (oldParent.equals(newParent) 
				&& childIndex > model.getIndexOfChild(oldParent, selNode))
			childIndex -= 1;
		
		// Remove the node from the old parent.
		model.removeNodeFromParent(selNode);
		// Insert the node into the new parent.
		model.insertNodeInto(selNode, newParent, childIndex);
		return true;
	}

	public String toString() {
		return getClass().getName();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -