### 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 3 Dec 2007 12:55:41 -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,6 +25,7 @@ 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.TasksUiImages; import org.eclipse.mylyn.internal.tasks.ui.editors.EditorBusyIndicator; import org.eclipse.mylyn.internal.tasks.ui.editors.IBusyEditor; @@ -31,6 +36,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.DragSourceAdapter; +import org.eclipse.swt.dnd.DragSourceEvent; +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; @@ -330,7 +341,7 @@ } } else if (getEditorInput() instanceof AbstractRepositoryTaskEditorInput) { this.setTitleImage(TasksUiImages.getImage(TasksUiImages.TASK_REMOTE)); - } else { + } else { setTitleImage(TasksUiImages.getImage(TasksUiImages.TASK)); } @@ -388,29 +399,83 @@ @Override protected void createHeaderContents(IManagedForm headerForm) { - getToolkit().decorateFormHeading(headerForm.getForm().getForm()); + Form form = headerForm.getForm().getForm(); + getToolkit().decorateFormHeading(form); headerForm.getForm().setImage(TasksUiImages.getImage(TasksUiImages.TASK)); updateFormTitle(); + + } + + private void installTitleDrag(Form form) { + Transfer[] transferTypes; + if (null == task) { + transferTypes = new Transfer[] { TextTransfer.getInstance() }; + } else { + transferTypes = new Transfer[] { TextTransfer.getInstance(), FileTransfer.getInstance() }; + } + form.addTitleDragSupport(DND.DROP_COPY | DND.DROP_LINK, transferTypes, new DragSourceAdapter() { + + @Override + public void dragSetData(DragSourceEvent event) { + if (FileTransfer.getInstance().isSupportedType(event.dataType)) { + // similar code is in TaskListDragSourceListener, maybe move to an utility class + 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); + } + } + } + if (TextTransfer.getInstance().isSupportedType(event.dataType)) { + if (task != null) { + event.data = task.getUrl(); // goes wrong with LocalTask + return; + } else if (getEditorInput() instanceof RepositoryTaskEditorInput + && ((RepositoryTaskEditorInput) getEditorInput()).getUrl() != null) { + event.data = ((RepositoryTaskEditorInput) getEditorInput()).getUrl(); + return; + } + } + } + }); } protected void updateFormTitle() { IEditorInput input = getEditorInput(); if (input instanceof TaskEditorInput) { - AbstractTask task = ((TaskEditorInput) input).getTask(); + /* AbstractTask */task = ((TaskEditorInput) input).getTask(); if (task instanceof LocalTask) { getHeaderForm().getForm().setText("Task: " + task.getSummary()); } else { setFormHeaderImage(task.getConnectorKind()); setFormHeaderLabel(task); - return; +// return; } } else if (input instanceof RepositoryTaskEditorInput) { - AbstractTask task = ((RepositoryTaskEditorInput) input).getRepositoryTask(); + /* AbstractTask */task = ((RepositoryTaskEditorInput) input).getRepositoryTask(); RepositoryTaskData data = ((RepositoryTaskEditorInput) input).getTaskData(); if (task != null && data != null && !data.isNew()) { setFormHeaderImage(task.getConnectorKind()); setFormHeaderLabel(task); - return; +// return; } else { if (data != null) { setFormHeaderImage(data.getRepositoryKind()); @@ -418,6 +483,7 @@ } } } + installTitleDrag(getHeaderForm().getForm().getForm()); } private void setFormHeaderImage(String repositoryKind) {