org.kalypso.afgui.internal.ui.workflow.WorkflowBreadcrumbViewer.java Source code

Java tutorial

Introduction

Here is the source code for org.kalypso.afgui.internal.ui.workflow.WorkflowBreadcrumbViewer.java

Source

/*----------------    FILE HEADER KALYPSO ------------------------------------------
 *
 *  This file is part of kalypso.
 *  Copyright (C) 2004 by:
 *
 *  Technical University Hamburg-Harburg (TUHH)
 *  Institute of River and coastal engineering
 *  Denickestrae 22
 *  21073 Hamburg, Germany
 *  http://www.tuhh.de/wb
 *
 *  and
 *
 *  Bjoernsen Consulting Engineers (BCE)
 *  Maria Trost 3
 *  56070 Koblenz, Germany
 *  http://www.bjoernsen.de
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact:
 *
 *  E-Mail:
 *  belger@bjoernsen.de
 *  schlienger@bjoernsen.de
 *  v.doemming@tuhh.de
 *
 *  ---------------------------------------------------------------------------*/
package org.kalypso.afgui.internal.ui.workflow;

import nu.bibi.breadcrumb.BreadcrumbViewer;
import nu.bibi.breadcrumb.IMenuSelectionListener;
import nu.bibi.breadcrumb.MenuSelectionEvent;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.services.IServiceLocator;
import org.kalypso.afgui.internal.i18n.Messages;
import org.kalypso.afgui.scenarios.ScenarioHelper;
import org.kalypso.afgui.ui.workflow.WorkflowBreadCrumbLabelProvider;
import org.kalypso.afgui.ui.workflow.WorkflowBreadcrumbContentProvider;
import org.kalypso.afgui.views.ScenarioViewerFilter;
import org.kalypso.afgui.views.WorkflowView;

import de.renew.workflow.connector.cases.IScenario;

/**
 * @author Gernot Belger
 */
public class WorkflowBreadcrumbViewer extends BreadcrumbViewer {
    private final MenuManager m_itemMenuManager;

    private final WorkflowView m_view;

    public WorkflowBreadcrumbViewer(final Composite parent, final WorkflowView view) {
        super(parent, SWT.NONE);

        m_view = view;

        setLabelProvider(new WorkflowBreadCrumbLabelProvider());
        setToolTipLabelProvider(new WorkflowBreadCrumbTooltipProvider());

        setContentProvider(new WorkflowBreadcrumbContentProvider());
        setInput(ResourcesPlugin.getWorkspace().getRoot());

        addFilter(new ScenarioViewerFilter());

        m_itemMenuManager = new MenuManager();
        m_itemMenuManager.add(new Separator("additions")); //$NON-NLS-1$

        final IServiceLocator locator = view.getSite();

        final IMenuService menuService = (IMenuService) locator.getService(IMenuService.class);
        menuService.populateContributionManager(m_itemMenuManager, "popup:org.kalypso.afgui.breadcrumbs"); //$NON-NLS-1$

        hookListeners();
    }

    void dispose() {
        final IWorkbench workbench = PlatformUI.getWorkbench();

        final IMenuService menuService = (IMenuService) workbench.getService(IMenuService.class);
        menuService.releaseContributions(m_itemMenuManager);

        m_itemMenuManager.dispose();
    }

    @Override
    protected void configureDropDownViewer(final TreeViewer viewer, final Object selection) {
        viewer.setContentProvider(getContentProvider());

        // REMARK: cannot reuse label provider of breadcrumb, because it gets disposed if drop-down is closed
        viewer.setLabelProvider(new WorkflowBreadCrumbLabelProvider());
        setToolTipLabelProvider(new WorkflowBreadCrumbTooltipProvider());

        viewer.setFilters(getFilters());

        viewer.getTree().addMenuDetectListener(new MenuDetectListener() {
            @Override
            public void menuDetected(final MenuDetectEvent e) {
                final Object menuSelection = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
                handleItemMenuDetected(e, menuSelection);
            }
        });
    }

    private void hookListeners() {
        addMenuSelectionListener(new IMenuSelectionListener() {
            @Override
            public void menuSelect(final MenuSelectionEvent event) {
                final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                handleMenuSelection(selection);
            }
        });

        addMenuDetectListener(new MenuDetectListener() {
            @Override
            public void menuDetected(final MenuDetectEvent e) {
                final Object selectedElement = getSelection().getFirstElement();
                handleItemMenuDetected(e, selectedElement);
            }
        });

        // display drop-down menu
        addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(final DoubleClickEvent event) {
                // get selection
                final Object element = getSelection().getFirstElement();
                if (element == null) {
                    return;
                }

                // get parent
                final ITreeContentProvider contentProvider = getContentProvider();
                final Object parentElement = contentProvider.getParent(element);

                // open
                openDropDownMenu(parentElement);
            }
        });

        getControl().addDisposeListener(new DisposeListener() {
            @Override
            public void widgetDisposed(final DisposeEvent e) {
                dispose();
            }
        });
    }

    protected void handleItemMenuDetected(final MenuDetectEvent e, final Object selectedElement) {
        final IWorkbenchPartSite site = m_view.getSite();
        final ISelectionProvider selectionProvider = site.getSelectionProvider();

        // FIXME: works only partly: unfocus of the workflow view will disable all actions

        final StructuredSelection selection = new StructuredSelection(selectedElement);
        selectionProvider.setSelection(selection);

        final Menu contextMenu = m_itemMenuManager.createContextMenu(getControl());

        contextMenu.setLocation(e.x, e.y);
        contextMenu.setVisible(true);
    }

    protected void handleMenuSelection(final IStructuredSelection selection) {
        // REMARK: without the next line, open the model dialog in stopTask (during activate Scenario)
        // will get a widget-disposed error
        setFocus();

        if (selection.isEmpty())
            return;

        final Shell shell = getControl().getShell();

        final Object firstElement = selection.getFirstElement();

        if (firstElement instanceof IScenario) {
            ScenarioHelper.activateScenario2(shell, (IScenario) firstElement);
        } else if (firstElement instanceof String) {
            ScenarioHelper.activateScenario2(shell, null);
        }

        return;
    }

    public void setScenario(final IScenario scenario) {
        final Control control = getControl();
        if (control == null || control.isDisposed())
            return;

        if (scenario == null)
            setInput(Messages.getString("org.kalypso.afgui.views.WorkflowView.0")); //$NON-NLS-1$
        else
            setInput(scenario);

        refresh();
    }
}