Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 279334 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/CheckboxMultiSelectAttributeEditor.java (+126 lines)
Added Link Here
1
package org.eclipse.mylyn.internal.tasks.ui.editors;
2
3
import java.util.Collections;
4
import java.util.List;
5
import java.util.Map;
6
7
import org.eclipse.jface.window.Window;
8
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
9
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
10
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
11
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
12
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
13
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.events.SelectionEvent;
16
import org.eclipse.swt.events.SelectionListener;
17
import org.eclipse.swt.graphics.Color;
18
import org.eclipse.swt.layout.GridData;
19
import org.eclipse.swt.layout.GridLayout;
20
import org.eclipse.swt.widgets.Button;
21
import org.eclipse.swt.widgets.Composite;
22
import org.eclipse.swt.widgets.Shell;
23
import org.eclipse.swt.widgets.Text;
24
import org.eclipse.ui.PlatformUI;
25
import org.eclipse.ui.forms.widgets.FormToolkit;
26
27
/**
28
 * @author Shawn Minto
29
 */
30
public class CheckboxMultiSelectAttributeEditor extends AbstractAttributeEditor {
31
32
	private Text valueText;
33
34
	public CheckboxMultiSelectAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
35
		super(manager, taskAttribute);
36
		setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.MULTIPLE));
37
	}
38
39
	@Override
40
	public void createControl(Composite parent, FormToolkit toolkit) {
41
		Composite keywordComposite = toolkit.createComposite(parent);
42
		GridLayout layout = new GridLayout(2, false);
43
		layout.marginWidth = 1;
44
		keywordComposite.setLayout(layout);
45
46
		valueText = toolkit.createText(keywordComposite, "");
47
		GridData keywordsData = new GridData(GridData.FILL_HORIZONTAL);
48
		valueText.setLayoutData(keywordsData);
49
		valueText.setEditable(false);
50
51
		Button changeKeywordsButton = toolkit.createButton(keywordComposite, "Edit", SWT.FLAT);
52
		GridData keyWordsButtonData = new GridData();
53
		changeKeywordsButton.setLayoutData(keyWordsButtonData);
54
		changeKeywordsButton.addSelectionListener(new SelectionListener() {
55
56
			public void widgetDefaultSelected(SelectionEvent e) {
57
			}
58
59
			public void widgetSelected(SelectionEvent e) {
60
61
				List<String> values = getValues();
62
63
				Map<String, String> validValues = getAttributeMapper().getOptions(getTaskAttribute());
64
65
				Shell shell = null;
66
				if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
67
					shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
68
				} else {
69
					shell = new Shell(PlatformUI.getWorkbench().getDisplay());
70
				}
71
72
				CheckBoxTreeDialogDialog keywordsDialog = new CheckBoxTreeDialogDialog(shell, values, validValues);
73
				int responseCode = keywordsDialog.open();
74
75
				List<String> newValues = keywordsDialog.getSelectedValues();
76
				if (responseCode == Window.OK && values != null) {
77
					setValues(newValues);
78
					attributeChanged();
79
					updateText();
80
				} else {
81
					return;
82
				}
83
84
			}
85
86
		});
87
		updateText();
88
		setControl(keywordComposite);
89
	}
90
91
	private void updateText() {
92
		if (valueText != null && !valueText.isDisposed()) {
93
			StringBuilder valueString = new StringBuilder();
94
			List<String> values = getValuesLabels();
95
			Collections.sort(values);
96
			for (int i = 0; i < values.size(); i++) {
97
				valueString.append(values.get(i));
98
				if (i != values.size() - 1) {
99
					valueString.append(", "); //$NON-NLS-1$
100
				}
101
			}
102
			valueText.setText(valueString.toString());
103
		}
104
	}
105
106
	public List<String> getValues() {
107
		return getAttributeMapper().getValues(getTaskAttribute());
108
	}
109
110
	public List<String> getValuesLabels() {
111
		return getAttributeMapper().getValueLabels(getTaskAttribute());
112
	}
113
114
	public void setValues(List<String> newValues) {
115
		getAttributeMapper().setValues(getTaskAttribute(), newValues);
116
		attributeChanged();
117
	}
118
119
	@Override
120
	protected void decorateIncoming(Color color) {
121
		if (valueText != null && !valueText.isDisposed()) {
122
			valueText.setBackground(color);
123
		}
124
	}
125
126
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/CheckBoxTreeDialogDialog.java (+158 lines)
Added Link Here
1
package org.eclipse.mylyn.internal.tasks.ui.editors;
2
3
import java.util.HashSet;
4
import java.util.List;
5
import java.util.Map;
6
import java.util.Set;
7
8
import org.eclipse.jface.dialogs.Dialog;
9
import org.eclipse.jface.viewers.CheckStateChangedEvent;
10
import org.eclipse.jface.viewers.CheckboxTreeViewer;
11
import org.eclipse.jface.viewers.ICheckStateListener;
12
import org.eclipse.jface.viewers.ITreeContentProvider;
13
import org.eclipse.jface.viewers.LabelProvider;
14
import org.eclipse.jface.viewers.TreeViewer;
15
import org.eclipse.jface.viewers.Viewer;
16
import org.eclipse.jface.viewers.ViewerSorter;
17
import org.eclipse.mylyn.internal.provisional.commons.ui.EnhancedFilteredTree;
18
import org.eclipse.mylyn.internal.provisional.commons.ui.SubstringPatternFilter;
19
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.layout.GridData;
21
import org.eclipse.swt.layout.GridLayout;
22
import org.eclipse.swt.widgets.Composite;
23
import org.eclipse.swt.widgets.Control;
24
import org.eclipse.swt.widgets.Shell;
25
import org.eclipse.ui.dialogs.PatternFilter;
26
27
/**
28
 * @author Shawn Minto
29
 */
30
public class CheckBoxTreeDialogDialog extends Dialog {
31
32
	private final Map<String, String> validValues;
33
34
	private CheckboxFilteredTree valueTree;
35
36
	private final List<String> selectedValues;
37
38
	private class CheckboxFilteredTree extends EnhancedFilteredTree {
39
40
		public CheckboxFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
41
			super(parent, treeStyle, filter);
42
		}
43
44
		@Override
45
		protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
46
			return new CheckboxTreeViewer(parent, style);
47
		}
48
49
		@Override
50
		public CheckboxTreeViewer getViewer() {
51
			return (CheckboxTreeViewer) super.getViewer();
52
		}
53
54
	}
55
56
	public CheckBoxTreeDialogDialog(Shell shell, List<String> values, Map<String, String> validValues) {
57
		super(shell);
58
		setShellStyle(getShellStyle() | SWT.RESIZE);
59
		this.selectedValues = values;
60
		this.validValues = validValues;
61
	}
62
63
	@Override
64
	protected Control createDialogArea(Composite parent) {
65
		getShell().setText("Select Keywords");
66
67
		Composite composite = new Composite(parent, SWT.NONE);
68
		composite.setLayout(new GridLayout());
69
		GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
70
		composite.setLayoutData(gd);
71
72
		valueTree = new CheckboxFilteredTree(composite, SWT.CHECK | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL
73
				| SWT.BORDER, new SubstringPatternFilter());
74
		GridData keyWordsTextData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
75
		keyWordsTextData.heightHint = 175;
76
		keyWordsTextData.widthHint = 160;
77
		CheckboxTreeViewer viewer = valueTree.getViewer();
78
		viewer.getControl().setLayoutData(keyWordsTextData);
79
80
		if (validValues != null) {
81
82
			viewer.setContentProvider(new ITreeContentProvider() {
83
84
				public Object[] getChildren(Object parentElement) {
85
					if (parentElement instanceof Map<?, ?>) {
86
						return ((Map<?, ?>) parentElement).keySet().toArray();
87
					}
88
					return null;
89
				}
90
91
				public Object getParent(Object element) {
92
					return null;
93
				}
94
95
				public boolean hasChildren(Object element) {
96
					return false;
97
				}
98
99
				public Object[] getElements(Object inputElement) {
100
					return getChildren(inputElement);
101
				}
102
103
				public void dispose() {
104
				}
105
106
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
107
				}
108
109
			});
110
111
			viewer.setSorter(new ViewerSorter());
112
			viewer.setLabelProvider(new LabelProvider() {
113
				@Override
114
				public String getText(Object element) {
115
					if (element instanceof String) {
116
						return validValues.get(element);
117
					}
118
					return super.getText(element);
119
				}
120
			});
121
			viewer.setInput(validValues);
122
123
			Set<String> invalidKeywords = new HashSet<String>();
124
			for (String keyword : validValues.keySet()) {
125
				if (!viewer.setChecked(keyword, true)) {
126
					invalidKeywords.add(keyword);
127
				}
128
			}
129
130
			selectedValues.removeAll(invalidKeywords);
131
132
			viewer.setCheckedElements(selectedValues.toArray());
133
134
		}
135
136
		viewer.addCheckStateListener(new ICheckStateListener() {
137
138
			public void checkStateChanged(CheckStateChangedEvent event) {
139
				if (event.getChecked()) {
140
					selectedValues.add((String) event.getElement());
141
				} else {
142
					selectedValues.remove(event.getElement());
143
				}
144
			}
145
146
		});
147
148
		parent.pack();
149
150
		applyDialogFont(composite);
151
152
		return composite;
153
	}
154
155
	public List<String> getSelectedValues() {
156
		return selectedValues;
157
	}
158
}

Return to bug 279334