### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.core Index: src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java,v retrieving revision 1.26 diff -u -r1.26 TaskAttribute.java --- src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java 2 Jun 2008 07:07:30 -0000 1.26 +++ src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java 12 Jun 2008 07:26:28 -0000 @@ -101,6 +101,8 @@ public static final String KIND_PEOPLE = "task.common.kind.default"; + public static final String KIND_PLANNING = "task.common.kind.planning"; + //public static final String META_SHOW_IN_ATTRIBUTES_SECTION = "task.meta.showInTaskEditorAttributesSection"; public static final String META_ASSOCIATED_ATTRIBUTE_ID = "task.meta.associated.attribute"; #P org.eclipse.mylyn.jira.core Index: src/org/eclipse/mylyn/internal/jira/core/JiraAttribute.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.jira.core/src/org/eclipse/mylyn/internal/jira/core/JiraAttribute.java,v retrieving revision 1.7 diff -u -r1.7 JiraAttribute.java --- src/org/eclipse/mylyn/internal/jira/core/JiraAttribute.java 1 Jun 2008 08:14:38 -0000 1.7 +++ src/org/eclipse/mylyn/internal/jira/core/JiraAttribute.java 12 Jun 2008 07:26:31 -0000 @@ -153,7 +153,12 @@ } public String getKind() { - return (isHidden) ? null : TaskAttribute.KIND_DEFAULT; + switch (this) { + case DUE_DATE: + return TaskAttribute.KIND_PLANNING; + default: + return (isHidden) ? null : TaskAttribute.KIND_DEFAULT; + } } } Index: src/org/eclipse/mylyn/internal/jira/core/JiraTaskDataHandler.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.jira.core/src/org/eclipse/mylyn/internal/jira/core/JiraTaskDataHandler.java,v retrieving revision 1.31 diff -u -r1.31 JiraTaskDataHandler.java --- src/org/eclipse/mylyn/internal/jira/core/JiraTaskDataHandler.java 6 Jun 2008 08:31:52 -0000 1.31 +++ src/org/eclipse/mylyn/internal/jira/core/JiraTaskDataHandler.java 12 Jun 2008 07:26:31 -0000 @@ -510,6 +510,12 @@ || !JiraAttribute.valueById(attribute.getId()).isHidden())) { properties.setKind(TaskAttribute.KIND_DEFAULT); } + if (JiraAttribute.DUE_DATE.id().equals(attribute.getId()) + || JiraAttribute.ACTUAL.id().equals(attribute.getId()) + || JiraAttribute.ESTIMATE.id().equals(attribute.getId()) + || JiraAttribute.INITIAL_ESTIMATE.id().equals(attribute.getId())) { + properties.setKind(TaskAttribute.KIND_PLANNING); + } if (TaskAttribute.COMMENT_NEW.equals(attribute.getId()) || TaskAttribute.RESOLUTION.equals(attribute.getId())) { #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java,v retrieving revision 1.56 diff -u -r1.56 AbstractTaskEditorPage.java --- src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java 10 Jun 2008 23:32:15 -0000 1.56 +++ src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java 12 Jun 2008 07:26:33 -0000 @@ -8,6 +8,7 @@ package org.eclipse.mylyn.tasks.ui.editors; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -30,6 +31,7 @@ import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.util.SafeRunnable; @@ -63,6 +65,7 @@ import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlinePage; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPeoplePart; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPlanningPart; +import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorRepositoryPlanningPart; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorRichTextPart; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; @@ -120,12 +123,15 @@ import org.eclipse.ui.forms.IFormPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormPage; +import org.eclipse.ui.forms.events.ExpansionAdapter; +import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; @@ -292,6 +298,8 @@ public static final String ID_PART_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.part.planning"; + public static final String ID_PART_REPOSITORY_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.part.repositoryPlanning"; + public static final String ID_PART_SUMMARY = "org.eclipse.mylyn.tasks.ui.editors.part.summary"; public static final String PATH_ACTIONS = "actions"; @@ -308,6 +316,8 @@ public static final String PATH_PLANNING = "planning"; + public static final String PATH_REPOSITORY_PLANNING = "repositoryPlanning"; + // private static final String ID_POPUP_MENU = "org.eclipse.mylyn.tasks.ui.editor.menu.page"; private AttributeEditorFactory attributeEditorFactory; @@ -513,6 +523,19 @@ return new TaskEditorSummaryPart(); } }.setPath(PATH_HEADER)); + descriptors.add(new TaskEditorPartDescriptor(ID_PART_PLANNING) { + @Override + public AbstractTaskEditorPart createPart() { + return new TaskEditorPlanningPart(); + } + }.setPath(PATH_PLANNING)); + descriptors.add(new TaskEditorPartDescriptor(ID_PART_REPOSITORY_PLANNING) { + @Override + public AbstractTaskEditorPart createPart() { + return new TaskEditorRepositoryPlanningPart(); + } + }.setPath(PATH_PLANNING)); + descriptors.add(new TaskEditorPartDescriptor(ID_PART_ATTRIBUTES) { @Override public AbstractTaskEditorPart createPart() { @@ -552,14 +575,6 @@ return new TaskEditorNewCommentPart(); } }.setPath(PATH_COMMENTS)); - if (taskData.isNew()) { - descriptors.add(new TaskEditorPartDescriptor(ID_PART_PLANNING) { - @Override - public AbstractTaskEditorPart createPart() { - return new TaskEditorPlanningPart(); - } - }.setPath(PATH_PLANNING)); - } descriptors.add(new TaskEditorPartDescriptor(ID_PART_ACTIONS) { @Override public AbstractTaskEditorPart createPart() { @@ -579,19 +594,61 @@ List descriptors = new LinkedList(createPartDescriptors()); // single column createParts(PATH_HEADER, editorComposite, descriptors); + // two column + Composite planningComposite = toolkit.createComposite(editorComposite); + planningComposite.setLayout(GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(2).create()); + GridDataFactory.fillDefaults().grab(true, false).applyTo(planningComposite); + createParts(PATH_PLANNING, planningComposite, descriptors); + createParts(PATH_REPOSITORY_PLANNING, planningComposite, descriptors); + coupleSections(planningComposite); + // single column createParts(PATH_ATTRIBUTES, editorComposite, descriptors); createParts(PATH_ATTACHMENTS, editorComposite, descriptors); createParts(PATH_COMMENTS, editorComposite, descriptors); - createParts(PATH_PLANNING, editorComposite, descriptors); // two column Composite bottomComposite = toolkit.createComposite(editorComposite); - bottomComposite.setLayout(new GridLayout(2, false)); + bottomComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create()); GridDataFactory.fillDefaults().grab(true, false).applyTo(bottomComposite); createParts(PATH_ACTIONS, bottomComposite, descriptors); createParts(PATH_PEOPLE, bottomComposite, descriptors); bottomComposite.pack(true); } + private void coupleSections(Composite composite) { + final List
sections = new ArrayList
(); + final boolean[] processingEvents = new boolean[1]; + Control[] controls = composite.getChildren(); + boolean expand = false; + for (Control control : controls) { + if (control instanceof Section) { + final Section section = (Section) control; + sections.add(section); + expand |= section.isExpanded(); + section.addExpansionListener(new ExpansionAdapter() { + @Override + public void expansionStateChanging(ExpansionEvent e) { + if (!processingEvents[0]) { + processingEvents[0] = true; + for (Section otherSection : sections) { + if (otherSection != section && otherSection.isExpanded() != e.getState()) { + EditorUtil.toggleExpandableComposite(e.getState(), otherSection); + } + } + processingEvents[0] = false; + } + } + }); + } + } + if (expand) { + for (Section section : sections) { + if (!section.isExpanded()) { + EditorUtil.toggleExpandableComposite(true, section); + } + } + } + } + private void createParts(String path, final Composite parent, Collection descriptors) { for (Iterator it = descriptors.iterator(); it.hasNext();) { final TaskEditorPartDescriptor descriptor = it.next(); Index: .refactorings/2008/6/24/refactorings.index =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.index,v retrieving revision 1.8 diff -u -r1.8 refactorings.index --- .refactorings/2008/6/24/refactorings.index 12 Jun 2008 03:52:21 -0000 1.8 +++ .refactorings/2008/6/24/refactorings.index 12 Jun 2008 07:26:33 -0000 @@ -6,9 +6,7 @@ 1213201895713 Move compilation unit 1213220621176 Change method 'createPage' 1213222760431 Extract method 'getPriorityImage' +1213223492423 Extract method 'createScheduledDatePicker' +1213223509735 Extract method 'createDueDatePicker' +1213223626268 Extract method 'createEstimatedTime' 1213224501261 Delete element -1213239593449 Extract constant 'LABEL_RESOURCES' -1213240835314 Rename field 'tasksCategory' -1213241600882 Rename field 'resourcesCategory' -1213241701045 Rename field 'repositoryMap' -1213242540994 Extract local variable 'projectMapping' Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java,v retrieving revision 1.11 diff -u -r1.11 TaskEditorPlanningPart.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java 8 May 2008 07:20:16 -0000 1.11 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java 12 Jun 2008 07:26:33 -0000 @@ -8,19 +8,43 @@ package org.eclipse.mylyn.internal.tasks.ui.editors; +import java.util.Calendar; +import java.util.Set; + import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.mylyn.commons.core.DateUtil; +import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.tasks.core.DateRange; +import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener; +import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil; +import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta; import org.eclipse.mylyn.internal.tasks.ui.ScheduleDatePicker; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; +import org.eclipse.mylyn.monitor.ui.MonitorUi; +import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskActivityListener; +import org.eclipse.mylyn.tasks.core.TaskActivityAdapter; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Spinner; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.FormToolkit; @@ -32,12 +56,81 @@ */ public class TaskEditorPlanningPart extends AbstractTaskEditorPart { + private static final String CLEAR = "Clear"; + private static final int DEFAULT_ESTIMATED_TIME = 1; - private ScheduleDatePicker scheduledForDate; + private static final String NO_TIME_ELAPSED = "0 seconds"; + + private static final String RESET = "Reset"; + + private static final int LABEL_WIDTH = 80; + + private static final int CONTROL_WIDTH = 100; + + private DatePicker dueDatePicker; + + private Text elapsedTimeText; private Spinner estimatedTime; + private ScheduleDatePicker scheduleDatePicker; + + private AbstractTask task; + + private final ITaskListChangeListener TASK_LIST_LISTENER = new TaskListChangeAdapter() { + + @Override + public void containersChanged(Set containers) { + for (TaskContainerDelta taskContainerDelta : containers) { + if (taskContainerDelta.getElement() instanceof ITask) { + final AbstractTask updateTask = (AbstractTask) taskContainerDelta.getElement(); + if (updateTask != null && task != null + && updateTask.getHandleIdentifier().equals(task.getHandleIdentifier())) { + if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().isClosing()) { + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + public void run() { + updateFromTask(updateTask); + } + }); + } + } + } + } + } + + }; + + private final ITaskActivityListener timingListener = new TaskActivityAdapter() { + + @Override + public void elapsedTimeUpdated(ITask task, long newElapsedTime) { + if (task.equals(TaskEditorPlanningPart.this.task)) { + String elapsedTimeString = NO_TIME_ELAPSED; + try { + elapsedTimeString = DateUtil.getFormattedDuration(newElapsedTime, false); + if (elapsedTimeString.equals("")) { + elapsedTimeString = NO_TIME_ELAPSED; + } + + } catch (RuntimeException e) { + StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, + "Could not format elapsed time", e)); + } + final String elapsedString = elapsedTimeString; + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + + public void run() { + if (elapsedTimeText != null && !elapsedTimeText.isDisposed()) { + elapsedTimeText.setText(elapsedString); + } + } + }); + + } + } + }; + public TaskEditorPlanningPart() { setPartName("Personal Planning"); } @@ -47,125 +140,163 @@ AbstractTask task = (AbstractTask) getTaskEditorPage().getTask(); Assert.isNotNull(task); - DateRange selectedDate = null; - if (scheduledForDate != null) { - selectedDate = scheduledForDate.getScheduledDate(); - } - if (selectedDate != null) { - TasksUiPlugin.getTaskActivityManager().setScheduledFor(task, selectedDate); + if (scheduleDatePicker != null && scheduleDatePicker.getScheduledDate() != null) { + if (task.getScheduledForDate() == null + || (task.getScheduledForDate() != null && !scheduleDatePicker.getScheduledDate().equals( + task.getScheduledForDate())) || (task).getScheduledForDate().isDay()) { + TasksUiPlugin.getTaskActivityManager().setScheduledFor(task, scheduleDatePicker.getScheduledDate()); + (task).setReminded(false); + } + } else { + TasksUiPlugin.getTaskActivityManager().setScheduledFor(task, null); + (task).setReminded(false); } if (estimatedTime != null) { task.setEstimatedTimeHours(estimatedTime.getSelection()); } + if (dueDatePicker != null && dueDatePicker.getDate() != null) { + TasksUiPlugin.getTaskActivityManager().setDueDate(task, dueDatePicker.getDate().getTime()); + } else { + TasksUiPlugin.getTaskActivityManager().setDueDate(task, null); + } + super.commit(onSave); } + private void createActualTime(FormToolkit toolkit, Composite parent) { + Label label = toolkit.createLabel(parent, "Active:"); + label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); + label.setToolTipText("Time working on this task"); + + Composite nameValueComp = createComposite(parent, 2, toolkit); + String elapsedTimeString = NO_TIME_ELAPSED; + try { + elapsedTimeString = DateUtil.getFormattedDuration(TasksUiPlugin.getTaskActivityManager().getElapsedTime( + task), false); + if (elapsedTimeString.equals("")) { + elapsedTimeString = NO_TIME_ELAPSED; + } + } catch (RuntimeException e) { + // FIXME what exception is caught here? + StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not format elapsed time", e)); + } + + elapsedTimeText = toolkit.createText(nameValueComp, elapsedTimeString); + elapsedTimeText.setText(elapsedTimeString); + + GridData td = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); + td.grabExcessHorizontalSpace = true; + elapsedTimeText.setLayoutData(td); + elapsedTimeText.setEditable(false); + + ImageHyperlink resetActivityTimeButton = toolkit.createImageHyperlink(nameValueComp, SWT.NONE); + resetActivityTimeButton.setImage(CommonImages.getImage(CommonImages.REMOVE)); + resetActivityTimeButton.setToolTipText(RESET); + resetActivityTimeButton.addHyperlinkListener(new HyperlinkAdapter() { + + @Override + public void linkActivated(HyperlinkEvent e) { + if (MessageDialog.openConfirm(getControl().getShell(), "Confirm Activity Time Deletion", + "Do you wish to reset your activity time on this task?\n\nThis will take immediate affect and can not be undone.")) { + MonitorUi.getActivityContextManager().removeActivityTime(task.getHandleIdentifier(), 0l, + System.currentTimeMillis()); + } + } + }); + } + + private Composite createComposite(Composite parent, int col, FormToolkit toolkit) { + Composite nameValueComp = toolkit.createComposite(parent); + GridLayout layout = new GridLayout(3, false); + layout.marginHeight = 3; + nameValueComp.setLayout(layout); + return nameValueComp; + } + @Override public void createControl(Composite parent, FormToolkit toolkit) { - Section section = createSection(parent, toolkit, true); + task = (AbstractTask) getTaskEditorPage().getTask(); + + Section section = createSection(parent, toolkit, false); + + boolean hasDueDate = !getTaskEditorPage().getConnector().hasRepositoryDueDate( + getTaskEditorPage().getTaskRepository(), task, getTaskData()); + Composite composite = getManagedForm().getToolkit().createComposite(section); + composite.setLayout(new GridLayout((hasDueDate) ? 4 : 2, false)); + + createScheduledDatePicker(toolkit, composite); - Composite sectionClient = getManagedForm().getToolkit().createComposite(section); - GridLayout layout = new GridLayout(); - layout.numColumns = 7; - layout.makeColumnsEqualWidth = false; - sectionClient.setLayout(layout); - GridData clientDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - sectionClient.setLayoutData(clientDataLayout); - - // Reminder -// getManagedForm().getToolkit().createLabel(sectionClient, "Scheduled for:"); -// // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); -// scheduledForDate = new ScheduleDatePicker(sectionClient, SWT.FLAT, DatePicker.LABEL_CHOOSE, true, -// TasksUiPlugin.getDefault().getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR)); -// scheduledForDate.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); -// scheduledForDate.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); -// Calendar newTaskSchedule = Calendar.getInstance(); -// int scheduledEndHour = TasksUiPlugin.getDefault().getPreferenceStore().getInt( -// TasksUiPreferenceConstants.PLANNING_ENDHOUR); -// // If past scheduledEndHour set for following day -// if (newTaskSchedule.get(Calendar.HOUR_OF_DAY) >= scheduledEndHour) { -// TaskActivityUtil.snapForwardNumDays(newTaskSchedule, 1); -// } else { -// TaskActivityUtil.snapEndOfWorkDay(newTaskSchedule); -// } -// scheduledForDate.setDate(newTaskSchedule); -//// Button removeReminder = getManagedForm().getToolkit().createButton(sectionClient, "Clear", -//// SWT.PUSH | SWT.CENTER); -//// removeReminder.addSelectionListener(new SelectionAdapter() { -//// @Override -//// public void widgetSelected(SelectionEvent e) { -//// scheduledForDate.setDate(null); -//// } -//// }); -// -// ImageHyperlink clearReminder = getManagedForm().getToolkit().createImageHyperlink(sectionClient, SWT.NONE); -// clearReminder.setImage(CommonImages.getImage(CommonImages.REMOVE)); -// clearReminder.setToolTipText("Clear"); -// clearReminder.addHyperlinkListener(new HyperlinkAdapter() { -// @Override -// public void linkActivated(HyperlinkEvent e) { -// scheduledForDate.setDate(null); -// } -// }); - - ///NEW -// ITask task = getTaskEditorPage().getTask(); -// scheduledForDate = new ScheduleDatePicker(sectionClient, task, SWT.FLAT); -// scheduledForDate.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); -// toolkit.adapt(scheduledForDate, true, true); -// toolkit.paintBordersFor(sectionClient); -// -// scheduledForDate.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); -// scheduledForDate.addPickerSelectionListener(new SelectionListener() { -// public void widgetSelected(SelectionEvent arg0) { -// getTaskEditorPage().getModel().attributeChanged(attribute); -// } -// -// public void widgetDefaultSelected(SelectionEvent arg0) { -// // ignore -// } -// }); -// -// ImageHyperlink clearScheduledDate = toolkit.createImageHyperlink(sectionClient, SWT.NONE); -// clearScheduledDate.setImage(CommonImages.getImage(CommonImages.REMOVE)); -// clearScheduledDate.setToolTipText(CLEAR); -// clearScheduledDate.addHyperlinkListener(new HyperlinkAdapter() { -// -// @Override -// public void linkActivated(HyperlinkEvent e) { -// scheduledForDate.setScheduledDate(null); -// ((AbstractTask) task).setReminded(false); -// TaskPlanningEditor.this.markDirty(true); -// } -// }); - - // 1 Blank column after Reminder clear button - Label dummy = getManagedForm().getToolkit().createLabel(sectionClient, ""); - GridData dummyLabelDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_CENTER); - dummyLabelDataLayout.horizontalSpan = 1; - dummyLabelDataLayout.widthHint = 30; - dummy.setLayoutData(dummyLabelDataLayout); + // disable due date picker if it's a repository due date + if (hasDueDate) { + createDueDatePicker(toolkit, composite); + } + + createEstimatedTime(toolkit, composite); + + createActualTime(toolkit, composite); + + TasksUiInternal.getTaskList().addChangeListener(TASK_LIST_LISTENER); + TasksUiPlugin.getTaskActivityManager().addActivityListener(timingListener); + + toolkit.paintBordersFor(composite); + section.setClient(composite); + setSection(toolkit, section); + } + + private void createDueDatePicker(FormToolkit toolkit, Composite parent) { + Label label = toolkit.createLabel(parent, "Due:"); + label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); + + Composite composite = createComposite(parent, 2, toolkit); + + dueDatePicker = new DatePicker(composite, SWT.FLAT, DatePicker.LABEL_CHOOSE, true, 0); + GridDataFactory.fillDefaults().hint(CONTROL_WIDTH, SWT.DEFAULT).applyTo(dueDatePicker); + dueDatePicker.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); + dueDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); + if (task.getDueDate() != null) { + Calendar calendar = TaskActivityUtil.getCalendar(); + calendar.setTime(task.getDueDate()); + dueDatePicker.setDate(calendar); + } + dueDatePicker.addPickerSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent arg0) { + markDirty(); + } + }); + toolkit.adapt(dueDatePicker, true, false); + toolkit.paintBordersFor(composite); + + ImageHyperlink clearDueDate = toolkit.createImageHyperlink(composite, SWT.NONE); + clearDueDate.setImage(CommonImages.getImage(CommonImages.REMOVE)); + clearDueDate.setToolTipText(CLEAR); + clearDueDate.addHyperlinkListener(new HyperlinkAdapter() { + @Override + public void linkActivated(HyperlinkEvent e) { + dueDatePicker.setDate(null); + markDirty(); + } + }); + } + + private void createEstimatedTime(FormToolkit toolkit, Composite parent) { + Label label = toolkit.createLabel(parent, "Estimated:"); + label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); + + Composite composite = createComposite(parent, 2, toolkit); // Estimated time - getManagedForm().getToolkit().createLabel(sectionClient, "Estimated hours:"); - // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); - // estimatedTime = new Spinner(sectionClient, SWT.FLAT); - estimatedTime = new Spinner(sectionClient, SWT.FLAT); + estimatedTime = new Spinner(composite, SWT.FLAT); estimatedTime.setDigits(0); estimatedTime.setMaximum(100); estimatedTime.setMinimum(0); estimatedTime.setIncrement(1); estimatedTime.setSelection(DEFAULT_ESTIMATED_TIME); estimatedTime.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); - GridData estimatedDataLayout = new GridData(); - estimatedDataLayout.widthHint = 30; - estimatedTime.setLayoutData(estimatedDataLayout); - // getManagedForm().getToolkit().createLabel(sectionClient, "hours "); - // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); - ImageHyperlink clearEstimated = getManagedForm().getToolkit().createImageHyperlink(sectionClient, SWT.NONE); + ImageHyperlink clearEstimated = toolkit.createImageHyperlink(composite, SWT.NONE); clearEstimated.setImage(CommonImages.getImage(CommonImages.REMOVE)); clearEstimated.setToolTipText("Clear"); clearEstimated.addHyperlinkListener(new HyperlinkAdapter() { @@ -174,9 +305,60 @@ estimatedTime.setSelection(0); } }); + toolkit.paintBordersFor(composite); + } - getManagedForm().getToolkit().paintBordersFor(sectionClient); - section.setClient(sectionClient); - setSection(toolkit, section); + private void createScheduledDatePicker(FormToolkit toolkit, Composite parent) { + Label label = toolkit.createLabel(parent, "Scheduled:"); + label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); + + Composite composite = createComposite(parent, 2, toolkit); + + scheduleDatePicker = new ScheduleDatePicker(composite, task, SWT.FLAT); + GridDataFactory.fillDefaults().hint(CONTROL_WIDTH, SWT.DEFAULT).applyTo(scheduleDatePicker); + scheduleDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); + toolkit.adapt(scheduleDatePicker, true, false); + toolkit.paintBordersFor(composite); + + scheduleDatePicker.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); + scheduleDatePicker.addPickerSelectionListener(new SelectionListener() { + public void widgetDefaultSelected(SelectionEvent arg0) { + // ignore + } + + public void widgetSelected(SelectionEvent arg0) { + markDirty(); + } + }); + + ImageHyperlink clearScheduledDate = toolkit.createImageHyperlink(composite, SWT.NONE); + clearScheduledDate.setImage(CommonImages.getImage(CommonImages.REMOVE)); + clearScheduledDate.setToolTipText(CLEAR); + clearScheduledDate.addHyperlinkListener(new HyperlinkAdapter() { + @Override + public void linkActivated(HyperlinkEvent e) { + scheduleDatePicker.setScheduledDate(null); + // XXX why is this set here? + task.setReminded(false); + markDirty(); + } + }); } + + @Override + public void dispose() { + TasksUiPlugin.getTaskActivityManager().removeActivityListener(timingListener); + TasksUiInternal.getTaskList().removeChangeListener(TASK_LIST_LISTENER); + } + + private void updateFromTask(AbstractTask updateTask) { + if (scheduleDatePicker != null && !scheduleDatePicker.isDisposed()) { + if (updateTask.getScheduledForDate() != null) { + scheduleDatePicker.setScheduledDate(updateTask.getScheduledForDate()); + } else { + scheduleDatePicker.setScheduledDate(null); + } + } + } + } Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java,v retrieving revision 1.143 diff -u -r1.143 TaskPlanningEditor.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java 1 Jun 2008 10:37:16 -0000 1.143 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java 12 Jun 2008 07:26:33 -0000 @@ -615,6 +615,9 @@ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); scheduleDatePicker = new ScheduleDatePicker(nameValueComp, task, SWT.FLAT); + GridData gd = new GridData(); + gd.widthHint = 135; + scheduleDatePicker.setLayoutData(gd); scheduleDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); toolkit.adapt(scheduleDatePicker, true, false); toolkit.paintBordersFor(nameValueComp); Index: src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java,v retrieving revision 1.12 diff -u -r1.12 ScheduleDatePicker.java --- src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java 29 May 2008 23:25:06 -0000 1.12 +++ src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java 12 Jun 2008 07:26:33 -0000 @@ -101,7 +101,8 @@ scheduledDateText = new Text(this, style); scheduledDateText.setEditable(false); GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false); - dateTextGridData.widthHint = 135; + dateTextGridData.grabExcessHorizontalSpace = true; + dateTextGridData.widthHint = SWT.FILL; dateTextGridData.verticalIndent = 0; scheduledDateText.setLayoutData(dateTextGridData); Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRepositoryPlanningPart.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRepositoryPlanningPart.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRepositoryPlanningPart.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRepositoryPlanningPart.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,118 @@ +/******************************************************************************* + * 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.internal.tasks.ui.editors; + +import java.util.ArrayList; +import java.util.Map; + +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData; +import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; +import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.Section; + +/** + * @author Steffen Pingel + */ +public class TaskEditorRepositoryPlanningPart extends AbstractTaskEditorPart { + + private ArrayList attributeEditors; + + private Composite attributesComposite; + + private boolean hasIncoming; + + public TaskEditorRepositoryPlanningPart() { + setPartName("Team Planning"); + } + + @Override + public void createControl(Composite parent, final FormToolkit toolkit) { + initialize(); + if (attributeEditors.isEmpty()) { + return; + } + + final Section section = createSection(parent, toolkit, hasIncoming); + + attributesComposite = toolkit.createComposite(section); + attributesComposite.addListener(SWT.MouseDown, new Listener() { + public void handleEvent(Event event) { + Control focus = event.display.getFocusControl(); + if (focus instanceof Text && ((Text) focus).getEditable() == false) { + getManagedForm().getForm().setFocus(); + } + } + }); + + GridLayout attributesLayout = new GridLayout(); + attributesLayout.numColumns = 2; + attributesLayout.horizontalSpacing = 5; + attributesLayout.verticalSpacing = 6; + attributesComposite.setLayout(attributesLayout); + + GridData attributesData = new GridData(GridData.FILL_BOTH); + attributesData.horizontalSpan = 1; + attributesData.grabExcessVerticalSpace = false; + attributesComposite.setLayoutData(attributesData); + + createAttributeControls(attributesComposite, toolkit, attributesLayout.numColumns); + toolkit.paintBordersFor(attributesComposite); + + section.setClient(attributesComposite); + setSection(toolkit, section); + } + + private void createAttributeControls(Composite composite, FormToolkit toolkit, int numColumns) { + for (AbstractAttributeEditor editor : attributeEditors) { + editor.createLabelControl(composite, toolkit); + editor.createControl(composite, toolkit); + getTaskEditorPage().getAttributeEditorToolkit().adapt(editor); + } + + } + + private void initialize() { + attributeEditors = new ArrayList(); + + Map attributes = getTaskData().getRoot().getAttributes(); + for (TaskAttribute attribute : attributes.values()) { + TaskAttributeMetaData properties = attribute.getMetaData(); + if (!TaskAttribute.KIND_PLANNING.equals(properties.getKind())) { + continue; + } + + AbstractAttributeEditor attributeEditor = createAttributeEditor(attribute); + if (attributeEditor != null) { + attributeEditors.add(attributeEditor); + if (getModel().hasIncomingChanges(attribute)) { + hasIncoming = true; + } + } + } +// +// Collections.sort(attributeEditors, new Comparator() { +// public int compare(AbstractAttributeEditor o1, AbstractAttributeEditor o2) { +// int p1 = (o1.getLayoutHint() != null) ? o1.getLayoutHint().getPriority() : LayoutHint.DEFAULT_PRIORITY; +// int p2 = (o2.getLayoutHint() != null) ? o2.getLayoutHint().getPriority() : LayoutHint.DEFAULT_PRIORITY; +// return p1 - p2; +// } +// }); + } + +}