/* * JHDDragSource.java * * Created on January 28, 2003, 4:49 PM */ package CH.ifa.draw.contrib.dnd; import CH.ifa.draw.framework.*; import CH.ifa.draw.standard.DeleteFromDrawingVisitor; import CH.ifa.draw.util.Undoable; import java.awt.Component; import java.awt.dnd.*; import javax.swing.JComponent; /** * * @author Administrator */ public class JHDDragSourceListener implements java.awt.dnd.DragSourceListener { private Undoable sourceUndoable; private Boolean autoscrollState; private DrawingEditor editor; /** Creates a new instance of JHDDragSource */ public JHDDragSourceListener(DrawingEditor newEditor, DrawingView newView) { this.editor = newEditor; } // protected DrawingView view(){ // return dv; // } protected DrawingEditor editor(){ return editor; } /** * This method is invoked to signify that the Drag and Drop operation is complete. * This is the last method called in the process. */ public void dragDropEnd(java.awt.dnd.DragSourceDropEvent dsde) { DrawingView view = (DrawingView) dsde.getDragSourceContext().getComponent(); log("DragSourceDropEvent-dragDropEnd"); if (dsde.getDropSuccess() == true) { if (dsde.getDropAction() == DnDConstants.ACTION_MOVE) { log("DragSourceDropEvent-ACTION_MOVE"); //get the flavor in order of ease of use here. setSourceUndoActivity( createSourceUndoActivity( view ) ); DNDFigures df = (DNDFigures)DNDHelper.processReceivedData(DNDFiguresTransferable.DNDFiguresFlavor, dsde.getDragSourceContext().getTransferable()); getSourceUndoActivity().setAffectedFigures( df.getFigures() ); //all this visitation needs to be hidden in a view method. DeleteFromDrawingVisitor deleteVisitor = new DeleteFromDrawingVisitor(view.drawing()); FigureEnumeration fe = getSourceUndoActivity().getAffectedFigures(); while (fe.hasNextFigure()) { fe.nextFigure().visit(deleteVisitor); } view.clearSelection(); view.checkDamage(); editor().getUndoManager().pushUndo( getSourceUndoActivity() ); editor().getUndoManager().clearRedos(); // update menus editor().figureSelectionChanged( view ); } else if (dsde.getDropAction() == DnDConstants.ACTION_COPY) { log("DragSourceDropEvent-ACTION_COPY"); } } if (autoscrollState != null) { Component c = dsde.getDragSourceContext().getComponent(); if (JComponent.class.isInstance( c )) { JComponent jc = (JComponent)c; jc.setAutoscrolls(autoscrollState.booleanValue()); autoscrollState= null; } } } /** * Called as the hotspot enters a platform dependent drop site. */ public void dragEnter(DragSourceDragEvent dsde) { log("DragSourceDragEvent-dragEnter"); if (autoscrollState == null) { Component c = dsde.getDragSourceContext().getComponent(); if (JComponent.class.isInstance( c )) { JComponent jc = (JComponent)c; autoscrollState= new Boolean(jc.getAutoscrolls()); jc.setAutoscrolls(false);//why turn it off??? } } } /** * Called as the hotspot exits a platform dependent drop site. */ public void dragExit(java.awt.dnd.DragSourceEvent dse) { } /** * Called as the hotspot moves over a platform dependent drop site. */ public void dragOver(DragSourceDragEvent dsde) { //log("DragSourceDragEvent-dragOver"); } /** * Called when the user has modified the drop gesture. */ public void dropActionChanged(DragSourceDragEvent dsde) { log("DragSourceDragEvent-dropActionChanged"); } /** * Factory method for undo activity */ protected Undoable createSourceUndoActivity(DrawingView drawingView) { return new RemoveUndoActivity( drawingView ); } protected void setSourceUndoActivity(Undoable undoable){ sourceUndoable = undoable; } protected Undoable getSourceUndoActivity(){ return sourceUndoable; } public static class RemoveUndoActivity extends CH.ifa.draw.util.UndoableAdapter { private boolean undone = false; public RemoveUndoActivity(DrawingView view) { super( view ); log("RemoveUndoActivity created " + view); setUndoable(true); setRedoable(true); } public boolean undo() { if (isUndoable()) { if(getAffectedFigures().hasNextFigure()) { log("RemoveUndoActivity undo"); getDrawingView().clearSelection(); setAffectedFigures( getDrawingView().insertFigures(getAffectedFigures(), 0, 0,false)); undone = true; return true; } } return false; } public boolean redo() { // do not call execute directly as the selection might has changed if (isRedoable()) { log("RemoveUndoActivity redo"); DeleteFromDrawingVisitor deleteVisitor = new DeleteFromDrawingVisitor( getDrawingView().drawing()); FigureEnumeration fe = getAffectedFigures(); while (fe.hasNextFigure()) { fe.nextFigure().visit(deleteVisitor); //orphans figures } getDrawingView().clearSelection(); setAffectedFigures( deleteVisitor.getDeletedFigures() ); undone = false; return true; } return false; } /** * Since this is a delete activity, figures can only be released if the * action has not been undone. */ public void release() { if(undone == false){//we have figures that used to be in the drawing, but were not adding back FigureEnumeration fe = getAffectedFigures(); while (fe.hasNextFigure()) { Figure f = fe.nextFigure(); getDrawingView().drawing().remove(f); f.release(); } } setAffectedFigures(CH.ifa.draw.standard.FigureEnumerator.getEmptyEnumeration()); } } private static void log(String message){ //System.out.println("JHDDragSourceListener: " + message); } }