X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/dnd/DelegatingDropAdapter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/dnd/DelegatingDropAdapter.java new file mode 100644 index 0000000..c3ad84a --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/dnd/DelegatingDropAdapter.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.ui.dnd; + +import org.eclipse.swt.dnd.DropTargetEvent; +import org.eclipse.swt.dnd.DropTargetListener; +import org.eclipse.swt.dnd.TransferData; + +import org.eclipse.jface.util.Assert; + +/** + * A delegating drop adapter negotiates between a set of TransferDropTargetListeners + * On dragEnter the adapter determines the listener to be used for any further + * drag* callback. + */ +public class DelegatingDropAdapter implements DropTargetListener { + + private TransferDropTargetListener[] fListeners; + + private TransferDropTargetListener fChosenListener; + + /** + * Creates a new delegating drop adapter. + * + * @param listeners an array of potential listeners + */ + public DelegatingDropAdapter(TransferDropTargetListener[] listeners) { + fListeners= listeners; + Assert.isNotNull(listeners); + } + + /* non Java-doc + * @see DropTargetListener + */ + public void dragEnter(DropTargetEvent event) { + fChosenListener= null; + event.currentDataType= selectPreferredListener(event.dataTypes); + if (fChosenListener != null) + fChosenListener.dragEnter(event); + } + + /* non Java-doc + * @see DropTargetListener + */ + public void dragLeave(DropTargetEvent event){ + if (fChosenListener != null) + fChosenListener.dragLeave(event); + } + + /* non Java-doc + * @see DropTargetListener + */ + public void dragOperationChanged(DropTargetEvent event){ + if (fChosenListener != null) + fChosenListener.dragOperationChanged(event); + } + + /* non Java-doc + * @see DropTargetListener + */ + public void dragOver(DropTargetEvent event){ + if (fChosenListener != null) + fChosenListener.dragOver(event); + } + + /* non Java-doc + * @see DropTargetListener + */ + public void drop(DropTargetEvent event){ + if (fChosenListener != null) + fChosenListener.drop(event); + fChosenListener= null; + } + + /* non Java-doc + * @see DropTargetListener + */ + public void dropAccept(DropTargetEvent event){ + if (fChosenListener != null) + fChosenListener.dropAccept(event); + } + + private TransferData selectPreferredListener(TransferData[] dataTypes) { + for (int i= 0; i < fListeners.length; i++) { + TransferData data= computeTransferData(dataTypes, fListeners[i]); + if (data != null) + return data; + } + return null; + } + + private TransferData computeTransferData(TransferData[] dataTypes, TransferDropTargetListener listener) { + for (int i= 0; i < dataTypes.length; i++) { + if (listener.getTransfer().isSupportedType(dataTypes[i])) { + fChosenListener= listener; + return dataTypes[i]; + } + } + return null; + } +}