diff options
author | mkersten | 2007-06-15 06:21:54 +0000 |
---|---|---|
committer | mkersten | 2007-06-15 06:21:54 +0000 |
commit | f77185b381c361fa15f733d64270d2ec4f1a3e35 (patch) | |
tree | 283596da50220c0ccc8ff902d56e32b1f3666b2e | |
parent | facde93a15c2b4dc18cc8c5cff6376dd39e676eb (diff) | |
download | org.eclipse.mylyn.tasks-f77185b381c361fa15f733d64270d2ec4f1a3e35.tar.gz org.eclipse.mylyn.tasks-f77185b381c361fa15f733d64270d2ec4f1a3e35.tar.xz org.eclipse.mylyn.tasks-f77185b381c361fa15f733d64270d2ec4f1a3e35.zip |
NEW - bug 186493: provide Task List view UI for task working set switching
https://bugs.eclipse.org/bugs/show_bug.cgi?id=186493
3 files changed, 454 insertions, 1 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskWorkingSetAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskWorkingSetAction.java new file mode 100644 index 000000000..efd17b43c --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskWorkingSetAction.java @@ -0,0 +1,447 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2006 Mylar 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.actions; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.bindings.keys.IKeyLookup; +import org.eclipse.jface.bindings.keys.KeyLookupFactory; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.window.Window; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages; +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.Menu; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkingSet; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.internal.WorkbenchMessages; +import org.eclipse.ui.internal.WorkingSetComparator; +import org.eclipse.ui.internal.dialogs.AbstractWorkingSetDialog; +import org.eclipse.ui.internal.dialogs.WorkingSetFilter; +import org.eclipse.ui.internal.dialogs.WorkingSetLabelProvider; + +/** + * Derived from SelectWorkingSetsAction + * + * @author Leo Dos Santos + */ +public class TaskWorkingSetAction extends Action implements IMenuCreator { + + public static String ID_TASK_WORKING_SET = "org.eclipse.mylyn.tasks.ui.workingSet"; + + public static String TASK_WORKING_SET_TEXT_LABEL = "Select Task Working Sets"; + + private Menu dropDownMenu = null; + + public TaskWorkingSetAction() { + super(); + setText("Sets"); + setToolTipText(TASK_WORKING_SET_TEXT_LABEL); + setImageDescriptor(TasksUiImages.TASK_WORKING_SET); + setEnabled(true); + setMenuCreator(this); + } + + public void dispose() { + if (dropDownMenu != null) { + dropDownMenu.dispose(); + dropDownMenu = null; + } + } + + public Menu getMenu(Control parent) { + if (dropDownMenu != null) { + dropDownMenu.dispose(); + } + dropDownMenu = new Menu(parent); + addActionsToMenu(); + return dropDownMenu; + } + + public Menu getMenu(Menu parent) { + if (dropDownMenu != null) { + dropDownMenu.dispose(); + } + dropDownMenu = new Menu(parent); + addActionsToMenu(); + return dropDownMenu; + } + + @SuppressWarnings("unchecked") + private void addActionsToMenu() { + IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets(); + + if (doTaskWorkingSetsExist()) { + ActionContributionItem item = new ActionContributionItem(new ToggleAllWorkingSetsAction()); + item.fill(dropDownMenu, -1); + + Separator separator = new Separator(); + separator.fill(dropDownMenu, -1); + + List<IWorkingSet> sortedWorkingSets = Arrays.asList(workingSets); + Collections.sort(sortedWorkingSets, new WorkingSetComparator()); + + Iterator<IWorkingSet> iter = sortedWorkingSets.iterator(); + while (iter.hasNext()) { + IWorkingSet workingSet = (IWorkingSet) iter.next(); + if (workingSet != null + && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + item = new ActionContributionItem(new ToggleWorkingSetAction(workingSet)); + item.fill(dropDownMenu, -1); + } + } + + separator = new Separator(); + separator.fill(dropDownMenu, -1); + } + + ActionContributionItem editItem = new ActionContributionItem(new ManageWorkingSetsAction()); + editItem.fill(dropDownMenu, -1); + } + + private IWorkbenchWindow getWindow() { + return PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + } + + private IWorkingSet[] getEnabledSets() { + return getWindow().getActivePage().getWorkingSets(); + } + + private boolean isWorkingSetEnabled(IWorkingSet set) { + IWorkingSet[] enabledSets = getEnabledSets(); + for (int i = 0; i < enabledSets.length; i++) { + if (enabledSets[i].equals(set)) { + return true; + } + } + return false; + } + + private boolean isOnlyTaskWorkingSetEnabled(IWorkingSet set) { + if (!isWorkingSetEnabled(set)) { + return false; + } + + IWorkingSet[] enabledSets = getEnabledSets(); + for (int i = 0; i < enabledSets.length; i++) { + if (!enabledSets[i].equals(set) + && enabledSets[i].getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + return false; + } + } + return true; + } + + private boolean areAllTaskWorkingSetsEnabled() { + IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets(); + for (IWorkingSet workingSet : workingSets) { + if (workingSet != null + && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + if (!isWorkingSetEnabled(workingSet)) { + return false; + } + } + } + return true; + } + + private boolean doTaskWorkingSetsExist() { + IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets(); + for (IWorkingSet workingSet : workingSets) { + if (workingSet != null && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + return true; + } + } + return false; + } + + @Override + public void run() { + String[] ids = new String[1]; + ids[0] = ID_TASK_WORKING_SET; + ConfigureWindowWorkingSetsDialog dialog = new ConfigureWindowWorkingSetsDialog(getWindow(), ids); + if (dialog.open() == Window.OK) { + + } + } + + public void run(IAction action) { + this.run(); + } + + private class ManageWorkingSetsAction extends Action { + ManageWorkingSetsAction() { + super(WorkbenchMessages.Edit); + } + + public void run() { + TaskWorkingSetAction.this.run(this); + } + } + + private class ToggleAllWorkingSetsAction extends Action { + + ToggleAllWorkingSetsAction() { + super("All Task Working Sets", IAction.AS_CHECK_BOX); + setImageDescriptor(TasksUiImages.TASK_WORKING_SET); + setChecked(areAllTaskWorkingSetsEnabled()); + } + + public void runWithEvent(Event event) { + Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(getWindow().getActivePage() + .getWorkingSets())); + + Set<IWorkingSet> tempList = new HashSet<IWorkingSet>(); + Iterator<IWorkingSet> iter = newList.iterator(); + while (iter.hasNext()) { + IWorkingSet workingSet = (IWorkingSet) iter.next(); + if (workingSet != null + && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + tempList.add(workingSet); + } + } + newList.removeAll(tempList); + + if (isChecked()) { + IWorkingSet[] allWorkingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets(); + for (IWorkingSet workingSet : allWorkingSets) { + if (workingSet != null + && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + newList.add(workingSet); + } + } + } + + getWindow().getActivePage() + .setWorkingSets((IWorkingSet[]) newList.toArray(new IWorkingSet[newList.size()])); + } + + } + + private class ToggleWorkingSetAction extends Action { + private IWorkingSet set; + + ToggleWorkingSetAction(IWorkingSet set) { + super(set.getLabel(), IAction.AS_CHECK_BOX); + setImageDescriptor(set.getImageDescriptor()); + this.set = set; + setChecked(isWorkingSetEnabled(set)); + } + +// public void runWithEvent(Event event) { +// +// Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(getWindow().getActivePage() +// .getWorkingSets())); +// +// if (isChecked()) { +// // if the primary modifier key is down then clear the list +// // first. this makes the selection exclusive rather than +// // additive. +// boolean modified = (event.stateMask & KeyLookupFactory.getDefault().formalModifierLookup( +// IKeyLookup.M1_NAME)) != 0; +// +// if (modified) +// newList.clear(); +// newList.add(set); +// } else { +// newList.remove(set); +// } +// +// getWindow().getActivePage() +// .setWorkingSets((IWorkingSet[]) newList.toArray(new IWorkingSet[newList.size()])); +// } + + public void runWithEvent(Event event) { + Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(getWindow().getActivePage() + .getWorkingSets())); + + boolean modified = (event.stateMask & KeyLookupFactory.getDefault() + .formalModifierLookup(IKeyLookup.M1_NAME)) != 0; + + if (!modified) { + // When + + Set<IWorkingSet> tempList = new HashSet<IWorkingSet>(); + Iterator<IWorkingSet> iter = newList.iterator(); + while (iter.hasNext()) { + IWorkingSet workingSet = (IWorkingSet) iter.next(); + if (workingSet != null + && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) { + tempList.add(workingSet); + } + } + newList.removeAll(tempList); + + if (isChecked()) { + newList.add(set); + } else { + if (!isOnlyTaskWorkingSetEnabled(set)) { + newList.add(set); + } + } + + } else { + if (isChecked()) { + newList.add(set); + } else { + newList.remove(set); + } + } + + getWindow().getActivePage() + .setWorkingSets((IWorkingSet[]) newList.toArray(new IWorkingSet[newList.size()])); + } + + } + + class ConfigureWindowWorkingSetsDialog extends AbstractWorkingSetDialog { + + private final static int SIZING_SELECTION_WIDGET_HEIGHT = 200; + + private final static int SIZING_SELECTION_WIDGET_WIDTH = 50; + + private IWorkbenchWindow window; + + private CheckboxTableViewer viewer; + + private Set<String> taskWorkingSetIds; + + protected ConfigureWindowWorkingSetsDialog(IWorkbenchWindow window, String[] workingSetIds) { + super(window.getShell(), workingSetIds); + setShellStyle(getShellStyle() | SWT.RESIZE); + this.window = window; + //setTitle(WorkbenchMessages.WorkingSetSelectionDialog_title_multiSelect); + setTitle(TASK_WORKING_SET_TEXT_LABEL); + setMessage(WorkbenchMessages.WorkingSetSelectionDialog_message_multiSelect); + + if (workingSetIds == null || workingSetIds.length == 0) { + taskWorkingSetIds = null; + } else { + taskWorkingSetIds = new HashSet<String>(); + for (String id : workingSetIds) { + taskWorkingSetIds.add(id); + } + } + } + + protected Control createDialogArea(Composite parent) { + initializeDialogUnits(parent); + + Composite composite = (Composite) super.createDialogArea(parent); + + Composite viewerComposite = new Composite(composite, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginHeight = layout.marginWidth = 0; + layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); + layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); + viewerComposite.setLayout(layout); + + GridData data = new GridData(GridData.FILL_BOTH); + data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT; + data.widthHint = SIZING_SELECTION_WIDGET_WIDTH + 300; // fudge? I like fudge. + viewerComposite.setLayoutData(data); + + viewer = CheckboxTableViewer.newCheckList(viewerComposite, SWT.BORDER); + viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); + viewer.setLabelProvider(new WorkingSetLabelProvider()); + viewer.setContentProvider(new ArrayContentProvider()); + viewer.addFilter(new WorkingSetFilter(taskWorkingSetIds)); + viewer.setInput(window.getWorkbench().getWorkingSetManager().getWorkingSets()); + + viewer.setCheckedElements(window.getActivePage().getWorkingSets()); + + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + handleSelectionChanged(); + } + }); + + data = new GridData(GridData.FILL_BOTH); + data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT; + data.widthHint = SIZING_SELECTION_WIDGET_WIDTH; + + viewer.getControl().setLayoutData(data); + addModifyButtons(viewerComposite); + + addSelectionButtons(composite); + + availableWorkingSetsChanged(); + + Dialog.applyDialogFont(composite); + + return composite; + } + + protected void okPressed() { + Object[] selection = viewer.getCheckedElements(); + IWorkingSet[] workingSets = new IWorkingSet[selection.length]; + System.arraycopy(selection, 0, workingSets, 0, selection.length); + window.getActivePage().setWorkingSets(workingSets); + super.okPressed(); + } + + protected List<?> getSelectedWorkingSets() { + ISelection selection = viewer.getSelection(); + if (selection instanceof IStructuredSelection) { + return ((IStructuredSelection) selection).toList(); + } + return null; + } + + protected void availableWorkingSetsChanged() { + viewer.setInput(window.getWorkbench().getWorkingSetManager().getWorkingSets()); + super.availableWorkingSetsChanged(); + } + + /** + * Called when the selection has changed. + */ + void handleSelectionChanged() { + updateButtonAvailability(); + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + } + + protected void selectAllSets() { + viewer.setCheckedElements(window.getWorkbench().getWorkingSetManager().getWorkingSets()); + updateButtonAvailability(); + } + + protected void deselectAllSets() { + viewer.setCheckedElements(new Object[0]); + updateButtonAvailability(); + } + } + +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractMylarFilteredTree.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractMylarFilteredTree.java index 0973c4892..0cf60662f 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractMylarFilteredTree.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractMylarFilteredTree.java @@ -86,7 +86,7 @@ public abstract class AbstractMylarFilteredTree extends FilteredTree { @Override protected Composite createFilterControls(Composite parent) { - GridLayout gridLayout = new GridLayout(4, false); + GridLayout gridLayout = new GridLayout(5, false); gridLayout.marginWidth = 0; gridLayout.marginHeight = 2; gridLayout.verticalSpacing = 0; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java index 462eee07b..cf5eef091 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java @@ -13,9 +13,11 @@ package org.eclipse.mylyn.internal.tasks.ui.views; import java.util.List; import java.util.Set; +import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer; +import org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction; import org.eclipse.mylyn.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.ITaskActivityListener; import org.eclipse.mylyn.tasks.core.ITaskListChangeListener; @@ -163,6 +165,10 @@ public class TaskListFilteredTree extends AbstractMylarFilteredTree { @Override protected Composite createStatusComposite(Composite container) { + ToolBarManager manager = new ToolBarManager(SWT.FLAT); + manager.add(new TaskWorkingSetAction()); + manager.createControl(container); + activeTaskLabel = new Hyperlink(container, SWT.LEFT); activeTaskLabel.setText(LABEL_NO_ACTIVE); AbstractTask activeTask = TasksUiPlugin.getTaskListManager().getTaskList().getActiveTask(); |