blob: 57f5d779ecbebb74e2dd25576dce7ef90cb5c915 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 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.pde.internal.ua.ui.editor.cheatsheet.comp;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.internal.ua.core.icheatsheet.comp.*;
import org.eclipse.pde.internal.ua.ui.PDEUserAssistanceUIPlugin;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.ICSDetails;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.ICSMaster;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.comp.actions.CompCSAddGroupAction;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.comp.actions.CompCSAddTaskAction;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.comp.actions.CompCSRemoveTaskObjectAction;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
import org.eclipse.pde.internal.ui.editor.TreeSection;
import org.eclipse.pde.internal.ui.editor.actions.CollapseAction;
import org.eclipse.pde.internal.ui.parts.TreePart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.cheatsheets.OpenCheatSheetAction;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
/**
* CompCSMasterTreeSection
*
*/
public class CompCSMasterTreeSection extends TreeSection implements ICSMaster {
private static final int F_BUTTON_ADD_TASK = 0;
private static final int F_BUTTON_ADD_GROUP = 1;
private static final int F_BUTTON_REMOVE = 2;
private static final int F_BUTTON_UP = 3;
private static final int F_BUTTON_DOWN = 4;
private static final int F_BUTTON_PREVIEW = 5;
private static final int F_UP_FLAG = -1;
private static final int F_DOWN_FLAG = 1;
private TreeViewer fTreeViewer;
private ICompCSModel fModel;
private CollapseAction fCollapseAction;
private CompCSRemoveTaskObjectAction fRemoveTaskObjectAction;
private CompCSAddGroupAction fAddGroupAction;
private CompCSAddTaskAction fAddTaskAction;
private CompCSGroupValidator fGroupValidator;
/**
* @param formPage
* @param parent
* @param style
* @param buttonLabels
*/
public CompCSMasterTreeSection(PDEFormPage formPage, Composite parent) {
super(formPage, parent, Section.DESCRIPTION, new String[] {Messages.CompCSMasterTreeSection_addTask, Messages.CompCSMasterTreeSection_addGroup, Messages.CompCSMasterTreeSection_Remove, Messages.CompCSMasterTreeSection_Up, Messages.CompCSMasterTreeSection_Down, Messages.CompCSMasterTreeSection_Preview});
// Create actions
fAddGroupAction = new CompCSAddGroupAction();
fAddTaskAction = new CompCSAddTaskAction();
fRemoveTaskObjectAction = new CompCSRemoveTaskObjectAction();
fCollapseAction = null;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.PDESection#createClient(org.eclipse.ui.forms.widgets.Section, org.eclipse.ui.forms.widgets.FormToolkit)
*/
protected void createClient(Section section, FormToolkit toolkit) {
// Get the model
fModel = (ICompCSModel) getPage().getModel();
Composite container = createClientContainer(section, 2, toolkit);
createTree(container, toolkit);
toolkit.paintBordersFor(container);
section.setText(Messages.CompCSMasterTreeSection_Content);
section.setDescription(Messages.CompCSMasterTreeSection_sectionDesc);
section.setClient(container);
initializeTreeViewer();
createSectionToolbar(section, toolkit);
}
/**
* @param container
* @param toolkit
*/
private void createTree(Composite container, FormToolkit toolkit) {
TreePart treePart = getTreePart();
createViewerPartControl(container, SWT.SINGLE, 2, toolkit);
fTreeViewer = treePart.getTreeViewer();
fTreeViewer.setContentProvider(new CompCSContentProvider());
fTreeViewer.setLabelProvider(PDEUserAssistanceUIPlugin.getDefault().getLabelProvider());
PDEUserAssistanceUIPlugin.getDefault().getLabelProvider().connect(this);
createTreeListeners();
// TODO: MP: LOW: CompCS: Implement drag and drop move feature
}
/**
*
*/
private void createTreeListeners() {
// Create listener for the outline view 'link with editor' toggle
// button
fTreeViewer.addPostSelectionChangedListener(getPage().getPDEEditor().new PDEFormEditorChangeListener());
}
/**
* @return
*/
public ISelection getSelection() {
return fTreeViewer.getSelection();
}
/**
*
*/
private void initializeTreeViewer() {
if (fModel == null) {
return;
}
fTreeViewer.setInput(fModel);
ICompCS cheatsheet = fModel.getCompCS();
// Create the group validator and register all existing groups to be
// validated within the workspace model
fGroupValidator = new CompCSGroupValidator(cheatsheet, getManagedForm().getForm().getForm(), Messages.CompCSMasterTreeSection_content);
// If the cheat sheet already has a task object, then the object has
// to be deleted first before a new task or group can be added to
// the root cheatsheet node
boolean addFlag = false;
if (cheatsheet.getFieldTaskObject() == null) {
addFlag = fModel.isEditable();
}
getTreePart().setButtonEnabled(F_BUTTON_ADD_TASK, addFlag);
getTreePart().setButtonEnabled(F_BUTTON_ADD_GROUP, addFlag);
// Set to false because initial node selected is the root cheatsheet node
getTreePart().setButtonEnabled(F_BUTTON_REMOVE, false);
// Set to false because initial node selected is the root cheatsheet node
getTreePart().setButtonEnabled(F_BUTTON_UP, false);
// Set to false because initial node selected is the root cheatsheet node
getTreePart().setButtonEnabled(F_BUTTON_DOWN, false);
// Validate initial file content
// TODO: MP: LOW: CompCS: The error message does not show up in the form on load for some reason
// TODO: MP: LOW: CompCS: Implement error image overlay on icon ILightWeightLabelDecorator
// TODO: MP: LOW: CompCS: The error message dissapears on up / down movement
updatePreviewButton(fGroupValidator.validate());
// Select the cheatsheet node in the tree
fTreeViewer.setSelection(new StructuredSelection(cheatsheet), true);
fTreeViewer.expandToLevel(2);
}
/**
* @param section
* @param toolkit
*/
private void createSectionToolbar(Section section, FormToolkit toolkit) {
ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
ToolBar toolbar = toolBarManager.createControl(section);
final Cursor handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
toolbar.setCursor(handCursor);
// Cursor needs to be explicitly disposed
toolbar.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if ((handCursor != null) && (handCursor.isDisposed() == false)) {
handCursor.dispose();
}
}
});
// Add collapse action to the tool bar
fCollapseAction = new CollapseAction(fTreeViewer, Messages.CompCSMasterTreeSection_collapseAll, 1, fModel.getCompCS());
toolBarManager.add(fCollapseAction);
toolBarManager.update(true);
section.setTextClient(toolbar);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#buttonSelected(int)
*/
protected void buttonSelected(int index) {
switch (index) {
case F_BUTTON_ADD_TASK :
handleAddTaskAction();
break;
case F_BUTTON_ADD_GROUP :
handleAddGroupAction();
break;
case F_BUTTON_REMOVE :
handleDeleteAction();
break;
case F_BUTTON_UP :
handleMoveTaskObjectAction(F_UP_FLAG);
break;
case F_BUTTON_DOWN :
handleMoveTaskObjectAction(F_DOWN_FLAG);
break;
case F_BUTTON_PREVIEW :
handlePreviewAction();
break;
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.TreeSection#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
*/
protected void selectionChanged(IStructuredSelection selection) {
updateButtons();
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.cheatsheet.simple.details.ISimpleCSMaster#updateButtons()
*/
public void updateButtons() {
if (!fModel.isEditable()) {
return;
}
Object object = ((IStructuredSelection) fTreeViewer.getSelection()).getFirstElement();
ICompCSObject csObject = (ICompCSObject) object;
boolean canAddTask = false;
boolean canAddGroup = false;
boolean canRemove = false;
boolean canMoveUp = false;
boolean canMoveDown = false;
if (csObject != null) {
ICompCSObject parent = csObject.getParent();
if ((csObject.getType() == ICompCSConstants.TYPE_TASK) || (csObject.getType() == ICompCSConstants.TYPE_TASKGROUP)) {
if ((parent.getType() == ICompCSConstants.TYPE_COMPOSITE_CHEATSHEET) && (csObject.getType() == ICompCSConstants.TYPE_TASKGROUP)) {
canAddTask = true;
canAddGroup = true;
} else if (parent.getType() == ICompCSConstants.TYPE_TASKGROUP) {
ICompCSTaskGroup taskGroup = (ICompCSTaskGroup) parent;
ICompCSTaskObject taskObject = (ICompCSTaskObject) csObject;
if (taskGroup.isFirstFieldTaskObject(taskObject) == false) {
canMoveUp = true;
}
if (taskGroup.isLastFieldTaskObject(taskObject) == false) {
canMoveDown = true;
}
canRemove = canRemoveTaskObject(taskGroup);
canAddTask = true;
canAddGroup = true;
}
}
}
getTreePart().setButtonEnabled(F_BUTTON_ADD_TASK, canAddTask);
getTreePart().setButtonEnabled(F_BUTTON_ADD_GROUP, canAddGroup);
getTreePart().setButtonEnabled(F_BUTTON_REMOVE, canRemove);
getTreePart().setButtonEnabled(F_BUTTON_UP, canMoveUp);
getTreePart().setButtonEnabled(F_BUTTON_DOWN, canMoveDown);
}
/**
*
*/
private void handleAddTaskAction() {
ISelection sel = fTreeViewer.getSelection();
Object object = ((IStructuredSelection) sel).getFirstElement();
if (object == null) {
return;
}
if (object instanceof ICompCSTaskGroup) {
fAddTaskAction.setParentObject((ICompCSObject) object);
fAddTaskAction.run();
} else if (object instanceof ICompCSTask) {
fAddTaskAction.setParentObject(((ICompCSObject) object).getParent());
fAddTaskAction.run();
}
}
/**
* @param flag
*/
private void updatePreviewButton(boolean flag) {
getTreePart().setButtonEnabled(F_BUTTON_PREVIEW, flag);
}
/**
*
*/
private void handleAddGroupAction() {
ISelection sel = fTreeViewer.getSelection();
Object object = ((IStructuredSelection) sel).getFirstElement();
if (object == null) {
return;
}
if (object instanceof ICompCSTaskGroup) {
fAddGroupAction.setParentObject((ICompCSObject) object);
fAddGroupAction.run();
} else if (object instanceof ICompCSTask) {
fAddGroupAction.setParentObject(((ICompCSObject) object).getParent());
fAddGroupAction.run();
}
}
/**
*
*/
private void handleMoveTaskObjectAction(int positionFlag) {
ISelection sel = fTreeViewer.getSelection();
Object object = ((IStructuredSelection) sel).getFirstElement();
if (object == null) {
return;
} else if (object instanceof ICompCSTaskObject) {
ICompCSTaskObject taskObject = (ICompCSTaskObject) object;
ICompCSTaskGroup parent = null;
// Determine the parents type
if (taskObject.getParent().getType() == ICompCSConstants.TYPE_TASKGROUP) {
parent = (ICompCSTaskGroup) taskObject.getParent();
} else {
return;
}
// Move the task object up or down one position
parent.moveFieldTaskObject(taskObject, positionFlag);
}
}
/**
*
*/
private void handlePreviewAction() {
// Get the editor input
// Could be IFileEditorInput (File in workpspace - e.g. Package Explorer View)
// Could be IStorageEditorInput (File not in workpsace - e.g. CVS Repositories View)
IEditorInput input = getPage().getEditorInput();
URL url = null;
try {
if (input instanceof IFileEditorInput) {
IFileEditorInput fileInput = (IFileEditorInput) input;
url = fileInput.getFile().getLocationURI().toURL();
} else if (input instanceof IStorageEditorInput) {
// Note: This URL does not exist on the local file system
// As a result any tasks this composite cheat sheet has that
// specify a pathes to simple cheat sheets will not resolve
// Cheat sheet view will log an error loading simple cheat
// sheets
IStorageEditorInput storageInput = (IStorageEditorInput) input;
url = storageInput.getStorage().getFullPath().toFile().toURI().toURL();
} else {
// No base URL. Pathes will definitely not resolve here
url = null;
}
// Write the current model into a String as raw XML
StringWriter swriter = new StringWriter();
PrintWriter writer = new PrintWriter(swriter);
fModel.getCompCS().write("", writer); //$NON-NLS-1$
writer.flush();
swriter.close();
// Launch in the cheat sheet view
OpenCheatSheetAction openAction = new OpenCheatSheetAction(input.getName(), input.getName(), swriter.toString(), url);
openAction.run();
} catch (IOException e) {
PDEUserAssistanceUIPlugin.logException(e);
} catch (CoreException e) {
PDEUserAssistanceUIPlugin.logException(e);
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.PDESection#modelChanged(org.eclipse.pde.core.IModelChangedEvent)
*/
public void modelChanged(IModelChangedEvent event) {
// No need to call super, world changed event handled here
if (event.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
handleModelEventWorldChanged(event);
} else if (event.getChangeType() == IModelChangedEvent.INSERT) {
handleModelInsertType(event);
} else if (event.getChangeType() == IModelChangedEvent.REMOVE) {
handleModelRemoveType(event);
} else if (event.getChangeType() == IModelChangedEvent.CHANGE) {
handleModelChangeType(event);
}
// Validate registered groups regardless of change type
// Validation is not required for task and composite cheat sheet
// change types (performance savings available); but, is required for
// everything else
updatePreviewButton(fGroupValidator.validate());
}
/**
* @param event
*/
private void handleModelEventWorldChanged(IModelChangedEvent event) {
Object[] objects = event.getChangedObjects();
ICompCSObject object = (ICompCSObject) objects[0];
if (object == null) {
// Ignore
return;
} else if (object.getType() == ICompCSConstants.TYPE_COMPOSITE_CHEATSHEET) {
// Get the form page
CompCSPage page = (CompCSPage) getPage();
// Remember the currently selected page
IDetailsPage previousDetailsPage = page.getBlock().getDetailsPart().getCurrentPage();
// Replace the current dirty model with the model reloaded from
// file
fModel = ((ICompCS) object).getModel();
// Reset the treeviewer using the new model as input
// TODO: MP: CompCS: This is redundant and should be deleted
fTreeViewer.setInput(fModel);
// Re-initialize the tree viewer. Makes a details page selection
initializeTreeViewer();
// Get the current details page selection
IDetailsPage currentDetailsPage = page.getBlock().getDetailsPart().getCurrentPage();
// If the selected page before the revert is the same as the
// selected page after the revert, then its fields will need to
// be updated
// TODO: MP: REVERT: LOW: Revisit to see if updating details page is necessary - especially after making static
if (currentDetailsPage.equals(previousDetailsPage) && currentDetailsPage instanceof ICSDetails) {
((ICSDetails) currentDetailsPage).updateFields();
}
}
}
/**
* @param event
*/
private void handleModelInsertType(IModelChangedEvent event) {
// Insert event
Object[] objects = event.getChangedObjects();
ICompCSObject object = (ICompCSObject) objects[0];
if (object == null) {
// Ignore
} else if (object.getType() == ICompCSConstants.TYPE_TASK) {
handleTaskObjectInsert(object);
} else if (object.getType() == ICompCSConstants.TYPE_TASKGROUP) {
handleTaskObjectInsert(object);
// Register the group for validation
fGroupValidator.addGroup((ICompCSTaskGroup) object);
}
}
/**
* @param object
*/
private void handleTaskObjectInsert(ICompCSObject object) {
// Refresh the parent element in the tree viewer
// TODO: MP: CompCS: LOW: Can we get away with an update instead of a refresh here?
fTreeViewer.refresh(object.getParent());
// Select the new task / group in the tree
fTreeViewer.setSelection(new StructuredSelection(object), true);
}
/**
* @param event
*/
private void handleModelRemoveType(IModelChangedEvent event) {
// Remove event
Object[] objects = event.getChangedObjects();
ICompCSObject object = (ICompCSObject) objects[0];
if (object == null) {
// Ignore
} else if (object.getType() == ICompCSConstants.TYPE_TASK) {
handleTaskObjectRemove(object);
} else if (object.getType() == ICompCSConstants.TYPE_TASKGROUP) {
handleTaskObjectRemove(object);
// Unregister the group from validation
fGroupValidator.removeGroup((ICompCSTaskGroup) object);
}
}
/**
* @param object
*/
private void handleTaskObjectRemove(ICompCSObject object) {
// Remove the item
fTreeViewer.remove(object);
// Select the appropriate object
ICompCSObject csObject = fRemoveTaskObjectAction.getObjectToSelect();
if (csObject == null) {
csObject = object.getParent();
}
fTreeViewer.setSelection(new StructuredSelection(csObject), true);
}
/**
* @param event
*/
private void handleModelChangeType(IModelChangedEvent event) {
// Change event
Object[] objects = event.getChangedObjects();
ICompCSObject object = (ICompCSObject) objects[0];
if (object == null) {
// Ignore
} else if (object.getType() == ICompCSConstants.TYPE_TASK) {
// Update the element in the tree viewer
fTreeViewer.update(object, null);
} else if (object.getType() == ICompCSConstants.TYPE_TASKGROUP) {
// Refresh the element in the tree viewer
fTreeViewer.update(object, null);
} else if (object.getType() == ICompCSConstants.TYPE_COMPOSITE_CHEATSHEET) {
// Refresh the element in the tree viewer
fTreeViewer.update(object, null);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.pde.internal.ui.editor.cheatsheet.ICSMaster#fireSelection()
*/
public void fireSelection() {
fTreeViewer.setSelection(fTreeViewer.getSelection());
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#fillContextMenu(org.eclipse.jface.action.IMenuManager)
*/
protected void fillContextMenu(IMenuManager manager) {
// Get the current selection
ISelection selection = fTreeViewer.getSelection();
Object object = ((IStructuredSelection) selection).getFirstElement();
// Do blind cast - has to be a composite CS object
// Could be null
ICompCSObject csObject = (ICompCSObject) object;
// Create the "New" sub-menu
MenuManager submenu = new MenuManager(Messages.CompCSMasterTreeSection_new);
// Add the "New" sub-menu to the main context menu
manager.add(submenu);
if ((csObject == null) || (csObject.getType() == ICompCSConstants.TYPE_COMPOSITE_CHEATSHEET)) {
// NO-OP
} else if (csObject.getType() == ICompCSConstants.TYPE_TASK) {
// Remove task action
fillContextMenuRemoveAction(manager, (ICompCSTaskObject) csObject);
} else if (csObject.getType() == ICompCSConstants.TYPE_TASKGROUP) {
ICompCSTaskGroup group = (ICompCSTaskGroup) csObject;
// Add to the "New" sub-menu
// Add task action
fAddTaskAction.setParentObject(group);
fAddTaskAction.setEnabled(fModel.isEditable());
submenu.add(fAddTaskAction);
// Add to the "New" sub-menu
// Add group action
fAddGroupAction.setParentObject(group);
fAddGroupAction.setEnabled(fModel.isEditable());
submenu.add(fAddGroupAction);
// Remove task group action
fillContextMenuRemoveAction(manager, (ICompCSTaskObject) csObject);
}
// Add normal edit operations
// TODO: MP: LOW: SimpleCS: Enable context menu edit operations
//getPage().getPDEEditor().getContributor().contextMenuAboutToShow(manager);
//manager.add(new Separator());
}
/**
* @param manager
* @param csObject
*/
private void fillContextMenuRemoveAction(IMenuManager manager, ICompCSTaskObject taskObject) {
// Add to the main context menu
// Add a separator to the main context menu
manager.add(new Separator());
// Delete task object action
fRemoveTaskObjectAction.setTaskObject(taskObject);
manager.add(fRemoveTaskObjectAction);
ICompCSObject parent = taskObject.getParent();
if (canRemoveTaskObject(parent) == false) {
fRemoveTaskObjectAction.setEnabled(false);
} else {
fRemoveTaskObjectAction.setEnabled(fModel.isEditable());
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.PDESection#doGlobalAction(java.lang.String)
*/
public boolean doGlobalAction(String actionId) {
if (actionId.equals(ActionFactory.DELETE.getId())) {
handleDeleteAction();
return true;
}
return false;
}
/**
* @param object
*/
private void handleDeleteAction() {
ISelection sel = fTreeViewer.getSelection();
Object object = ((IStructuredSelection) sel).getFirstElement();
if (object != null) {
if (object instanceof ICompCSTaskObject) {
ICompCSTaskObject taskObject = (ICompCSTaskObject) object;
ICompCSObject parent = taskObject.getParent();
if (canRemoveTaskObject(parent) == false) {
// Preserve cheat sheet validity
// Semantic Rule: Cannot have a task group with no tasks
Display.getCurrent().beep();
} else {
fRemoveTaskObjectAction.setTaskObject(taskObject);
fRemoveTaskObjectAction.run();
}
} else if (object instanceof ICompCS) {
// Preserve cheat sheet validity
// Semantic Rule: Cannot have a cheat sheet with no root
// cheatsheet node
// Produce audible beep
Display.getCurrent().beep();
}
}
}
/**
* @param parent
* @return
*/
private boolean canRemoveTaskObject(ICompCSObject parent) {
if (parent.getType() == ICompCSConstants.TYPE_COMPOSITE_CHEATSHEET) {
// Preserve cheat sheet validity
// Semantic Rule: Cannot delete the task object directly under
// the root cheat sheet node
// Wizard by default creates a task group as the only allowed
// child of the root cheat sheet node. No good reason to
// substitute with a task instead. Specification supports its,
// but cheat sheet editor will not support it
return false;
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.ui.forms.AbstractFormPart#setFormInput(java.lang.Object)
*/
public boolean setFormInput(Object object) {
// This method allows the outline view to select items in the tree
// Invoked by
// org.eclipse.ui.forms.editor.IFormPage.selectReveal(Object object)
if (object instanceof ICompCSObject) {
// Select the item in the tree
fTreeViewer.setSelection(new StructuredSelection(object), true);
// Verify that something was actually selected
ISelection selection = fTreeViewer.getSelection();
if ((selection != null) && (selection.isEmpty() == false)) {
return true;
}
}
return false;
}
}