/*******************************************************************************
* Copyright (c) 2009 STMicroelectronics.
* 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:
* Marzia Maugeri <marzia.maugeri@st.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.dataviewers.abstractview;
import org.eclipse.jface.action.IAction;
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.viewers.Viewer;
import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTTreeViewer;
import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTViewer;
import org.eclipse.linuxtools.dataviewers.actions.STCollapseAllTreeAction;
import org.eclipse.linuxtools.dataviewers.actions.STCollapseSelectionAction;
import org.eclipse.linuxtools.dataviewers.actions.STCopyAction;
import org.eclipse.linuxtools.dataviewers.actions.STDataViewersSortAction;
import org.eclipse.linuxtools.dataviewers.actions.STExpandAllTreeAction;
import org.eclipse.linuxtools.dataviewers.actions.STExpandSelectionAction;
import org.eclipse.linuxtools.dataviewers.actions.STExportToCSVAction;
import org.eclipse.linuxtools.dataviewers.actions.STHideShowColAction;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
/**
* The AbstractSTDataView is a view that generically implements data result views.
*/
public abstract class AbstractSTDataView extends ViewPart {
private AbstractSTViewer stViewer = null;
private IAction sortAction = null;
private IAction preferencesAction = null;
private IAction hideShowColAction = null;
private IAction expandAllAction = null;
private IAction collapseAllAction = null;
private IAction expandSelectionAction = null;
private IAction collapseSelectionAction = null;
private IAction exportToCSVAction = null;
private IAction copyToAction = null;
/**
* Create optional arbitrary Controls, on top of viewer. Does nothing by default. Can be used to display a title, or
* some other informations.
*
* @param parent The parent composite, with a gridlayout (1 column).
*/
protected abstract void createTitle(Composite parent) ;
/**
* Creates a wrapper handling a TreeTable or Table Viewer
*
* <p>
* Subclasses may override it.
* </p>
*
* @param parent The parent composite.
* @return An AbstractSTViewer
*/
protected abstract AbstractSTViewer createAbstractSTViewer(Composite parent);
/**
* Add actions to the toolbar (top-right toolbar)
* <p>
* Subclasses may override it.
* </p>
*
* @param manager The IToolBarManager to contribute to.
*/
protected abstract void contributeToToolbar(IToolBarManager manager);
@Override
public void createPartControl(Composite parent) {
GridLayout gridLayout = new GridLayout(1, true);
parent.setLayout(gridLayout);
createTitle(parent);
stViewer = createAbstractSTViewer(parent);
// create the actions before the input is set on the viewer but after
// the sorter and filter are set so the actions will be enabled correctly.
createActions();
final MenuManager mgr = initContextMenu();
final Menu menu = mgr.createContextMenu(parent);
stViewer.getViewer().getControl().setMenu(menu);
getSite().registerContextMenu(mgr, stViewer.getViewer());
// the selection provider registered
getSite().setSelectionProvider(stViewer.getViewer());
IActionBars actionBars = getViewSite().getActionBars();
initMenu(actionBars.getMenuManager());
initToolBar(actionBars.getToolBarManager());
}
/**
* Creates the actions for the receiver.
*/
protected void createActions() {
// menu bar
expandAllAction = createExpandAllAction();
collapseAllAction = createCollapseAllAction();
sortAction = new STDataViewersSortAction(getSTViewer());
hideShowColAction = new STHideShowColAction(getSTViewer());
exportToCSVAction = createExportToCSVAction();
// context menu (right-click)
expandSelectionAction = createExpandSelectionAction();
collapseSelectionAction = createCollapseSelectionAction();
copyToAction = new STCopyAction(getSTViewer());
}
/**
* Creates the export To CSV actions.
*
* @return IAction The newly created action.
*/
protected IAction createExportToCSVAction() {
return new STExportToCSVAction(getSTViewer());
}
/**
* Creates the collapse selection actions.
*
* @return IAction The newly created action.
*/
private IAction createCollapseSelectionAction() {
if (getSTViewer() instanceof AbstractSTTreeViewer) {
AbstractSTTreeViewer stTreeViewer = (AbstractSTTreeViewer) getSTViewer();
return new STCollapseSelectionAction(stTreeViewer);
}
return null;
}
/**
* Creates the expand selection actions.
*
* @return IAction The newly created action.
*/
private IAction createExpandSelectionAction() {
if (getSTViewer() instanceof AbstractSTTreeViewer) {
AbstractSTTreeViewer stTreeViewer = (AbstractSTTreeViewer) getSTViewer();
return new STExpandSelectionAction(stTreeViewer);
}
return null;
}
/**
* Creates the collapse all action.
*
* @return IAction The newly created action.
*/
private IAction createCollapseAllAction() {
if (getSTViewer() instanceof AbstractSTTreeViewer) {
AbstractSTTreeViewer stTreeViewer = (AbstractSTTreeViewer) getSTViewer();
return new STCollapseAllTreeAction(stTreeViewer);
}
return null;
}
/**
* Creates the expand all action.
*
* @return IAction The newly created action.
*/
private IAction createExpandAllAction() {
if (getSTViewer() instanceof AbstractSTTreeViewer) {
AbstractSTTreeViewer stTreeViewer = (AbstractSTTreeViewer) getSTViewer();
return new STExpandAllTreeAction(stTreeViewer);
}
return null;
}
/**
* Init the context menu
* <p>
* If you intend to add an action in the context menu you may override the <code>fillContextMenu</code> method.
* </p>
*
* @see #fillContextMenu(IMenuManager manager)
*/
private MenuManager initContextMenu() {
MenuManager mgr = new MenuManager();
mgr.setRemoveAllWhenShown(true);
mgr.addMenuListener(mgr1 -> {
getSTViewer().getViewer().cancelEditing();
fillContextMenu(mgr1);
});
return mgr;
}
/**
* Init the toolbar for the receiver
* <p>
* You can override this method if you want - but remember to call <code>super.initToolBar()</code>.
* </p>
*
* @param manager The tool bar manager of this view.
*/
private void initToolBar(IToolBarManager manager) {
if (expandAllAction != null) {
manager.add(expandAllAction);
}
if (collapseAllAction != null) {
manager.add(collapseAllAction);
}
if (hideShowColAction != null) {
manager.add(hideShowColAction);
}
if (exportToCSVAction != null) {
manager.add(exportToCSVAction);
}
if (sortAction != null) {
manager.add(sortAction);
}
contributeToToolbar(manager);
manager.update(true);
}
/**
* Init the menu for the receiver.
*
* @param menu The IMenuManager to add to.
*/
private void initMenu(IMenuManager menu) {
if (preferencesAction != null) {
menu.add(preferencesAction);
}
}
@Override
public void setFocus() {
Viewer viewer = getSTViewer().getViewer();
if (viewer != null && !viewer.getControl().isDisposed()) {
viewer.getControl().setFocus();
}
}
/**
* Return the viewer.
*
* @return AbstractSTViewer
*/
public AbstractSTViewer getSTViewer() {
return stViewer;
}
/**
* Shortcut for getViewer().setInput(input).
*
* @param input The viewer input.
* @see org.eclipse.jface.viewers.TreeViewer#setInput(Object)
*/
public void setInput(Object input) {
stViewer.getViewer().setInput(input);
}
/**
* Fills the context menu (mouse right-click)
* <p>
* Subclasses may extend it. don't forget to call <code>super.fillContextMenu(...)</code>
* </p>
*
* @param manager The IMenuManager to fill.
* @since 6.0
*/
protected void fillContextMenu(IMenuManager manager) {
Control control = stViewer.getViewer().getControl();
if (control instanceof Tree) {
Tree tree = (Tree) control;
TreeItem[] selection = tree.getSelection();
if (selection != null && selection.length > 0) {
if (collapseSelectionAction != null) {
manager.add(collapseSelectionAction);
}
if (expandSelectionAction != null) {
manager.add(expandSelectionAction);
}
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
if (copyToAction != null) {
manager.add(copyToAction);
}
}
}
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
}