/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.utils.scalableui; import java.awt.Component; import java.awt.Point; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.InputEvent; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.TransferHandler; /** * * @author Marat */ public class ScalableTransferHandler extends TransferHandler{ public static final String INNER_DROP_LOCATION_TAG = "ScalableDropLocation"; public static final String INNER_DROP_ACTION_TAG = "ScalableDropAction"; protected JScalablePanel scalable = null; public ScalableTransferHandler(JScalablePanel aScalable) { super(); scalable = aScalable; } protected TransferHandler getScalableTransferHandler() { if(scalable != null && scalable.getInnerDropTargetComponent() != null) { Component lc = scalable.getInnerDropTargetComponent(); if(lc instanceof JComponent) { JComponent jlc = (JComponent)lc; return jlc.getTransferHandler(); } } return null; } protected Point getScalableDropTargetPoint() { if(scalable != null) return scalable.getInnerDropTargetPoint(); return null; } protected Component getScalableDropTarget() { if(scalable != null && scalable.getInnerDropTargetComponent() != null) return scalable.getInnerDropTargetComponent(); return null; } @Override protected Transferable createTransferable(JComponent c) { return null; } @Override public void exportAsDrag(JComponent comp, InputEvent e, int action) { } @Override protected void exportDone(JComponent source, Transferable data, int action) { } @Override public int getSourceActions(JComponent c) { TransferHandler th = getScalableTransferHandler(); if(th != null) return th.getSourceActions(c); return super.getSourceActions(c); } @Override public Icon getVisualRepresentation(Transferable t) { TransferHandler th = getScalableTransferHandler(); if(th != null) return th.getVisualRepresentation(t); return super.getVisualRepresentation(t); } protected class ScalableDropLocation extends TransferHandler.DropLocation{ ScalableDropLocation(Point pt) { super(pt); } } @Override public boolean canImport(TransferSupport support) { TransferHandler th = getScalableTransferHandler(); if(th != null && getScalableDropTargetPoint() != null) { Component lcomp = getScalableDropTarget(); if(lcomp instanceof JComponent) { JComponent jcomp = (JComponent)lcomp; jcomp.putClientProperty(INNER_DROP_LOCATION_TAG, new ScalableDropLocation(new Point(getScalableDropTargetPoint()))); if(support.isDrop()) jcomp.putClientProperty(INNER_DROP_ACTION_TAG, support.getUserDropAction()); } return th.canImport(new TransferSupport(lcomp, support.getTransferable())); } return super.canImport(support); } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { TransferHandler th = getScalableTransferHandler(); if(th != null) return th.canImport(comp, transferFlavors); return super.canImport(comp, transferFlavors); } @Override public boolean importData(TransferSupport support) { TransferHandler th = getScalableTransferHandler(); if(th != null && getScalableDropTargetPoint() != null) { Component lcomp = getScalableDropTarget(); if(lcomp instanceof JComponent) { JComponent jcomp = (JComponent)lcomp; jcomp.putClientProperty(INNER_DROP_LOCATION_TAG, new ScalableDropLocation(new Point(getScalableDropTargetPoint()))); } return th.importData(new TransferSupport(lcomp, support.getTransferable())); } return super.importData(support); } @Override public boolean importData(JComponent comp, Transferable t) { TransferHandler th = getScalableTransferHandler(); if(th != null) return th.importData( (getScalableDropTarget() instanceof JComponent)? (JComponent)getScalableDropTarget():comp, t); return super.importData(comp, t); } }