### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java,v retrieving revision 1.64 diff -u -r1.64 TaskEditor.java --- src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java 27 Sep 2007 00:42:08 -0000 1.64 +++ src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java 29 Nov 2007 10:46:46 -0000 @@ -8,6 +8,10 @@ package org.eclipse.mylyn.tasks.ui.editors; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -21,7 +25,10 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.mylyn.internal.tasks.core.LocalTask; +import org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants; +import org.eclipse.mylyn.internal.tasks.ui.TaskTransfer; import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages; +import org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction; import org.eclipse.mylyn.internal.tasks.ui.editors.EditorBusyIndicator; import org.eclipse.mylyn.internal.tasks.ui.editors.IBusyEditor; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor; @@ -31,6 +38,12 @@ import org.eclipse.mylyn.tasks.core.RepositoryTaskData; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DragSourceEvent; +import org.eclipse.swt.dnd.DragSourceListener; +import org.eclipse.swt.dnd.FileTransfer; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IEditorInput; @@ -155,7 +168,7 @@ /** * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, and updates this * multi-page editor's input to correspond to the nested editor's. - * + * * @see org.eclipse.ui.ISaveablePart#doSaveAs() */ @Override @@ -330,7 +343,7 @@ } } else if (getEditorInput() instanceof AbstractRepositoryTaskEditorInput) { this.setTitleImage(TasksUiImages.getImage(TasksUiImages.TASK_REMOTE)); - } else { + } else { setTitleImage(TasksUiImages.getImage(TasksUiImages.TASK)); } @@ -388,11 +401,82 @@ @Override protected void createHeaderContents(IManagedForm headerForm) { - getToolkit().decorateFormHeading(headerForm.getForm().getForm()); + Form baseForm = headerForm.getForm().getForm(); + getToolkit().decorateFormHeading(baseForm); headerForm.getForm().setImage(TasksUiImages.getImage(TasksUiImages.TASK)); updateFormTitle(); + registerDragListeners(baseForm); } + private void registerDragListeners(Form baseForm) { + Transfer[] dragTypes = new Transfer[] { +// TaskTransfer.getInstance(), + FileTransfer.getInstance(), + TextTransfer.getInstance() + }; + + DragSourceListener titleDragSourceListener = new DragSourceListener() { + + public void dragFinished(DragSourceEvent event) { + // ignore + + } + + public void dragSetData(DragSourceEvent event) { + AbstractTask task = null; + // ignore + IEditorInput input = getEditorInput(); + if (input instanceof TaskEditorInput) { + task = ((TaskEditorInput) input).getTask(); + } else if (input instanceof RepositoryTaskEditorInput) { + task = ((RepositoryTaskEditorInput) input).getRepositoryTask(); + } + // TODO maybe change the sequence here to get it working... + if (TaskTransfer.getInstance().isSupportedType(event.dataType)) { + AbstractTask[] data = new AbstractTask[1]; + data[0] = task; + event.data = data; + } else if (FileTransfer.getInstance().isSupportedType(event.dataType)) { + if (task != null) { + String encodedName = "task-" + task.getTaskKey(); + try { + encodedName = URLEncoder.encode(task.getHandleIdentifier(), + ITasksUiConstants.FILENAME_ENCODING); + } catch (UnsupportedEncodingException e) { + StatusHandler.fail(e, "Could not determine path for context", false); + } + File tempDir = new File(TasksUiPlugin.getDefault().getDataDirectory() + File.separator + "temp"); + if (!tempDir.exists()) { + tempDir.mkdir(); + } + File taskTempFile; + try { + taskTempFile = File.createTempFile(encodedName, ITasksUiConstants.FILE_EXTENSION, + tempDir); + taskTempFile.deleteOnExit(); + TasksUiPlugin.getTaskListManager().getTaskListWriter().writeTask(task, + taskTempFile); + event.data = new String[] { taskTempFile.getAbsolutePath() }; + } catch (IOException e) { + StatusHandler.fail(e, "Cannot create a temp query file for Drag&Drop", true); + } + } + } else if (TextTransfer.getInstance().isSupportedType(event.dataType)) { + event.data = CopyTaskDetailsAction.getTextForTask(task); + } + + } + + public void dragStart(DragSourceEvent event) { + // ignore + + } + + }; + baseForm.addTitleDragSupport(DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT, dragTypes, titleDragSourceListener); + } + + protected void updateFormTitle() { IEditorInput input = getEditorInput(); if (input instanceof TaskEditorInput) {