| /******************************************************************************* |
| * Copyright (c) 2016 ALL4TEC & CEA LIST. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * ALL4TEC & CEA LIST - initial API and implementation |
| ******************************************************************************/ |
| package org.polarsys.esf.core.common.ui.view; |
| |
| import org.apache.commons.lang3.StringUtils; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.ColumnLabelProvider; |
| import org.eclipse.jface.viewers.DoubleClickEvent; |
| import org.eclipse.jface.viewers.EditingSupport; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.TreeViewerColumn; |
| import org.eclipse.jface.viewers.ViewerColumn; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.TreeColumn; |
| import org.eclipse.ui.handlers.CollapseAllHandler; |
| import org.eclipse.ui.handlers.ExpandAllHandler; |
| import org.polarsys.esf.core.common.ui.CommonUIActivator; |
| import org.polarsys.esf.core.common.ui.CommonUIActivator.Implementation; |
| |
| /** |
| * Abstract base of all the Pages to use in a PageBookView, |
| * and which includes a tree. |
| * |
| * This implementation doesn't manage the columns in the tree, |
| * but it inherits of all the standard mechanisms like the filters, the editing domain mechanisms, etc. |
| * |
| * @author $Author: jdumont $ |
| * @version $Revision: 83 $ |
| */ |
| public abstract class AbstractTreePage |
| extends AbstractColumnViewerPage { |
| |
| /** |
| * Default constructor, which allows to specify if the viewer must be read only or not. |
| * |
| * @param pReadOnlyMode <code>true</code> if this view is in read only mode, <code>false</code> otherwise |
| */ |
| public AbstractTreePage(final boolean pReadOnlyMode) { |
| super(pReadOnlyMode); |
| } |
| |
| /** |
| * Advanced constructor which takes the name of the required column, an array with the optional columns name, |
| * and a boolean which specifies if the viewer must be in read only mode or not. |
| * |
| * The required column will mandatory be visible and can't be hidden. |
| * |
| * @param pRequiredColumnName The name of the required column name |
| * @param pColumnsName The array of optional columns name. This list must not contain the required column name |
| * @param pReadOnlyMode <code>true</code> if this view is in read only mode, <code>false</code> otherwise |
| */ |
| public AbstractTreePage( |
| final String pRequiredColumnName, |
| final String[] pColumnsName, |
| final boolean pReadOnlyMode) { |
| super(pRequiredColumnName, pColumnsName, pReadOnlyMode); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected TreeViewer createViewer(final Composite pParent) { |
| return new TreeViewer(pParent, SWT.MULTI); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public TreeViewer getViewer() { |
| return (TreeViewer) super.getViewer(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * Overridden to expand or collapse the current element on which |
| * the double click is performed. |
| */ |
| @Override |
| protected void handleDoubleClick(final DoubleClickEvent pEvent) { |
| // Get the element on which the double click is performed |
| final IStructuredSelection vSelection = (IStructuredSelection) pEvent.getSelection(); |
| final Object vSelectedeElement = vSelection.getFirstElement(); |
| |
| // If the element is expandable, change is expand state |
| if (getViewer().isExpandable(vSelectedeElement)) { |
| getViewer().setExpandedState(vSelectedeElement, !getViewer().getExpandedState(vSelectedeElement)); |
| } |
| } |
| |
| /** |
| * Create the expand all action. |
| * |
| * @return The expand all action created |
| */ |
| protected IAction createExpandAllAction() { |
| // Get the action image |
| final ImageDescriptor vImageDescriptor = |
| CommonUIActivator.getPlugin().getImageRegistry().getDescriptor( |
| Implementation.ICON_EXPAND_ALL_KEY); |
| |
| // Get the action label |
| final String vActionLabel = |
| CommonUIActivator.getMessages().getString("AbstractTreePage.action.expandall"); //$NON-NLS-1$ |
| |
| // Create the action |
| final IAction vExpandAllAction = new Action(vActionLabel, vImageDescriptor) { |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void run() { |
| // Prepare the expand action asynchronously, on the UI thread |
| AbstractTreePage.this.getSite().getShell().getDisplay().asyncExec(new Runnable() { |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void run() { |
| // Create the action handler on the viewer |
| final ExpandAllHandler vExpandAllHandler = |
| new ExpandAllHandler(AbstractTreePage.this.getViewer()); |
| |
| // And finally execute it |
| vExpandAllHandler.execute(null); |
| } |
| }); |
| } |
| }; |
| |
| return vExpandAllAction; |
| } |
| |
| /** |
| * Create the collapse all action. |
| * |
| * @return The collapse all action created |
| */ |
| protected IAction createCollapseAllAction() { |
| // Get the action image |
| final ImageDescriptor vImageDescriptor = |
| CommonUIActivator.getPlugin().getImageRegistry().getDescriptor( |
| Implementation.ICON_COLLAPSE_ALL_KEY); |
| |
| // Get the action label |
| final String vActionLabel = |
| CommonUIActivator.getMessages().getString("AbstractTreePage.action.collapseall"); //$NON-NLS-1$ |
| |
| // Create the action |
| final IAction vCollapseAllAction = new Action(vActionLabel, vImageDescriptor) { |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void run() { |
| // Prepare the collapse action asynchronously, on the UI thread |
| AbstractTreePage.this.getSite().getShell().getDisplay().asyncExec(new Runnable() { |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void run() { |
| // Create the action handler on the viewer |
| final CollapseAllHandler vCollapseAllHandler = |
| new CollapseAllHandler(AbstractTreePage.this.getViewer()); |
| |
| // And finally execute it |
| vCollapseAllHandler.execute(null); |
| } |
| }); |
| } |
| }; |
| |
| return vCollapseAllAction; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void setLinesVisible(final boolean pShow) { |
| getViewer().getTree().setLinesVisible(pShow); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void setHeaderVisible(final boolean pShow) { |
| getViewer().getTree().setHeaderVisible(pShow); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected boolean isViewerHeaderInitiallyVisible() { |
| return getViewer().getTree().getHeaderVisible(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected boolean isViewerLinesInitiallyVisible() { |
| return getViewer().getTree().getLinesVisible(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected boolean hideColumn(final String pColumnName) { |
| |
| boolean vColumnHidden = false; |
| |
| // Try to find the column by its name |
| final TreeColumn vColumn = getColumn(pColumnName); |
| |
| // If the column is found, dispose it |
| if (vColumn != null) { |
| vColumn.dispose(); |
| |
| // Remember that the column was hidden |
| vColumnHidden = true; |
| } |
| |
| return vColumnHidden; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected boolean isColumnVisible(final String pColumnName) { |
| return getColumn(pColumnName) != null; |
| } |
| |
| /** |
| * Find and return an existing column in the tree viewer from its name. |
| * |
| * @param pColumnName The name of the column to find |
| * @return The column found if any, and <code>null</code> otherwise |
| */ |
| protected TreeColumn getColumn(final String pColumnName) { |
| |
| TreeColumn vColumnFound = null; |
| |
| // Check if the searched name is valid |
| if (StringUtils.isNotEmpty(pColumnName)) { |
| |
| // Get an iterator on the list of existing columns in the tree viewer |
| final TreeColumn[] vColumnsArray = getViewer().getTree().getColumns(); |
| |
| // Loop on the columns array until the column is found |
| for (int i = 0; i < vColumnsArray.length && vColumnFound == null; i++) { |
| TreeColumn vTreeColumn = vColumnsArray[i]; |
| |
| if (vTreeColumn.getText().equals(pColumnName)) { |
| vColumnFound = vTreeColumn; |
| } |
| } |
| } |
| |
| return vColumnFound; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * This is customised to add the expand all and collapse all actions. |
| */ |
| @Override |
| protected void addToolBarActions() { |
| addExpandAllAction(); |
| addCollapseAllAction(); |
| super.addToolBarActions(); |
| } |
| |
| /** |
| * Add to the toolbar the action to expand all the tree content. |
| */ |
| protected void addExpandAllAction() { |
| addToolBarAction(createExpandAllAction()); |
| } |
| |
| /** |
| * Add to the toolbar the action to collapse all the tree content. |
| */ |
| protected void addCollapseAllAction() { |
| addToolBarAction(createCollapseAllAction()); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected TreeViewerColumn createRequiredViewerColumn() { |
| // Nothing to do as this implementation doesn't manage multiple columns |
| return null; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected ViewerColumn createViewerColumn(final String pColumnName) { |
| // Nothing to do as this implementation doesn't manage multiple columns |
| return null; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected ViewerColumn createViewerColumn(final String pColumnName, final int pIndex) { |
| // Nothing to do as this implementation doesn't manage multiple columns |
| return null; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected ViewerColumn createViewerColumn( |
| final String pColumnName, |
| final ColumnLabelProvider pColumnLabelProvider) { |
| // Nothing to do as this implementation doesn't manage multiple columns |
| return null; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected ViewerColumn createViewerColumn( |
| final String pColumnName, |
| final ColumnLabelProvider pColumnLabelProvider, |
| final EditingSupport pEditingSupport) { |
| // Nothing to do as this implementation doesn't manage multiple columns |
| return null; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected ViewerColumn createViewerColumn(final String pColumnName, final String pPropertyID) { |
| // Nothing to do as this implementation doesn't manage multiple columns |
| return null; |
| } |
| |
| } |