View | Details | Raw Unified | Return to bug 234044 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java (-10 / +67 lines)
Lines 8-13 Link Here
8
8
9
package org.eclipse.mylyn.tasks.ui.editors;
9
package org.eclipse.mylyn.tasks.ui.editors;
10
10
11
import java.util.ArrayList;
11
import java.util.Collection;
12
import java.util.Collection;
12
import java.util.Collections;
13
import java.util.Collections;
13
import java.util.Iterator;
14
import java.util.Iterator;
Lines 30-35 Link Here
30
import org.eclipse.jface.action.IToolBarManager;
31
import org.eclipse.jface.action.IToolBarManager;
31
import org.eclipse.jface.dialogs.IMessageProvider;
32
import org.eclipse.jface.dialogs.IMessageProvider;
32
import org.eclipse.jface.layout.GridDataFactory;
33
import org.eclipse.jface.layout.GridDataFactory;
34
import org.eclipse.jface.layout.GridLayoutFactory;
33
import org.eclipse.jface.resource.JFaceResources;
35
import org.eclipse.jface.resource.JFaceResources;
34
import org.eclipse.jface.text.TextSelection;
36
import org.eclipse.jface.text.TextSelection;
35
import org.eclipse.jface.util.SafeRunnable;
37
import org.eclipse.jface.util.SafeRunnable;
Lines 63-68 Link Here
63
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlinePage;
65
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlinePage;
64
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPeoplePart;
66
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPeoplePart;
65
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPlanningPart;
67
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPlanningPart;
68
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorRepositoryPlanningPart;
66
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorRichTextPart;
69
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorRichTextPart;
67
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart;
70
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart;
68
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
71
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
Lines 120-131 Link Here
120
import org.eclipse.ui.forms.IFormPart;
123
import org.eclipse.ui.forms.IFormPart;
121
import org.eclipse.ui.forms.IManagedForm;
124
import org.eclipse.ui.forms.IManagedForm;
122
import org.eclipse.ui.forms.editor.FormPage;
125
import org.eclipse.ui.forms.editor.FormPage;
126
import org.eclipse.ui.forms.events.ExpansionAdapter;
127
import org.eclipse.ui.forms.events.ExpansionEvent;
123
import org.eclipse.ui.forms.events.HyperlinkAdapter;
128
import org.eclipse.ui.forms.events.HyperlinkAdapter;
124
import org.eclipse.ui.forms.events.HyperlinkEvent;
129
import org.eclipse.ui.forms.events.HyperlinkEvent;
125
import org.eclipse.ui.forms.widgets.ExpandableComposite;
130
import org.eclipse.ui.forms.widgets.ExpandableComposite;
126
import org.eclipse.ui.forms.widgets.FormToolkit;
131
import org.eclipse.ui.forms.widgets.FormToolkit;
127
import org.eclipse.ui.forms.widgets.Hyperlink;
132
import org.eclipse.ui.forms.widgets.Hyperlink;
128
import org.eclipse.ui.forms.widgets.ScrolledForm;
133
import org.eclipse.ui.forms.widgets.ScrolledForm;
134
import org.eclipse.ui.forms.widgets.Section;
129
import org.eclipse.ui.handlers.IHandlerService;
135
import org.eclipse.ui.handlers.IHandlerService;
130
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
136
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
131
137
Lines 292-297 Link Here
292
298
293
	public static final String ID_PART_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.part.planning";
299
	public static final String ID_PART_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.part.planning";
294
300
301
	public static final String ID_PART_REPOSITORY_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.part.repositoryPlanning";
302
295
	public static final String ID_PART_SUMMARY = "org.eclipse.mylyn.tasks.ui.editors.part.summary";
303
	public static final String ID_PART_SUMMARY = "org.eclipse.mylyn.tasks.ui.editors.part.summary";
296
304
297
	public static final String PATH_ACTIONS = "actions";
305
	public static final String PATH_ACTIONS = "actions";
Lines 308-313 Link Here
308
316
309
	public static final String PATH_PLANNING = "planning";
317
	public static final String PATH_PLANNING = "planning";
310
318
319
	public static final String PATH_REPOSITORY_PLANNING = "repositoryPlanning";
320
311
//	private static final String ID_POPUP_MENU = "org.eclipse.mylyn.tasks.ui.editor.menu.page";
321
//	private static final String ID_POPUP_MENU = "org.eclipse.mylyn.tasks.ui.editor.menu.page";
312
322
313
	private AttributeEditorFactory attributeEditorFactory;
323
	private AttributeEditorFactory attributeEditorFactory;
Lines 518-523 Link Here
518
				return new TaskEditorSummaryPart();
528
				return new TaskEditorSummaryPart();
519
			}
529
			}
520
		}.setPath(PATH_HEADER));
530
		}.setPath(PATH_HEADER));
531
		descriptors.add(new TaskEditorPartDescriptor(ID_PART_PLANNING) {
532
			@Override
533
			public AbstractTaskEditorPart createPart() {
534
				return new TaskEditorPlanningPart();
535
			}
536
		}.setPath(PATH_PLANNING));
537
		descriptors.add(new TaskEditorPartDescriptor(ID_PART_REPOSITORY_PLANNING) {
538
			@Override
539
			public AbstractTaskEditorPart createPart() {
540
				return new TaskEditorRepositoryPlanningPart();
541
			}
542
		}.setPath(PATH_PLANNING));
543
521
		descriptors.add(new TaskEditorPartDescriptor(ID_PART_ATTRIBUTES) {
544
		descriptors.add(new TaskEditorPartDescriptor(ID_PART_ATTRIBUTES) {
522
			@Override
545
			@Override
523
			public AbstractTaskEditorPart createPart() {
546
			public AbstractTaskEditorPart createPart() {
Lines 557-570 Link Here
557
				return new TaskEditorNewCommentPart();
580
				return new TaskEditorNewCommentPart();
558
			}
581
			}
559
		}.setPath(PATH_COMMENTS));
582
		}.setPath(PATH_COMMENTS));
560
		if (taskData.isNew()) {
561
			descriptors.add(new TaskEditorPartDescriptor(ID_PART_PLANNING) {
562
				@Override
563
				public AbstractTaskEditorPart createPart() {
564
					return new TaskEditorPlanningPart();
565
				}
566
			}.setPath(PATH_PLANNING));
567
		}
568
		descriptors.add(new TaskEditorPartDescriptor(ID_PART_ACTIONS) {
583
		descriptors.add(new TaskEditorPartDescriptor(ID_PART_ACTIONS) {
569
			@Override
584
			@Override
570
			public AbstractTaskEditorPart createPart() {
585
			public AbstractTaskEditorPart createPart() {
Lines 584-602 Link Here
584
		List<TaskEditorPartDescriptor> descriptors = new LinkedList<TaskEditorPartDescriptor>(createPartDescriptors());
599
		List<TaskEditorPartDescriptor> descriptors = new LinkedList<TaskEditorPartDescriptor>(createPartDescriptors());
585
		// single column
600
		// single column
586
		createParts(PATH_HEADER, editorComposite, descriptors);
601
		createParts(PATH_HEADER, editorComposite, descriptors);
602
		// two column
603
		Composite planningComposite = toolkit.createComposite(editorComposite);
604
		planningComposite.setLayout(GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(2).create());
605
		GridDataFactory.fillDefaults().grab(true, false).applyTo(planningComposite);
606
		createParts(PATH_PLANNING, planningComposite, descriptors);
607
		createParts(PATH_REPOSITORY_PLANNING, planningComposite, descriptors);
608
		coupleSections(planningComposite);
609
		// single column
587
		createParts(PATH_ATTRIBUTES, editorComposite, descriptors);
610
		createParts(PATH_ATTRIBUTES, editorComposite, descriptors);
588
		createParts(PATH_ATTACHMENTS, editorComposite, descriptors);
611
		createParts(PATH_ATTACHMENTS, editorComposite, descriptors);
589
		createParts(PATH_COMMENTS, editorComposite, descriptors);
612
		createParts(PATH_COMMENTS, editorComposite, descriptors);
590
		createParts(PATH_PLANNING, editorComposite, descriptors);
591
		// two column
613
		// two column
592
		Composite bottomComposite = toolkit.createComposite(editorComposite);
614
		Composite bottomComposite = toolkit.createComposite(editorComposite);
593
		bottomComposite.setLayout(new GridLayout(2, false));
615
		bottomComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
594
		GridDataFactory.fillDefaults().grab(true, false).applyTo(bottomComposite);
616
		GridDataFactory.fillDefaults().grab(true, false).applyTo(bottomComposite);
595
		createParts(PATH_ACTIONS, bottomComposite, descriptors);
617
		createParts(PATH_ACTIONS, bottomComposite, descriptors);
596
		createParts(PATH_PEOPLE, bottomComposite, descriptors);
618
		createParts(PATH_PEOPLE, bottomComposite, descriptors);
597
		bottomComposite.pack(true);
619
		bottomComposite.pack(true);
598
	}
620
	}
599
621
622
	private void coupleSections(Composite composite) {
623
		final List<Section> sections = new ArrayList<Section>();
624
		final boolean[] processingEvents = new boolean[1];
625
		Control[] controls = composite.getChildren();
626
		boolean expand = false;
627
		for (Control control : controls) {
628
			if (control instanceof Section) {
629
				final Section section = (Section) control;
630
				sections.add(section);
631
				expand |= section.isExpanded();
632
				section.addExpansionListener(new ExpansionAdapter() {
633
					@Override
634
					public void expansionStateChanging(ExpansionEvent e) {
635
						if (!processingEvents[0]) {
636
							processingEvents[0] = true;
637
							for (Section otherSection : sections) {
638
								if (otherSection != section && otherSection.isExpanded() != e.getState()) {
639
									EditorUtil.toggleExpandableComposite(e.getState(), otherSection);
640
								}
641
							}
642
							processingEvents[0] = false;
643
						}
644
					}
645
				});
646
			}
647
		}
648
		if (expand) {
649
			for (Section section : sections) {
650
				if (!section.isExpanded()) {
651
					EditorUtil.toggleExpandableComposite(true, section);
652
				}
653
			}
654
		}
655
	}
656
600
	private void createParts(String path, final Composite parent, Collection<TaskEditorPartDescriptor> descriptors) {
657
	private void createParts(String path, final Composite parent, Collection<TaskEditorPartDescriptor> descriptors) {
601
		for (Iterator<TaskEditorPartDescriptor> it = descriptors.iterator(); it.hasNext();) {
658
		for (Iterator<TaskEditorPartDescriptor> it = descriptors.iterator(); it.hasNext();) {
602
			final TaskEditorPartDescriptor descriptor = it.next();
659
			final TaskEditorPartDescriptor descriptor = it.next();
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java (+3 lines)
Lines 615-620 Link Here
615
		label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
615
		label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
616
616
617
		scheduleDatePicker = new ScheduleDatePicker(nameValueComp, task, SWT.FLAT);
617
		scheduleDatePicker = new ScheduleDatePicker(nameValueComp, task, SWT.FLAT);
618
		GridData gd = new GridData();
619
		gd.widthHint = 135;
620
		scheduleDatePicker.setLayoutData(gd);
618
		scheduleDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
621
		scheduleDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
619
		toolkit.adapt(scheduleDatePicker, true, false);
622
		toolkit.adapt(scheduleDatePicker, true, false);
620
		toolkit.paintBordersFor(nameValueComp);
623
		toolkit.paintBordersFor(nameValueComp);
(-)src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java (-1 / +2 lines)
Lines 101-107 Link Here
101
		scheduledDateText = new Text(this, style);
101
		scheduledDateText = new Text(this, style);
102
		scheduledDateText.setEditable(false);
102
		scheduledDateText.setEditable(false);
103
		GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false);
103
		GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false);
104
		dateTextGridData.widthHint = 135;
104
		dateTextGridData.grabExcessHorizontalSpace = true;
105
		dateTextGridData.widthHint = SWT.FILL;
105
		dateTextGridData.verticalIndent = 0;
106
		dateTextGridData.verticalIndent = 0;
106
107
107
		scheduledDateText.setLayoutData(dateTextGridData);
108
		scheduledDateText.setLayoutData(dateTextGridData);
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRepositoryPlanningPart.java (+118 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.tasks.ui.editors;
10
11
import java.util.ArrayList;
12
import java.util.Map;
13
14
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
15
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
16
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
17
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
18
import org.eclipse.swt.SWT;
19
import org.eclipse.swt.layout.GridData;
20
import org.eclipse.swt.layout.GridLayout;
21
import org.eclipse.swt.widgets.Composite;
22
import org.eclipse.swt.widgets.Control;
23
import org.eclipse.swt.widgets.Event;
24
import org.eclipse.swt.widgets.Listener;
25
import org.eclipse.swt.widgets.Text;
26
import org.eclipse.ui.forms.widgets.FormToolkit;
27
import org.eclipse.ui.forms.widgets.Section;
28
29
/**
30
 * @author Steffen Pingel
31
 */
32
public class TaskEditorRepositoryPlanningPart extends AbstractTaskEditorPart {
33
34
	private ArrayList<AbstractAttributeEditor> attributeEditors;
35
36
	private Composite attributesComposite;
37
38
	private boolean hasIncoming;
39
40
	public TaskEditorRepositoryPlanningPart() {
41
		setPartName("Team Planning");
42
	}
43
44
	@Override
45
	public void createControl(Composite parent, final FormToolkit toolkit) {
46
		initialize();
47
		if (attributeEditors.isEmpty()) {
48
			return;
49
		}
50
51
		final Section section = createSection(parent, toolkit, hasIncoming);
52
53
		attributesComposite = toolkit.createComposite(section);
54
		attributesComposite.addListener(SWT.MouseDown, new Listener() {
55
			public void handleEvent(Event event) {
56
				Control focus = event.display.getFocusControl();
57
				if (focus instanceof Text && ((Text) focus).getEditable() == false) {
58
					getManagedForm().getForm().setFocus();
59
				}
60
			}
61
		});
62
63
		GridLayout attributesLayout = new GridLayout();
64
		attributesLayout.numColumns = 2;
65
		attributesLayout.horizontalSpacing = 5;
66
		attributesLayout.verticalSpacing = 6;
67
		attributesComposite.setLayout(attributesLayout);
68
69
		GridData attributesData = new GridData(GridData.FILL_BOTH);
70
		attributesData.horizontalSpan = 1;
71
		attributesData.grabExcessVerticalSpace = false;
72
		attributesComposite.setLayoutData(attributesData);
73
74
		createAttributeControls(attributesComposite, toolkit, attributesLayout.numColumns);
75
		toolkit.paintBordersFor(attributesComposite);
76
77
		section.setClient(attributesComposite);
78
		setSection(toolkit, section);
79
	}
80
81
	private void createAttributeControls(Composite composite, FormToolkit toolkit, int numColumns) {
82
		for (AbstractAttributeEditor editor : attributeEditors) {
83
			editor.createLabelControl(composite, toolkit);
84
			editor.createControl(composite, toolkit);
85
			getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
86
		}
87
88
	}
89
90
	private void initialize() {
91
		attributeEditors = new ArrayList<AbstractAttributeEditor>();
92
93
		Map<String, TaskAttribute> attributes = getTaskData().getRoot().getAttributes();
94
		for (TaskAttribute attribute : attributes.values()) {
95
			TaskAttributeMetaData properties = attribute.getMetaData();
96
			if (!TaskAttribute.KIND_PLANNING.equals(properties.getKind())) {
97
				continue;
98
			}
99
100
			AbstractAttributeEditor attributeEditor = createAttributeEditor(attribute);
101
			if (attributeEditor != null) {
102
				attributeEditors.add(attributeEditor);
103
				if (getModel().hasIncomingChanges(attribute)) {
104
					hasIncoming = true;
105
				}
106
			}
107
		}
108
//
109
//		Collections.sort(attributeEditors, new Comparator<AbstractAttributeEditor>() {
110
//			public int compare(AbstractAttributeEditor o1, AbstractAttributeEditor o2) {
111
//				int p1 = (o1.getLayoutHint() != null) ? o1.getLayoutHint().getPriority() : LayoutHint.DEFAULT_PRIORITY;
112
//				int p2 = (o2.getLayoutHint() != null) ? o2.getLayoutHint().getPriority() : LayoutHint.DEFAULT_PRIORITY;
113
//				return p1 - p2;
114
//			}
115
//		});
116
	}
117
118
}
(-)src/org/eclipse/mylyn/internal/jira/core/JiraAttribute.java (-1 / +6 lines)
Lines 153-159 Link Here
153
	}
153
	}
154
154
155
	public String getKind() {
155
	public String getKind() {
156
		return (isHidden) ? null : TaskAttribute.KIND_DEFAULT;
156
		switch (this) {
157
		case DUE_DATE:
158
			return TaskAttribute.KIND_PLANNING;
159
		default:
160
			return (isHidden) ? null : TaskAttribute.KIND_DEFAULT;
161
		}
157
	}
162
	}
158
163
159
}
164
}
(-)src/org/eclipse/mylyn/internal/jira/core/JiraTaskDataHandler.java (+6 lines)
Lines 510-515 Link Here
510
					|| !JiraAttribute.valueById(attribute.getId()).isHidden())) {
510
					|| !JiraAttribute.valueById(attribute.getId()).isHidden())) {
511
				properties.setKind(TaskAttribute.KIND_DEFAULT);
511
				properties.setKind(TaskAttribute.KIND_DEFAULT);
512
			}
512
			}
513
			if (JiraAttribute.DUE_DATE.id().equals(attribute.getId())
514
					|| JiraAttribute.ACTUAL.id().equals(attribute.getId())
515
					|| JiraAttribute.ESTIMATE.id().equals(attribute.getId())
516
					|| JiraAttribute.INITIAL_ESTIMATE.id().equals(attribute.getId())) {
517
				properties.setKind(TaskAttribute.KIND_PLANNING);
518
			}
513
519
514
			if (TaskAttribute.COMMENT_NEW.equals(attribute.getId())
520
			if (TaskAttribute.COMMENT_NEW.equals(attribute.getId())
515
					|| TaskAttribute.RESOLUTION.equals(attribute.getId())) {
521
					|| TaskAttribute.RESOLUTION.equals(attribute.getId())) {
(-)src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java (+2 lines)
Lines 101-106 Link Here
101
101
102
	public static final String KIND_PEOPLE = "task.common.kind.default";
102
	public static final String KIND_PEOPLE = "task.common.kind.default";
103
103
104
	public static final String KIND_PLANNING = "task.common.kind.planning";
105
104
	//public static final String META_SHOW_IN_ATTRIBUTES_SECTION = "task.meta.showInTaskEditorAttributesSection";
106
	//public static final String META_SHOW_IN_ATTRIBUTES_SECTION = "task.meta.showInTaskEditorAttributesSection";
105
107
106
	public static final String META_ASSOCIATED_ATTRIBUTE_ID = "task.meta.associated.attribute";
108
	public static final String META_ASSOCIATED_ATTRIBUTE_ID = "task.meta.associated.attribute";

Return to bug 234044