blob: da92cd9ea8d7e13f9213dadcd48564571a555b72 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005, 2018 IBM Corporation, Ericsson
* 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 - Initial API and implementation
* Bernd Hufmann - Updated for TMF
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.views.uml2sd;
import java.util.Iterator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
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.commands.ActionHandler;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.ITmfImageConstants;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.BaseMessage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Frame;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.GraphNode;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.SyncMessage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.SyncMessageReturn;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.ConfigureMinMax;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.FirstPage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.KeyBindingsManager;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.LastPage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.MoveToMessage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.NextPage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.OpenSDFiltersDialog;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.OpenSDFindDialog;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.OpenSDPagesDialog;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.PrevPage;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.Print;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.ShowNodeEnd;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.ShowNodeStart;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.Zoom;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.Zoom.ZoomType;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.IExtendedFilterProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.IExtendedFindProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDCollapseProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDExtendedActionBarProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDFindProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDGraphNodeSupporter;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDPropertiesProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.load.IUml2SDLoader;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.load.LoadersManager;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.util.Messages;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;
/**
* <p>
* This class is a generic sequence diagram view implementation.
* </p>
* @version 1.0
* @author sveyrier
*/
public class SDView extends ViewPart implements IPartListener {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
/**
* Name of menu separator for view modes
*/
public static final String UML2SD_VIEW_MODES_SEPARATOR = "UML2SD_VIEW_MODES"; //$NON-NLS-1$
/**
* Name of menu separator for working set
*/
public static final String UML2SD_WORKING_SET_SEPARATOR = "UML2SD_WORKING_SET"; //$NON-NLS-1$
/**
* Name of menu separator for sorting
*/
public static final String UML2SD_SORTING_SEPARATOR = "UML2SD_SORTING"; //$NON-NLS-1$
/**
* Name of menu separator for filtering
*/
public static final String UML2SD_FILTERING_SEPARATOR = "UML2SD_FILTERING"; //$NON-NLS-1$
/**
* Name of menu separator for view layout
*/
public static final String UML2SD_VIEW_LAYOUT_SEPARATOR = "UML2SD_VIEW_LAYOUT"; //$NON-NLS-1$
/**
* Name of menu separator for link editor
*/
public static final String UML2SD_LINK_EDITOR_SEPARATOR = "UML2SD_LINK_EDITOR"; //$NON-NLS-1$
/**
* Name of menu separator for other commands
*/
public static final String UML2SD_OTHER_COMMANDS_SEPARATOR = "UML2SD_OTHER_COMMANDS"; //$NON-NLS-1$
/**
* Name of menu separator for other plug-in commands
*/
public static final String UML2SD_OTHER_PLUGINS_COMMANDS_SEPARATOR = "UML2SD_OTHER_PLUGINS_COMMANDS"; //$NON-NLS-1$
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The sequence diagram widget.
*/
private SDWidget fSdWidget = null;
/**
* The time compression bar.
*/
private TimeCompressionBar fTimeCompressionBar = null;
/**
* The sequence diagram find provider implementation.
*/
private ISDFindProvider fSdFindProvider = null;
/**
* The sequence diagram paging provider implementation.
*/
private ISDPagingProvider fSdPagingProvider = null;
/**
* The sequence diagram filter provider implementation.
*/
private ISDFilterProvider fSdFilterProvider = null;
/**
* The extended sequence diagram filter provider implementation.
*/
private IExtendedFilterProvider fSdExFilterProvider = null;
/**
* The extended sequence diagram find provider implementation.
*/
private IExtendedFindProvider fSdExFindProvider = null;
/**
* The extended sequence diagram action bar provider implementation.
*/
private ISDExtendedActionBarProvider fSdExtendedActionBarProvider = null;
/**
* The sequence diagram property provider implementation.
*/
private ISDPropertiesProvider fSdPropertiesProvider = null;
/**
* Button for executing the next page action.
*/
private NextPage fNextPageButton = null;
/**
* Button for executing the previous page action.
*/
private PrevPage fPrevPageButton = null;
/**
* Button for executing the first page page action.
*/
private FirstPage fFirstPageButton = null;
/**
* Button for executing the last page action.
*/
private LastPage fLastPageButton = null;
/**
* The menu manager reference.
*/
private MenuManager fMenuMgr = null;
/**
* Flag to indicate whether view needs initialization or not.
*/
private boolean fNeedInit = true;
/**
* WaitCursor is the cursor to be displayed when long tasks are running
*/
private Cursor fWaitCursor;
private Zoom fResetZoomAction;
private Zoom fNoZoomAction;
private Zoom fZoomInAction;
private Zoom fZoomOutAction;
private ActionHandler fPrintActionHandler;
/**
* Keeping this allows to deactivate the action when the view is
* deactivated.
*/
private IHandlerActivation fPrintHandlerActivation;
// ------------------------------------------------------------------------
// Methods
// ------------------------------------------------------------------------
@Override
public void createPartControl(Composite c) {
Composite parent = new Composite(c, SWT.NONE);
GridLayout parentLayout = new GridLayout();
parentLayout.numColumns = 2;
parentLayout.marginWidth = 0;
parentLayout.marginHeight = 0;
parent.setLayout(parentLayout);
GridData timeLayoutdata = new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL);
timeLayoutdata.widthHint = 10;
GridData seqDiagLayoutData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL);
fTimeCompressionBar = new TimeCompressionBar(parent, SWT.NONE);
fTimeCompressionBar.setLayoutData(timeLayoutdata);
fSdWidget = new SDWidget(parent, SWT.NONE);
fSdWidget.setLayoutData(seqDiagLayoutData);
fSdWidget.setSite(this);
fSdWidget.setTimeBar(fTimeCompressionBar);
// Add this view to the key bindings manager
KeyBindingsManager.getInstance().add(this.getSite().getId());
createCoolbarContent();
hookContextMenu();
fTimeCompressionBar.setVisible(false);
parent.layout(true);
fPrintActionHandler = new ActionHandler(new Print(this));
getSite().getPage().addPartListener(this);
fNeedInit = restoreLoader();
}
/**
* Load a blank page that is supposed to explain that a kind of interaction must be chosen.
*/
protected void loadBlank() {
IUml2SDLoader loader = new BlankUml2SdLoader();
loader.setViewer(this);
setContentDescription(loader.getTitleString());
}
@Override
public void setFocus() {
if (fSdWidget != null) {
// update actions for key bindings
KeyBindingsManager.getInstance().setSdView(this);
fSdWidget.setFocus();
}
if (isViewReady() && fNeedInit) {
fNeedInit = restoreLoader();
}
}
@Override
public void dispose() {
getSite().getPage().removePartListener(this);
KeyBindingsManager.getInstance().remove(this.getSite().getId());
/* Workaround for Bug 490400: Clear the action bars */
IActionBars bars = getViewSite().getActionBars();
bars.getToolBarManager().removeAll();
bars.getMenuManager().removeAll();
disposeZoomActions();
fPrintActionHandler.dispose();
super.dispose();
}
private void disposeZoomActions() {
if (fResetZoomAction != null) {
fResetZoomAction.dispose();
}
if (fNoZoomAction != null) {
fNoZoomAction.dispose();
}
if (fZoomInAction != null) {
fZoomInAction.dispose();
}
if (fZoomOutAction != null) {
fZoomOutAction.dispose();
}
}
/**
* Returns the SD widget.
*
* @return The SD widget.
*/
public SDWidget getSDWidget() {
return fSdWidget;
}
/**
* Set the find provider for the opened sequence diagram viewer<br>
* If the provider is not set, the find menu item will not be available in the viewer<br>
* A find provider is called back when the user perform a find action<br>
* The find provider is responsible to move the sequence diagram to the GraphNode which match the
* find criteria as well as to highlight the GraphNode
*
* @param provider the search provider
*/
public void setSDFindProvider(ISDFindProvider provider) {
fSdFindProvider = provider;
fSdExFindProvider = null;
createCoolbarContent();
if (provider != null) {
KeyBindingsManager.getInstance().setFindEnabled(true);
}
else {
KeyBindingsManager.getInstance().setFindEnabled(false);
}
}
/**
* Set the find provider for the opened sequence diagram viewer<br>
* If the provider is not set, the find menu item will not be available in
* the viewer<br>
* A find provider is called back when the user perform a find action<br>
* If the extended find provider is set, it replaces the regular find
* provider (sdFindProvider).<br>
*
* @param provider
* The provider to set
*/
public void setExtendedFindProvider(IExtendedFindProvider provider) {
fSdExFindProvider = provider;
fSdFindProvider = null;
createCoolbarContent();
if (provider != null) {
KeyBindingsManager.getInstance().setFindEnabled(true);
}
else {
KeyBindingsManager.getInstance().setFindEnabled(false);
}
}
/**
* Returns the extended find provider
*
* @return extended find provider.
*/
public IExtendedFindProvider getExtendedFindProvider() {
return fSdExFindProvider;
}
/**
* Resets all providers.
*/
public void resetProviders() {
KeyBindingsManager.getInstance().setFindEnabled(false);
fSdFindProvider = null;
fSdExFindProvider = null;
fSdFilterProvider = null;
fSdExFilterProvider = null;
fSdPagingProvider = null;
fSdExtendedActionBarProvider = null;
fSdPropertiesProvider = null;
if ((fSdWidget != null) && (!fSdWidget.isDisposed())) {
fSdWidget.setCollapseProvider(null);
}
}
/**
* Set the filter provider for the opened sequence diagram viewer<br>
* If the provider is not set, the filter menu item will not be available in the viewer<br>
* A filter provider is called back when the user perform a filter action<br>
*
* @param provider the filter provider
*/
public void setSDFilterProvider(ISDFilterProvider provider) {
fSdFilterProvider = provider;
// Both systems can be used now, commenting out next statement
createCoolbarContent();
}
/**
* Sets the extended filter provider for the opened sequence diagram viewer.
*
* @param provider
* The provider to set
*/
public void setExtendedFilterProvider(IExtendedFilterProvider provider) {
fSdExFilterProvider = provider;
// Both systems can be used now, commenting out next statement
createCoolbarContent();
}
/**
* Returns the extended find provider.
*
* @return The extended find provider.
*/
public IExtendedFilterProvider getExtendedFilterProvider() {
return fSdExFilterProvider;
}
/**
* Register the given provider to support Drag and Drop collapsing. This provider is
* responsible of updating the Frame.
*
* @param provider - the provider to register
*/
public void setCollapsingProvider(ISDCollapseProvider provider) {
if ((fSdWidget != null) && (!fSdWidget.isDisposed())) {
fSdWidget.setCollapseProvider(provider);
}
}
/**
* Set the page provider for the opened sequence diagram viewer<br>
* If the sequence diagram provided (see setFrame) need to be split in many parts, a paging provider must be
* provided in order to handle page change requested by the user<br>
* Set a page provider will create the next and previous page buttons in the viewer coolBar
*
* @param provider the paging provider
*/
public void setSDPagingProvider(ISDPagingProvider provider) {
fSdPagingProvider = provider;
createCoolbarContent();
}
/**
* Returns the current page provider for the view
*
* @return the paging provider
*/
public ISDPagingProvider getSDPagingProvider() {
return fSdPagingProvider;
}
/**
* Returns the current find provider for the view
*
* @return the find provider
*/
public ISDFindProvider getSDFindProvider() {
return fSdFindProvider;
}
/**
* Returns the current filter provider for the view
*
* @return the filter provider
*/
public ISDFilterProvider getSDFilterProvider() {
return fSdFilterProvider;
}
/**
* Set the extended action bar provider for the opened sequence diagram viewer<br>
* This allow to add programmatically actions in the coolbar and/or in the drop-down menu
*
* @param provider the search provider
*/
public void setSDExtendedActionBarProvider(ISDExtendedActionBarProvider provider) {
fSdExtendedActionBarProvider = provider;
createCoolbarContent();
}
/**
* Returns the current extended action bar provider for the view
*
* @return the extended action bar provider
*/
public ISDExtendedActionBarProvider getSDExtendedActionBarProvider() {
return fSdExtendedActionBarProvider;
}
/**
* Set the properties view provider for the opened sequence diagram viewer
*
* @param provider the properties provider
*/
public void setSDPropertiesProvider(ISDPropertiesProvider provider) {
fSdPropertiesProvider = provider;
}
/**
* Returns the current extended action bar provider for the view.
*
* @return the extended action bar provider
*/
public ISDPropertiesProvider getSDPropertiesProvider() {
return fSdPropertiesProvider;
}
/**
* Sets the sdWidget.
*
* @param sdWidget
* A sdWidget to set
*/
protected void setSDWidget(SDWidget sdWidget) {
fSdWidget = sdWidget;
}
/**
* Sets the time compression bar.
*
* @param timeCompressionbar
* A sdWidget to set
*/
protected void setTimeBar(TimeCompressionBar timeCompressionbar) {
fTimeCompressionBar = timeCompressionbar;
}
/**
* Sets the initialization flag.
*
* @param needInit
* flag value to set
*/
protected void setNeedInit(boolean needInit) {
fNeedInit = needInit;
}
/**
* Creates the basic sequence diagram menu
*/
protected void hookContextMenu() {
fMenuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
fMenuMgr.setRemoveAllWhenShown(true);
fMenuMgr.addMenuListener(this::fillContextMenu);
Menu menu = fMenuMgr.createContextMenu(fSdWidget.getViewControl());
fSdWidget.getViewControl().setMenu(menu);
getSite().registerContextMenu(fMenuMgr, fSdWidget.getSelectionProvider());
}
/**
* Returns the context menu manager
*
* @return the menu manager
*/
public MenuManager getMenuManager() {
return fMenuMgr;
}
/**
* Fills the basic sequence diagram menu and define the dynamic menu item insertion point
*
* @param manager the menu manager
*/
protected void fillContextMenu(IMenuManager manager) {
manager.add(new Separator("Additions")); //$NON-NLS-1$
if (getSDWidget() != null && getSDWidget().getCurrentGraphNode() != null) {
ISelectionProvider selProvider = fSdWidget.getSelectionProvider();
ISelection sel = selProvider.getSelection();
int nbMessage = 0;
Iterator<?> it = ((StructuredSelection) sel).iterator();
while (it.hasNext()) {
Object node = it.next();
if (node instanceof BaseMessage) {
nbMessage++;
}
}
if (nbMessage != 1) {
return;
}
GraphNode node = getSDWidget().getCurrentGraphNode();
if ((node instanceof SyncMessageReturn) && (((SyncMessageReturn) node).getMessage() != null)) {
Action goToMessage = new MoveToMessage(this);
goToMessage.setText(Messages.SequenceDiagram_GoToMessage);
manager.add(goToMessage);
}
if ((node instanceof SyncMessage) && (((SyncMessage) node).getMessageReturn() != null)) {
Action goToMessage = new MoveToMessage(this);
goToMessage.setText(Messages.SequenceDiagram_GoToMessageReturn);
manager.add(goToMessage);
}
}
manager.add(new Separator("MultiSelectAdditions")); //$NON-NLS-1$
}
/**
* Enables/Disables an action with given name.
*
* @param actionName The action name
* @param state true or false
*/
public void setEnableAction(String actionName, boolean state) {
IActionBars bar = getViewSite().getActionBars();
if (bar != null) {
IContributionItem item = bar.getMenuManager().find(actionName);
if ((item != null) && (item instanceof ActionContributionItem)) {
IAction action = ((ActionContributionItem) item).getAction();
if (action != null) {
action.setEnabled(state);
}
item.setVisible(state);
bar.updateActionBars();
}
}
}
/**
* Creates the coolBar icon depending on the actions supported by the Sequence Diagram provider<br>
* - Navigation buttons are displayed if ISDPovider.HasPaging return true<br>
* - Navigation buttons are enabled depending on the value return by ISDPovider.HasNext and HasPrev<br>
*
* @see ISDGraphNodeSupporter Action support definition
* @see SDView#setSDFilterProvider(ISDFilterProvider)
* @see SDView#setSDFindProvider(ISDFindProvider)
* @see SDView#setSDPagingProvider(ISDPagingProvider)
*/
protected void createCoolbarContent() {
IActionBars bar = getViewSite().getActionBars();
bar.getMenuManager().removeAll();
bar.getToolBarManager().removeAll();
disposeZoomActions();
createMenuGroup();
fResetZoomAction = new Zoom(this, ZoomType.ZOOM_RESET);
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fResetZoomAction);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fResetZoomAction);
fNoZoomAction = new Zoom(this, ZoomType.ZOOM_NONE);
fNoZoomAction.setChecked(true);
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fNoZoomAction);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fNoZoomAction);
fZoomInAction = new Zoom(this, ZoomType.ZOOM_IN);
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fZoomInAction);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fZoomInAction);
fZoomOutAction = new Zoom(this, ZoomType.ZOOM_OUT);
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fZoomOutAction);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fZoomOutAction);
MenuManager navigation = new MenuManager(Messages.SequenceDiagram_Navigation);
ShowNodeStart showNodeStart = new ShowNodeStart(this);
showNodeStart.setText(Messages.SequenceDiagram_ShowNodeStart);
showNodeStart.setId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ShowNodeStart");//$NON-NLS-1$
showNodeStart.setActionDefinitionId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ShowNodeStart");//$NON-NLS-1$
navigation.add(showNodeStart);
ShowNodeEnd showNodeEnd = new ShowNodeEnd(this);
showNodeEnd.setText(Messages.SequenceDiagram_ShowNodeEnd);
showNodeEnd.setId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ShowNodeEnd");//$NON-NLS-1$
showNodeEnd.setActionDefinitionId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ShowNodeEnd");//$NON-NLS-1$
navigation.add(showNodeEnd);
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, navigation);
ConfigureMinMax minMax = new ConfigureMinMax(this);
minMax.setText(Messages.SequenceDiagram_ConfigureMinMax);
minMax.setId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ConfigureMinMax");//$NON-NLS-1$
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, minMax);
if ((fSdWidget.getFrame() != null) && (fSdWidget.getFrame().hasTimeInfo())) {
minMax.setEnabled(true);
} else {
minMax.setEnabled(false);
}
// Do we need to display a paging item
if (fSdPagingProvider != null) {
fNextPageButton = new NextPage(this);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fNextPageButton);
fNextPageButton.setEnabled(fSdPagingProvider.hasNextPage());
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fNextPageButton);
fPrevPageButton = new PrevPage(this);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fPrevPageButton);
fPrevPageButton.setEnabled(fSdPagingProvider.hasPrevPage());
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fPrevPageButton);
fFirstPageButton = new FirstPage(this);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fFirstPageButton);
fFirstPageButton.setEnabled(fSdPagingProvider.hasPrevPage());
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fFirstPageButton);
fLastPageButton = new LastPage(this);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fLastPageButton);
fLastPageButton.setEnabled(fSdPagingProvider.hasNextPage());
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, fLastPageButton);
}
if (fSdExFilterProvider != null) {
Action action = fSdExFilterProvider.getFilterAction();
if (action != null) {
if (action.getId() == null)
{
action.setId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.extendedFilter"); //$NON-NLS-1$
}
if (action.getImageDescriptor() == null) {
action.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_FILTERS));
}
if (action.getText() == null || action.getText().length() == 0) {
action.setText(Messages.SequenceDiagram_EditFilters);
}
bar.getMenuManager().prependToGroup(UML2SD_FILTERING_SEPARATOR, action);
bar.getToolBarManager().prependToGroup(UML2SD_FILTERING_SEPARATOR, action);
}
}
// Both systems can be used now: commenting out else keyword
if (fSdFilterProvider != null) {
bar.getMenuManager().appendToGroup(UML2SD_FILTERING_SEPARATOR, new OpenSDFiltersDialog(this, fSdFilterProvider));
}
if (fSdPagingProvider instanceof ISDAdvancedPagingProvider) {
IContributionItem sdPaging = bar.getMenuManager().find(OpenSDPagesDialog.ID);
if (sdPaging != null) {
bar.getMenuManager().remove(sdPaging);
sdPaging = null;
}
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, new OpenSDPagesDialog(this, (ISDAdvancedPagingProvider) fSdPagingProvider));
updatePagesMenuItem(bar);
}
if (fSdExFindProvider != null) {
Action action = fSdExFindProvider.getFindAction();
if (action != null) {
if (action.getId() == null) {
action.setId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.extendedFind"); //$NON-NLS-1$
}
if (action.getImageDescriptor() == null) {
action.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_SEARCH_SEQ));
}
if (action.getText() == null) {
action.setText(Messages.SequenceDiagram_Find + "..."); //$NON-NLS-1$
}
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, action);
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, action);
}
} else if (fSdFindProvider != null) {
bar.getMenuManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, new OpenSDFindDialog(this));
bar.getToolBarManager().appendToGroup(UML2SD_OTHER_COMMANDS_SEPARATOR, new OpenSDFindDialog(this));
}
if (fSdExtendedActionBarProvider != null) {
fSdExtendedActionBarProvider.supplementCoolbarContent(bar);
}
bar.updateActionBars();
}
/**
* Updates the view coolbar buttons state according to the value return by: -
* ISDExtendedActionBarProvider.hasNextPage()<br>
* - ISDExtendedActionBarProvider.hasPrevPage()<br>
*
*/
public void updateCoolBar() {
if (fSdPagingProvider != null) {
IActionBars bar = getViewSite().getActionBars();
if (bar == null) {
return;
}
IToolBarManager barManager = bar.getToolBarManager();
if (barManager == null) {
return;
}
IContributionItem nextPage = barManager.find(NextPage.ID);
if (nextPage instanceof ActionContributionItem) {
IAction nextPageAction = ((ActionContributionItem) nextPage).getAction();
if (nextPageAction instanceof NextPage) {
((NextPage) nextPageAction).setEnabled(fSdPagingProvider.hasNextPage());
}
}
IContributionItem prevPage = barManager.find(PrevPage.ID);
if (prevPage instanceof ActionContributionItem) {
IAction prevPageAction = ((ActionContributionItem) prevPage).getAction();
if (prevPageAction instanceof PrevPage) {
((PrevPage) prevPageAction).setEnabled(fSdPagingProvider.hasPrevPage());
}
}
IContributionItem firstPage = barManager.find(FirstPage.ID);
if (firstPage instanceof ActionContributionItem) {
IAction firstPageAction = ((ActionContributionItem) firstPage).getAction();
if (firstPageAction instanceof FirstPage) {
((FirstPage) firstPageAction).setEnabled(fSdPagingProvider.hasPrevPage());
}
}
IContributionItem lastPage = barManager.find(LastPage.ID);
if (lastPage instanceof ActionContributionItem) {
IAction lastPageAction = ((ActionContributionItem) lastPage).getAction();
if (lastPageAction instanceof LastPage) {
((LastPage) lastPageAction).setEnabled(fSdPagingProvider.hasNextPage());
}
}
updatePagesMenuItem(bar);
}
}
/**
* Enables or disables the Pages... menu item, depending on the number of pages
*
* @param bar the bar containing the action
*/
protected void updatePagesMenuItem(IActionBars bar) {
if (fSdPagingProvider instanceof ISDAdvancedPagingProvider) {
IMenuManager menuManager = bar.getMenuManager();
ActionContributionItem contributionItem = (ActionContributionItem) menuManager.find(OpenSDPagesDialog.ID);
IAction openSDPagesDialog = null;
if (contributionItem != null) {
openSDPagesDialog = contributionItem.getAction();
}
if (openSDPagesDialog instanceof OpenSDPagesDialog) {
openSDPagesDialog.setEnabled(((ISDAdvancedPagingProvider) fSdPagingProvider).pagesCount() > 1);
}
}
}
/**
* The frame to render (the sequence diagram)
*
* @param frame the frame to display
*/
public void setFrame(Frame frame) {
setFrame(frame, true);
}
/**
* The frame to render (the sequence diagram)
*
* @param frame the frame to display
* @param resetPosition boolean Flag whether to reset the position or not.
*/
protected void setFrame(Frame frame, boolean resetPosition) {
if (getSDWidget() == null) {
return;
}
if (frame == null) {
loadBlank();
return;
}
IUml2SDLoader loader = LoadersManager.getInstance().getCurrentLoader(getViewSite().getId(), this);
if (loader == null) {
return;
}
if (loader.getTitleString() != null) {
setContentDescription(loader.getTitleString());
}
getSDWidget().setFrame(frame, resetPosition);
if (fTimeCompressionBar != null) {
fTimeCompressionBar.setFrame(frame);
}
updateCoolBar();
if (fTimeCompressionBar != null) {
if (!frame.hasTimeInfo()) {
Composite parent = fTimeCompressionBar.getParent();
fTimeCompressionBar.setVisible(false);
parent.layout(true);
} else {
Composite parent = fTimeCompressionBar.getParent();
fTimeCompressionBar.setVisible(true);
parent.layout(true);
}
}
IContributionItem shortKeysMenu = getViewSite().getActionBars().getMenuManager().find("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers");//$NON-NLS-1$
MenuManager shortKeys = (MenuManager) shortKeysMenu;
if (shortKeys != null) {
IContributionItem[] items = shortKeys.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i] instanceof ActionContributionItem) {
IAction action = ((ActionContributionItem) items[i]).getAction();
if (action != null) {
action.setEnabled(true);
}
}
}
}
createCoolbarContent();
}
/**
* Activate or deactivate the short key command given in parameter (see plugin.xml)
*
* @param id the command id defined in the plugin.xml
* @param value the state value
*/
public void setEnableCommand(String id, boolean value) {
IContributionItem shortKeysMenu = getViewSite().getActionBars().getMenuManager().find("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers");//$NON-NLS-1$
MenuManager shortKeys = (MenuManager) shortKeysMenu;
if (shortKeys == null) {
return;
}
IContributionItem item = shortKeys.find(id);
if ((item != null) && (item instanceof ActionContributionItem)) {
IAction action = ((ActionContributionItem) item).getAction();
if (action != null) {
action.setEnabled(value);
}
}
}
/**
* Set the frame from an other thread than the one executing the main loop
*
* @param frame The frame to set (and display)
*/
public void setFrameSync(final Frame frame) {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
getSDWidget().getDisplay().syncExec(() -> {
if (getSDWidget() == null || getSDWidget().isDisposed() ||
((fTimeCompressionBar != null) && fTimeCompressionBar.isDisposed())) {
return;
}
setFrame(frame);
});
}
/**
* Ensure an object is visible from an other thread than the one executing the main loop
*
* @param sm The node to make visible in view
*/
public void ensureVisibleSync(final GraphNode sm) {
getSDWidget().getDisplay().syncExec(() -> {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
getSDWidget().ensureVisible(sm);
});
}
/**
* Set the frame and ensure an object is visible from an other thread than the one executing the main loop
*
* @param sm The node to make visible in view
* @param frame Frame The frame to set
*/
public void setFrameAndEnsureVisibleSync(final Frame frame, final GraphNode sm) {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
getSDWidget().getDisplay().syncExec(() -> {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
setFrameAndEnsureVisible(frame, sm);
});
}
/**
* Set the frame and ensure an object is visible
*
* @param sm The node to make visible in view
* @param frame Frame The frame to set
*/
public void setFrameAndEnsureVisible(Frame frame, GraphNode sm) {
getSDWidget().clearSelection();
setFrame(frame, false);
getSDWidget().ensureVisible(sm);
}
/**
* Set the frame and ensure an object is visible from an other thread than the one executing the main loop
*
* @param frame The frame to set.
* @param x The x coordinate to make visible.
* @param y The y coordinate to make visible.
*/
public void setFrameAndEnsureVisibleSync(final Frame frame, final int x, final int y) {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
getSDWidget().getDisplay().syncExec(() -> setFrameAndEnsureVisible(frame, x, y));
}
/**
* Set the frame and ensure an object is visible
*
* @param frame The frame to set.
* @param x The x coordinate to make visible.
* @param y The y coordinate to make visible.
*/
public void setFrameAndEnsureVisible(Frame frame, int x, int y) {
getSDWidget().clearSelection();
setFrame(frame, false);
getSDWidget().ensureVisible(x, y);
getSDWidget().redraw();
}
/**
* Toggle between default and wait cursors from an other thread than the one executing the main loop
*
* @param wait <code>true</code> for wait cursor else <code>false</code> for default cursor.
*/
public void toggleWaitCursorAsync(final boolean wait) {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
getSDWidget().getDisplay().asyncExec(() -> {
if (getSDWidget() == null || getSDWidget().isDisposed()) {
return;
}
if (wait) {
if (fWaitCursor != null && !fWaitCursor.isDisposed()) {
fWaitCursor.dispose();
}
fWaitCursor = new Cursor(getSDWidget().getDisplay(), SWT.CURSOR_WAIT);
getSDWidget().setCursor(fWaitCursor);
getSDWidget().getDisplay().update();
} else {
if (fWaitCursor != null && !fWaitCursor.isDisposed()) {
fWaitCursor.dispose();
}
fWaitCursor = null;
getSDWidget().setCursor(null);
getSDWidget().getDisplay().update();
}
});
}
/**
* Return the time compression bar widget
*
* @return the time compression bar
*/
public TimeCompressionBar getTimeCompressionBar() {
return fTimeCompressionBar;
}
/**
* Returns the current Frame (the sequence diagram container)
*
* @return the current frame
*/
public Frame getFrame() {
if (getSDWidget() != null) {
return getSDWidget().getFrame();
}
return null;
}
/**
* Gets the initialization flag.
* @return the value of the initialization flag.
*/
protected boolean isNeedInit() {
return fNeedInit;
}
/**
* Restores the loader for the view based on the view ID.
*
* @return boolean <code>true</code> if initialization is needed else <code>false</code>.
*/
protected boolean restoreLoader() {
String id = getViewSite().getId();
if (id == null) {
return true;
}
IUml2SDLoader loader = LoadersManager.getInstance().getCurrentLoader(id, this);
if ((loader != null)) {
loader.setViewer(this);
return false;
}
loadBlank();
return true;
}
/**
* Checks if current view is ready to be used.
*
* @return boolean <code>true</code> if view is ready else <code>false</code>.
*/
protected boolean isViewReady() {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
if (page == null) {
return false;
}
IViewReference[] ref = page.getViewReferences();
for (int i = 0; i < ref.length; i++) {
if (ref[i].getView(false) == this) {
return true;
}
}
return false;
}
/**
* Creates the menu group.
*/
protected void createMenuGroup() {
IActionBars bar = getViewSite().getActionBars();
if (bar == null) {
return;
}
bar.getToolBarManager().add(new Separator(UML2SD_VIEW_MODES_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_WORKING_SET_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_SORTING_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_FILTERING_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_VIEW_LAYOUT_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_LINK_EDITOR_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_OTHER_COMMANDS_SEPARATOR));
bar.getToolBarManager().add(new Separator(UML2SD_OTHER_PLUGINS_COMMANDS_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_VIEW_MODES_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_WORKING_SET_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_SORTING_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_FILTERING_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_VIEW_LAYOUT_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_LINK_EDITOR_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_OTHER_COMMANDS_SEPARATOR));
bar.getMenuManager().add(new Separator(UML2SD_OTHER_PLUGINS_COMMANDS_SEPARATOR));
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (fSdPropertiesProvider != null && adapter.equals(IPropertySheetPage.class)) {
return adapter.cast(fSdPropertiesProvider.getPropertySheetEntry());
}
return super.getAdapter(adapter);
}
/**
* Loader for a blank sequence diagram.
*
* @version 1.0
*/
public static class BlankUml2SdLoader implements IUml2SDLoader {
@Override
public void setViewer(SDView viewer) {
// Nothing to do
Frame f = new Frame();
f.setName(""); //$NON-NLS-1$
viewer.setFrame(f);
}
@Override
public String getTitleString() {
return ""; //$NON-NLS-1$
}
@Override
public void dispose() {
// Do nothing
}
}
@Override
public void partActivated(IWorkbenchPart part) {
if (part == this) {
final Object service = PlatformUI.getWorkbench().getService(IHandlerService.class);
fPrintHandlerActivation = ((IHandlerService) service).activateHandler(ActionFactory.PRINT.getCommandId(), fPrintActionHandler);
}
}
@Override
public void partBroughtToTop(IWorkbenchPart part) {
// Do nothing
}
@Override
public void partClosed(IWorkbenchPart part) {
// Do nothing
}
@Override
public void partDeactivated(IWorkbenchPart part) {
if (part == this && fPrintHandlerActivation != null) {
final Object service = PlatformUI.getWorkbench().getService(IHandlerService.class);
((IHandlerService) service).deactivateHandler(fPrintHandlerActivation);
}
}
@Override
public void partOpened(IWorkbenchPart part) {
// Do nothing
}
}