| /******************************************************************************* |
| * Copyright (c) 2004, 2008 Jingwen Ou 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: |
| * Jingwen Ou - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.sandbox.ui.editors; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.ui.JavaUI; |
| import org.eclipse.jface.text.BadLocationException; |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.jface.text.ITextSelection; |
| import org.eclipse.jface.text.TextSelection; |
| import org.eclipse.jface.text.source.SourceViewer; |
| import org.eclipse.mylyn.commons.core.StatusHandler; |
| import org.eclipse.mylyn.internal.sandbox.ui.hyperlinks.ResourceHyperlinkExtensions; |
| import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; |
| import org.eclipse.swt.custom.StyledTextDropTargetEffect; |
| import org.eclipse.swt.dnd.DND; |
| import org.eclipse.swt.dnd.DropTarget; |
| import org.eclipse.swt.dnd.DropTargetEvent; |
| import org.eclipse.swt.dnd.TextTransfer; |
| import org.eclipse.swt.dnd.Transfer; |
| import org.eclipse.ui.part.ResourceTransfer; |
| |
| /** |
| * Specifies a move operation is allowed, but when the actual operation is performed, covert it to a copy operation |
| * |
| * @author Jingwen Ou |
| */ |
| public class TaskEditorDropTarget extends StyledTextDropTargetEffect { |
| |
| public static final String DEFAULT_PREFIX = "file"; |
| |
| public static void addDropTargetSupport(SourceViewer editor) { |
| new TaskEditorDropTarget(editor); |
| } |
| |
| private final SourceViewer editor; |
| |
| private TaskEditorDropTarget(SourceViewer editor) { |
| super(editor.getTextWidget()); |
| this.editor = editor; |
| |
| DropTarget target = new DropTarget(editor.getControl(), DND.DROP_COPY); |
| // TODO: may also add TaskTransfer? |
| // TODO: this concern may also go to IResourceHyperlinkExtension by adding something like IResourceHyperlinkExtension.getTransfers()? |
| target.setTransfer(new Transfer[] { JavaUI.getJavaElementClipboardTransfer(), ResourceTransfer.getInstance(), |
| TextTransfer.getInstance() }); |
| target.addDropListener(this); |
| } |
| |
| @Override |
| public void dragEnter(DropTargetEvent event) { |
| super.dragEnter(event); |
| event.detail = DND.DROP_COPY; |
| } |
| |
| @Override |
| public void drop(DropTargetEvent event) { |
| StringBuilder shouldDropText = new StringBuilder(); |
| // this concern may also go to IResourceHyperlinkExtension by adding something like IResourceHyperlinkExtension.drop(DropTargetEvent)? |
| if (TextTransfer.getInstance().isSupportedType(event.currentDataType) && (event.data instanceof String)) { |
| shouldDropText.append((String) event.data); |
| } else if (JavaUI.getJavaElementClipboardTransfer().isSupportedType(event.currentDataType) |
| && (event.data instanceof IJavaElement[])) { |
| |
| IJavaElement[] elements = (IJavaElement[]) event.data; |
| |
| for (IJavaElement element : elements) { |
| shouldDropText.append(ResourceHyperlinkExtensions.getGeneratedPrefix("java") + element.getElementName() |
| + addCommaIfNeeded(elements, element)); |
| } |
| |
| } else if (ResourceTransfer.getInstance().isSupportedType(event.currentDataType) |
| && (event.data instanceof IResource[])) { |
| IResource[] elements = (IResource[]) event.data; |
| for (IResource element : elements) { |
| String fullName = element.getName(); |
| int sep_pos = fullName.lastIndexOf("."); |
| |
| if (sep_pos != -1) { |
| String fileName = fullName.substring(0, sep_pos); |
| String fileType = fullName.substring(sep_pos + 1); |
| |
| // decide file type by file extension |
| String generatedPrefix = ResourceHyperlinkExtensions.getGeneratedPrefix(fileType.toLowerCase()); |
| |
| if (generatedPrefix != null) { |
| shouldDropText.append(generatedPrefix + " " + fileName + addCommaIfNeeded(elements, element)); |
| } else { |
| // cannot decide the file type, then use default |
| shouldDropText.append(ResourceHyperlinkExtensions.getDefaultPrefix() + " " |
| + element.getFullPath().toString().substring(1) + addCommaIfNeeded(elements, element)); |
| } |
| } |
| |
| } |
| } |
| |
| if (shouldDropText.length() > 0) { |
| dropTextToCurrentPosition(shouldDropText.toString()); |
| } |
| } |
| |
| private String addCommaIfNeeded(Object[] elements, Object element) { |
| return ((elements.length > 1 && element != elements[elements.length - 1]) ? ", " : ""); |
| } |
| |
| private void dropTextToCurrentPosition(String shouldDropText) { |
| try { |
| ITextSelection textSelection = ((ITextSelection) editor.getSelection()); |
| IDocument currentDocument = editor.getDocument(); |
| currentDocument.replace(textSelection.getOffset(), 0, shouldDropText); |
| |
| // move cursor to the end |
| editor.getTextWidget().setFocus(); |
| editor.setSelection(new TextSelection(textSelection.getOffset() + shouldDropText.length(), 0)); |
| } catch (BadLocationException e) { |
| StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not drop text", e)); |
| } |
| } |
| } |