blob: 9dec41e1a72d14756bcb99bd459596fe6fc09904 [file] [log] [blame]
/*******************************************************************************
* 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
*******************************************************************************/
package org.eclipse.ui.views.bookmarkexplorer;
import java.util.ArrayList;
import org.eclipse.core.resources.IMarker;
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.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.IDialogSettings;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
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.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.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Scrollable;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
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;
import org.eclipse.ui.views.navigator.ShowInNavigatorAction;
/**
* Main class for the bookmark navigator for displaying bookmarks on
* resources and opening an editor on the bookmarked resource when the user
* commands.
* <p>
* This standard view has id <code>"org.eclipse.ui.views.BookmarkNavigator"</code>.
* </p>
* <p>
* The workbench will automatically instantiate this class when a bookmark
* navigator is needed for a workbench window. This class is not intended
* to be instantiated or subclassed by clients.
* </p>
*/
public class BookmarkNavigator extends ViewPart {
private Table table;
private TableViewer viewer;
private OpenBookmarkAction openAction;
private CopyBookmarkAction copyAction;
private PasteBookmarkAction pasteAction;
private RemoveBookmarkAction removeAction;
private EditBookmarkAction editAction;
private SelectAllAction selectAllAction;
private ShowInNavigatorAction showInNavigatorAction;
private SortByAction sortByDescriptionAction;
private SortByAction sortByResourceAction;
private SortByAction sortByFolderAction;
private SortByAction sortByLineAction;
private SortByAction sortByCreationTime;
private ChangeSortDirectionAction sortAscendingAction;
private ChangeSortDirectionAction sortDescendingAction;
private IMemento memento;
private BookmarkSorter sorter;
private Clipboard clipboard;
private final String columnHeaders[] = {
BookmarkMessages.ColumnIcon_header,
BookmarkMessages.ColumnDescription_header,
BookmarkMessages.ColumnResource_header,
BookmarkMessages.ColumnFolder_header,
BookmarkMessages.ColumnLocation_header };
private ColumnLayoutData columnLayouts[] = {
new ColumnPixelData(16, false, true), new ColumnWeightData(200),
new ColumnWeightData(75), new ColumnWeightData(150),
new ColumnWeightData(60) };
// Persistance tags.
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_VERTICAL_POSITION = "verticalPosition";//$NON-NLS-1$
private static final String TAG_HORIZONTAL_POSITION = "horizontalPosition";//$NON-NLS-1$
class SortByAction extends Action {
private int column;
/**
* @param column
*/
public SortByAction(int column) {
this.column = column;
}
public void run() {
sorter.setTopPriority(column);
updateSortState();
viewer.refresh();
IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
IDialogSettings settings = workbenchSettings
.getSection("BookmarkSortState");//$NON-NLS-1$
if (settings == null)
settings = workbenchSettings.addNewSection("BookmarkSortState");//$NON-NLS-1$
sorter.saveState(settings);
}
}
class ChangeSortDirectionAction extends Action {
private int direction;
/**
* @param direction
*/
public ChangeSortDirectionAction(int direction) {
this.direction = direction;
}
public void run() {
sorter.setTopPriorityDirection(direction);
updateSortState();
viewer.refresh();
IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
IDialogSettings settings = workbenchSettings
.getSection("BookmarkSortState");//$NON-NLS-1$
if (settings == null)
settings = workbenchSettings.addNewSection("BookmarkSortState");//$NON-NLS-1$
sorter.saveState(settings);
}
}
/**
* Creates the bookmarks view.
*/
public BookmarkNavigator() {
super();
}
/**
* Adds this views contributions to the workbench.
*/
void addContributions() {
ISharedImages sharedImages = PlatformUI.getWorkbench()
.getSharedImages();
// Create the actions.
openAction = new OpenBookmarkAction(this);
openAction
.setImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/gotoobj_tsk.gif"));//$NON-NLS-1$
copyAction = new CopyBookmarkAction(this);
copyAction.setImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
pasteAction = new PasteBookmarkAction(this);
pasteAction.setImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
removeAction = new RemoveBookmarkAction(this);
removeAction.setImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
removeAction.setDisabledImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
editAction = new EditBookmarkAction(this);
selectAllAction = new SelectAllAction(this);
showInNavigatorAction = new ShowInNavigatorAction(getViewSite()
.getPage(), viewer);
// initializes action enabled state
handleSelectionChanged(StructuredSelection.EMPTY);
// Create dynamic menu mgr. Dynamic is currently required to
// support action contributions.
MenuManager mgr = new MenuManager();
mgr.setRemoveAllWhenShown(true);
mgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {
fillContextMenu(mgr);
}
});
Menu menu = mgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(mgr, viewer);
// Add actions to the local tool bar
IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
tbm.add(removeAction);
tbm.add(openAction);
tbm.update(false);
// Register with action service.
IActionBars actionBars = getViewSite().getActionBars();
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
copyAction);
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
pasteAction);
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
removeAction);
actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
selectAllAction);
// Set the double click action.
viewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
openAction.run();
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleSelectionChanged((IStructuredSelection) event
.getSelection());
}
});
viewer.getControl().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
handleKeyPressed(e);
}
});
}
/* (non-Javadoc)
* Method declared on IWorkbenchPart.
*/
public void createPartControl(Composite parent) {
clipboard = new Clipboard(parent.getDisplay());
createTable(parent);
viewer = new TableViewer(table);
createColumns();
sorter = new BookmarkSorter();
viewer.setContentProvider(new BookmarkContentProvider(this));
viewer.setLabelProvider(new BookmarkLabelProvider(this));
viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
viewer.setSorter(sorter);
IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
IDialogSettings settings = workbenchSettings
.getSection("BookmarkSortState");//$NON-NLS-1$
sorter.restoreState(settings);
addContributions();
initDragAndDrop();
createSortActions();
fillActionBars();
updateSortState();
updatePasteEnablement();
getSite().setSelectionProvider(viewer);
if (memento != null)
restoreState(memento);
memento = null;
PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),
IBookmarkHelpContextIds.BOOKMARK_VIEW);
}
public void dispose() {
if (clipboard != null)
clipboard.dispose();
}
/**
* Notifies this listener that the menu is about to be shown by
* the given menu manager.
*
* @param manager the menu manager
*/
void fillContextMenu(IMenuManager manager) {
manager.add(openAction);
manager.add(copyAction);
updatePasteEnablement();
manager.add(pasteAction);
manager.add(removeAction);
manager.add(selectAllAction);
manager.add(showInNavigatorAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
manager.add(new Separator());
manager.add(editAction);
}
/* (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, getViewer().getSelection());
}
};
}
if (adapter == IShowInTargetList.class) {
return new IShowInTargetList() {
public String[] getShowInTargetIds() {
return new String[] { IPageLayout.ID_RES_NAV };
}
};
}
return super.getAdapter(adapter);
}
/**
* Returns the UI plugin for the bookmarks view.
*/
static AbstractUIPlugin getPlugin() {
return (AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
}
/**
* Returns the shell.
*/
Shell getShell() {
return getViewSite().getShell();
}
/**
* Returns the viewer used to display bookmarks.
*
* @return the viewer, or <code>null</code> if this view's controls
* have not been created yet
*/
StructuredViewer getViewer() {
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
&& removeAction.isEnabled())
removeAction.run();
}
/**
* Handles a selection change.
*
* @param selection the new selection
*/
void handleSelectionChanged(IStructuredSelection selection) {
//update the actions
openAction.selectionChanged(selection);
removeAction.selectionChanged(selection);
editAction.selectionChanged(selection);
selectAllAction.selectionChanged(selection);
showInNavigatorAction.selectionChanged(selection);
}
/* (non-Javadoc)
* Method declared on IViewPart.
*/
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
this.memento = memento;
}
/**
* Adds drag and drop support to the bookmark navigator.
*/
protected void initDragAndDrop() {
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);
}
/**
* 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[] markers = ((IStructuredSelection) viewer.getSelection())
.toArray();
if (markers != null) {
StringBuffer buffer = new StringBuffer();
ILabelProvider provider = (ILabelProvider) getViewer()
.getLabelProvider();
for (int i = 0; i < markers.length; i++) {
if (i > 0)
buffer.append(System.getProperty("line.separator")); //$NON-NLS-1$
String text = provider.getText(markers[i]);
if(text != null)
buffer.append(text);
}
event.data = buffer.toString();
}
return;
}
}
void restoreState(IMemento memento) {
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 = new Long(markerMems[i].getString(TAG_ID))
.longValue();
IResource resource = root.findMember(markerMems[i]
.getString(TAG_RESOURCE));
if (resource != null) {
IMarker marker = resource.findMarker(id);
if (marker != null)
selectionList.add(marker);
}
} catch (CoreException e) {
}
}
viewer.setSelection(new StructuredSelection(selectionList));
}
Scrollable scrollable = (Scrollable) viewer.getControl();
//save vertical position
ScrollBar bar = scrollable.getVerticalBar();
if (bar != null) {
try {
String posStr = memento.getString(TAG_VERTICAL_POSITION);
int position;
position = new Integer(posStr).intValue();
bar.setSelection(position);
} catch (NumberFormatException e) {
}
}
bar = scrollable.getHorizontalBar();
if (bar != null) {
try {
String posStr = memento.getString(TAG_HORIZONTAL_POSITION);
int position;
position = new Integer(posStr).intValue();
bar.setSelection(position);
} catch (NumberFormatException e) {
}
}
updateSortState();
viewer.refresh();
}
public void saveState(IMemento memento) {
if (viewer == null) {
if (this.memento != null) //Keep the old state;
memento.putMemento(this.memento);
return;
}
Scrollable scrollable = (Scrollable) viewer.getControl();
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
ScrollBar bar = scrollable.getVerticalBar();
int position = bar != null ? bar.getSelection() : 0;
memento.putString(TAG_VERTICAL_POSITION, String.valueOf(position));
//save horizontal position
bar = scrollable.getHorizontalBar();
position = bar != null ? bar.getSelection() : 0;
memento.putString(TAG_HORIZONTAL_POSITION, String.valueOf(position));
}
/* (non-Javadoc)
* Method declared on IWorkbenchPart.
*/
public void setFocus() {
if (viewer != null)
viewer.getControl().setFocus();
}
void createColumns() {
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 - first column doesn't count
int column = table.indexOf((TableColumn) e.widget) - 1;
if (column == sorter.getTopPriority())
sorter.reverseTopPriority();
else {
sorter.setTopPriority(column);
}
updateSortState();
viewer.refresh();
IDialogSettings workbenchSettings = getPlugin()
.getDialogSettings();
IDialogSettings settings = workbenchSettings
.getSection("BookmarkSortState");//$NON-NLS-1$
if (settings == null)
settings = workbenchSettings
.addNewSection("BookmarkSortState");//$NON-NLS-1$
sorter.saveState(settings);
}
};
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]);
if (i > 0)
tc.addSelectionListener(headerListener);
}
}
/**
* 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());
}
/**
* Fills the local tool bar and menu manager with actions.
*/
void fillActionBars() {
IActionBars actionBars = getViewSite().getActionBars();
IMenuManager menu = actionBars.getMenuManager();
IMenuManager submenu = new MenuManager(BookmarkMessages.SortMenuGroup_text);
menu.add(submenu);
submenu.add(sortByDescriptionAction);
submenu.add(sortByResourceAction);
submenu.add(sortByFolderAction);
submenu.add(sortByLineAction);
submenu.add(sortByCreationTime);
submenu.add(new Separator());
submenu.add(sortAscendingAction);
submenu.add(sortDescendingAction);
}
void createSortActions() {
sortByDescriptionAction = new SortByAction(BookmarkSorter.DESCRIPTION);
sortByDescriptionAction.setText(BookmarkMessages.ColumnDescription_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(
sortByDescriptionAction,
IBookmarkHelpContextIds.SORT_DESCRIPTION_ACTION);
sortByResourceAction = new SortByAction(BookmarkSorter.RESOURCE);
sortByResourceAction.setText(BookmarkMessages.ColumnResource_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByResourceAction,
IBookmarkHelpContextIds.SORT_RESOURCE_ACTION);
sortByFolderAction = new SortByAction(BookmarkSorter.FOLDER);
sortByFolderAction.setText(BookmarkMessages.ColumnFolder_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByFolderAction,
IBookmarkHelpContextIds.SORT_FOLDER_ACTION);
sortByLineAction = new SortByAction(BookmarkSorter.LOCATION);
sortByLineAction.setText(BookmarkMessages.ColumnLocation_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByLineAction,
IBookmarkHelpContextIds.SORT_LOCATION_ACTION);
sortByCreationTime = new SortByAction(BookmarkSorter.CREATION_TIME);
sortByCreationTime.setText(BookmarkMessages.ColumnCreationTime_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByCreationTime,
IBookmarkHelpContextIds.SORT_CREATION_TIME_ACTION);
sortAscendingAction = new ChangeSortDirectionAction(
BookmarkSorter.ASCENDING);
sortAscendingAction.setText(BookmarkMessages.SortDirectionAscending_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(sortAscendingAction,
IBookmarkHelpContextIds.SORT_ASCENDING_ACTION);
sortDescendingAction = new ChangeSortDirectionAction(
BookmarkSorter.DESCENDING);
sortDescendingAction.setText(BookmarkMessages.SortDirectionDescending_text);
PlatformUI.getWorkbench().getHelpSystem().setHelp(sortDescendingAction,
IBookmarkHelpContextIds.SORT_DESCENDING_ACTION);
}
void updateSortState() {
int column = sorter.getTopPriority();
sortByDescriptionAction
.setChecked(column == BookmarkSorter.DESCRIPTION);
sortByResourceAction.setChecked(column == BookmarkSorter.RESOURCE);
sortByFolderAction.setChecked(column == BookmarkSorter.FOLDER);
sortByLineAction.setChecked(column == BookmarkSorter.LOCATION);
sortByCreationTime.setChecked(column == BookmarkSorter.CREATION_TIME);
int direction = sorter.getTopPriorityDirection();
sortAscendingAction.setChecked(direction == BookmarkSorter.ASCENDING);
sortDescendingAction.setChecked(direction == BookmarkSorter.DESCENDING);
}
/**
* 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++) {
try {
if (markerData[i].getType().equals(IMarker.BOOKMARK)) {
canPaste = true;
break;
}
} catch (CoreException e) {
canPaste = false;
}
}
}
pasteAction.setEnabled(canPaste);
}
Clipboard getClipboard() {
return clipboard;
}
}