| /******************************************************************************* |
| * Copyright (c) 2004, 2009 Mylyn project committers and others. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * https://www.eclipse.org/legal/epl-2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| *******************************************************************************/ |
| |
| 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.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.wizard.WizardDialog; |
| import org.eclipse.mylyn.internal.tasks.ui.dialogs.AbstractWorkingSetDialogCOPY; |
| import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater; |
| import org.eclipse.mylyn.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.IWorkingSetManager; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.dialogs.IWorkingSetEditWizard; |
| import org.eclipse.ui.internal.WorkbenchPlugin; |
| import org.eclipse.ui.internal.WorkingSetComparator; |
| import org.eclipse.ui.internal.dialogs.WorkingSetFilter; |
| import org.eclipse.ui.internal.dialogs.WorkingSetLabelProvider; |
| |
| /** |
| * Derived from SelectWorkingSetsAction |
| * |
| * @author Leo Dos Santos |
| * @author Mik Kersten |
| */ |
| public class TaskWorkingSetAction extends Action implements IMenuCreator { |
| |
| public static final String LABEL_SETS_NONE = Messages.TaskWorkingSetAction_All; |
| |
| private Menu dropDownMenu; |
| |
| public TaskWorkingSetAction() { |
| setText(Messages.TaskWorkingSetAction_Sets); |
| setToolTipText(Messages.TaskWorkingSetAction_Select_and_Edit_Working_Sets); |
| 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 itemAll = new ActionContributionItem(new ToggleAllWorkingSetsAction()); |
| // ActionContributionItem itemNone = new ActionContributionItem(new ToggleNoWorkingSetsAction()); |
| |
| List<IWorkingSet> sortedWorkingSets = Arrays.asList(workingSets); |
| Collections.sort(sortedWorkingSets, new WorkingSetComparator()); |
| |
| Iterator<IWorkingSet> iter = sortedWorkingSets.iterator(); |
| while (iter.hasNext()) { |
| IWorkingSet workingSet = iter.next(); |
| if (workingSet != null |
| && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) { |
| ActionContributionItem itemSet = new ActionContributionItem(new ToggleWorkingSetAction(workingSet)); |
| itemSet.fill(dropDownMenu, -1); |
| } |
| } |
| |
| Separator separator = new Separator(); |
| separator.fill(dropDownMenu, -1); |
| itemAll.fill(dropDownMenu, -1); |
| } |
| |
| ActionContributionItem editItem = new ActionContributionItem(new ManageWorkingSetsAction()); |
| editItem.fill(dropDownMenu, -1); |
| } |
| |
| private boolean doTaskWorkingSetsExist() { |
| IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets(); |
| for (IWorkingSet workingSet : workingSets) { |
| if (workingSet != null && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| @Override |
| public void run() { |
| String[] ids = new String[1]; |
| ids[0] = TaskWorkingSetUpdater.ID_TASK_WORKING_SET; |
| ConfigureWindowWorkingSetsDialog dialog = new ConfigureWindowWorkingSetsDialog(PlatformUI.getWorkbench() |
| .getActiveWorkbenchWindow(), ids); |
| dialog.open(); |
| } |
| |
| public void run(IAction action) { |
| this.run(); |
| } |
| |
| public void run(IWorkingSet editWorkingSet) { |
| IWorkingSetManager manager = WorkbenchPlugin.getDefault().getWorkingSetManager(); |
| IWorkingSetEditWizard wizard = manager.createWorkingSetEditWizard(editWorkingSet); |
| WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard); |
| |
| // dialog.create(); |
| dialog.open(); |
| // PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(), |
| // IWorkbenchHelpContextIds.WORKING_SET_EDIT_WIZARD); |
| // if (dialog.open() == Window.OK) { |
| // editWorkingSet = wizard.getSelection(); |
| // availableWorkingSetsChanged(); |
| // // make sure ok button is enabled when the selected working set |
| // // is edited. Fixes bug 33386. |
| // updateButtonAvailability(); |
| // } |
| // editedWorkingSets.put(editWorkingSet, originalWorkingSet); |
| } |
| |
| private class ManageWorkingSetsAction extends Action { |
| ManageWorkingSetsAction() { |
| super(Messages.TaskWorkingSetAction_Edit_Label); |
| } |
| |
| @Override |
| public void run() { |
| TaskWorkingSetAction.this.run(this); |
| } |
| } |
| |
| // TODO: remove? |
| protected class ToggleEnableAllSetsAction extends Action { |
| |
| ToggleEnableAllSetsAction() { |
| super(Messages.TaskWorkingSetAction_Deselect_All, IAction.AS_CHECK_BOX); |
| // setImageDescriptor(TasksUiImages.TASK_WORKING_SET); |
| // setChecked(!areAllTaskWorkingSetsEnabled()); |
| } |
| |
| @Override |
| public void runWithEvent(Event event) { |
| Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(TaskWorkingSetUpdater.getEnabledSets())); |
| |
| Set<IWorkingSet> tempList = new HashSet<IWorkingSet>(); |
| Iterator<IWorkingSet> iter = newList.iterator(); |
| while (iter.hasNext()) { |
| IWorkingSet workingSet = iter.next(); |
| if (workingSet != null |
| && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.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(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) { |
| newList.add(workingSet); |
| } |
| } |
| } |
| |
| TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(newList); |
| } |
| |
| } |
| |
| class ConfigureWindowWorkingSetsDialog extends AbstractWorkingSetDialogCOPY { |
| |
| private final static int SIZING_SELECTION_WIDGET_HEIGHT = 200; |
| |
| private final static int SIZING_SELECTION_WIDGET_WIDTH = 50; |
| |
| private final IWorkbenchWindow window; |
| |
| private CheckboxTableViewer viewer; |
| |
| private Set<String> taskWorkingSetIds; |
| |
| protected ConfigureWindowWorkingSetsDialog(IWorkbenchWindow window, String[] workingSetIds) { |
| super(window.getShell(), workingSetIds, true); |
| setShellStyle(getShellStyle() | SWT.RESIZE); |
| this.window = window; |
| //setTitle(WorkbenchMessages.WorkingSetSelectionDialog_title_multiSelect); |
| setTitle(Messages.TaskWorkingSetAction_Select_and_Edit_Working_Sets); |
| setMessage(""); //$NON-NLS-1$ |
| |
| if (workingSetIds == null || workingSetIds.length == 0) { |
| taskWorkingSetIds = null; |
| } else { |
| taskWorkingSetIds = new HashSet<String>(); |
| for (String id : workingSetIds) { |
| taskWorkingSetIds.add(id); |
| } |
| } |
| } |
| |
| @Override |
| 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(ArrayContentProvider.getInstance()); |
| viewer.addFilter(new WorkingSetFilter(taskWorkingSetIds)); |
| viewer.setInput(window.getWorkbench().getWorkingSetManager().getWorkingSets()); |
| |
| viewer.setCheckedElements(TaskWorkingSetUpdater.getActiveWorkingSets(window).toArray()); |
| |
| 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; |
| } |
| |
| @Override |
| protected void okPressed() { |
| Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(TaskWorkingSetUpdater.getEnabledSets())); |
| Set<IWorkingSet> tempList = new HashSet<IWorkingSet>(); |
| for (IWorkingSet workingSet : newList) { |
| for (String id : taskWorkingSetIds) { |
| if (workingSet.getId().equalsIgnoreCase(id)) { |
| tempList.add(workingSet); |
| } |
| } |
| } |
| newList.removeAll(tempList); |
| |
| Object[] selection = viewer.getCheckedElements(); |
| IWorkingSet[] setsToEnable = new IWorkingSet[selection.length]; |
| System.arraycopy(selection, 0, setsToEnable, 0, selection.length); |
| newList.addAll(new HashSet<IWorkingSet>(Arrays.asList(setsToEnable))); |
| |
| TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(newList); |
| super.okPressed(); |
| } |
| |
| @Override |
| protected List<?> getSelectedWorkingSets() { |
| ISelection selection = viewer.getSelection(); |
| if (selection instanceof IStructuredSelection) { |
| return ((IStructuredSelection) selection).toList(); |
| } |
| return null; |
| } |
| |
| @Override |
| protected void availableWorkingSetsChanged() { |
| viewer.setInput(window.getWorkbench().getWorkingSetManager().getWorkingSets()); |
| super.availableWorkingSetsChanged(); |
| } |
| |
| /** |
| * Called when the selection has changed. |
| */ |
| void handleSelectionChanged() { |
| updateButtonAvailability(); |
| } |
| |
| @Override |
| protected void configureShell(Shell shell) { |
| super.configureShell(shell); |
| } |
| |
| @Override |
| protected void selectAllSets() { |
| viewer.setCheckedElements(window.getWorkbench().getWorkingSetManager().getWorkingSets()); |
| updateButtonAvailability(); |
| } |
| |
| @Override |
| protected void deselectAllSets() { |
| viewer.setCheckedElements(new Object[0]); |
| updateButtonAvailability(); |
| } |
| } |
| } |