package com.vci.client.auth2.action; import java.awt.Component; import java.awt.Point; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.swing.JButton; import javax.swing.SwingUtilities; import com.vci.client.auth2.view.AbstractUIFunclet; public abstract class Action extends JButton implements ActionListener, DragGestureListener, DragSourceListener, Transferable, DropTargetListener { /** * */ private static final long serialVersionUID = -3553375893075534123L; private AbstractUIFunclet funclet; private DataFlavor[] flavors = { DataFlavor.javaFileListFlavor }; private boolean dragEnable = false; public Action(String name) { super(name); addActionListener(this); DragSource dragSource = DragSource.getDefaultDragSource(); dragSource.createDefaultDragGestureRecognizer(this, // component where // drag originates DnDConstants.ACTION_MOVE, // actions this); } public abstract void execute(); @Override public void actionPerformed(ActionEvent e) { execute(); } public AbstractUIFunclet getFunclet() { return funclet; } public void setFunclet(AbstractUIFunclet funclet) { this.funclet = funclet; } public boolean isDragEnable() { return dragEnable; } public void setDragEnable(boolean dragEnable) { this.dragEnable = dragEnable; } @Override public void dragDropEnd(DragSourceDropEvent dsde) { if (this.dragEnable) { try { Object o = dsde.getDragSourceContext().getTransferable() .getTransferData(DataFlavor.javaFileListFlavor); //当前的位置 Point location = dsde.getLocation(); SwingUtilities.convertPointFromScreen(location, getFunclet().getRightMainPanel() .getRightCenterToolBar()); Action target = (Action) getFunclet().getRightMainPanel() .getRightCenterToolBar().findComponentAt(location); List all = Arrays.asList(getFunclet() .getRightMainPanel().getRightCenterToolBar() .getComponents()); getFunclet().getRightMainPanel().getRightCenterToolBar() .remove((Action) o); getFunclet().getRightMainPanel().getRightCenterToolBar() .add((Action) o, all.indexOf(target)); } catch (Exception e) { } getFunclet().updateUI(); } } @Override public void dragGestureRecognized(DragGestureEvent dge) { dge.startDrag(DragSource.DefaultMoveDrop, this, this); } @Override public DataFlavor[] getTransferDataFlavors() { return flavors; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { for (DataFlavor df : flavors) { if (df.equals(flavor)) { return true; } } return false; } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { return this; } @Override public void dragEnter(DragSourceDragEvent dsde) { } @Override public void dragOver(DragSourceDragEvent dsde) { } @Override public void dropActionChanged(DragSourceDragEvent dsde) { } @Override public void dragExit(DragSourceEvent dse) { } @Override public void dragEnter(DropTargetDragEvent dtde) { // TODO Auto-generated method stub } @Override public void dragOver(DropTargetDragEvent dtde) { System.out.println(); } @Override public void dropActionChanged(DropTargetDragEvent dtde) { // TODO Auto-generated method stub } @Override public void dragExit(DropTargetEvent dte) { } @Override public void drop(DropTargetDropEvent dtde) { System.out.println(); } }