/*******************************************************************************
* Copyright (c) 2011 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
* William Chen (Wind River) - [345384] Provide property pages for remote file system nodes
*******************************************************************************/
package org.eclipse.tm.te.tcf.filesystem.controls;
import java.util.Collections;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.expressions.EvaluationContext;
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.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.tm.te.tcf.filesystem.internal.nls.Messages;
import org.eclipse.tm.te.ui.interfaces.IUIConstants;
import org.eclipse.tm.te.ui.trees.AbstractTreeControl;
import org.eclipse.ui.IDecoratorManager;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbench;
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.navigator.ICommonActionConstants;
import org.eclipse.ui.part.MultiPageSelectionProvider;
/**
* File system browser control.
*/
public class FSTreeControl extends AbstractTreeControl implements ISelectionChangedListener, IDoubleClickListener {
/**
* Constructor.
*/
public FSTreeControl() {
super();
}
/**
* Constructor.
*
* @param parentPart The parent workbench part this control is embedded in or <code>null</code>.
*/
public FSTreeControl(IWorkbenchPart parentPart) {
super(parentPart);
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
protected void configureTreeViewer(TreeViewer viewer) {
super.configureTreeViewer(viewer);
Tree tree = viewer.getTree();
if (hasColumns()) {
TreeColumn column = new TreeColumn(tree, SWT.LEFT);
column.setText(Messages.FSTreeControl_column_name_label);
column.setWidth(300);
column = new TreeColumn(tree, SWT.RIGHT);
column.setText(Messages.FSTreeControl_column_size_label);
column.setWidth(100);
column = new TreeColumn(tree, SWT.RIGHT);
column.setText(Messages.FSTreeControl_column_modified_label);
column.setWidth(200);
}
tree.setHeaderVisible(hasColumns());
viewer.addDoubleClickListener(this);
}
/**
* Returns if or if not to show the tree columns.
*
* @return <code>True</code> to show the tree columns, <code>false</code> otherwise.
*/
protected boolean hasColumns() {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#doCreateTreeViewerContentProvider(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
protected ITreeContentProvider doCreateTreeViewerContentProvider(TreeViewer viewer) {
return new FSTreeContentProvider();
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#doCreateTreeViewerLabelProvider(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
protected ILabelProvider doCreateTreeViewerLabelProvider(TreeViewer viewer) {
FSTreeLabelProvider labelProvider = new FSTreeLabelProvider(viewer);
IWorkbench workbench = PlatformUI.getWorkbench();
IDecoratorManager manager = workbench.getDecoratorManager();
ILabelDecorator decorator = manager.getLabelDecorator();
return new FSTreeDecoratingLabelProvider(labelProvider,decorator);
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#doCreateTreeViewerSelectionChangedListener(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
protected ISelectionChangedListener doCreateTreeViewerSelectionChangedListener(TreeViewer viewer) {
return this;
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#doCreateTreeViewerComparator(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
protected ViewerComparator doCreateTreeViewerComparator(TreeViewer viewer) {
return new FSTreeViewerComparator(viewer, (ILabelProvider)viewer.getLabelProvider());
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#getAutoExpandLevel()
*/
@Override
protected int getAutoExpandLevel() {
return 0;
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.tcf.vtl.ui.datasource.controls.trees.AbstractTreeControl#getContextMenuId()
*/
@Override
protected String getContextMenuId() {
return IUIConstants.ID_CONTROL_MENUS_BASE + ".menu.fs"; //$NON-NLS-1$;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
IWorkbenchPart parent = getParentPart();
if (parent != null) {
IWorkbenchPartSite site = parent.getSite();
if (site != null) {
ISelectionProvider selectionProvider = site.getSelectionProvider();
if (selectionProvider instanceof MultiPageSelectionProvider) {
// Propagate the selection event to update the selection context.
((MultiPageSelectionProvider) selectionProvider).fireSelectionChanged(event);
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
*/
@Override
public void doubleClick(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!
ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class);
Command command = service != null ? service.getCommand(ICommonActionConstants.OPEN) : null;
if (command != null && command.isDefined() && command.isEnabled()) {
try {
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());
}
ExecutionEvent executionEvent = new ExecutionEvent(command, Collections.EMPTY_MAP, part, ctx);
command.executeWithChecks(executionEvent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}