blob: a1c131122f576005d5904f5c4f51d09c2a0e6b0e [file] [log] [blame]
package org.eclipse.ui.views.tasklist;
/**********************************************************************
Copyright (c) 2000, 2001, 2002, International Business Machines Corp and others.
All rights reserved.   This program and the accompanying materials
are made available under the terms of the Common Public License v0.5
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v05.html
 
Contributors:
Cagatay Kavukcuoglu <cagatayk@acm.org> - Filter for markers in same project
**********************************************************************/
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.*;
import org.eclipse.ui.*;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.part.*;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* Main class for the Task List view for displaying tasks and problem annotations
* on resources, and for opening an editor on the resource when the user commands.
* <p>
* This standard view has id <code>"org.eclipse.ui.views.TaskList"</code>.
* </p>
* <p>
* The workbench will automatically instantiate this class when a Task List
* view is needed for a workbench window. This class is not intended
* to be instantiated or subclassed by clients.
* </p>
*/
public class TaskList extends ViewPart {
private Table table;
private TableEditor tableEditor;
private MenuManager contextMenu;
private CellEditor descriptionEditor;
private TableViewer viewer;
private TasksFilter filter = new TasksFilter();
private IMemento memento;
private boolean markerLimitExceeded;
private Composite parent;
private StackLayout stackLayout = new StackLayout();
private Composite compositeMarkerLimitExceeded;
private CellEditorActionHandler editorActionHandler;
private TaskAction newTaskAction;
private TaskAction copyTaskAction;
private TaskAction pasteTaskAction;
private TaskAction removeTaskAction;
private TaskAction purgeCompletedAction;
private TaskAction gotoTaskAction;
private TaskAction selectAllAction;
private TaskAction resolveMarkerAction;
private TaskAction filtersAction;
private TaskAction markCompletedAction;
private TaskAction propertiesAction;
private Clipboard clipboard;
private static String[] tableColumnProperties = {
IBasicPropertyConstants.P_IMAGE,
IMarker.DONE,
IMarker.PRIORITY,
IMarker.MESSAGE,
IMarkerConstants.P_RESOURCE_NAME,
IMarkerConstants.P_CONTAINER_NAME,
IMarkerConstants.P_LINE_AND_LOCATION};
// Persistance tags.
private static final String TAG_COLUMN = "column"; //$NON-NLS-1$
private static final String TAG_NUMBER = "number"; //$NON-NLS-1$
private static final String TAG_WIDTH = "width"; //$NON-NLS-1$
private static final String TAG_SORTER_COLUMN = "sorterColumn"; //$NON-NLS-1$
private static final String TAG_SORTER_REVERSED = "sorterReversed"; //$NON-NLS-1$
private static final String TAG_FILTER = "filter"; //$NON-NLS-1$
private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
private static final String TAG_ID = "id"; //$NON-NLS-1$
private static final String TAG_MARKER = "marker"; //$NON-NLS-1$
private static final String TAG_RESOURCE = "resource"; //$NON-NLS-1$
private static final String TAG_TOP_INDEX = "topIndex"; //$NON-NLS-1$
static class TaskListLabelProvider
extends LabelProvider
implements ITableLabelProvider {
private static String[] keys = {
IBasicPropertyConstants.P_IMAGE,
IMarkerConstants.P_COMPLETE_IMAGE,
IMarkerConstants.P_PRIORITY_IMAGE,
IMarker.MESSAGE,
IMarkerConstants.P_RESOURCE_NAME,
IMarkerConstants.P_CONTAINER_NAME,
IMarkerConstants.P_LINE_AND_LOCATION};
public String getColumnText(Object element, int columnIndex) {
if (columnIndex >= 3 && columnIndex <= 6)
return (String) MarkerUtil.getProperty(element, keys[columnIndex]);
return ""; //$NON-NLS-1$
}
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex >= 0 && columnIndex <= 2) {
return (Image) MarkerUtil.getProperty(element, keys[columnIndex]);
}
return null;
}
}
private String columnHeaders[] = {
TaskListMessages.getString("TaskList.headerIcon"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.headerCompleted"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.headerPriority"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.headerDescription"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.headerResource"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.headerFolder"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.headerLocation") //$NON-NLS-1$
};
private ColumnLayoutData columnLayouts[] = {
new ColumnPixelData(19, false),
new ColumnPixelData(19, false),
new ColumnPixelData(19, false),
new ColumnWeightData(200),
new ColumnWeightData(75),
new ColumnWeightData(150),
new ColumnWeightData(60)};
private IPartListener partListener = new IPartListener() {
public void partActivated(IWorkbenchPart part) {
TaskList.this.partActivated(part);
}
public void partBroughtToTop(IWorkbenchPart part) {
}
public void partClosed(IWorkbenchPart part) {
TaskList.this.partClosed(part);
}
public void partDeactivated(IWorkbenchPart part) {
}
public void partOpened(IWorkbenchPart part) {
}
};
private ISelectionChangedListener focusSelectionChangedListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
TaskList.this.focusSelectionChanged(event);
}
};
private IResource[] focusResources;
private IWorkbenchPart focusPart;
private ISelectionProvider focusSelectionProvider;
private ICellModifier cellModifier = new ICellModifier() {
public Object getValue(Object element, String property) {
return MarkerUtil.getProperty(element,property);
}
public boolean canModify(Object element, String property) {
IMarker marker = (IMarker) element;
return MarkerUtil.isMarkerType(marker, IMarker.TASK);
}
/**
* Modifies a marker as a result of a successfully completed direct editing.
*/
public void modify(Object element, String property, Object value) {
Item item = (Item) element;
IMarker marker = (IMarker) item.getData();
setProperty(marker, property, value);
}
};
/**
* Creates a new task list view.
*/
public TaskList() {
super();
}
void addDragSupport(Control control) {
int operations = DND.DROP_COPY;
Transfer[] transferTypes = new Transfer[]{MarkerTransfer.getInstance(),
TextTransfer.getInstance()};
DragSourceListener listener = new DragSourceAdapter() {
public void dragSetData(DragSourceEvent event){
performDragSetData(event);
}
public void dragFinished(DragSourceEvent event){
}
};
viewer.addDragSupport(operations, transferTypes, listener);
}
void cancelEditing() {
getTableViewer().cancelEditing();
}
void createColumns() {
/**
* This class handles selections of the column headers.
* Selection of the column header will cause resorting
* of the shown tasks using that column's sorter.
* Repeated selection of the header will toggle
* sorting order (ascending versus descending).
*/
SelectionListener headerListener = new SelectionAdapter() {
/**
* Handles the case of user selecting the
* header area.
* <p>If the column has not been selected previously,
* it will set the sorter of that column to be
* the current tasklist sorter. Repeated
* presses on the same column header will
* toggle sorting order (ascending/descending).
*/
public void widgetSelected(SelectionEvent e) {
// column selected - need to sort
int column = table.indexOf((TableColumn) e.widget);
TaskSorter oldSorter = (TaskSorter) viewer.getSorter();
if (oldSorter != null && column == oldSorter.getColumnNumber()) {
oldSorter.setReversed(!oldSorter.isReversed());
viewer.refresh();
} else {
viewer.setSorter(new TaskSorter(TaskList.this, column));
}
}
};
if(memento != null) {
//restore columns width
IMemento children[] = memento.getChildren(TAG_COLUMN);
if (children != null) {
for (int i = 0; i < children.length; i++) {
Integer val = children[i].getInteger(TAG_NUMBER);
if (val != null) {
int index = val.intValue();
val = children[i].getInteger(TAG_WIDTH);
if (val != null) {
columnLayouts[index] = new ColumnPixelData(val.intValue(), true);
}
}
}
}
}
TableLayout layout = new TableLayout();
table.setLayout(layout);
table.setHeaderVisible(true);
for (int i = 0; i < columnHeaders.length; i++) {
layout.addColumnData(columnLayouts[i]);
TableColumn tc = new TableColumn(table, SWT.NONE,i);
tc.setResizable(columnLayouts[i].resizable);
tc.setText(columnHeaders[i]);
tc.addSelectionListener(headerListener);
}
}
/**
* Returns a string that summarizes the contents of the
* given markers.
*/
/*package*/ static String createMarkerReport(IMarker[] markers) {
StringBuffer buf = new StringBuffer();
// Create the header
buf.append(TaskListMessages.getString("TaskList.reportKind")); //$NON-NLS-1$
buf.append("\t"); //$NON-NLS-1$
buf.append(TaskListMessages.getString("TaskList.reportStatus")); //$NON-NLS-1$
buf.append("\t"); //$NON-NLS-1$
buf.append(TaskListMessages.getString("TaskList.reportPriority")); //$NON-NLS-1$
buf.append("\t"); //$NON-NLS-1$
buf.append(TaskListMessages.getString("TaskList.headerDescription")); //$NON-NLS-1$
buf.append("\t"); //$NON-NLS-1$
buf.append(TaskListMessages.getString("TaskList.headerResource")); //$NON-NLS-1$
buf.append("\t"); //$NON-NLS-1$
buf.append(TaskListMessages.getString("TaskList.headerFolder")); //$NON-NLS-1$
buf.append("\t"); //$NON-NLS-1$
buf.append(TaskListMessages.getString("TaskList.headerLocation")); //$NON-NLS-1$
buf.append(System.getProperty("line.separator")); //$NON-NLS-1$
// Create the report for the markers
for (int i = 0; i < markers.length; i++) {
writeMarker(buf, markers[i]);
}
return buf.toString();
}
/* package */ boolean isMarkerLimitExceeded() {
return markerLimitExceeded;
}
/* package */ void setMarkerLimitExceeded(boolean markerLimitExceeded) {
this.markerLimitExceeded = markerLimitExceeded;
if (markerLimitExceeded) {
stackLayout.topControl = compositeMarkerLimitExceeded;
}
else {
stackLayout.topControl = table;
}
parent.layout();
}
/* (non-Javadoc)
* Method declared on IWorkbenchPart.
*/
public void createPartControl(Composite parent) {
this.parent = parent;
clipboard = new Clipboard(parent.getDisplay());
createTable(parent);
viewer = new TableViewer(table);
viewer.setUseHashlookup(true);
createColumns();
makeActions();
fillActionBars();
addDragSupport(table);
compositeMarkerLimitExceeded = new Composite(parent, SWT.NONE);
compositeMarkerLimitExceeded.setLayout(new GridLayout());
Label labelMarkerLimitExceeded = new Label(compositeMarkerLimitExceeded,
SWT.WRAP);
labelMarkerLimitExceeded.setText(TaskListMessages.getString(
"TaskList.markerLimitExceeded")); //$NON-NLS-1$
parent.setLayout(stackLayout);
setMarkerLimitExceeded(false);
viewer.setContentProvider(new TaskListContentProvider(this));
viewer.setLabelProvider(new TaskListLabelProvider());
viewer.setSorter(new TaskSorter(this, 5));
if(memento != null) {
//restore filter
IMemento filterMem = memento.getChild(TAG_FILTER);
if(filterMem != null)
getFilter().restoreState(filterMem);
//restore sorter
Integer columnNumber = memento.getInteger(TAG_SORTER_COLUMN);
if(columnNumber != null) {
boolean reversed = memento.getInteger(TAG_SORTER_REVERSED).intValue() == 1;
TaskSorter sorter = new TaskSorter(this, columnNumber.intValue());
sorter.setReversed(reversed);
viewer.setSorter(sorter);
}
}
viewer.setInput(getWorkspace().getRoot());
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
TaskList.this.selectionChanged(event);
}
});
viewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
gotoTaskAction.run();
}
});
viewer.getControl().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
handleKeyPressed(e);
}
});
CellEditor editors[] = new CellEditor[columnHeaders.length];
editors[1] = new CheckboxCellEditor(table);
editors[2] = new ComboBoxCellEditor(table,new String[] {
TaskListMessages.getString("TaskList.high"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.normal"), //$NON-NLS-1$
TaskListMessages.getString("TaskList.low") //$NON-NLS-1$
});
editors[3] = descriptionEditor = new TextCellEditor(table);
viewer.setCellEditors(editors);
viewer.setCellModifier(cellModifier);
viewer.setColumnProperties(tableColumnProperties);
// Configure the context menu to be lazily populated on each pop-up.
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(
new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
TaskList.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(table);
table.setMenu(menu);
// Be sure to register it so that other plug-ins can add actions.
getSite().registerContextMenu(menuMgr, viewer);
this.contextMenu = menuMgr;
// Track selection in the page.
getSite().getPage().addPartListener(partListener);
// Add global action handlers.
editorActionHandler = new CellEditorActionHandler(getViewSite().getActionBars());
editorActionHandler.addCellEditor(descriptionEditor);
editorActionHandler.setCopyAction(copyTaskAction);
editorActionHandler.setPasteAction(pasteTaskAction);
editorActionHandler.setDeleteAction(removeTaskAction);
editorActionHandler.setSelectAllAction(selectAllAction);
getViewSite().getActionBars().setGlobalActionHandler(
IWorkbenchActionConstants.PROPERTIES,
propertiesAction);
if (memento != null) restoreState(memento);
memento = null;
// Set help on the view itself
viewer.getControl().addHelpListener(new HelpListener() {
/*
* @see HelpListener#helpRequested(HelpEvent)
*/
public void helpRequested(HelpEvent e) {
String contextId = null;
// See if there is a context registered for the current selection
IMarker marker = (IMarker)((IStructuredSelection)getSelection()).getFirstElement();
if (marker != null) {
IWorkbench workbench = getViewSite().getWorkbenchWindow().getWorkbench();
contextId = workbench.getMarkerHelpRegistry().getHelp(marker);
}
if (contextId == null)
contextId = ITaskListHelpContextIds.TASK_LIST_VIEW;
WorkbenchHelp.displayHelp(contextId);
}
});
// Prime the status line and title.
updateStatusMessage();
updateTitle();
}
/**
* Creates the table control.
*/
void createTable(Composite parent) {
table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
table.setLinesVisible(true);
//table.setLayout(new TableLayout());
tableEditor = new TableEditor(table);
}
/* (non-Javadoc)
* Method declared on IWorkbenchPart.
*/
public void dispose() {
super.dispose();
getSite().getPage().removePartListener(partListener);
if (focusSelectionProvider != null) {
focusSelectionProvider.removeSelectionChangedListener(focusSelectionChangedListener);
focusSelectionProvider = null;
}
focusPart = null;
if (editorActionHandler != null) {
editorActionHandler.dispose();
editorActionHandler = null;
}
if (clipboard != null)
clipboard.dispose();
}
/**
* Activates the editor on the given marker.
*/
public void edit(IMarker marker) {
viewer.editElement(marker, 3);
}
/**
* Fills the local tool bar and menu manager with actions.
*/
void fillActionBars() {
IActionBars actionBars = getViewSite().getActionBars();
IMenuManager menu = actionBars.getMenuManager();
menu.add(filtersAction);
IToolBarManager toolBar = actionBars.getToolBarManager();
toolBar.add(newTaskAction);
toolBar.add(removeTaskAction);
toolBar.add(filtersAction);
}
/**
* Contributes actions to the pop-up menu.
*/
void fillContextMenu(IMenuManager menu) {
menu.add(newTaskAction);
menu.add(gotoTaskAction);
menu.add(new Separator());
menu.add(copyTaskAction);
menu.add(pasteTaskAction);
menu.add(removeTaskAction);
menu.add(new Separator());
menu.add(markCompletedAction);
menu.add(purgeCompletedAction);
menu.add(new Separator());
menu.add(resolveMarkerAction);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end")); //$NON-NLS-1$
menu.add(propertiesAction);
}
/**
* The filter settings have changed.
* Refreshes the viewer and title bar.
*/
void filterChanged() {
BusyIndicator.showWhile(viewer.getControl().getShell().getDisplay(), new Runnable() {
public void run() {
// Filter has already been updated by dialog; just refresh.
// Don't need to update labels for existing elements
// since changes to filter settings don't affect them.
viewer.getControl().setRedraw(false);
viewer.refresh(false);
viewer.getControl().setRedraw(true);
// update after refresh since the content provider caches summary info
updateStatusMessage();
updateTitle();}
});
}
void focusSelectionChanged(SelectionChangedEvent event) {
updateFocusResource(event.getSelection());
}
/**
* Returns a clipboard for cut/copy/paste actions.
* <p>
* May only be called after this part's viewer has been created.
* The clipboard is disposed when this part is disposed.
* </p>
* @return a clipboard
* @since 2.0
*/
/*package*/ Clipboard getClipboard() {
return clipboard;
}
/**
* Returns the filter for the viewer.
*/
TasksFilter getFilter() {
return filter;
}
/**
* Returns the UI plugin for the task list.
*/
static AbstractUIPlugin getPlugin() {
return (AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
}
/**
* Returns the resource for which the task list is showing tasks.
*
* @return the resource, possibly the workspace root
*/
public IResource getResource() {
if (showSelections()) {
if (focusResources != null && focusResources.length >= 1 && focusResources[0] != null) {
return focusResources[0];
}
}
return getWorkspace().getRoot();
}
public IResource[] getResources() {
if (showSelections()) {
if (focusResources != null) {
return focusResources;
}
}
return new IResource[] { getWorkspace().getRoot() };
}
/**
* Returns the resource depth which the task list is using to show tasks.
*
* @return an <code>IResource.DEPTH_*</code> constant
*/
int getResourceDepth() {
if (showSelections() && !showChildrenHierarchy())
return IResource.DEPTH_ZERO;
else
return IResource.DEPTH_INFINITE;
}
/**
* API method which returns the current selection.
*
* @return the current selection (element type: <code>IMarker</code>)
*/
public ISelection getSelection() {
return viewer.getSelection();
}
/**
* Returns the message to display in the status line.
*/
String getStatusMessage(IStructuredSelection selection) {
if (selection.size() == 1) {
IMarker marker = (IMarker) selection.getFirstElement();
return MarkerUtil.getMessage(marker);
}
TaskListContentProvider provider = (TaskListContentProvider) viewer.getContentProvider();
if (selection.size() > 1) {
return provider.getStatusSummarySelected(selection);
} else {
return provider.getStatusSummaryVisible();
}
}
/**
* When created, new task instance is cached in
* order to keep it at the top of the list until
* first edited. This method returns it, or
* null if there is no task instance pending
* for first editing.
*/
TableViewer getTableViewer() {
return viewer;
}
/**
* Returns the workspace.
*/
IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
/**
* Handles key events in viewer.
*/
void handleKeyPressed(KeyEvent event) {
if (event.character == SWT.DEL && event.stateMask == 0
&& removeTaskAction.isEnabled())
removeTaskAction.run();
}
/* (non-Javadoc)
* Method declared on IViewPart.
*/
public void init(IViewSite site,IMemento memento) throws PartInitException {
super.init(site,memento);
this.memento = memento;
}
/**
* Returns whether we are interested in the given marker delta.
*/
boolean isAffectedBy(IMarkerDelta markerDelta) {
return checkResource(markerDelta.getResource()) && getFilter().select(markerDelta);
}
/**
* Returns whether we are interested in markers on the given resource.
*/
boolean checkResource(IResource resource) {
if (!showSelections()) {
return true;
}
IResource[] resources = getResources();
IResource resource2;
if (showOwnerProject()) {
IProject project;
for (int i = 0, l = resources.length; i < l; i++) {
resource2 = resources[i];
if (resource2 == null) {
return true;
}
else {
project = resource2.getProject();
if (project == null || project.equals(resource.getProject())) {
return true;
}
}
}
}
if (showChildrenHierarchy()) {
for (int i = 0, l = resources.length; i < l; i++) {
resource2 = resources[i];
if (resource2 != null &&
resource2.getFullPath().isPrefixOf(resource.getFullPath())) {
return true;
}
}
}
else {
for (int i = 0, l = resources.length; i < l; i++) {
resource2 = resources[i];
if (resource.equals(resource2)) {
return true;
}
}
}
return false;
}
/**
* Returns whether the given marker should be shown,
* given the current filter settings.
*/
boolean shouldShow(IMarker marker) {
return checkResource(marker.getResource()) && getFilter().select(marker);
}
/**
* Makes actions used in the local tool bar and
* popup menu.
*/
void makeActions() {
// goto
gotoTaskAction = new GotoTaskAction(this, "gotoFile"); //$NON-NLS-1$
gotoTaskAction.setText(TaskListMessages.getString("GotoTask.text")); //$NON-NLS-1$
gotoTaskAction.setToolTipText(TaskListMessages.getString("GotoTask.tooltip")); //$NON-NLS-1$
gotoTaskAction.setHoverImageDescriptor(MarkerUtil.getImageDescriptor("gotoobj")); //$NON-NLS-1$
gotoTaskAction.setImageDescriptor(MarkerUtil.getImageDescriptor("gotoobj_grey")); //$NON-NLS-1$
gotoTaskAction.setEnabled(false);
// new task
newTaskAction = new NewTaskAction(this, "newTask"); //$NON-NLS-1$
newTaskAction.setText(TaskListMessages.getString("NewTask.text")); //$NON-NLS-1$
newTaskAction.setToolTipText(TaskListMessages.getString("NewTask.tooltip")); //$NON-NLS-1$
newTaskAction.setHoverImageDescriptor(MarkerUtil.getImageDescriptor("addtsk")); //$NON-NLS-1$
newTaskAction.setImageDescriptor(MarkerUtil.getImageDescriptor("addtsk_grey")); //$NON-NLS-1$
newTaskAction.setDisabledImageDescriptor(MarkerUtil.getImageDescriptor("addtsk_disabled")); //$NON-NLS-1$
// copy task
copyTaskAction = new CopyTaskAction(this, "copy"); //$NON-NLS-1$
copyTaskAction.setText(TaskListMessages.getString("CopyTask.text")); //$NON-NLS-1$
copyTaskAction.setToolTipText(TaskListMessages.getString("CopyTask.tooltip")); //$NON-NLS-1$
copyTaskAction.setHoverImageDescriptor(MarkerUtil.getImageDescriptor("copy")); //$NON-NLS-1$
copyTaskAction.setEnabled(false);
// paste task
pasteTaskAction = new PasteTaskAction(this, "paste"); //$NON-NLS-1$
pasteTaskAction.setText(TaskListMessages.getString("PasteTask.text")); //$NON-NLS-1$
pasteTaskAction.setToolTipText(TaskListMessages.getString("PasteTask.tooltip")); //$NON-NLS-1$
pasteTaskAction.setHoverImageDescriptor(MarkerUtil.getImageDescriptor("paste")); //$NON-NLS-1$
pasteTaskAction.setEnabled(false);
// remove task
removeTaskAction = new RemoveTaskAction(this, "delete"); //$NON-NLS-1$
removeTaskAction.setText(TaskListMessages.getString("RemoveTask.text")); //$NON-NLS-1$
removeTaskAction.setToolTipText(TaskListMessages.getString("RemoveTask.tooltip")); //$NON-NLS-1$
removeTaskAction.setHoverImageDescriptor(MarkerUtil.getImageDescriptor("remtsk")); //$NON-NLS-1$
removeTaskAction.setImageDescriptor(MarkerUtil.getImageDescriptor("remtsk_grey")); //$NON-NLS-1$
removeTaskAction.setDisabledImageDescriptor(MarkerUtil.getImageDescriptor("remtsk_disabled")); //$NON-NLS-1$
removeTaskAction.setEnabled(false);
//mark completed task
markCompletedAction = new MarkCompletedAction(this,"markCompleted"); //$NON-NLS-1$
markCompletedAction.setText(TaskListMessages.getString("MarkCompleted.text")); //$NON-NLS-1$
markCompletedAction.setToolTipText(TaskListMessages.getString("MarkCompleted.tooltip")); //$NON-NLS-1$
markCompletedAction.setEnabled(false);
//delete completed task
purgeCompletedAction = new PurgeCompletedAction(this, "deleteCompleted"); //$NON-NLS-1$
purgeCompletedAction.setText(TaskListMessages.getString("PurgeCompleted.text")); //$NON-NLS-1$
purgeCompletedAction.setToolTipText(TaskListMessages.getString("PurgeCompleted.tooltip")); //$NON-NLS-1$
purgeCompletedAction.setImageDescriptor(MarkerUtil.getImageDescriptor("delete_edit")); //$NON-NLS-1$
purgeCompletedAction.setEnabled(true);
// select all
selectAllAction = new SelectAllTasksAction(this, "selectAll"); //$NON-NLS-1$
selectAllAction.setText(TaskListMessages.getString("SelectAll.text")); //$NON-NLS-1$
selectAllAction.setToolTipText(TaskListMessages.getString("SelectAll.tooltip")); //$NON-NLS-1$
// resolutions
resolveMarkerAction = new ResolveMarkerAction(this, "resolve"); //$NON-NLS-1$
resolveMarkerAction.setText(TaskListMessages.getString("Resolve.text")); //$NON-NLS-1$
resolveMarkerAction.setToolTipText(TaskListMessages.getString("Resolve.tooltip")); //$NON-NLS-1$
// filters...
filtersAction = new FiltersAction(this, "filter"); //$NON-NLS-1$
filtersAction.setText(TaskListMessages.getString("Filters.text")); //$NON-NLS-1$
filtersAction.setToolTipText(TaskListMessages.getString("Filters.tooltip")); //$NON-NLS-1$
filtersAction.setImageDescriptor(MarkerUtil.getImageDescriptor("filter")); //$NON-NLS-1$
// properties
propertiesAction = new TaskPropertiesAction(this, "properties"); //$NON-NLS-1$
propertiesAction.setText(TaskListMessages.getString("Properties.text")); //$NON-NLS-1$
propertiesAction.setToolTipText(TaskListMessages.getString("Properties.tooltip")); //$NON-NLS-1$
propertiesAction.setEnabled(false);
}
/**
* The markers have changed. Update the status line and title bar.
*/
void markersChanged() {
updateStatusMessage();
updateTitle();
}
void partActivated(IWorkbenchPart part) {
if (part == focusPart)
return;
if (focusSelectionProvider != null) {
focusSelectionProvider.removeSelectionChangedListener(focusSelectionChangedListener);
focusSelectionProvider = null;
}
focusPart = part;
if (focusPart != null) {
focusSelectionProvider = focusPart.getSite().getSelectionProvider();
if (focusSelectionProvider != null) {
focusSelectionProvider.addSelectionChangedListener(focusSelectionChangedListener);
updateFocusResource(focusSelectionProvider.getSelection());
}
else {
updateFocusResource(null);
}
}
}
void partClosed(IWorkbenchPart part) {
if (part != focusPart)
return;
if (focusSelectionProvider != null) {
focusSelectionProvider.removeSelectionChangedListener(focusSelectionChangedListener);
focusSelectionProvider = null;
}
focusPart = null;
}
/**
* The user is attempting to drag marker data. Add the appropriate
* data to the event depending on the transfer type.
*/
void performDragSetData(DragSourceEvent event) {
if (MarkerTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = ((IStructuredSelection) viewer.getSelection()).toArray();
return;
}
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
Object[] data = ((IStructuredSelection) viewer.getSelection()).toArray();
if (data != null) {
IMarker[] markers = new IMarker[data.length];
for (int i = 0; i < markers.length; i++) {
markers[i] = (IMarker)data[i];
}
event.data = createMarkerReport(markers);
}
return;
}
}
void restoreState(IMemento memento) {
//restore selection
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IMemento selectionMem = memento.getChild(TAG_SELECTION);
if(selectionMem != null) {
ArrayList selectionList = new ArrayList();
IMemento markerMems[] = selectionMem.getChildren(TAG_MARKER);
for (int i = 0; i < markerMems.length; i++){
try {
long id = Long.parseLong(markerMems[i].getString(TAG_ID));
IResource resource = root.findMember(markerMems[i].getString(TAG_RESOURCE));
if(resource != null) {
IMarker marker = resource.findMarker(id);
if (marker != null) {
selectionList.add(marker);
}
}
} catch (NumberFormatException e) {
} catch (CoreException e) {
}
}
viewer.setSelection(new StructuredSelection(selectionList));
}
Table table = viewer.getTable();
//restore vertical position
try {
String topIndexStr = memento.getString(TAG_TOP_INDEX);
table.setTopIndex(Integer.parseInt(topIndexStr));
} catch (NumberFormatException e) {}
}
/* (non-Javadoc)
* Method declared on IViewPart.
*/
public void saveState(IMemento memento) {
if(viewer == null) {
if(this.memento != null) //Keep the old state;
memento.putMemento(this.memento);
return;
}
//save filter
getFilter().saveState(memento.createChild(TAG_FILTER));
//save sorter
TaskSorter sorter = (TaskSorter) viewer.getSorter();
memento.putInteger(TAG_SORTER_COLUMN,sorter.getColumnNumber());
memento.putInteger(TAG_SORTER_REVERSED,sorter.isReversed()?1:0);
//save columns width
Table table = viewer.getTable();
TableColumn columns[] = table.getColumns();
//check whether it has ever been layed out
//workaround for 1GDTU19: ITPUI:WIN2000 - Task list columns "collapsed" left
boolean shouldSave = false;
for (int i = 0; i < columns.length; i++) {
if (columnLayouts[i].resizable && columns[i].getWidth() != 0) {
shouldSave = true;
break;
}
}
if (shouldSave) {
for (int i = 0; i < columns.length; i++) {
if (columnLayouts[i].resizable) {
IMemento child = memento.createChild(TAG_COLUMN);
child.putInteger(TAG_NUMBER,i);
child.putInteger(TAG_WIDTH,columns[i].getWidth());
}
}
}
//save selection
Object markers[] = ((IStructuredSelection)viewer.getSelection()).toArray();
if(markers.length > 0) {
IMemento selectionMem = memento.createChild(TAG_SELECTION);
for (int i = 0; i < markers.length; i++) {
IMemento elementMem = selectionMem.createChild(TAG_MARKER);
IMarker marker = (IMarker)markers[i];
elementMem.putString(TAG_RESOURCE,marker.getResource().getFullPath().toString());
elementMem.putString(TAG_ID,String.valueOf(marker.getId()));
}
}
//save vertical position
int topIndex = table.getTopIndex();
memento.putString(TAG_TOP_INDEX,String.valueOf(topIndex));
}
/**
* Handles marker selection change in the task list by updating availability of
* the actions in the local tool bar.
*/
void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
updateStatusMessage(selection);
updateTitle();
updatePasteEnablement();
// If selection is empty, then disable copy, remove and goto.
if (selection.isEmpty()) {
copyTaskAction.setEnabled(false);
removeTaskAction.setEnabled(false);
gotoTaskAction.setEnabled(false);
propertiesAction.setEnabled(false);
return;
};
// Can only open properties for a single task at a time
propertiesAction.setEnabled(selection.size() == 1);
// Can always copy
copyTaskAction.setEnabled(true);
// Determine if goto should be enabled
IMarker selectedMarker = (IMarker) selection.getFirstElement();
boolean canJump = selection.size() == 1 && selectedMarker.getResource().getType() == IResource.FILE;
gotoTaskAction.setEnabled(canJump);
// Determine if remove should be enabled
boolean canRemove = true;
for (Iterator markers = selection.iterator(); markers.hasNext();) {
IMarker m = (IMarker) markers.next();
if (!MarkerUtil.isMarkerType(m, IMarker.TASK)) {
canRemove = false;
break;
}
}
removeTaskAction.setEnabled(canRemove);
// if there is an active editor on the selection's input, tell
// the editor to goto the marker
if (canJump) {
IEditorPart editor = getSite().getPage().getActiveEditor();
if (editor != null) {
IEditorInput input = editor.getEditorInput();
if (input instanceof IFileEditorInput) {
IFile file = ((IFileEditorInput)input).getFile();
if (selectedMarker.getResource().equals(file))
editor.gotoMarker(selectedMarker);
}
}
}
}
/* (non-Javadoc)
* Method declared on IWorkbenchPart.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
/**
* Sets the property on a marker to the given value.
*
* @exception CoreException if an error occurs setting the value
*/
void setProperty(IMarker marker, String property, Object value) {
if (MarkerUtil.getProperty(marker, property).equals(value)) {
return;
}
try {
if (property == tableColumnProperties[1]) { // Completed
marker.setAttribute(IMarker.DONE, value);
} else if (property == tableColumnProperties[2]) { // Priority
// this property is used only by cell editor, where order is High, Normal, Low
marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH - ((Integer) value).intValue());
} else if (property == tableColumnProperties[3]) { // Description
marker.setAttribute(IMarker.MESSAGE, value);
// Let's not refilter too lightly - see if it is needed
// TaskSorter sorter = (TaskSorter) viewer.getSorter();
// if (sorter != null && sorter.getColumnNumber() == 3) {
// viewer.refresh();
// }
}
}
catch (CoreException e) {
String msg = TaskListMessages.getString("TaskList.errorModifyingTask"); //$NON-NLS-1$
ErrorDialog.openError(getSite().getShell(), msg, null, e.getStatus());
}
}
/**
* API method which sets the current selection of this viewer.
*
* @param selection a structured selection of <code>IMarker</code> objects
* @param reveal <code>true</code> to reveal the selection, <false> otherwise
*/
public void setSelection(ISelection selection, boolean reveal) {
Assert.isTrue(selection instanceof IStructuredSelection);
IStructuredSelection ssel = (IStructuredSelection) selection;
for (Iterator i = ssel.iterator(); i.hasNext();)
Assert.isTrue(i.next() instanceof IMarker);
viewer.setSelection(selection, reveal);
}
boolean showChildrenHierarchy() {
switch (getFilter().onResource) {
case TasksFilter.ON_ANY_RESOURCE:
case TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN:
case TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT: // added by cagatayk@acm.org
case TasksFilter.ON_WORKING_SET:
default:
return true;
case TasksFilter.ON_SELECTED_RESOURCE_ONLY:
return false;
}
}
boolean showSelections() {
switch (getFilter().onResource) {
case TasksFilter.ON_SELECTED_RESOURCE_ONLY:
case TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN:
case TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT: // added by cagatayk@acm.org
return true;
case TasksFilter.ON_ANY_RESOURCE:
case TasksFilter.ON_WORKING_SET:
default:
return false;
}
}
// showOwnerProject() added by cagatayk@acm.org
boolean showOwnerProject() {
return getFilter().onResource == TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT;
}
/**
* Processes state change of the 'showSelections' switch.
* If true, it will resync with the saved input element.
* Otherwise, it will reconfigure to show all the
* problems/tasks in the workbench.
*/
void toggleInputSelection(boolean value) {
/*
if (value) {
handleInput(inputSelection, false);
} else {
// detach from input and link to the workbench object
handleInput(WorkbenchPlugin.getPluginWorkbench(), true);
}
updateTitle();
*/
}
/**
* If true, current input will be
* remembered and further selections will be
* ignored.
*/
void toggleLockInput(boolean value) {
/*
if (!value) {
handleInput(inputSelection, false);
lockedInput = null;
} else {
lockedInput = (IElement) getInput();
}
String lockedInputPath = "";
if (lockedInput != null && lockedInput instanceof IResource) {
IResource resource = (IResource) lockedInput;
lockedInputPath = resource.getFullPath().toString();
}
IDialogStore store = WorkbenchPlugin.getDefault().getDialogStore();
store.put(STORE_LOCKED_INPUT, lockedInputPath);
updateTitle();
*/
}
/**
* Updates the focus resource, and refreshes if we're showing only tasks for the focus resource.
*/
void updateFocusResource(ISelection selection) {
java.util.List list = new ArrayList();
if (selection instanceof IStructuredSelection) {
Iterator iterator = ((IStructuredSelection) selection).iterator();
Object object;
Object adapter;
ITaskListResourceAdapter taskListResourceAdapter;
if (iterator != null) {
while (iterator.hasNext()) {
object = iterator.next();
if (object instanceof IAdaptable) {
adapter = ((IAdaptable) object).getAdapter(ITaskListResourceAdapter.class);
if (adapter != null) {
taskListResourceAdapter = (ITaskListResourceAdapter) adapter;
}
else {
taskListResourceAdapter = DefaultTaskListResourceAdapter.getDefault();
}
list.add(taskListResourceAdapter.getAffectedResource((IAdaptable) object));
}
}
}
}
if (list.size() == 0 && focusPart instanceof IEditorPart) {
IEditorInput input = ((IEditorPart) focusPart).getEditorInput();
if (input != null) {
if (input instanceof IFileEditorInput) {
list.add(((IFileEditorInput) input).getFile());
}
else {
IResource resource = (IResource) input.getAdapter(IResource.class);
if (resource == null) {
resource = (IFile) input.getAdapter(IFile.class);
}
list.add(resource);
}
}
}
IResource[] resources = (IResource[]) list.toArray(new IResource[list.size()]);
if (resources.length < 1) {
return; // required to achieve lazy update behavior.
}
if (!java.util.Arrays.equals(resources, focusResources)) {
boolean updateNeeded = false;
if (resources == null || focusResources == null) {
updateNeeded = true;
}
else if (showOwnerProject()) {
int l = resources.length;
if (l != focusResources.length) {
updateNeeded = true;
}
else {
IProject oldProject;
IProject newProject;
boolean projectsEqual;
for (int i = 0; i < l; i++) {
oldProject = focusResources[0] == null ? null : focusResources[0].getProject();
newProject = resources[0] == null ? null : resources[0].getProject();
projectsEqual = (oldProject == null ? newProject == null : oldProject.equals(newProject));
if (!projectsEqual) {
updateNeeded = true;
break;
}
}
}
}
else if (showSelections()) {
updateNeeded = true;
}
// remember the focus resource even if update is not needed,
// so that we know it if the filter settings change
focusResources = resources;
if (updateNeeded) {
viewer.getControl().setRedraw(false);
viewer.refresh();
viewer.getControl().setRedraw(true);
updateStatusMessage();
updateTitle();
}
}
}
/**
* Updates the enablement of the paste action
*/
void updatePasteEnablement() {
// Paste if clipboard contains tasks
MarkerTransfer transfer = MarkerTransfer.getInstance();
IMarker[] markerData = (IMarker[])getClipboard().getContents(transfer);
boolean canPaste = false;
if (markerData != null) {
for (int i = 0; i < markerData.length; i++) {
if (MarkerUtil.isMarkerType(markerData[i], IMarker.TASK)) {
canPaste = true;
break;
}
}
}
pasteTaskAction.setEnabled(canPaste);
}
/**
* Updates that message displayed in the status line.
*/
void updateStatusMessage() {
updateStatusMessage((IStructuredSelection) viewer.getSelection());
}
/**
* Updates that message displayed in the status line.
*/
void updateStatusMessage(IStructuredSelection selection) {
String message = getStatusMessage(selection);
getViewSite().getActionBars().getStatusLineManager().setMessage(message);
}
/**
* Updates the title of the view. Should be called when filters change.
*/
void updateTitle() {
String viewName = getConfigurationElement().getAttribute("name"); //$NON-NLS-1$
TaskListContentProvider provider = (TaskListContentProvider) getTableViewer().getContentProvider();
String summary = provider.getTitleSummary();
if ("".equals(summary)) { //$NON-NLS-1$
setTitle(viewName);
}
else {
String title = TaskListMessages.format("TaskList.title", new Object[] { viewName, summary }); //$NON-NLS-1$
setTitle(title);
}
}
/**
* Writes a string representation of the given marker to the buffer.
*/
static void writeMarker(StringBuffer buf, IMarker marker) {
buf.append(MarkerUtil.getKindText(marker));
buf.append("\t"); //$NON-NLS-1$
buf.append(MarkerUtil.getCompleteText(marker));
buf.append("\t"); //$NON-NLS-1$
buf.append(MarkerUtil.getPriorityText(marker));
buf.append("\t"); //$NON-NLS-1$
buf.append(MarkerUtil.getMessage(marker));
buf.append("\t"); //$NON-NLS-1$
buf.append(MarkerUtil.getResourceName(marker));
buf.append("\t"); //$NON-NLS-1$
buf.append(MarkerUtil.getContainerName(marker));
buf.append("\t"); //$NON-NLS-1$
buf.append(MarkerUtil.getLineAndLocation(marker));
buf.append(System.getProperty("line.separator")); //$NON-NLS-1$
}
}