### 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.67 diff -u -r1.67 TaskEditor.java --- src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java 24 Jan 2008 04:11:11 -0000 1.67 +++ src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java 31 Jan 2008 16:28:02 -0000 @@ -21,6 +21,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.TaskTransfer; 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,7 +32,10 @@ import org.eclipse.mylyn.tasks.core.RepositoryTaskData; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.tasks.ui.TasksUiUtil; +import org.eclipse.swt.dnd.DND; +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.ui.IEditorInput; import org.eclipse.ui.IEditorPart; @@ -65,13 +69,15 @@ private IEditorPart contentOutlineProvider = null; public final Object FAMILY_SUBMIT = new Object(); - + private MenuManager menuManager = new MenuManager(); private EditorBusyIndicator editorBusyIndicator; private IHyperlinkListener messageHyperLinkListener; + private TitleDragSource titleDragSource; + public TaskEditor() { super(); taskPlanningEditor = new TaskPlanningEditor(this); @@ -88,9 +94,10 @@ public TaskEditorActionContributor getContributor() { return (TaskEditorActionContributor) getEditorSite().getActionBarContributor(); } - + /** - * @param Configurs standard task editor context menu + * @param Configurs + * standard task editor context menu * @Since 2.3 */ protected void configureContextMenuManager(MenuManager manager) { @@ -227,7 +234,7 @@ @Override public void dispose() { - + if (editorBusyIndicator != null) { editorBusyIndicator.stop(); } @@ -333,7 +340,7 @@ } } else if (getEditorInput() instanceof AbstractRepositoryTaskEditorInput) { this.setTitleImage(TasksUiImages.getImage(TasksUiImages.TASK_REMOTE)); - } else { + } else { setTitleImage(TasksUiImages.getImage(TasksUiImages.TASK)); } @@ -368,9 +375,7 @@ // } if (busy) { - if (TasksUiUtil.isAnimationsEnabled()) { - editorBusyIndicator.start(); - } + editorBusyIndicator.start(); } else { editorBusyIndicator.stop(); } @@ -393,29 +398,45 @@ @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) { + if (null == titleDragSource) { + Transfer[] transferTypes; + if (null == task) { + transferTypes = new Transfer[] { TextTransfer.getInstance() }; + } else { + transferTypes = new Transfer[] { TaskTransfer.getInstance(), TextTransfer.getInstance(), + FileTransfer.getInstance() }; + } + titleDragSource = new TitleDragSource(this); + form.addTitleDragSupport(DND.DROP_MOVE | DND.DROP_LINK, transferTypes, titleDragSource); + } } protected void updateFormTitle() { IEditorInput input = getEditorInput(); if (input instanceof TaskEditorInput) { - AbstractTask task = ((TaskEditorInput) input).getTask(); + 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(); + 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()); @@ -423,6 +444,7 @@ } } } + installTitleDrag(getHeaderForm().getForm().getForm()); } private void setFormHeaderImage(String repositoryKind) { @@ -438,13 +460,13 @@ } /** - * @since 2.3 + * @since 2.3 */ public void setMessage(String message, int type, IHyperlinkListener listener) { if (this.getHeaderForm() != null && this.getHeaderForm().getForm() != null) { if (!this.getHeaderForm().getForm().isDisposed()) { getTopForm().setMessage(message, type); - + if (messageHyperLinkListener != null) { getTopForm().removeMessageHyperlinkListener(messageHyperLinkListener); } @@ -459,7 +481,7 @@ public void setMessage(String message, int type) { setMessage(message, type, null); } - + protected IWorkbenchSiteProgressService getProgressService() { Object siteService = getEditorSite().getAdapter(IWorkbenchSiteProgressService.class); if (siteService != null) Index: src/org/eclipse/mylyn/tasks/ui/editors/TitleDragSource.java =================================================================== RCS file: src/org/eclipse/mylyn/tasks/ui/editors/TitleDragSource.java diff -N src/org/eclipse/mylyn/tasks/ui/editors/TitleDragSource.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/tasks/ui/editors/TitleDragSource.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Mylyn project committers 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 + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.ui.editors; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants; +import org.eclipse.mylyn.internal.tasks.ui.TaskTransfer; +import org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction; +import org.eclipse.mylyn.monitor.core.StatusHandler; +import org.eclipse.mylyn.tasks.core.AbstractTask; +import org.eclipse.mylyn.tasks.core.TaskList; +import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; +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.ui.forms.widgets.Form; + +/** + * Handle the dragging of the {@link TaskList} {@link Form} Title to the {@link TaskList} and Desktop. By grabbing the + * Task title, you can drag and export as Task (to TaskList), as File (to Desktop or Mail) and Text. + * + * @author Maarten Meijer + */ +public final class TitleDragSource extends DragSourceAdapter { + /** + * + */ + private final TaskEditor taskEditor; + + /** + * @param taskEditor + * whose title to drag from + */ + TitleDragSource(TaskEditor taskEditor) { + this.taskEditor = taskEditor; + } + + @Override + public void dragSetData(DragSourceEvent event) { + if (TaskTransfer.getInstance().isSupportedType(event.dataType)) { + if (this.taskEditor.task != null) { + event.data = new AbstractTask[] { this.taskEditor.task }; + } + } + if (FileTransfer.getInstance().isSupportedType(event.dataType)) { + // similar code is in TaskListDragSourceListener, maybe move to an utility class + if (this.taskEditor.task != null) { + String encodedName = "task-" + this.taskEditor.task.getTaskKey(); + try { + encodedName = URLEncoder.encode(this.taskEditor.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(this.taskEditor.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 (this.taskEditor.task != null) { + event.data = CopyTaskDetailsAction.getTextForTask(this.taskEditor.task); + return; + } else if (this.taskEditor.getEditorInput() instanceof RepositoryTaskEditorInput + && ((RepositoryTaskEditorInput) this.taskEditor.getEditorInput()).getUrl() != null) { + event.data = ((RepositoryTaskEditorInput) this.taskEditor.getEditorInput()).getUrl(); + return; + } + } + } +}