| /******************************************************************************* |
| * Copyright (c) 2001, 2010 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.sse.ui.internal; |
| |
| import org.eclipse.jface.text.ITextViewer; |
| import org.eclipse.swt.dnd.DND; |
| import org.eclipse.swt.dnd.DropTargetAdapter; |
| import org.eclipse.swt.dnd.DropTargetEvent; |
| import org.eclipse.swt.dnd.FileTransfer; |
| import org.eclipse.swt.dnd.Transfer; |
| import org.eclipse.swt.dnd.TransferData; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.wst.sse.ui.StructuredTextEditor; |
| import org.eclipse.wst.sse.ui.internal.TransferBuilder.TransferProxyForDelayLoading; |
| |
| /** |
| * ExtendedEditorDropTargetAdapter |
| */ |
| public class ExtendedEditorDropTargetAdapter extends DropTargetAdapter { |
| private String[] editorIds; |
| private Point originalRange = null; |
| private IEditorPart targetEditor = null; |
| private ITextViewer textViewer = null; |
| |
| private Transfer[] transfers = null; |
| |
| private boolean useProxy; |
| |
| /** |
| * @deprecated use ExtendedEditorDropTargetAdapter(boolean useProxy) for |
| * the performance |
| */ |
| public ExtendedEditorDropTargetAdapter() { |
| this(false); |
| } |
| |
| public ExtendedEditorDropTargetAdapter(boolean useProxy) { |
| super(); |
| this.useProxy = useProxy; |
| } |
| |
| protected boolean doDrop(Transfer transfer, DropTargetEvent event) { |
| TransferBuilder tb = new TransferBuilder(useProxy); |
| |
| IDropAction[] as = null; |
| if (editorIds != null && editorIds.length > 0) |
| as = tb.getDropActions(editorIds, transfer); |
| else |
| as = tb.getDropActions(getTargetEditor().getClass().getName(), transfer); |
| |
| for (int i = 0; i < as.length; ++i) { |
| IDropAction da = as[i]; |
| Transfer actualTransfer; |
| if (transfer instanceof TransferProxyForDelayLoading) { |
| actualTransfer = ((TransferProxyForDelayLoading) transfer).getTransferClass(); |
| } |
| else { |
| actualTransfer = transfer; |
| } |
| if (actualTransfer instanceof FileTransfer) { |
| if (event.data == null) { |
| Logger.log(Logger.ERROR, "No data in DropTargetEvent from " + event.widget); //$NON-NLS-1$ |
| return false; |
| } |
| String[] strs = (String[]) event.data; |
| boolean[] bs = new boolean[strs.length]; |
| int c = 0; |
| for (int j = 0; j < strs.length; ++j) { |
| bs[j] = false; |
| if (da.isSupportedData(strs[j])) { |
| event.data = new String[]{strs[j]}; |
| if (!da.run(event, targetEditor)) { |
| bs[j] = true; |
| c++; |
| } |
| } |
| else { |
| bs[j] = true; |
| c++; |
| } |
| } |
| if (c == 0) { |
| return true; |
| } |
| |
| int k = 0; |
| String[] rests = new String[c]; |
| for (int j = 0; j < strs.length; ++j) { |
| if (bs[j]) |
| rests[k++] = strs[j]; |
| } |
| event.data = rests; |
| } |
| else if (da.isSupportedData(event.data)) { |
| if (da.run(event, targetEditor)) { |
| return true; |
| } |
| } |
| } |
| |
| return false; |
| } |
| |
| /** |
| */ |
| public void dragEnter(DropTargetEvent event) { |
| TransferData data = null; |
| Transfer[] ts = getTransfers(); |
| for (int i = 0; i < ts.length; i++) { |
| for (int j = 0; j < event.dataTypes.length; j++) { |
| if (ts[i].isSupportedType(event.dataTypes[j])) { |
| data = event.dataTypes[j]; |
| break; |
| } |
| } |
| if (data != null) { |
| event.currentDataType = data; |
| break; |
| } |
| } |
| |
| if (textViewer != null) { |
| originalRange = textViewer.getSelectedRange(); |
| } |
| } |
| |
| public void dragLeave(DropTargetEvent event) { |
| if (textViewer != null) { |
| textViewer.setSelectedRange(originalRange.x, originalRange.y); |
| } |
| else { |
| originalRange = null; |
| } |
| } |
| |
| /** |
| * Scroll the visible area as needed |
| */ |
| public void dragOver(DropTargetEvent event) { |
| event.operations &= ~DND.DROP_MOVE; |
| event.detail = DND.DROP_COPY; |
| event.feedback |= DND.FEEDBACK_SCROLL; |
| } |
| |
| /** |
| */ |
| public void drop(DropTargetEvent event) { |
| if (event.operations == DND.DROP_NONE) |
| return; |
| |
| Transfer[] ts = getTransfers(); |
| for (int i = 0; i < ts.length; i++) { |
| if (ts[i].isSupportedType(event.currentDataType)) { |
| if (doDrop(ts[i], event)) { |
| IEditorPart part = targetEditor; |
| if (targetEditor instanceof StructuredTextEditor){ |
| part = ((StructuredTextEditor) targetEditor).getEditorPart(); |
| } |
| targetEditor.getSite().getPage().activate(part); |
| break; |
| } |
| } |
| } |
| } |
| |
| public IEditorPart getTargetEditor() { |
| return targetEditor; |
| } |
| |
| public ITextViewer getTextViewer() { |
| return textViewer; |
| } |
| |
| /** |
| * @return org.eclipse.swt.dnd.Transfer[] |
| */ |
| public Transfer[] getTransfers() { |
| if (transfers == null) { |
| TransferBuilder tb = new TransferBuilder(useProxy); |
| if (editorIds == null || editorIds.length == 0) |
| transfers = tb.getDropTargetTransfers(getTargetEditor().getClass().getName()); |
| else |
| transfers = tb.getDropTargetTransfers(editorIds); |
| } |
| return transfers; |
| } |
| |
| /** |
| */ |
| public void setTargetEditor(IEditorPart targetEditor) { |
| this.targetEditor = targetEditor; |
| } |
| |
| public void setTargetIDs(String[] ids) { |
| editorIds = ids; |
| } |
| |
| public void setTextViewer(ITextViewer textViewer) { |
| this.textViewer = textViewer; |
| } |
| |
| } |