blob: 90b71fa791c9232397b959e626d2fe313ad2b98d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
* Ken Sueda - improvements
* Eugene Kuleshov - improvements
* Frank Becker - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.views;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.commons.ui.PlatformUiUtil;
import org.eclipse.mylyn.commons.ui.compatibility.CommonThemes;
import org.eclipse.mylyn.commons.workbench.GradientDrawer;
import org.eclipse.mylyn.internal.commons.notifications.feed.ServiceMessage;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
import org.eclipse.mylyn.internal.tasks.ui.CategorizedPresentation;
import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
import org.eclipse.mylyn.internal.tasks.ui.MyTasksFilter;
import org.eclipse.mylyn.internal.tasks.ui.ScheduledPresentation;
import org.eclipse.mylyn.internal.tasks.ui.TaskArchiveFilter;
import org.eclipse.mylyn.internal.tasks.ui.TaskCompletionFilter;
import org.eclipse.mylyn.internal.tasks.ui.TaskPriorityFilter;
import org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryUtil;
import org.eclipse.mylyn.internal.tasks.ui.TaskReviewArtifactFilter;
import org.eclipse.mylyn.internal.tasks.ui.TaskWorkingSetFilter;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.actions.CollapseAllAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.ExpandAllAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.FilterMyTasksAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.GoUpAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.GroupSubTasksAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.LinkWithEditorAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTasksUiPreferencesAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.ShowAllQueriesAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.ShowNonMatchingSubtasksAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeAutomaticallyAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListSortAction;
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListViewActionGroup;
import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListServiceMessageControl;
import org.eclipse.mylyn.internal.tasks.ui.search.AbstractSearchHandler;
import org.eclipse.mylyn.internal.tasks.ui.search.SearchUtil;
import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.IRepositoryElement;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
import org.eclipse.mylyn.tasks.core.ITaskContainer;
import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
import org.eclipse.mylyn.tasks.core.TaskActivityAdapter;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.RTFTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.URLTransfer;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.ISizeProvider;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.handlers.CollapseAllHandler;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.IShowInTargetList;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
import org.eclipse.ui.themes.IThemeManager;
/**
* @author Mik Kersten
* @author Ken Sueda
* @author Eugene Kuleshov
* @author David Green
*/
public class TaskListView extends AbstractTaskListView implements IPropertyChangeListener, IShowInTarget {
private static final String ID_SEPARATOR_FILTERS = "filters"; //$NON-NLS-1$
private static final String ID_SEPARATOR_SEARCH = "search"; //$NON-NLS-1$
private static final String ID_SEPARATOR_TASKS = "tasks"; //$NON-NLS-1$
private static final String ID_SEPARATOR_CONTEXT = "context"; //$NON-NLS-1$
/**
* @deprecated Use {@link ITasksUiConstants#ID_VIEW_TASKS} instead
*/
@Deprecated
public static final String ID = ITasksUiConstants.ID_VIEW_TASKS;
public static final String LABEL_VIEW = Messages.TaskListView_Task_List;
private static final String MEMENTO_SORTER = "sorter"; //$NON-NLS-1$
private static final String MEMENTO_LINK_WITH_EDITOR = "linkWithEditor"; //$NON-NLS-1$
private static final String MEMENTO_PRESENTATION = "presentation"; //$NON-NLS-1$
private static final String LABEL_NO_TASKS = "no task active"; //$NON-NLS-1$
private final static int SIZE_MAX_SELECTION_HISTORY = 10;
static final String[] PRIORITY_LEVELS = { PriorityLevel.P1.toString(), PriorityLevel.P2.toString(),
PriorityLevel.P3.toString(), PriorityLevel.P4.toString(), PriorityLevel.P5.toString() };
public static final String[] PRIORITY_LEVEL_DESCRIPTIONS = { PriorityLevel.P1.getDescription(),
PriorityLevel.P2.getDescription(), PriorityLevel.P3.getDescription(), PriorityLevel.P4.getDescription(),
PriorityLevel.P5.getDescription() };
private static List<AbstractTaskListPresentation> presentationsPrimary = new ArrayList<AbstractTaskListPresentation>();
private static List<AbstractTaskListPresentation> presentationsSecondary = new ArrayList<AbstractTaskListPresentation>();
private boolean focusedMode;
private boolean linkWithEditor;
private final TaskListCellModifier taskListCellModifier = new TaskListCellModifier(this);
private IThemeManager themeManager;
private TaskListFilteredTree filteredTree;
private org.eclipse.mylyn.commons.ui.SelectionProviderAdapter selectionProvider;
private DrillDownAdapter drillDownAdapter;
private AbstractTaskContainer drilledIntoCategory;
private CollapseAllAction collapseAll;
private ExpandAllAction expandAll;
private FilterCompletedTasksAction filterCompleteTask;
private FilterMyTasksAction filterMyTasksAction;
private GroupSubTasksAction groupSubTasksAction;
private SynchronizeAutomaticallyAction synchronizeAutomatically;
private OpenTasksUiPreferencesAction openPreferencesAction;
private PriorityDropDownAction filterOnPriorityAction;
private TaskListSortAction sortDialogAction;
private NewTaskAction newTaskAction;
private LinkWithEditorAction linkWithEditorAction;
private final PresentationDropDownSelectionAction presentationDropDownSelectionAction = new PresentationDropDownSelectionAction(
this);
private ShowNonMatchingSubtasksAction showNonMatchingSubtasksAction;
private final TaskPriorityFilter filterPriority = new TaskPriorityFilter();
private final TaskCompletionFilter filterComplete = new TaskCompletionFilter();
private final TaskArchiveFilter filterArchive = new TaskArchiveFilter();
private final TaskReviewArtifactFilter filterArtifact = new TaskReviewArtifactFilter();
private final PresentationFilter filterPresentation = PresentationFilter.getInstance();
private final MyTasksFilter filterMyTasks = new MyTasksFilter();
private TaskWorkingSetFilter filterWorkingSet;
private final Set<AbstractTaskListFilter> filters = new HashSet<AbstractTaskListFilter>();
protected String[] columnNames = new String[] { Messages.TaskListView_Summary };
protected int[] columnWidths = new int[] { 200 };
private TreeColumn[] columns;
private IMemento taskListMemento;
private AbstractTaskListPresentation currentPresentation;
private TaskTableLabelProvider taskListTableLabelProvider;
private TaskListSorter tableSorter;
private TaskListViewActionGroup actionGroup;
private CustomTaskListDecorationDrawer customDrawer;
private TaskListServiceMessageControl serviceMessageControl;
private long lastExpansionTime;
private final IPageListener PAGE_LISTENER = new IPageListener() {
public void pageActivated(IWorkbenchPage page) {
filteredTree.indicateActiveTaskWorkingSet();
}
public void pageClosed(IWorkbenchPage page) {
// ignore
}
public void pageOpened(IWorkbenchPage page) {
// ignore
}
};
private final LinkedHashMap<String, IStructuredSelection> lastSelectionByTaskHandle = new LinkedHashMap<String, IStructuredSelection>(
SIZE_MAX_SELECTION_HISTORY);
/**
* True if the view should indicate that interaction monitoring is paused
*/
protected boolean isPaused = false;
private final ITaskActivityListener TASK_ACTIVITY_LISTENER = new TaskActivityAdapter() {
@Override
public void activityReset() {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
refreshJob.refresh();
}
});
}
};
private final ITaskActivationListener TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
@Override
public void taskActivated(final ITask task) {
if (task != null) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
updateDescription();
refresh(task);
selectedAndFocusTask(task);
filteredTree.indicateActiveTask(task);
}
});
}
}
@Override
public void taskDeactivated(final ITask task) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
refresh(task);
updateDescription();
filteredTree.indicateNoActiveTask();
}
});
}
private void refresh(final ITask task) {
if (TaskListView.this.isScheduledPresentation()) {
refreshJob.refresh();
} else {
refreshJob.refreshElement(task);
}
}
};
private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)
|| CommonThemes.isCommonTheme(event.getProperty())) {
taskListTableLabelProvider.setCategoryBackgroundColor(
themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_CATEGORY));
getViewer().refresh();
}
}
};
private final IPropertyChangeListener tasksUiPreferenceListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED.equals(event.getProperty())) {
updateTooltipEnablement();
}
if (event.getProperty().equals(ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED)
|| event.getProperty().equals(ITasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT)) {
refreshJob.refresh();
}
if (event.getProperty().equals(ITasksUiPreferenceConstants.FILTER_HIDDEN)
|| event.getProperty().equals(ITasksUiPreferenceConstants.FILTER_NON_MATCHING)
|| event.getProperty().equals(ITasksUiPreferenceConstants.GROUP_SUBTASKS)) {
filterPresentation.updateSettings();
refresh(true);
if (showNonMatchingSubtasksAction != null) {
showNonMatchingSubtasksAction.update();
}
}
}
};
private TaskListToolTip taskListToolTip;
public static TaskListView getFromActivePerspective() {
if (PlatformUI.isWorkbenchRunning()) {
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null) {
IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
if (activePage != null) {
IViewPart view = activePage.findView(ITasksUiConstants.ID_VIEW_TASKS);
if (view instanceof TaskListView) {
return (TaskListView) view;
}
}
}
}
return null;
}
private static boolean initializedSynchronization;
public TaskListView() {
if (!initializedSynchronization) {
initializedSynchronization = true;
// trigger additional initialization when task list is first made visible.
TasksUiPlugin.getDefault().initializeNotificationsAndSynchronization();
}
}
@Override
public void dispose() {
super.dispose();
if (actionGroup != null) {
actionGroup.dispose();
}
TasksUiPlugin.getDefault().getServiceMessageManager().removeServiceMessageListener(serviceMessageControl);
TasksUiPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(tasksUiPreferenceListener);
if (refreshJob != null) {
refreshJob.dispose();
}
TasksUiPlugin.getTaskActivityManager().removeActivityListener(TASK_ACTIVITY_LISTENER);
TasksUiPlugin.getTaskActivityManager().removeActivationListener(TASK_ACTIVATION_LISTENER);
PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(this);
if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().removePageListener(PAGE_LISTENER);
}
final IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
if (themeManager != null) {
themeManager.removePropertyChangeListener(THEME_CHANGE_LISTENER);
}
if (editorListener != null) {
getSite().getPage().removePartListener(editorListener);
}
if (searchHandler != null) {
searchHandler.dispose();
}
}
private void updateDescription() {
ITask task = TasksUi.getTaskActivityManager().getActiveTask();
if (getSite() == null || getSite().getPage() == null) {
return;
}
IViewReference reference = getSite().getPage().findViewReference(ITasksUiConstants.ID_VIEW_TASKS);
boolean shouldSetDescription = false;
if (reference != null && reference.isFastView() && !getSite().getPage().isPartVisible(this)) {
shouldSetDescription = true;
}
if (task != null) {
setTitleToolTip(LABEL_VIEW + " (" + task.getSummary() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
if (shouldSetDescription) {
setContentDescription(task.getSummary());
} else {
setContentDescription(""); //$NON-NLS-1$
}
} else {
setTitleToolTip(LABEL_VIEW);
if (shouldSetDescription) {
setContentDescription(LABEL_NO_TASKS);
} else {
setContentDescription(""); //$NON-NLS-1$
}
}
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
init(site);
this.taskListMemento = memento;
}
@Override
public void saveState(IMemento memento) {
if (tableSorter != null) {
IMemento child = memento.createChild(MEMENTO_SORTER);
tableSorter.saveState(child);
}
memento.putString(MEMENTO_LINK_WITH_EDITOR, Boolean.toString(linkWithEditor));
memento.putString(MEMENTO_PRESENTATION,
currentPresentation != null ? currentPresentation.getId() : CategorizedPresentation.ID);
if (filteredTree != null && filteredTree.getTextSearchControl() != null) {
filteredTree.getTextSearchControl().saveState(memento);
}
}
private void restoreState() {
if (taskListMemento != null) {
if (tableSorter != null) {
IMemento sorterMemento = taskListMemento.getChild(MEMENTO_SORTER);
if (sorterMemento != null) {
tableSorter.restoreState(sorterMemento);
}
}
applyPresentation(taskListMemento.getString(MEMENTO_PRESENTATION));
}
filterWorkingSet = new TaskWorkingSetFilter();
filterWorkingSet.updateWorkingSet(getSite().getPage().getAggregateWorkingSet());
filteredTree.setWorkingSetFilter(filterWorkingSet);
addFilter(filterWorkingSet);
addFilter(filterPriority);
if (TasksUiPlugin.getDefault()
.getPreferenceStore()
.contains(ITasksUiPreferenceConstants.FILTER_COMPLETE_MODE)) {
addFilter(filterComplete);
}
if (TasksUiPlugin.getDefault()
.getPreferenceStore()
.contains(ITasksUiPreferenceConstants.FILTER_MY_TASKS_MODE)) {
addFilter(filterMyTasks);
}
addFilter(filterPresentation);
addFilter(filterArchive);
addFilter(filterArtifact);
// Restore "link with editor" value; by default true
boolean linkValue = true;
if (taskListMemento != null && taskListMemento.getString(MEMENTO_LINK_WITH_EDITOR) != null) {
linkValue = Boolean.parseBoolean(taskListMemento.getString(MEMENTO_LINK_WITH_EDITOR));
}
setLinkWithEditor(linkValue);
if (taskListMemento != null && filteredTree.getTextSearchControl() != null) {
filteredTree.getTextSearchControl().restoreState(taskListMemento);
}
getViewer().refresh();
}
@Override
public void createPartControl(Composite parent) {
Composite body = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.numColumns = 1;
body.setLayout(layout);
IWorkbenchSiteProgressService progress = (IWorkbenchSiteProgressService) getSite()
.getAdapter(IWorkbenchSiteProgressService.class);
if (progress != null) {
// show indicator for all running query synchronizations
progress.showBusyForFamily(ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION);
}
this.selectionProvider = new org.eclipse.mylyn.commons.ui.SelectionProviderAdapter();
getSite().setSelectionProvider(selectionProvider);
themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER);
searchHandler = SearchUtil.createSearchHandler();
filteredTree = new TaskListFilteredTree(body,
SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL | SWT.NO_SCROLL | SWT.FULL_SELECTION,
searchHandler, getViewSite().getWorkbenchWindow());
// need to do initialize tooltip early for native tooltip disablement to take effect
taskListToolTip = new TaskListToolTip(getViewer().getControl());
updateTooltipEnablement();
getSite().registerContextMenu(TasksUiInternal.ID_MENU_ACTIVE_TASK, filteredTree.getActiveTaskMenuManager(),
selectionProvider);
filteredTree.setActiveTaskSelectionProvider(selectionProvider);
getViewer().addSelectionChangedListener(this.selectionProvider);
getViewer().getControl().addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
selectionProvider.setSelection(getViewer().getSelection());
}
});
filteredTree.getFilterControl().addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateFilterEnablement();
}
});
getViewer().getTree().setHeaderVisible(false);
getViewer().setUseHashlookup(true);
refreshJob = new TaskListRefreshJob(this, getViewer(), "Task List Refresh"); //$NON-NLS-1$
configureColumns(columnNames, columnWidths);
final IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
Color categoryBackground = themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_CATEGORY);
taskListTableLabelProvider = new TaskTableLabelProvider(new TaskElementLabelProvider(true),
PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), categoryBackground);
getViewer().setLabelProvider(taskListTableLabelProvider);
CellEditor[] editors = new CellEditor[columnNames.length];
TextCellEditor textEditor = new TextCellEditor(getViewer().getTree());
((Text) textEditor.getControl()).setOrientation(SWT.LEFT_TO_RIGHT);
editors[0] = textEditor;
// editors[1] = new ComboBoxCellEditor(getViewer().getTree(),
// editors[2] = new CheckboxCellEditor();
getViewer().setCellEditors(editors);
getViewer().setCellModifier(taskListCellModifier);
tableSorter = new TaskListSorter();
getViewer().setSorter(tableSorter);
applyPresentation(CategorizedPresentation.ID);
drillDownAdapter = new DrillDownAdapter(getViewer());
getViewer().setInput(getViewSite());
final int activationImageOffset = PlatformUiUtil.getTreeImageOffset();
customDrawer = new CustomTaskListDecorationDrawer(activationImageOffset, false);
getViewer().getTree().addListener(SWT.EraseItem, customDrawer);
getViewer().getTree().addListener(SWT.PaintItem, customDrawer);
Listener expandListener = new Listener() {
public void handleEvent(Event event) {
lastExpansionTime = System.currentTimeMillis();
}
};
getViewer().getTree().addListener(SWT.Expand, expandListener);
getViewer().getTree().addListener(SWT.Collapse, expandListener);
getViewer().getTree().addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent event) {
// avoid activation in case the event was actually triggered as a side-effect of a tree expansion
long currentTime = System.currentTimeMillis();
if (currentTime - lastExpansionTime < 150 && currentTime >= lastExpansionTime) {
return;
}
if (event.button == 3) {
// button3 is used for the context menu so we ignore the mouseDown Event
return;
}
// NOTE: need e.x offset for Linux/GTK, which does not see
// left-aligned items in tree
Object selectedNode = ((Tree) event.widget).getItem(new Point(event.x + 70, event.y));
if (selectedNode instanceof TreeItem) {
Object selectedObject = ((TreeItem) selectedNode).getData();
if (selectedObject instanceof ITask) {
if (event.x > activationImageOffset && event.x < activationImageOffset + 13) {
taskListCellModifier.toggleTaskActivation((TreeItem) selectedNode, event);
}
}
}
}
});
// TODO make these proper commands and move code into TaskListViewCommands
getViewer().getTree().addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.F2 && e.stateMask == 0) {
if (actionGroup.getRenameAction().isEnabled()) {
actionGroup.getRenameAction().run();
}
} else if ((e.keyCode & SWT.KEYCODE_BIT) != 0) {
// Do nothing here since it is key code
} else if (e.keyCode == SWT.ESC) {
taskListToolTip.hide();
} else if (e.keyCode == 'f' && e.stateMask == SWT.MOD1) {
filteredTree.getFilterControl().setFocus();
} else if (e.stateMask == 0) {
if (Character.isLetter((char) e.keyCode) || Character.isDigit((char) e.keyCode)) {
String string = new Character((char) e.keyCode).toString();
filteredTree.getFilterControl().setFocus();
filteredTree.getFilterControl().setText(string);
filteredTree.getFilterControl().setSelection(1, 1);
}
}
}
public void keyReleased(KeyEvent e) {
}
});
// update tooltip contents
getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateToolTip(true);
}
});
getViewer().getTree().addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
taskListToolTip.hide();
}
});
makeActions();
hookGlobalActions();
hookContextMenu();
hookOpenAction();
contributeToActionBars();
initHandlers();
new GradientDrawer(themeManager, getViewer()) {
@Override
protected boolean shouldApplyGradient(Event event) {
return event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask);
}
};
initDragAndDrop(parent);
expandToActiveTasks();
restoreState();
updateDescription();
IContextService contextSupport = (IContextService) getSite().getService(IContextService.class);
if (contextSupport != null) {
contextSupport.activateContext(ITasksUiConstants.ID_VIEW_TASKS);
}
getSite().getPage().addPartListener(editorListener);
// we need to update the icon here as the action was not created when the presentation was applied
updatePresentationSelectorImage();
PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(this);
TasksUiPlugin.getTaskActivityManager().addActivityListener(TASK_ACTIVITY_LISTENER);
TasksUiPlugin.getTaskActivityManager().addActivationListener(TASK_ACTIVATION_LISTENER);
TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(tasksUiPreferenceListener);
serviceMessageControl = new TaskListServiceMessageControl(body);
List<TaskRepository> repos = TasksUi.getRepositoryManager().getAllRepositories();
boolean showMessage = true;
for (TaskRepository repository : repos) {
if (!repository.getConnectorKind().equals("local") //$NON-NLS-1$
&& !TaskRepositoryUtil.isAddAutomatically(repository.getRepositoryUrl())) {
showMessage = false;
break;
}
}
boolean showedWelcomeMessage = TasksUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(ITasksUiPreferenceConstants.WELCOME_MESSAGE);
if (showMessage && !showedWelcomeMessage) {
ServiceMessage message = new ServiceMessage("welcome"); //$NON-NLS-1$
message.setDescription(Messages.TaskListView_Welcome_Message);
message.setTitle(Messages.TaskListView_Welcome_Message_Title);
message.setImage(Dialog.DLG_IMG_MESSAGE_INFO);
serviceMessageControl.setMessage(message);
TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.WELCOME_MESSAGE,
Boolean.toString(true));
}
TasksUiPlugin.getDefault().getServiceMessageManager().addServiceMessageListener(serviceMessageControl);
// Need to do this because the page, which holds the active working set is not around on creation, see bug 203179
PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPageListener(PAGE_LISTENER);
}
private void initHandlers() {
IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
handlerService.activateHandler(CollapseAllHandler.COMMAND_ID, new CollapseAllHandler(getViewer()));
}
private void hookGlobalActions() {
IActionBars bars = getViewSite().getActionBars();
bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), actionGroup.getDeleteAction());
bars.setGlobalActionHandler(ActionFactory.COPY.getId(), actionGroup.getCopyDetailsAction());
bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), actionGroup.getUndoAction());
bars.setGlobalActionHandler(ActionFactory.REDO.getId(), actionGroup.getRedoAction());
}
private void applyPresentation(String id) {
if (id != null) {
for (AbstractTaskListPresentation presentation : presentationsPrimary) {
if (id.equals(presentation.getId())) {
applyPresentation(presentation);
return;
}
}
for (AbstractTaskListPresentation presentation : presentationsSecondary) {
if (id.equals(presentation.getId())) {
applyPresentation(presentation);
return;
}
}
}
}
public void applyPresentation(AbstractTaskListPresentation presentation) {
try {
getViewer().getControl().setRedraw(false);
if (!filteredTree.getFilterString().equals("")) { //$NON-NLS-1$
filteredTree.getFilterControl().setText(""); //$NON-NLS-1$
}
AbstractTaskListContentProvider contentProvider = presentation.getContentProvider(this);
getViewer().setContentProvider(contentProvider);
refresh(true);
currentPresentation = presentation;
updatePresentationSelectorImage();
tableSorter.getTaskComparator().presentationChanged(presentation);
} finally {
getViewer().getControl().setRedraw(true);
}
}
private void updatePresentationSelectorImage() {
if (presentationDropDownSelectionAction != null && currentPresentation != null) {
presentationDropDownSelectionAction.setImageDescriptor(currentPresentation.getImageDescriptor());
}
for (IContributionItem item : getViewSite().getActionBars().getToolBarManager().getItems()) {
if (item instanceof ActionContributionItem) {
IAction action = ((ActionContributionItem) item).getAction();
if (action instanceof PresentationDropDownSelectionAction.PresentationSelectionAction) {
((PresentationDropDownSelectionAction.PresentationSelectionAction) action).update();
}
}
}
}
public AbstractTaskListPresentation getCurrentPresentation() {
return currentPresentation;
}
private void configureColumns(final String[] columnNames, final int[] columnWidths) {
TreeColumnLayout layout = (TreeColumnLayout) getViewer().getTree().getParent().getLayout();
getViewer().setColumnProperties(columnNames);
columns = new TreeColumn[columnNames.length];
for (int i = 0; i < columnNames.length; i++) {
columns[i] = new TreeColumn(getViewer().getTree(), 0);
columns[i].setText(columnNames[i]);
if (i == 0) {
layout.setColumnData(columns[i], new ColumnWeightData(100));
} else {
layout.setColumnData(columns[i], new ColumnPixelData(columnWidths[i]));
}
columns[i].addControlListener(new ControlListener() {
public void controlResized(ControlEvent e) {
for (int j = 0; j < columnWidths.length; j++) {
if (columns[j].equals(e.getSource())) {
columnWidths[j] = columns[j].getWidth();
}
}
}
public void controlMoved(ControlEvent e) {
// don't care if the control is moved
}
});
}
}
/**
* Tracks editor activation and jump to corresponding task, if applicable
*/
private final IPartListener editorListener = new IPartListener() {
private void jumpToEditor(IWorkbenchPart part) {
if (!linkWithEditor || !(part instanceof IEditorPart)) {
return;
}
jumpToEditorTask((IEditorPart) part);
}
public void partActivated(IWorkbenchPart part) {
if (part == TaskListView.this) {
updateDescription();
} else {
jumpToEditor(part);
}
}
public void partBroughtToTop(IWorkbenchPart part) {
}
public void partClosed(IWorkbenchPart part) {
}
public void partDeactivated(IWorkbenchPart part) {
if (part == TaskListView.this) {
IViewReference reference = getSite().getPage().findViewReference(ITasksUiConstants.ID_VIEW_TASKS);
if (reference != null && reference.isFastView()) {
updateDescription();
}
taskListToolTip.hide();
}
}
public void partOpened(IWorkbenchPart part) {
}
};
private void initDragAndDrop(Composite parent) {
Transfer[] dragTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() };
Transfer[] dropTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance(),
TextTransfer.getInstance(), RTFTransfer.getInstance(), URLTransfer.getInstance() };
getViewer().addDragSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK, dragTypes,
new TaskDragSourceListener(getViewer()));
getViewer().addDropSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK | DND.DROP_DEFAULT, dropTypes,
new TaskListDropAdapter(getViewer()));
}
@Override
protected void expandToActiveTasks() {
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().asyncExec(new Runnable() {
public void run() {
ITask task = TasksUi.getTaskActivityManager().getActiveTask();
if (task != null) {
getViewer().expandToLevel(task, 0);
}
}
});
}
private void hookContextMenu() {
MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
actionGroup.fillContextMenu(manager);
}
});
Menu menu = menuManager.createContextMenu(getViewer().getControl());
getViewer().getControl().setMenu(menu);
getSite().registerContextMenu(menuManager, getViewer());
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
updateDrillDownActions();
manager.add(actionGroup.getGoUpAction());
manager.add(collapseAll);
manager.add(expandAll);
manager.add(new Separator(ID_SEPARATOR_FILTERS));
manager.add(sortDialogAction);
manager.add(filterOnPriorityAction);
manager.add(filterCompleteTask);
manager.add(filterMyTasksAction);
IMenuManager advancedMenu = new MenuManager(Messages.TaskListView_Advanced_Filters_Label);
advancedMenu.add(new ShowAllQueriesAction());
showNonMatchingSubtasksAction = new ShowNonMatchingSubtasksAction();
advancedMenu.add(showNonMatchingSubtasksAction);
advancedMenu.add(new Separator());
advancedMenu.add(groupSubTasksAction);
manager.add(advancedMenu);
manager.add(new Separator(ID_SEPARATOR_SEARCH));
manager.add(new GroupMarker(ID_SEPARATOR_TASKS));
manager.add(synchronizeAutomatically);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
manager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
filterOnPriorityAction.updateCheckedState();
}
});
manager.add(linkWithEditorAction);
manager.add(new Separator());
manager.add(openPreferencesAction);
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(newTaskAction);
manager.add(new Separator());
addPresentations(manager);
manager.add(new Separator());
manager.add(new GroupMarker(ID_SEPARATOR_CONTEXT));
manager.add(new Separator());
manager.add(filterCompleteTask);
manager.add(filterMyTasksAction);
manager.add(collapseAll);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void addPresentations(IToolBarManager manager) {
for (AbstractTaskListPresentation presentation : TaskListView.getPresentations()) {
if (!presentation.isPrimary()) {
// at least one non primary presentation present
manager.add(presentationDropDownSelectionAction);
return;
}
}
// add toggle buttons for primary presentations
for (AbstractTaskListPresentation presentation : TaskListView.getPresentations()) {
manager.add(new PresentationDropDownSelectionAction.PresentationSelectionAction(this, presentation));
}
}
public List<IRepositoryElement> getSelectedTaskContainers() {
List<IRepositoryElement> selectedElements = new ArrayList<IRepositoryElement>();
for (Iterator<?> i = ((IStructuredSelection) getViewer().getSelection()).iterator(); i.hasNext();) {
Object object = i.next();
if (object instanceof ITaskContainer) {
selectedElements.add((IRepositoryElement) object);
}
}
return selectedElements;
}
private void makeActions() {
actionGroup = new TaskListViewActionGroup(this, drillDownAdapter);
actionGroup.getOpenAction().setViewer(getViewer());
collapseAll = new CollapseAllAction(this);
expandAll = new ExpandAllAction(this);
filterCompleteTask = new FilterCompletedTasksAction(this);
groupSubTasksAction = new GroupSubTasksAction();
synchronizeAutomatically = new SynchronizeAutomaticallyAction();
openPreferencesAction = new OpenTasksUiPreferencesAction();
//filterArchiveCategory = new FilterArchiveContainerAction(this);
filterMyTasksAction = new FilterMyTasksAction(this);
sortDialogAction = new TaskListSortAction(getSite(), this);
filterOnPriorityAction = new PriorityDropDownAction(this);
linkWithEditorAction = new LinkWithEditorAction(this);
newTaskAction = new NewTaskAction();
filteredTree.getViewer().addSelectionChangedListener(newTaskAction);
}
private void hookOpenAction() {
getViewer().addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
actionGroup.getOpenAction().run();
}
});
getViewer().addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
if (TasksUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(ITasksUiPreferenceConstants.ACTIVATE_WHEN_OPENED)) {
AbstractTask selectedTask = getSelectedTask();
if (selectedTask != null && !selectedTask.isActive()) {
TasksUiInternal.activateTaskThroughCommand(selectedTask);
}
}
}
});
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus() {
filteredTree.getViewer().getControl().setFocus();
}
public void refresh(boolean expandIfFocused) {
if (expandIfFocused && isFocusedMode() && isAutoExpandMode()) {
try {
getViewer().getControl().setRedraw(false);
refreshJob.refreshNow();
getViewer().expandAll();
} finally {
getViewer().getControl().setRedraw(true);
}
} else {
refreshJob.refreshNow();
}
}
@Override
public void refresh() {
refreshJob.refreshNow();
}
public TaskListToolTip getToolTip() {
return taskListToolTip;
}
@Override
public TreeViewer getViewer() {
return filteredTree.getViewer();
}
public TaskCompletionFilter getCompleteFilter() {
return filterComplete;
}
public TaskPriorityFilter getPriorityFilter() {
return filterPriority;
}
public void addFilter(AbstractTaskListFilter filter) {
if (!filters.contains(filter)) {
filters.add(filter);
}
}
public Set<AbstractTaskListFilter> clearFilters() {
HashSet<AbstractTaskListFilter> previousFilters = new HashSet<AbstractTaskListFilter>(getFilters());
previousFilters.remove(filterMyTasks);// this filter is always available for users to toggle
filters.clear();
filters.add(filterArchive);
filters.add(filterWorkingSet);
filters.add(filterPresentation);
boolean enableMyTasksFilter = TasksUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(ITasksUiPreferenceConstants.FILTER_MY_TASKS_MODE);
if (enableMyTasksFilter) {
filters.add(getMyTasksFilter());
}
return previousFilters;
}
public void removeFilter(AbstractTaskListFilter filter) {
filters.remove(filter);
}
public void updateDrillDownActions() {
actionGroup.updateDrillDownActions();
}
boolean isInRenameAction = false;
private TaskListRefreshJob refreshJob;
private boolean itemNotFoundExceptionLogged;
private AbstractSearchHandler searchHandler;
public void setInRenameAction(boolean b) {
isInRenameAction = b;
}
public void goIntoCategory() {
ISelection selection = getViewer().getSelection();
if (selection instanceof StructuredSelection) {
StructuredSelection structuredSelection = (StructuredSelection) selection;
Object element = structuredSelection.getFirstElement();
if (element instanceof ITaskContainer) {
drilledIntoCategory = (AbstractTaskContainer) element;
drillDownAdapter.goInto();
IActionBars bars = getViewSite().getActionBars();
bars.getToolBarManager().remove(actionGroup.getGoUpAction().getId());
bars.getToolBarManager().add(actionGroup.getGoUpAction());
bars.updateActionBars();
updateDrillDownActions();
}
}
}
public void goUpToRoot() {
drilledIntoCategory = null;
drillDownAdapter.goBack();
IActionBars bars = getViewSite().getActionBars();
bars.getToolBarManager().remove(GoUpAction.ID);
bars.updateActionBars();
updateDrillDownActions();
}
public AbstractTask getSelectedTask() {
ISelection selection = getViewer().getSelection();
if (selection.isEmpty()) {
return null;
}
if (selection instanceof StructuredSelection) {
StructuredSelection structuredSelection = (StructuredSelection) selection;
Object element = structuredSelection.getFirstElement();
if (element instanceof ITask) {
return (AbstractTask) structuredSelection.getFirstElement();
}
}
return null;
}
public static AbstractTask getSelectedTask(ISelection selection) {
if (selection instanceof StructuredSelection) {
StructuredSelection structuredSelection = (StructuredSelection) selection;
if (structuredSelection.size() != 1) {
return null;
}
Object element = structuredSelection.getFirstElement();
if (element instanceof ITask) {
return (AbstractTask) structuredSelection.getFirstElement();
}
}
return null;
}
public void indicatePaused(boolean paused) {
isPaused = paused;
IStatusLineManager statusLineManager = getViewSite().getActionBars().getStatusLineManager();
if (isPaused) {
statusLineManager.setMessage(CommonImages.getImage(TasksUiImages.TASKS_VIEW),
Messages.TaskListView_Mylyn_context_capture_paused);
setPartName(Messages.TaskListView__paused_ + LABEL_VIEW);
} else {
statusLineManager.setMessage(""); //$NON-NLS-1$
setPartName(LABEL_VIEW);
}
}
public AbstractTaskContainer getDrilledIntoCategory() {
return drilledIntoCategory;
}
@Override
public TaskListFilteredTree getFilteredTree() {
return filteredTree;
}
public void selectedAndFocusTask(ITask task) {
if (task == null || getViewer().getControl().isDisposed()) {
return;
}
saveSelection();
IStructuredSelection selection = restoreSelection(task);
try {
getViewer().setSelection(selection, true);
} catch (SWTError e) {
if (!itemNotFoundExceptionLogged) {
itemNotFoundExceptionLogged = true;
// It's probably not worth displaying this to the user since the item
// is not there in this case, so consider removing.
StatusHandler.log(
new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, "Could not link Task List with editor", //$NON-NLS-1$
e));
}
}
}
/**
* Persists the path of a selection.
*/
private void saveSelection() {
IStructuredSelection selection = (IStructuredSelection) getViewer().getSelection();
if (selection.size() == 1 && selection.getFirstElement() instanceof ITask) {
// make sure the new selection is inserted at the end of the
// list
String handle = ((IRepositoryElement) selection.getFirstElement()).getHandleIdentifier();
lastSelectionByTaskHandle.remove(handle);
lastSelectionByTaskHandle.put(handle, selection);
if (lastSelectionByTaskHandle.size() > SIZE_MAX_SELECTION_HISTORY) {
Iterator<String> it = lastSelectionByTaskHandle.keySet().iterator();
it.next();
it.remove();
}
}
}
/**
* If <code>task</code> was previously selected, a tree selection is returned that references the same path that was
* previously selected.
*/
private IStructuredSelection restoreSelection(ITask task) {
IStructuredSelection selection = lastSelectionByTaskHandle.get(task.getHandleIdentifier());
if (selection != null) {
return selection;
} else {
return new StructuredSelection(task);
}
}
public Image[] getPirorityImages() {
Image[] images = new Image[PriorityLevel.values().length];
for (int i = 0; i < PriorityLevel.values().length; i++) {
images[i] = TasksUiImages.getImageForPriority(PriorityLevel.values()[i]);
}
return images;
}
@Override
public Set<AbstractTaskListFilter> getFilters() {
return filters;
}
public static String getCurrentPriorityLevel() {
if (TasksUiPlugin.getDefault().getPreferenceStore().contains(ITasksUiPreferenceConstants.FILTER_PRIORITY)) {
return TasksUiPlugin.getDefault()
.getPreferenceStore()
.getString(ITasksUiPreferenceConstants.FILTER_PRIORITY);
} else {
return PriorityLevel.P5.toString();
}
}
public TaskArchiveFilter getArchiveFilter() {
return filterArchive;
}
private void updateFilterEnablement() {
boolean enabled = !isFocusedMode();
if (enabled) {
String filterText = filteredTree.getFilterString();
if (filterText != null && filterText.length() > 0) {
enabled = false;
}
}
sortDialogAction.setEnabled(enabled);
filterOnPriorityAction.setEnabled(enabled);
filterCompleteTask.setEnabled(enabled);
//filterArchiveCategory.setEnabled(enabled);
}
@Override
public boolean isScheduledPresentation() {
return currentPresentation != null && ScheduledPresentation.ID.equals(currentPresentation.getId());
}
@Override
public boolean isFocusedMode() {
return focusedMode;
}
@Override
protected boolean isAutoExpandMode() {
return TasksUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST);
}
public void setFocusedMode(boolean focusedMode) {
if (this.focusedMode == focusedMode) {
return;
}
this.focusedMode = focusedMode;
customDrawer.setFocusedMode(focusedMode);
IToolBarManager manager = getViewSite().getActionBars().getToolBarManager();
ToolBarManager toolBarManager = getToolBarManager(manager);
try {
if (toolBarManager != null) {
toolBarManager.getControl().setRedraw(false);
}
if (focusedMode && isAutoExpandMode()) {
manager.remove(FilterCompletedTasksAction.ID);
manager.remove(CollapseAllAction.ID);
} else if (manager.find(CollapseAllAction.ID) == null) {
manager.prependToGroup(ID_SEPARATOR_CONTEXT, collapseAll);
manager.prependToGroup(ID_SEPARATOR_CONTEXT, filterCompleteTask);
}
updateFilterEnablement();
getViewSite().getActionBars().updateActionBars();
} finally {
if (toolBarManager != null) {
toolBarManager.getControl().setRedraw(true);
}
}
}
private ToolBarManager getToolBarManager(IToolBarManager manager) {
if (manager instanceof ToolBarManager && ((ToolBarManager) manager).getControl() != null
&& !((ToolBarManager) manager).getControl().isDisposed()) {
return (ToolBarManager) manager;
}
return null;
}
public void displayPrioritiesAbove(String priority) {
filterPriority.displayPrioritiesAbove(priority);
getViewer().refresh();
}
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property)
|| IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property)) {
if (getSite() != null && getSite().getPage() != null) {
if (filterWorkingSet.updateWorkingSet(getSite().getPage().getAggregateWorkingSet())) {
try {
getViewer().getControl().setRedraw(false);
if (drilledIntoCategory != null) {
goUpToRoot();
}
getViewer().refresh();
if (isFocusedMode() && isAutoExpandMode()) {
getViewer().expandAll();
}
} finally {
getViewer().getControl().setRedraw(true);
}
}
}
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
filteredTree.indicateActiveTaskWorkingSet();
}
});
}
}
public void setLinkWithEditor(boolean linkWithEditor) {
this.linkWithEditor = linkWithEditor;
linkWithEditorAction.setChecked(linkWithEditor);
if (linkWithEditor) {
IEditorPart activeEditor = getSite().getPage().getActiveEditor();
if (activeEditor != null) {
jumpToEditorTask(activeEditor);
}
}
}
private void jumpToEditorTask(IEditorPart editor) {
IEditorInput input = editor.getEditorInput();
if (input instanceof TaskEditorInput) {
ITask task = ((TaskEditorInput) input).getTask();
ITask selected = getSelectedTask();
if (selected == null || !selected.equals(task)) {
selectedAndFocusTask(task);
}
}
}
@Override
protected void updateToolTip(boolean force) {
if (taskListToolTip != null && taskListToolTip.isVisible()) {
if (!force && taskListToolTip.isTriggeredByMouse()) {
return;
}
TreeItem[] selection = getViewer().getTree().getSelection();
if (selection != null && selection.length > 0) {
Rectangle bounds = selection[0].getBounds();
taskListToolTip.show(new Point(bounds.x + 1, bounds.y + 1));
}
}
}
/**
* This can be used for experimentally adding additional presentations, but note that this convention is extremely
* likely to change in the Mylyn 3.0 cycle.
*/
public static List<AbstractTaskListPresentation> getPresentations() {
List<AbstractTaskListPresentation> presentations = new ArrayList<AbstractTaskListPresentation>();
presentations.addAll(presentationsPrimary);
presentations.addAll(presentationsSecondary);
return presentations;
}
public static void addPresentation(AbstractTaskListPresentation presentation) {
if (presentation.isPrimary()) {
presentationsPrimary.add(presentation);
} else {
presentationsSecondary.add(presentation);
}
}
public TaskListSorter getSorter() {
return tableSorter;
}
public boolean show(ShowInContext context) {
ISelection selection = context.getSelection();
if (selection instanceof IStructuredSelection) {
getViewer().setSelection(selection, true);
return true;
}
return false;
}
private void updateTooltipEnablement() {
// Set to empty string to disable native tooltips (windows only?)
// bug#160897
// http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg29614.html
if (taskListToolTip != null) {
boolean enabled = TasksUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED);
taskListToolTip.setEnabled(enabled);
if (getViewer().getTree() != null && !getViewer().getTree().isDisposed()) {
getViewer().getTree().setToolTipText((enabled) ? "" : null); //$NON-NLS-1$
}
}
}
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class adapter) {
if (adapter == ISizeProvider.class) {
return new ISizeProvider() {
public int getSizeFlags(boolean width) {
if (width) {
return SWT.MIN;
}
return 0;
}
public int computePreferredSize(boolean width, int availableParallel, int availablePerpendicular,
int preferredResult) {
if (width) {
if (getViewSite().getActionBars().getToolBarManager() instanceof ToolBarManager) {
Point size = ((ToolBarManager) getViewSite().getActionBars().getToolBarManager())
.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
// leave some room for the view menu drop-down
return size.x + PlatformUiUtil.getViewMenuWidth();
}
}
return preferredResult;
}
};
} else if (adapter == IShowInTargetList.class) {
return new IShowInTargetList() {
public String[] getShowInTargetIds() {
return new String[] { "org.eclipse.team.ui.GenericHistoryView" }; //$NON-NLS-1$
}
};
} else if (adapter == IShowInSource.class) {
return new IShowInSource() {
public ShowInContext getShowInContext() {
return new ShowInContext(getViewer().getInput(), getViewer().getSelection());
}
};
}
return super.getAdapter(adapter);
}
public TaskListServiceMessageControl getServiceMessageControl() {
return serviceMessageControl;
}
public MyTasksFilter getMyTasksFilter() {
return filterMyTasks;
}
}