Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java')
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java366
1 files changed, 23 insertions, 343 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
index 21187cf05..8e6c6388e 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
@@ -10,8 +10,6 @@
package org.eclipse.tcf.te.ui.trees;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
@@ -20,81 +18,47 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProvider;
-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.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.tcf.te.core.interfaces.IViewerInput;
import org.eclipse.tcf.te.runtime.utils.Host;
import org.eclipse.tcf.te.ui.WorkbenchPartControl;
-import org.eclipse.tcf.te.ui.activator.UIPlugin;
import org.eclipse.tcf.te.ui.forms.CustomFormToolkit;
-import org.eclipse.tcf.te.ui.interfaces.ImageConsts;
-import org.eclipse.tcf.te.ui.nls.Messages;
import org.eclipse.ui.IDecoratorManager;
-import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
/**
* Abstract tree control implementation.
*/
-public abstract class AbstractTreeControl extends WorkbenchPartControl implements SelectionListener,
- IDoubleClickListener, PropertyChangeListener, ISelectionChangedListener, FocusListener {
+public abstract class AbstractTreeControl extends WorkbenchPartControl implements SelectionListener {
// Reference to the tree viewer instance
private TreeViewer viewer;
// Reference to the selection changed listener
@@ -107,8 +71,8 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
private TreeViewerState viewerState;
// The action to configure the filters.
private ConfigFilterAction configFilterAction;
- // The tool bar manager
- private ToolBarManager toolbarManager;
+ // The menu manager
+ private MenuManager manager;
/**
* Constructor.
@@ -122,8 +86,8 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
*
* @param parentPart The parent workbench part this control is embedded in or <code>null</code>.
*/
- public AbstractTreeControl(IWorkbenchPart parentPart) {
- super(parentPart);
+ public AbstractTreeControl(IWorkbenchPart parent) {
+ super(parent);
}
/* (non-Javadoc)
@@ -171,10 +135,10 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
// Create the tree viewer
viewer = doCreateTreeViewer(parent);
// And configure the tree viewer
- configureTreeViewer(viewer);
+ doConfigureTreeViewer(viewer);
// Prepare popup menu and toolbar
- createContributionItems(viewer);
+ doCreateContributionItems(viewer);
}
/**
@@ -193,7 +157,7 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
*
* @param viewer The tree viewer. Must not be <code>null</code>.
*/
- protected void configureTreeViewer(TreeViewer viewer) {
+ protected void doConfigureTreeViewer(TreeViewer viewer) {
Assert.isNotNull(viewer);
viewer.setAutoExpandLevel(getAutoExpandLevel());
@@ -206,8 +170,6 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("inputChanged")) { //$NON-NLS-1$
onInputChanged(args[1], args[2]);
- } else if(method.getName().equals("dispose")) { //$NON-NLS-1$
- onContentProviderDisposed();
}
return method.invoke(contentProvider, args);
}
@@ -222,21 +184,11 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
viewer.getTree().setLayoutData(doCreateTreeViewerLayoutData(viewer));
// Attach the selection changed listener
- viewer.addSelectionChangedListener(this);
selectionChangedListener = doCreateTreeViewerSelectionChangedListener(viewer);
if (selectionChangedListener != null) {
viewer.addSelectionChangedListener(selectionChangedListener);
}
- viewer.addDoubleClickListener(this);
-
- // Set the help context.
- String helpContextId = getHelpId();
- if (helpContextId != null) {
- PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getTree(), helpContextId);
- }
- Tree tree = viewer.getTree();
- tree.addFocusListener(this);
// Define an editor activation strategy for the common viewer so as to be invoked only programmatically.
ColumnViewerEditorActivationStrategy activationStrategy = new TreeViewerEditorActivationStrategy(getViewerId(), viewer);
TreeViewerEditor.create(viewer, null, activationStrategy, ColumnViewerEditor.DEFAULT);
@@ -250,64 +202,19 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
* @param newInput The new input.
*/
void onInputChanged(Object oldInput, Object newInput) {
- if(oldInput != null) {
- uninstallPropertyChangeListener(oldInput);
- }
columns = doCreateViewerColumns(newInput);
filterDescriptors = doCreateFilterDescriptors(newInput);
if (isStatePersistent()) {
updateViewerState(newInput);
}
- createTreeColumns(viewer);
+ doCreateTreeColumns(viewer);
viewer.getTree().setHeaderVisible(true);
updateFilters();
new TreeViewerHeaderMenu(this).create();
configFilterAction.updateEnablement();
- if(newInput != null) {
- installPropertyChangeListener(newInput);
- }
- }
-
- /**
- * Handle the event when the content provider is disposed.
- * Un-install the property change listener that has been added
- * to the input.
- *
- * @param oldInput the old input.
- * @param newInput The new input.
- */
- void onContentProviderDisposed() {
- Object input = viewer.getInput();
- if(input != null) {
- uninstallPropertyChangeListener(input);
- }
- }
-
- /**
- * Uninstall the property change listener from the specified input.
- *
- * @param input The input of the tree viewer.
- */
- private void uninstallPropertyChangeListener(Object input) {
- IViewerInput viewerInput = ViewerStateManager.getViewerInput(input);
- if(viewerInput != null) {
- viewerInput.removePropertyChangeListener(this);
- }
}
/**
- * Install the property change listener to the input of the tree viewer.
- *
- * @param input The input of the tree viewer.
- */
- private void installPropertyChangeListener(Object input) {
- IViewerInput viewerInput = ViewerStateManager.getViewerInput(input);
- if(viewerInput != null) {
- viewerInput.addPropertyChangeListener(this);
- }
- }
-
- /**
* Update the viewer state using the states from the viewerState which
* is retrieved or created based on the input.
*
@@ -368,7 +275,7 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
return true;
}
else if (!column.isVisible() && visible) {
- TreeColumn treeColumn = createTreeColumn(column, false);
+ TreeColumn treeColumn = doCreateTreeColumn(column, false);
column.setTreeColumn(treeColumn);
column.setVisible(visible);
return true;
@@ -387,15 +294,6 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
}
/**
- * Get the help context id of this viewer.
- *
- * @return The help context id or null if no help available.
- */
- protected String getHelpId() {
- return null;
- }
-
- /**
* Create the tree viewer columns from the viewers extension.
* Subclass may override it to provide its customized viewer columns.
*
@@ -448,7 +346,7 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
*
* @param viewer The tree viewer.
*/
- protected void createTreeColumns(TreeViewer viewer) {
+ protected void doCreateTreeColumns(TreeViewer viewer) {
Assert.isTrue(columns != null && columns.length > 0);
List<ColumnDescriptor> visibleColumns = new ArrayList<ColumnDescriptor>();
for (ColumnDescriptor column : columns) {
@@ -460,7 +358,7 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
return o1.getOrder() < o2.getOrder() ? -1 : (o1.getOrder() > o2.getOrder() ? 1 : 0);
}});
for(ColumnDescriptor visibleColumn : visibleColumns) {
- createTreeColumn(visibleColumn, true);
+ doCreateTreeColumn(visibleColumn, true);
}
if(!Host.isWindowsHost()) {
Tree tree = viewer.getTree();
@@ -484,7 +382,7 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
* @param append If the new column should be appended.
* @return The tree column created.
*/
- TreeColumn createTreeColumn(final ColumnDescriptor column, boolean append) {
+ TreeColumn doCreateTreeColumn(final ColumnDescriptor column, boolean append) {
Tree tree = viewer.getTree();
final TreeColumn treeColumn = append ? new TreeColumn(tree, column.getStyle()) :
new TreeColumn(tree, column.getStyle(), getColumnIndex(column));
@@ -626,11 +524,11 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
*
* @param viewer The tree viewer instance. Must not be <code>null</code>.
*/
- protected void createContributionItems(TreeViewer viewer) {
+ protected void doCreateContributionItems(TreeViewer viewer) {
Assert.isNotNull(viewer);
// Create the menu manager
- MenuManager manager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ manager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
// Attach the menu listener
manager.addMenuListener(new IMenuListener() {
@Override
@@ -642,72 +540,15 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
manager.setRemoveAllWhenShown(true);
// Associated with the tree
viewer.getTree().setMenu(manager.createContextMenu(viewer.getTree()));
-
- // Register the context menu at the parent workbench part site.
- if (getParentPart() != null && getParentPart().getSite() != null && getContextMenuId() != null) {
- getParentPart().getSite().registerContextMenu(getContextMenuId(), manager, viewer);
- }
-
- // The toolbar is a bit more complicated as we want to have the
- // toolbar placed within the section title.
- createToolbarContributionItem(viewer);
}
-
+
/**
- * Returns the context menu id.
- *
- * @return The context menu id.
+ * Get the context menu manager.
+ *
+ * @return the context menu manager.
*/
- protected abstract String getContextMenuId();
-
- /**
- * Creates the toolbar within the section parent of the given tree viewer.
- *
- * @param viewer The tree viewer instance. Must not be <code>null</code>.
- */
- protected void createToolbarContributionItem(TreeViewer viewer) {
- Assert.isNotNull(viewer);
-
- // Determine the section parent from the tree viewer
- Composite parent = viewer.getTree().getParent();
- while (parent != null && !(parent instanceof Section)) {
- parent = parent.getParent();
- }
-
- // We are done here if we cannot find a section parent or the parent is disposed
- if (parent == null || parent.isDisposed()) {
- return;
- }
-
- toolbarManager = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL | SWT.RIGHT);
- // create the toolbar items
- createToolBarItems(toolbarManager);
- if (getParentPart() != null && getParentPart().getSite() != null && getContextMenuId() != null) {
- IMenuService service = (IMenuService) getParentPart().getSite().getService(IMenuService.class);
- if (service != null) {
- service.populateContributionManager(toolbarManager, "toolbar:" + this.getContextMenuId()); //$NON-NLS-1$
- }
- }
- ToolBar toolbar = toolbarManager.createControl(parent);
-
- // The cursor within the toolbar shall change to an hand
- final Cursor handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
- toolbar.setCursor(handCursor);
- // Cursor needs to be explicitly disposed
- toolbar.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent e) {
- if (handCursor.isDisposed() == false) {
- handCursor.dispose();
- }
- }
- });
-
- // If the parent composite is a forms section, set the toolbar
- // as text client to the section header
- Section section = (Section)parent;
- // Set the toolbar as text client
- section.setTextClient(toolbar);
+ public MenuManager getContextMenuManager() {
+ return manager;
}
/**
@@ -718,21 +559,9 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
*
* @param toolbarManager The toolbar to add the toolbar items too. Must not be <code>null</code>.
*/
- protected void createToolBarItems(ToolBarManager toolbarManager) {
- Assert.isNotNull(toolbarManager);
- toolbarManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ public void createToolbarContributionItems(IToolBarManager toolbarManager) {
toolbarManager.add(new CollapseAllAction(this));
toolbarManager.add(configFilterAction = new ConfigFilterAction(this));
- Action action = new Action(null, IAction.AS_PUSH_BUTTON){
- @Override
- public void run() {
- PlatformUI.getWorkbench().getHelpSystem().displayDynamicHelp();
- }
- };
- action.setToolTipText(Messages.AbstractTreeControl_HelpTooltip);
- ImageDescriptor image = UIPlugin.getImageDescriptor(ImageConsts.VIEWER_HELP);
- action.setImageDescriptor(image);
- toolbarManager.add(action);
}
/**
@@ -816,153 +645,4 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
-
- /**
- * Listens to the double-click event of the tree and expand or collapse
- * the tree by default. Subclass may override this method to invoke certain
- * command.
- *
- * @param event the double click event
- * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(DoubleClickEvent)
- */
- @Override
- public void doubleClick(final DoubleClickEvent event) {
- // If an handled and enabled command is registered for the ICommonActionConstants.OPEN
- // retargetable action id, redirect the double click handling to the command handler.
- //
- // Note: The default tree node expansion must be re-implemented in the active handler!
- String commandId = getDoubleClickCommandId();
- Command cmd = null;
- if(commandId != null) {
- ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class);
- cmd = service != null ? service.getCommand(commandId) : null;
- }
- if (cmd != null && cmd.isDefined() && cmd.isEnabled()) {
- final Command command = cmd;
- SafeRunner.run(new SafeRunnable(){
- @Override
- public void handleException(Throwable e) {
- // Ignore exception
- }
- @Override
- public void run() throws Exception {
- ISelection selection = event.getSelection();
- EvaluationContext ctx = new EvaluationContext(null, selection);
- ctx.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection);
- ctx.addVariable(ISources.ACTIVE_MENU_SELECTION_NAME, selection);
- ctx.addVariable(ISources.ACTIVE_WORKBENCH_WINDOW_NAME, PlatformUI.getWorkbench().getActiveWorkbenchWindow());
- IWorkbenchPart part = getParentPart();
- if (part != null) {
- IWorkbenchPartSite site = part.getSite();
- ctx.addVariable(ISources.ACTIVE_PART_ID_NAME, site.getId());
- ctx.addVariable(ISources.ACTIVE_PART_NAME, part);
- ctx.addVariable(ISources.ACTIVE_SITE_NAME, site);
- ctx.addVariable(ISources.ACTIVE_SHELL_NAME, site.getShell());
- }
- ctx.setAllowPluginActivation(true);
-
- ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, null);
- Assert.isNotNull(pCmd);
- IHandlerService handlerSvc = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class);
- Assert.isNotNull(handlerSvc);
- handlerSvc.executeCommandInContext(pCmd, null, ctx);
- }});
- } else {
- IStructuredSelection selection = (IStructuredSelection) event.getSelection();
- Object element = selection.getFirstElement();
- TreeViewer viewer = (TreeViewer) getViewer();
- if (viewer.isExpandable(element)) {
- viewer.setExpandedState(element, !viewer.getExpandedState(element));
- }
- }
- }
-
- /**
- * Get the id of the command invoked when the tree is double-clicked.
- * If the id is null, then no command is invoked.
- *
- * @return The double-click command id.
- */
- protected String getDoubleClickCommandId() {
- return null;
- }
-
- /*
- * (non-Javadoc)
- * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
- */
- @Override
- public void propertyChange(final PropertyChangeEvent event) {
- Object object = event.getSource();
- if (object == viewer.getInput()) {
- ToolBar toolbar = toolbarManager.getControl();
- if (!toolbar.isDisposed()) {
- Display display = toolbar.getDisplay();
- if (display.getThread() == Thread.currentThread()) {
- IContributionItem[] items = toolbarManager.getItems();
- for (IContributionItem item : items) {
- item.update();
- }
- }
- else {
- display.asyncExec(new Runnable() {
- @Override
- public void run() {
- propertyChange(event);
- }
- });
- }
- }
- }
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
- */
- @Override
- public void focusGained(FocusEvent e) {
- propagateSelection();
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
- */
- @Override
- public void focusLost(FocusEvent e) {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
- */
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
- propagateSelection();
- }
-
- /**
- * Propagate the current selection to the editor's selection provider.
- */
- private void propagateSelection() {
- IWorkbenchPart parent = getParentPart();
- if (parent != null) {
- IWorkbenchPartSite site = parent.getSite();
- if (site != null) {
- ISelection selection = getViewer().getSelection();
- ISelectionProvider selectionProvider = site.getSelectionProvider();
- // If the parent control is already disposed, we have no real chance of
- // testing for it. Catch the SWT exception here just in case.
- try {
- selectionProvider.setSelection(selection);
- if (selectionProvider instanceof MultiPageSelectionProvider) {
- SelectionChangedEvent changedEvent = new SelectionChangedEvent(selectionProvider, selection);
- ((MultiPageSelectionProvider) selectionProvider).firePostSelectionChanged(changedEvent);
- }
- } catch (SWTException e) {
- /* ignored on purpose */
- }
- }
- }
- }
} \ No newline at end of file

Back to the top