org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView.java

Source

/**********************************************************************
 * Copyright (c) 2005, 2008, 2011 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
 * $Id: SDView.java,v 1.2 2008/01/24 02:29:01 apnan Exp $
 * 
 * Contributors: 
 * IBM - Initial API and implementation
 * Bernd Hufmann - Updated for TMF
 **********************************************************************/
package org.eclipse.linuxtools.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.IMenuListener;
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.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.linuxtools.tmf.ui.ITmfImageConstants;
import org.eclipse.linuxtools.tmf.ui.TmfUiPlugin;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.BaseMessage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Frame;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.GraphNode;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.SyncMessage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.SyncMessageReturn;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ConfigureMinMax;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.FirstPage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.KeyBindingsManager;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.LastPage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.MoveToMessage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.NextPage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.OpenSDFiltersDialog;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.OpenSDFindDialog;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.OpenSDPagesDialog;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.PrevPage;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.Print;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ShowNodeEnd;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ShowNodeStart;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.Zoom;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.Zoom.ZoomType;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.IExtendedFilterProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.IExtendedFindProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDCollapseProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDExtendedActionBarProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFindProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDGraphNodeSupporter;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPropertiesProvider;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.LoadersManager;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.util.SDMessages;
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.ui.IActionBars;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;

/**
 * @author sveyrier
 * 
 */
public class SDView extends ViewPart {

    protected SDWidget sdWidget = null;
    protected TimeCompressionBar timeCompressionBar = null;
    protected ISDFindProvider sdFindProvider = null;
    protected ISDPagingProvider sdPagingProvider = null;
    protected ISDFilterProvider sdFilterProvider = null;
    protected IExtendedFilterProvider sdExFilterProvider = null;
    protected IExtendedFindProvider sdExFindProvider = null;
    protected ISDExtendedActionBarProvider sdExtendedActionBarProvider = null;
    protected ISDPropertiesProvider sdPropertiesProvider = null;

    protected NextPage nextPageButton = null;
    protected PrevPage prevPageButton = null;
    protected FirstPage firstPageButton = null;
    protected LastPage lastPageButton = null;

    protected MenuManager menuMgr = null;

    protected boolean needInit = true;

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @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);
        timeCompressionBar = new TimeCompressionBar(parent, SWT.NONE);
        timeCompressionBar.setLayoutData(timeLayoutdata);
        sdWidget = new SDWidget(parent, SWT.NONE);// SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        sdWidget.setLayoutData(seqDiagLayoutData);
        sdWidget.setSite(this);
        sdWidget.setTimeBar(timeCompressionBar);

        // Add this view to the key bindings manager
        KeyBindingsManager.getInstance().add(this.getSite().getId());

        createCoolbarContent();

        hookContextMenu();

        timeCompressionBar.setVisible(false);
        parent.layout(true);

        Print print = new Print(this);
        getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.PRINT.getId(), print);

        needInit = restoreLoader();
    }

    /**
     * Load a blank page that is supposed to explain that a kind of interaction must be chosen
     */
    protected void loadBlank() {
        IUml2SDLoader l = new IUml2SDLoader() {
            /*
             * (non-Javadoc)
             * @see
             * org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#setViewer(org.eclipse.linuxtools.tmf.ui
             * .views.uml2sd.SDView)
             */
            @Override
            public void setViewer(SDView viewer) {
                // Nothing to do
                Frame f = new Frame();
                f.setName(""); //$NON-NLS-1$
                viewer.setFrame(f);
            }

            /*
             * (non-Javadoc)
             * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#getTitleString()
             */
            @Override
            public String getTitleString() {
                return ""; //$NON-NLS-1$
            }

            /*
             * (non-Javadoc)
             * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#aboutToBeReplaced()
             */
            @Override
            public void dispose() {
            }
        };
        l.setViewer(this);
        setContentDescription(l.getTitleString());
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
        if (sdWidget != null) {
            // update actions for key bindings
            KeyBindingsManager.getInstance().setSdView(this);
            sdWidget.setFocus();
        }
        if (isViewReady() && needInit) {
            needInit = restoreLoader();
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        KeyBindingsManager.getInstance().remove(this.getSite().getId());
        super.dispose();
    }

    /**
     * @return The SD widget.
     */
    public SDWidget getSDWidget() {
        return sdWidget;
    }

    /**
     * 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) {
        sdFindProvider = provider;
        sdExFindProvider = 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
     */
    public void setExtendedFindProvider(IExtendedFindProvider provider) {
        sdExFindProvider = provider;
        sdFindProvider = 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 sdExFindProvider;
    }

    /**
     * Resets all providers.
     */
    public void resetProviders() {
        KeyBindingsManager.getInstance().setFindEnabled(false);
        sdFindProvider = null;
        sdExFindProvider = null;
        sdFilterProvider = null;
        sdExFilterProvider = null;
        sdPagingProvider = null;
        sdExtendedActionBarProvider = null;
        sdPropertiesProvider = null;
        if ((sdWidget != null) && (!sdWidget.isDisposed())) {
            sdWidget.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) {
        sdFilterProvider = provider;
        // Both systems can be used now, commenting out next statement
        // sdExFilterProvider = null;
        createCoolbarContent();
    }

    /**
     * Sets the extended filter provider for the opend sequence diagram viewer.
     * @param provider
     */
    public void setExtendedFilterProvider(IExtendedFilterProvider provider) {
        sdExFilterProvider = provider;
        // Both systems can be used now, commenting out next statement
        // sdFilterProvider = null;
        createCoolbarContent();
    }

    /**
     * Returns the extended find provider.
     * 
     * @return The extended find provider.
     */
    public IExtendedFilterProvider getExtendedFilterProvider() {
        return sdExFilterProvider;
    }

    /**
     * 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 ((sdWidget != null) && (!sdWidget.isDisposed())) {
            sdWidget.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) {
        sdPagingProvider = provider;
        createCoolbarContent();
    }

    /**
     * Returns the current page provider for the view
     * 
     * @return the paging provider
     */
    public ISDPagingProvider getSDPagingProvider() {
        return sdPagingProvider;
    }

    /**
     * Returns the current find provider for the view
     * 
     * @return the find provider
     */
    public ISDFindProvider getSDFindProvider() {
        return sdFindProvider;
    }

    /**
     * Returns the current filter provider for the view
     * 
     * @return the filter provider
     */
    public ISDFilterProvider getSDFilterProvider() {
        return sdFilterProvider;
    }

    /**
     * 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) {
        sdExtendedActionBarProvider = provider;
        createCoolbarContent();
    }

    /**
     * Returns the current extended action bar provider for the view
     * 
     * @return the extended action bar provider
     */
    public ISDExtendedActionBarProvider getSDExtendedActionBarProvider() {
        return sdExtendedActionBarProvider;
    }

    /**
     * Set the properties view provider for the opened sequence diagram viewer<br>
     * 
     * @param provider the properties provider
     */
    public void setSDPropertiesProvider(ISDPropertiesProvider provider) {
        sdPropertiesProvider = provider;
    }

    /**
     * Returns the current extended action bar provider for the view
     * 
     * @return the extended action bar provider
     */
    public ISDPropertiesProvider getSDPropertiesProvider() {
        return sdPropertiesProvider;
    }

    /**
     * Creates the basic sequence diagram menu
     */
    protected void hookContextMenu() {
        menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager manager) {
                fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(sdWidget.getViewControl());
        sdWidget.getViewControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, sdWidget.getSelectionProvider());
    }

    /**
     * Returns the context menu manager
     * 
     * @return the menu manager
     */
    public MenuManager getMenuManager() {
        return menuMgr;
    }

    /**
     * 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().currentGraphNode != null) {
            ISelectionProvider selProvider = sdWidget.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().currentGraphNode;
            if (node instanceof SyncMessageReturn) {
                if (((SyncMessageReturn) node).getMessage() != null) {
                    Action goToMessage = new MoveToMessage(this);
                    goToMessage.setText(SDMessages._39);
                    manager.add(goToMessage);
                }
            }
            if (node instanceof SyncMessage) {
                if (((SyncMessage) node).getMessageReturn() != null) {
                    Action goToMessage = new MoveToMessage(this);
                    goToMessage.setText(SDMessages._40);
                    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();

        createMenuGroup();

        Zoom resetZoom = new Zoom(this, ZoomType.ZOOM_RESET);
        bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", resetZoom);//$NON-NLS-1$
        bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", resetZoom); //$NON-NLS-1$

        Zoom noZoom = new Zoom(this, ZoomType.ZOOM_NONE);
        noZoom.setChecked(true);
        bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", noZoom);//$NON-NLS-1$
        bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", noZoom); //$NON-NLS-1$

        Zoom zoomIn = new Zoom(this, ZoomType.ZOOM_IN);
        bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", zoomIn);//$NON-NLS-1$
        bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", zoomIn); //$NON-NLS-1$

        Zoom zoomOut = new Zoom(this, ZoomType.ZOOM_OUT);
        bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", zoomOut);//$NON-NLS-1$
        bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", zoomOut); //$NON-NLS-1$

        MenuManager navigation = new MenuManager(SDMessages._77);

        ShowNodeStart showNodeStart = new ShowNodeStart(this);
        showNodeStart.setText(SDMessages.uml_25);

        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(SDMessages.uml_23);

        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", navigation); //$NON-NLS-1$

        ConfigureMinMax minMax = new ConfigureMinMax(this);
        minMax.setText(SDMessages.uml_45);
        minMax.setId("org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.ConfigureMinMax");//$NON-NLS-1$
        bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", minMax); //$NON-NLS-1$

        if ((sdWidget.getFrame() != null) && (sdWidget.getFrame().hasTimeInfo()))
            minMax.setEnabled(true);
        else
            minMax.setEnabled(false);

        // Do we need to display a paging item
        if (sdPagingProvider != null) {
            nextPageButton = new NextPage(this);
            bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", nextPageButton); //$NON-NLS-1$
            nextPageButton.setEnabled(sdPagingProvider.hasNextPage());
            bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", nextPageButton); //$NON-NLS-1$

            prevPageButton = new PrevPage(this);
            bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", prevPageButton); //$NON-NLS-1$
            prevPageButton.setEnabled(sdPagingProvider.hasPrevPage());
            bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", prevPageButton); //$NON-NLS-1$

            firstPageButton = new FirstPage(this);
            bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", firstPageButton); //$NON-NLS-1$
            firstPageButton.setEnabled(sdPagingProvider.hasPrevPage());
            bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", firstPageButton); //$NON-NLS-1$

            lastPageButton = new LastPage(this);
            bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", lastPageButton); //$NON-NLS-1$
            lastPageButton.setEnabled(sdPagingProvider.hasNextPage());
            bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", lastPageButton); //$NON-NLS-1$
        }

        if (sdExFilterProvider != null) {
            Action action = sdExFilterProvider.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(
                            TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_FILTERS));
                if (action.getText() == null || action.getText().length() == 0)
                    action.setText(SDMessages._42);
                bar.getMenuManager().prependToGroup("UML2SD_FILTERING", action); //$NON-NLS-1$
                bar.getToolBarManager().prependToGroup("UML2SD_FILTERING", action); //$NON-NLS-1$
            }
        }
        // Both systems can be used now: commenting out else keyword
        /* else */if (sdFilterProvider != null) {
            bar.getMenuManager().appendToGroup("UML2SD_FILTERING", new OpenSDFiltersDialog(this, sdFilterProvider)); //$NON-NLS-1$   
            // No longer in the coolbar: commenting out next statement
            //bar.getToolBarManager().appendToGroup("UML2SD_FILTERING",new OpenSDFiltersDialog(this, sdFilterProvider));   //$NON-NLS-1$   
        }
        if (sdPagingProvider != null && sdPagingProvider instanceof ISDAdvancedPagingProvider) {
            IContributionItem sdPaging = bar.getMenuManager().find(OpenSDPagesDialog.ID);
            if (sdPaging != null) {
                bar.getMenuManager().remove(sdPaging);
                sdPaging = null;
            }
            bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", //$NON-NLS-1$
                    new OpenSDPagesDialog(this, (ISDAdvancedPagingProvider) sdPagingProvider));
            updatePagesMenuItem(bar);
        }

        if (sdExFindProvider != null) {
            Action action = sdExFindProvider.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(TmfUiPlugin.getDefault()
                            .getImageDescripterFromPath(ITmfImageConstants.IMG_UI_SEARCH_SEQ));
                if (action.getText() == null)
                    action.setText(SDMessages._41);
                bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", action); //$NON-NLS-1$
                bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", action); //$NON-NLS-1$
            }
        } else if (sdFindProvider != null) {
            bar.getMenuManager().appendToGroup("UML2SD_OTHER_COMMANDS", new OpenSDFindDialog(this)); //$NON-NLS-1$
            bar.getToolBarManager().appendToGroup("UML2SD_OTHER_COMMANDS", new OpenSDFindDialog(this)); //$NON-NLS-1$
        }

        if (sdExtendedActionBarProvider != null) {
            sdExtendedActionBarProvider.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 (sdPagingProvider != 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 != null && nextPage instanceof ActionContributionItem) {
                IAction nextPageAction = ((ActionContributionItem) nextPage).getAction();
                if (nextPageAction != null && nextPageAction instanceof NextPage) {
                    ((NextPage) nextPageAction).setEnabled(sdPagingProvider.hasNextPage());
                }
            }

            IContributionItem prevPage = barManager.find(PrevPage.ID);
            if (prevPage != null && prevPage instanceof ActionContributionItem) {
                IAction prevPageAction = ((ActionContributionItem) prevPage).getAction();
                if (prevPageAction != null && prevPageAction instanceof PrevPage) {
                    ((PrevPage) prevPageAction).setEnabled(sdPagingProvider.hasPrevPage());
                }
            }

            IContributionItem firstPage = barManager.find(FirstPage.ID);
            if (firstPage != null && firstPage instanceof ActionContributionItem) {
                IAction firstPageAction = ((ActionContributionItem) firstPage).getAction();
                if (firstPageAction != null && firstPageAction instanceof FirstPage) {
                    ((FirstPage) firstPageAction).setEnabled(sdPagingProvider.hasPrevPage());
                }
            }

            IContributionItem lastPage = barManager.find(LastPage.ID);
            if (lastPage != null && lastPage instanceof ActionContributionItem) {
                IAction lastPageAction = ((ActionContributionItem) lastPage).getAction();
                if (lastPageAction != null && lastPageAction instanceof LastPage) {
                    ((LastPage) lastPageAction).setEnabled(sdPagingProvider.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 (sdPagingProvider instanceof ISDAdvancedPagingProvider) {
            IMenuManager menuManager = bar.getMenuManager();
            ActionContributionItem contributionItem = (ActionContributionItem) menuManager
                    .find(OpenSDPagesDialog.ID);
            IAction openSDPagesDialog = null;
            if (contributionItem != null) {
                openSDPagesDialog = contributionItem.getAction();
            }

            if (openSDPagesDialog != null && openSDPagesDialog instanceof OpenSDPagesDialog) {
                openSDPagesDialog.setEnabled(((ISDAdvancedPagingProvider) sdPagingProvider).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
     */
    protected void setFrame(Frame frame, boolean resetPosition) {
        if (sdWidget == null)
            return;

        if (frame == null) {
            loadBlank();
            return;
        }

        IUml2SDLoader l = LoadersManager.getInstance().getCurrentLoader(getViewSite().getId(), this);

        if ((l != null) && (l.getTitleString() != null)) {
            setContentDescription(l.getTitleString());
        }

        if (getSDWidget() != null)
            getSDWidget().setFrame(frame, resetPosition);

        if (timeCompressionBar != null)
            timeCompressionBar.setFrame(frame);
        updateCoolBar();
        if (!frame.hasTimeInfo()) {
            Composite parent = timeCompressionBar.getParent();
            timeCompressionBar.setVisible(false);
            parent.layout(true);
        } else {
            Composite parent = timeCompressionBar.getParent();
            timeCompressionBar.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
     */
    public void setFrameSync(final Frame frame) {
        if (getSDWidget() == null || getSDWidget().isDisposed()) {
            return;
        }
        getSDWidget().getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                if (getSDWidget() == null || getSDWidget().isDisposed()) {
                    return;
                }
                setFrame(frame);
            }
        });

    }

    /**
     * Ensure an object is visible from an other thread than the one executing the main loop
     * 
     * @param sm
     */
    public void ensureVisibleSync(final GraphNode sm) {
        getSDWidget().getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                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
     */
    public void setFrameAndEnsureVisibleSync(final Frame frame, final GraphNode sm) {
        if (getSDWidget() == null || getSDWidget().isDisposed()) {
            return;
        }
        getSDWidget().getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                if (getSDWidget() == null || getSDWidget().isDisposed()) {
                    return;
                }
                setFrameAndEnsureVisible(frame, sm);
            }
        });
    }

    /**
     * Set the frame and ensure an object is visible
     * 
     * @param sm
     */
    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 sm
     */
    public void setFrameAndEnsureVisibleSync(final Frame frame, final int x, final int y) {
        if (getSDWidget() == null || getSDWidget().isDisposed()) {
            return;
        }

        getSDWidget().getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                setFrameAndEnsureVisible(frame, x, y);
            }
        });
    }

    /**
     * Set the frame and ensure an object is visible
     * 
     * @param sm
     */
    public void setFrameAndEnsureVisible(Frame frame, int x, int y) {
        getSDWidget().clearSelection();
        setFrame(frame, false);
        getSDWidget().ensureVisible(x, y);
        getSDWidget().redraw();
    }

    /**
     * waitCursor is the cursor to be displayed when long tasks are running
     */
    protected Cursor waitCursor;

    /**
     * Toggle between default and wait cursors from an other thread than the one executing the main loop
     */
    public void toggleWaitCursorAsync(final boolean wait_) {
        if (getSDWidget() == null || getSDWidget().isDisposed()) {
            return;
        }

        getSDWidget().getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                if (getSDWidget() == null || getSDWidget().isDisposed()) {
                    return;
                }
                if (wait_) {
                    if (waitCursor != null && !waitCursor.isDisposed()) {
                        waitCursor.dispose();
                    }
                    waitCursor = new Cursor(getSDWidget().getDisplay(), SWT.CURSOR_WAIT);
                    getSDWidget().setCursor(waitCursor);
                    getSDWidget().getDisplay().update();
                } else {
                    if (waitCursor != null && !waitCursor.isDisposed()) {
                        waitCursor.dispose();
                    }
                    waitCursor = null;
                    getSDWidget().setCursor(null);
                    getSDWidget().getDisplay().update();
                }
            }
        });
    }

    /**
     * Return the time compression bar widget
     * 
     * @return the time compression bar
     */
    public TimeCompressionBar getTimeCompressionBar() {
        return timeCompressionBar;
    }

    /**
     * Returns the current Frame (the sequence diagram container)
     * 
     * @return the frame
     */
    public Frame getFrame() {
        if (getSDWidget() != null) {
            return getSDWidget().getFrame();
        } else {
            return null;
        }
    }

    protected boolean restoreLoader() {
        String id = getViewSite().getId();
        // System.err.println("restoreLoader() id="+id);
        if (id == null) {
            return true;
        }
        IUml2SDLoader l = LoadersManager.getInstance().getCurrentLoader(id, this);
        // System.err.println("restoreLoader() l="+l);
        if ((l != null)) {// &&( LoadersManager.getLoadersManager().getViewer(l)==this)){
            l.setViewer(this);
            return false;
        } else {
            loadBlank();
            return true;
        }
    }

    protected boolean isViewReady() {
        IWorkbenchPage persp = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        if (persp == null)
            return false;

        IViewReference[] ref = persp.getViewReferences();
        for (int i = 0; i < ref.length; i++) {
            if (ref[i].getView(false) == this) {
                return true;
            }
        }
        return false;
    }

    protected void createMenuGroup() {
        IActionBars bar = getViewSite().getActionBars();
        if (bar == null) {
            return;
        }
        bar.getToolBarManager().add(new Separator("UML2SD_VIEW_MODES")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_WORKING_SET")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_SORTING")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_FILTERING")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_VIEW_LAYOUT")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_LINK_EDITOR")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_OTHER_COMMANDS")); //$NON-NLS-1$
        bar.getToolBarManager().add(new Separator("UML2SD_OTHER_PLUGINS_COMMANDS")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_VIEW_MODES")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_WORKING_SET")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_SORTING")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_FILTERING")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_VIEW_LAYOUT")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_LINK_EDITOR")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_OTHER_COMMANDS")); //$NON-NLS-1$
        bar.getMenuManager().add(new Separator("UML2SD_OTHER_PLUGINS_COMMANDS")); //$NON-NLS-1$
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Object getAdapter(Class _adapter) {
        Object obj = super.getAdapter(_adapter);
        if (sdPropertiesProvider != null && _adapter.equals(IPropertySheetPage.class)) {
            return sdPropertiesProvider.getPropertySheetEntry();
        }

        return obj;
    }
}