| /******************************************************************************* |
| * Copyright (c) 2000, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Cagatay Kavukcuoglu <cagatayk@acm.org> - Filter for markers in same project |
| * Sebastian Davids <sdavids@gmx.de> - Reordered menu items |
| *******************************************************************************/ |
| |
| package org.eclipse.ui.views.tasklist; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Iterator; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IMenuListener; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.IToolBarManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.dialogs.ErrorDialog; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.util.Assert; |
| import org.eclipse.jface.viewers.CellEditor; |
| import org.eclipse.jface.viewers.CheckboxCellEditor; |
| import org.eclipse.jface.viewers.ColumnLayoutData; |
| import org.eclipse.jface.viewers.ColumnPixelData; |
| import org.eclipse.jface.viewers.ColumnWeightData; |
| import org.eclipse.jface.viewers.ComboBoxCellEditor; |
| import org.eclipse.jface.viewers.IBasicPropertyConstants; |
| import org.eclipse.jface.viewers.ICellModifier; |
| import org.eclipse.jface.viewers.IOpenListener; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.ISelectionProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITableLabelProvider; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.OpenEvent; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TableLayout; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TextCellEditor; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.accessibility.ACC; |
| import org.eclipse.swt.accessibility.AccessibleControlAdapter; |
| import org.eclipse.swt.accessibility.AccessibleControlEvent; |
| import org.eclipse.swt.custom.BusyIndicator; |
| import org.eclipse.swt.custom.StackLayout; |
| import org.eclipse.swt.custom.TableEditor; |
| import org.eclipse.swt.dnd.Clipboard; |
| import org.eclipse.swt.dnd.DND; |
| import org.eclipse.swt.dnd.DragSourceAdapter; |
| import org.eclipse.swt.dnd.DragSourceEvent; |
| import org.eclipse.swt.dnd.DragSourceListener; |
| import org.eclipse.swt.dnd.TextTransfer; |
| import org.eclipse.swt.dnd.Transfer; |
| import org.eclipse.swt.events.HelpEvent; |
| import org.eclipse.swt.events.HelpListener; |
| import org.eclipse.swt.events.KeyAdapter; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Item; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.IPageLayout; |
| import org.eclipse.ui.IPartListener; |
| import org.eclipse.ui.ISharedImages; |
| import org.eclipse.ui.IViewSite; |
| import org.eclipse.ui.IWorkbenchActionConstants; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.actions.ActionFactory; |
| import org.eclipse.ui.ide.IDE; |
| import org.eclipse.ui.ide.ResourceUtil; |
| import org.eclipse.ui.internal.views.tasklist.TaskListMessages; |
| import org.eclipse.ui.part.CellEditorActionHandler; |
| import org.eclipse.ui.part.IShowInSource; |
| import org.eclipse.ui.part.IShowInTargetList; |
| import org.eclipse.ui.part.MarkerTransfer; |
| import org.eclipse.ui.part.ShowInContext; |
| import org.eclipse.ui.part.ViewPart; |
| 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 TaskSorter sorter; |
| |
| 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 ResolveMarkerAction resolveMarkerAction; |
| |
| private TaskAction filtersAction; |
| |
| private MarkCompletedAction markCompletedAction; |
| |
| private TaskAction propertiesAction; |
| |
| //sort by action |
| private Action sortByCategoryAction; |
| |
| private Action sortByCompletedAction; |
| |
| private Action sortByPriorityAction; |
| |
| private Action sortByDescriptionAction; |
| |
| private Action sortByResourceAction; |
| |
| private Action sortByContainerAction; |
| |
| private Action sortByLocationAction; |
| |
| private Action sortByCreationTimeAction; |
| |
| private Action sortAscendingAction; |
| |
| private Action sortDescendingAction; |
| |
| 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_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$ |
| |
| private static final String TAG_SORT_SECTION = "TaskListSortState"; //$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; |
| } |
| } |
| |
| class SortByAction extends Action { |
| |
| private int column; |
| |
| /** |
| * @param column |
| */ |
| public SortByAction(int column) { |
| this.column = column; |
| } |
| |
| public void run() { |
| sorter.setTopPriority(column); |
| updateSortingState(); |
| viewer.refresh(); |
| IDialogSettings workbenchSettings = getPlugin().getDialogSettings(); |
| IDialogSettings settings = workbenchSettings |
| .getSection(TAG_SORT_SECTION); |
| if (settings == null) |
| settings = workbenchSettings.addNewSection(TAG_SORT_SECTION); |
| sorter.saveState(settings); |
| } |
| } |
| |
| class SortDirectionAction extends Action { |
| |
| private int direction; |
| |
| /** |
| * @param direction |
| */ |
| public SortDirectionAction(int direction) { |
| this.direction = direction; |
| } |
| |
| public void run() { |
| sorter.setTopPriorityDirection(direction); |
| updateSortingState(); |
| viewer.refresh(); |
| IDialogSettings workbenchSettings = getPlugin().getDialogSettings(); |
| IDialogSettings settings = workbenchSettings |
| .getSection(TAG_SORT_SECTION); |
| if (settings == null) |
| settings = workbenchSettings.addNewSection(TAG_SORT_SECTION); |
| sorter.saveState(settings); |
| } |
| } |
| |
| private String columnHeaders[] = { |
| TaskListMessages.TaskList_headerIcon, |
| TaskListMessages.TaskList_headerCompleted, |
| TaskListMessages.TaskList_headerPriority, |
| TaskListMessages.TaskList_headerDescription, |
| TaskListMessages.TaskList_headerResource, |
| TaskListMessages.TaskList_headerFolder, |
| TaskListMessages.TaskList_headerLocation |
| }; |
| |
| private ColumnLayoutData columnLayouts[] = { |
| new ColumnPixelData(16, false, true), new ColumnPixelData(16, false, true), |
| new ColumnPixelData(16, false, true), 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) { |
| return MarkerUtil.isEditable((IMarker) element); |
| } |
| |
| /** |
| * 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(); |
| } |
| |
| /** |
| * @param control |
| */ |
| 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); |
| if (column == sorter.getTopPriority()) |
| sorter.reverseTopPriority(); |
| else { |
| sorter.setTopPriority(column); |
| } |
| updateSortingState(); |
| viewer.refresh(); |
| IDialogSettings workbenchSettings = getPlugin() |
| .getDialogSettings(); |
| IDialogSettings settings = workbenchSettings |
| .getSection(TAG_SORT_SECTION); |
| if (settings == null) |
| settings = workbenchSettings |
| .addNewSection(TAG_SORT_SECTION); |
| sorter.saveState(settings); |
| } |
| }; |
| |
| 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); |
| } |
| } |
| } |
| } |
| } |
| |
| boolean text = "carbon".equals(SWT.getPlatform()); //$NON-NLS-1$ |
| TableLayout layout = new TableLayout(); |
| table.setLayout(layout); |
| table.setHeaderVisible(true); |
| |
| for (int i = 0; i < columnHeaders.length; i++) { |
| TableColumn tc = new TableColumn(table, SWT.NONE, i); |
| |
| if (!text && i == 1) |
| tc.setImage(MarkerUtil.getImage("header_complete")); //$NON-NLS-1$ |
| else if (!text && i == 2) |
| tc.setImage(MarkerUtil.getImage("header_priority")); //$NON-NLS-1$ |
| else |
| tc.setText(columnHeaders[i]); |
| |
| if (text && (i == 1 || i == 2)) { |
| tc.pack(); |
| columnLayouts[i] = new ColumnPixelData(Math.max(16, tc |
| .getWidth()), false, true); |
| } |
| |
| tc.setResizable(columnLayouts[i].resizable); |
| layout.addColumnData(columnLayouts[i]); |
| tc.addSelectionListener(headerListener); |
| } |
| } |
| |
| /** |
| * Returns a string that summarizes the contents of the |
| * given markers. |
| */ |
| static String createMarkerReport(IMarker[] markers) { |
| StringBuffer buf = new StringBuffer(); |
| // Create the header |
| buf.append(TaskListMessages.TaskList_reportKind); |
| buf.append("\t"); //$NON-NLS-1$ |
| buf.append(TaskListMessages.TaskList_reportStatus); |
| buf.append("\t"); //$NON-NLS-1$ |
| buf.append(TaskListMessages.TaskList_reportPriority); |
| buf.append("\t"); //$NON-NLS-1$ |
| buf.append(TaskListMessages.TaskList_headerDescription); |
| buf.append("\t"); //$NON-NLS-1$ |
| buf.append(TaskListMessages.TaskList_headerResource); |
| buf.append("\t"); //$NON-NLS-1$ |
| buf.append(TaskListMessages.TaskList_headerFolder); |
| buf.append("\t"); //$NON-NLS-1$ |
| buf.append(TaskListMessages.TaskList_headerLocation); |
| 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(); |
| } |
| |
| /** |
| * 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$ |
| } |
| |
| /* 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) { |
| // long t = System.currentTimeMillis(); |
| createPartControl0(parent); |
| // t = System.currentTimeMillis() - t; |
| // System.out.println("TaskList.createPartControl: " + t + "ms"); |
| } |
| |
| private void createPartControl0(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.TaskList_markerLimitExceeded); |
| parent.setLayout(stackLayout); |
| setMarkerLimitExceeded(false); |
| |
| viewer.setContentProvider(new TaskListContentProvider(this)); |
| viewer.setLabelProvider(new TaskListLabelProvider()); |
| if (memento != null) { |
| //restore filter |
| IMemento filterMem = memento.getChild(TAG_FILTER); |
| if (filterMem != null) |
| getFilter().restoreState(filterMem); |
| } |
| |
| sorter = new TaskSorter(); |
| IDialogSettings workbenchSettings = getPlugin().getDialogSettings(); |
| IDialogSettings settings = workbenchSettings |
| .getSection(TAG_SORT_SECTION); |
| sorter.restoreState(settings); |
| viewer.setSorter(sorter); |
| |
| //update the menu to indicate how task are currently sorted |
| updateSortingState(); |
| 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); |
| } |
| }); |
| |
| //Add in some accessibility support to supplement the description that we already |
| //get from the SWT table. |
| viewer.getControl().getAccessible().addAccessibleControlListener( |
| new AccessibleControlAdapter() { |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.accessibility.AccessibleControlListener#getValue(org.eclipse.swt.accessibility.AccessibleControlEvent) |
| */ |
| public void getValue(AccessibleControlEvent e) { |
| |
| int childIndex = e.childID; |
| |
| if (childIndex == ACC.CHILDID_SELF) { |
| super.getValue(e); |
| return; |
| } |
| Object item = viewer.getElementAt(childIndex); |
| if (item instanceof IMarker) { |
| IMarker marker = (IMarker) item; |
| |
| //If it is editable all we need is completeness |
| // the rest is found by the table accessibility |
| if (MarkerUtil.isEditable(marker)) |
| e.result = MarkerUtil.getCompleteText(marker); |
| else |
| //Otherwise all it needs is severity |
| e.result = MarkerUtil.getKindText(marker); |
| |
| } else { |
| super.getValue(e); |
| return; |
| } |
| |
| } |
| |
| }); |
| |
| CellEditor editors[] = new CellEditor[columnHeaders.length]; |
| editors[1] = new CheckboxCellEditor(table); |
| String[] priorities = new String[] { |
| TaskListMessages.TaskList_high, |
| TaskListMessages.TaskList_normal, |
| TaskListMessages.TaskList_low |
| }; |
| editors[2] = new ComboBoxCellEditor(table, priorities, SWT.READ_ONLY); |
| 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); |
| |
| // 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( |
| ActionFactory.PROPERTIES.getId(), propertiesAction); |
| |
| getSite().setSelectionProvider(viewer); |
| |
| 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) { |
| contextId = IDE.getMarkerHelpRegistry().getHelp(marker); |
| } |
| |
| if (contextId == null) |
| contextId = ITaskListHelpContextIds.TASK_LIST_VIEW; |
| |
| getSite().getWorkbenchWindow().getWorkbench().getHelpSystem() |
| .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()); |
| |
| 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. |
| * |
| * @param marker the marker to edit |
| */ |
| 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(); |
| IMenuManager submenu = new MenuManager(TaskListMessages.SortByMenu_text); |
| |
| menu.add(submenu); |
| submenu.add(sortByCategoryAction); |
| submenu.add(sortByCompletedAction); |
| submenu.add(sortByPriorityAction); |
| submenu.add(sortByDescriptionAction); |
| submenu.add(sortByResourceAction); |
| submenu.add(sortByContainerAction); |
| submenu.add(sortByLocationAction); |
| submenu.add(sortByCreationTimeAction); |
| submenu.add(new Separator()); |
| submenu.add(sortAscendingAction); |
| submenu.add(sortDescendingAction); |
| |
| 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) { |
| // update enabled state for actions that aren't updated in selectionChanged |
| IStructuredSelection selection = (IStructuredSelection) getSelection(); |
| markCompletedAction.setEnabled(markCompletedAction |
| .shouldEnable(selection)); |
| resolveMarkerAction.setEnabled(resolveMarkerAction |
| .shouldEnable(selection)); |
| |
| // add the actions to the 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()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) |
| */ |
| public Object getAdapter(Class adapter) { |
| if (adapter == IShowInSource.class) { |
| return new IShowInSource() { |
| public ShowInContext getShowInContext() { |
| return new ShowInContext(null, getSelection()); |
| } |
| }; |
| } |
| if (adapter == IShowInTargetList.class) { |
| return new IShowInTargetList() { |
| public String[] getShowInTargetIds() { |
| return new String[] { IPageLayout.ID_RES_NAV }; |
| } |
| |
| }; |
| } |
| return super.getAdapter(adapter); |
| } |
| |
| /** |
| * 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(); |
| } |
| |
| /** |
| * Get the resources. |
| * |
| * @return the resources |
| */ |
| 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; |
| |
| 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 != null && selection.size() == 1) { |
| IMarker marker = (IMarker) selection.getFirstElement(); |
| return MarkerUtil.getMessage(marker); |
| } |
| |
| TaskListContentProvider provider = (TaskListContentProvider) viewer |
| .getContentProvider(); |
| |
| if (selection != null && selection.size() > 1) { |
| return provider.getStatusSummarySelected(selection); |
| } |
| 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 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; |
| } |
| 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() { |
| ISharedImages sharedImages = PlatformUI.getWorkbench() |
| .getSharedImages(); |
| |
| // goto |
| gotoTaskAction = new GotoTaskAction(this, "gotoFile"); //$NON-NLS-1$ |
| gotoTaskAction.setText(TaskListMessages.GotoTask_text); |
| gotoTaskAction.setToolTipText(TaskListMessages.GotoTask_tooltip); |
| gotoTaskAction.setImageDescriptor(MarkerUtil |
| .getImageDescriptor("gotoobj")); //$NON-NLS-1$ |
| gotoTaskAction.setEnabled(false); |
| |
| // new task |
| newTaskAction = new NewTaskAction(this, "newTask"); //$NON-NLS-1$ |
| newTaskAction.setText(TaskListMessages.NewTask_text); |
| newTaskAction.setToolTipText(TaskListMessages.NewTask_tooltip); |
| newTaskAction.setImageDescriptor(MarkerUtil |
| .getImageDescriptor("addtsk")); //$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.CopyTask_text); |
| copyTaskAction.setToolTipText(TaskListMessages.CopyTask_tooltip); |
| copyTaskAction.setEnabled(false); |
| |
| // paste task |
| pasteTaskAction = new PasteTaskAction(this, "paste"); //$NON-NLS-1$ |
| pasteTaskAction.setText(TaskListMessages.PasteTask_text); |
| pasteTaskAction.setToolTipText(TaskListMessages.PasteTask_tooltip); |
| pasteTaskAction.setEnabled(false); |
| |
| // remove task |
| removeTaskAction = new RemoveTaskAction(this, "delete"); //$NON-NLS-1$ |
| removeTaskAction.setText(TaskListMessages.RemoveTask_text); |
| removeTaskAction.setToolTipText(TaskListMessages.RemoveTask_tooltip); |
| removeTaskAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); |
| removeTaskAction.setDisabledImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED)); |
| removeTaskAction.setEnabled(false); |
| |
| //mark completed task |
| markCompletedAction = new MarkCompletedAction(this, "markCompleted"); //$NON-NLS-1$ |
| markCompletedAction.setText(TaskListMessages.MarkCompleted_text); |
| markCompletedAction.setToolTipText(TaskListMessages.MarkCompleted_tooltip); |
| markCompletedAction.setEnabled(false); |
| |
| //delete completed task |
| purgeCompletedAction = new PurgeCompletedAction(this, "deleteCompleted"); //$NON-NLS-1$ |
| purgeCompletedAction.setText(TaskListMessages.PurgeCompleted_text); |
| purgeCompletedAction.setToolTipText(TaskListMessages.PurgeCompleted_tooltip); |
| purgeCompletedAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); |
| purgeCompletedAction.setEnabled(true); |
| |
| // select all |
| selectAllAction = new SelectAllTasksAction(this, "selectAll"); //$NON-NLS-1$ |
| selectAllAction.setText(TaskListMessages.SelectAll_text); |
| selectAllAction.setToolTipText(TaskListMessages.SelectAll_tooltip); |
| |
| // resolutions |
| resolveMarkerAction = new ResolveMarkerAction(this, "resolve"); //$NON-NLS-1$ |
| resolveMarkerAction.setText(TaskListMessages.Resolve_text); |
| resolveMarkerAction.setToolTipText(TaskListMessages.Resolve_tooltip); |
| resolveMarkerAction.setEnabled(false); |
| |
| // Sort by -> |
| sortByCategoryAction = new SortByAction(TaskSorter.TYPE); |
| sortByCategoryAction.setText(TaskListMessages.SortByCategory_text); |
| sortByCategoryAction.setToolTipText(TaskListMessages.SortByCategory_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByCategoryAction, |
| ITaskListHelpContextIds.TASK_SORT_TYPE_ACTION); |
| |
| sortByCompletedAction = new SortByAction(TaskSorter.COMPLETION); |
| sortByCompletedAction.setText(TaskListMessages.SortByCompleted_text); |
| sortByCompletedAction.setToolTipText(TaskListMessages.SortByCompleted_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp( |
| sortByCompletedAction, |
| ITaskListHelpContextIds.TASK_SORT_COMPLETED_ACTION); |
| |
| sortByPriorityAction = new SortByAction(TaskSorter.PRIORITY); |
| sortByPriorityAction.setText(TaskListMessages.SortByPriority_text); |
| sortByPriorityAction.setToolTipText(TaskListMessages.SortByPriority_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByPriorityAction, |
| ITaskListHelpContextIds.TASK_SORT_PRIORITY_ACTION); |
| |
| sortByDescriptionAction = new SortByAction(TaskSorter.DESCRIPTION); |
| sortByDescriptionAction.setText(TaskListMessages.SortByDescription_text); |
| sortByDescriptionAction.setToolTipText(TaskListMessages.SortByDescription_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp( |
| sortByDescriptionAction, |
| ITaskListHelpContextIds.TASK_SORT_DESCRIPTION_ACTION); |
| |
| sortByResourceAction = new SortByAction(TaskSorter.RESOURCE); |
| sortByResourceAction.setText(TaskListMessages.SortByResource_text); |
| sortByResourceAction.setToolTipText(TaskListMessages.SortByResource_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByResourceAction, |
| ITaskListHelpContextIds.TASK_SORT_RESOURCE_ACTION); |
| |
| sortByContainerAction = new SortByAction(TaskSorter.FOLDER); |
| sortByContainerAction.setText(TaskListMessages.SortByContainer_text); |
| sortByContainerAction.setToolTipText(TaskListMessages.SortByContainer_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp( |
| sortByContainerAction, |
| ITaskListHelpContextIds.TASK_SORT_FOLDER_ACTION); |
| |
| sortByLocationAction = new SortByAction(TaskSorter.LOCATION); |
| sortByLocationAction.setText(TaskListMessages.SortByLocation_text); |
| sortByLocationAction.setToolTipText(TaskListMessages.SortByLocation_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByLocationAction, |
| ITaskListHelpContextIds.TASK_SORT_LOCATION_ACTION); |
| |
| sortByCreationTimeAction = new SortByAction(TaskSorter.CREATION_TIME); |
| sortByCreationTimeAction.setText(TaskListMessages.SortByCreationTime_text); |
| sortByCreationTimeAction.setToolTipText(TaskListMessages.SortByCreationTime_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp( |
| sortByCreationTimeAction, |
| ITaskListHelpContextIds.TASK_SORT_CREATION_TIME_ACTION); |
| |
| sortAscendingAction = new SortDirectionAction(TaskSorter.ASCENDING); |
| sortAscendingAction.setText(TaskListMessages.SortAscending_text); |
| sortAscendingAction.setToolTipText(TaskListMessages.SortAscending_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(sortAscendingAction, |
| ITaskListHelpContextIds.TASK_SORT_ASCENDING_ACTION); |
| |
| sortDescendingAction = new SortDirectionAction(TaskSorter.DESCENDING); |
| sortDescendingAction.setText(TaskListMessages.SortDescending_text); |
| sortDescendingAction.setToolTipText(TaskListMessages.SortDescending_tooltip); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(sortDescendingAction, |
| ITaskListHelpContextIds.TASK_SORT_DESCENDING_ACTION); |
| |
| // filters... |
| filtersAction = new FiltersAction(this, "filter"); //$NON-NLS-1$ |
| filtersAction.setText(TaskListMessages.Filters_text); |
| filtersAction.setToolTipText(TaskListMessages.Filters_tooltip); |
| filtersAction.setImageDescriptor(MarkerUtil |
| .getImageDescriptor("filter")); //$NON-NLS-1$ |
| |
| // properties |
| propertiesAction = new TaskPropertiesAction(this, "properties"); //$NON-NLS-1$ |
| propertiesAction.setText(TaskListMessages.Properties_text); |
| propertiesAction.setToolTipText(TaskListMessages.Properties_tooltip); |
| 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 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.isEditable(m)) { |
| 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) { |
| IFile file = ResourceUtil.getFile(editor.getEditorInput()); |
| if (file != null) { |
| if (selectedMarker.getResource().equals(file)) { |
| IDE.gotoMarker(editor, selectedMarker); |
| } |
| } |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * Method declared on IWorkbenchPart. |
| */ |
| public void setFocus() { |
| viewer.getControl().setFocus(); |
| } |
| |
| /** |
| * Sets the property on a marker to the given 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.TaskList_errorModifyingTask; |
| 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); |
| |
| if (viewer != null) |
| 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. |
| * |
| * @param value the value |
| */ |
| 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. |
| * |
| * @param value the value |
| */ |
| 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) { |
| ArrayList list = new ArrayList(); |
| |
| if (selection instanceof IStructuredSelection) { |
| Iterator iterator = ((IStructuredSelection) selection).iterator(); |
| while (iterator.hasNext()) { |
| Object object = iterator.next(); |
| |
| if (object instanceof IAdaptable) { |
| ITaskListResourceAdapter taskListResourceAdapter; |
| Object adapter = ((IAdaptable) object) |
| .getAdapter(ITaskListResourceAdapter.class); |
| if (adapter != null |
| && adapter instanceof ITaskListResourceAdapter) { |
| taskListResourceAdapter = (ITaskListResourceAdapter) adapter; |
| } else { |
| taskListResourceAdapter = DefaultTaskListResourceAdapter |
| .getDefault(); |
| } |
| |
| IResource resource = taskListResourceAdapter |
| .getAffectedResource((IAdaptable) object); |
| if (resource != null) { |
| list.add(resource); |
| } |
| } |
| } |
| } |
| |
| if (list.size() == 0 && focusPart instanceof IEditorPart) { |
| IEditorInput input = ((IEditorPart) focusPart).getEditorInput(); |
| if (input != null) { |
| IResource resource = ResourceUtil.getResource(input); |
| if (resource != null) { |
| list.add(resource); |
| } |
| } |
| } |
| |
| int l = list.size(); |
| if (l < 1) { |
| return; // required to achieve lazy update behavior. |
| } |
| |
| IResource[] resources = (IResource[]) list.toArray(new IResource[l]); |
| for (int i = 0; i < l; i++) { |
| Assert.isNotNull(resources[i]); |
| } |
| |
| if (!Arrays.equals(resources, focusResources)) { |
| boolean updateNeeded = false; |
| |
| if (showOwnerProject()) { |
| int m = focusResources == null ? 0 : focusResources.length; |
| if (l != m) { |
| updateNeeded = true; |
| } else { |
| for (int i = 0; i < l; i++) { |
| IProject oldProject = m < 1 ? null : focusResources[0] |
| .getProject(); |
| IProject newProject = resources[0].getProject(); |
| boolean projectsEqual = (oldProject == null ? newProject == null |
| : oldProject.equals(newProject)); |
| if (!projectsEqual) { |
| updateNeeded = true; |
| break; |
| } |
| } |
| } |
| } else if (showSelections()) { |
| updateNeeded = true; |
| } |
| |
| // remember the focus resources even if update is not needed, |
| // so that we know them 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() { |
| ISelection selection = viewer.getSelection(); |
| |
| if (selection instanceof IStructuredSelection) |
| updateStatusMessage((IStructuredSelection) selection); |
| else |
| updateStatusMessage(null); |
| } |
| |
| /** |
| * 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() { |
| TaskListContentProvider provider = (TaskListContentProvider) getTableViewer() |
| .getContentProvider(); |
| String summary = provider.getTitleSummary(); |
| setContentDescription(summary); |
| } |
| |
| /** |
| * Method updateSortingState. |
| */ |
| void updateSortingState() { |
| int curColumn = sorter.getTopPriority(); |
| sortByCategoryAction.setChecked(curColumn == TaskSorter.TYPE); |
| sortByCompletedAction.setChecked(curColumn == TaskSorter.COMPLETION); |
| sortByPriorityAction.setChecked(curColumn == TaskSorter.PRIORITY); |
| sortByDescriptionAction.setChecked(curColumn == TaskSorter.DESCRIPTION); |
| sortByResourceAction.setChecked(curColumn == TaskSorter.RESOURCE); |
| sortByContainerAction.setChecked(curColumn == TaskSorter.FOLDER); |
| sortByLocationAction.setChecked(curColumn == TaskSorter.LOCATION); |
| sortByCreationTimeAction |
| .setChecked(curColumn == TaskSorter.CREATION_TIME); |
| |
| int curDirection = sorter.getTopPriorityDirection(); |
| sortAscendingAction.setChecked(curDirection == TaskSorter.ASCENDING); |
| sortDescendingAction.setChecked(curDirection == TaskSorter.DESCENDING); |
| } |
| |
| } |