org.eclipse.emf.mapping.presentation.SimpleMappedObjectViewer.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.mapping.presentation.SimpleMappedObjectViewer.java

Source

/**
 * Copyright (c) 2002-2006 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
 *
 * Contributors:
 *   IBM - Initial API and implementation
 */
package org.eclipse.emf.mapping.presentation;

import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.Widget;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.mapping.Mapping;
import org.eclipse.emf.mapping.domain.MappingDomain;

public class SimpleMappedObjectViewer extends TreeViewer {
    protected SimpleMappedObjectViewer otherViewer;
    protected MappingDomain mappingDomain;
    protected AdapterFactory adapterFactory;
    protected boolean isTop;

    protected class SelectObjectAction extends Action {
        protected Object objectToSelect;

        public SelectObjectAction(String text, ImageDescriptor imageDescriptor) {
            super(text, imageDescriptor);
            setEnabled(false);
        }

        public void setObjectToSelect(Object objectToSelect) {
            this.objectToSelect = objectToSelect;
            setEnabled(objectToSelect != null);
        }

        @Override
        public void run() {
            setSelection(new StructuredSelection(new Object[] { objectToSelect }), true);
        }
    }

    protected SelectObjectAction selectNextMappedObject;
    protected SelectObjectAction selectPreviousMappedObject;
    protected SelectObjectAction selectNextUnmappedObject;
    protected SelectObjectAction selectPreviousUnmappedObject;
    protected Action filterMappedObjects;
    protected Action selectOtherMappedObjects;

    public SimpleMappedObjectViewer(MappingDomain domain, Tree tree, boolean isTop) {
        super(tree);
        this.mappingDomain = domain;
        this.isTop = isTop;
        tree.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(MouseEvent event) {
                selectOtherMappedObjects();
            }
        });

        addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateActions();
            }
        });
    }

    public void setAdapterFactory(AdapterFactory adapterFactory) {
        this.adapterFactory = adapterFactory;
    }

    public Action getFilterMappedObjectsAction() {
        return filterMappedObjects;
    }

    public void setOtherViewer(SimpleMappedObjectViewer otherViewer) {
        this.otherViewer = otherViewer;
    }

    protected ISelection doGetSelection() {
        return super.getSelection();
    }

    public void updateActions() {
        Collection<?> selection = ((IStructuredSelection) doGetSelection()).toList();
        boolean isReady = false;
        Object previousMapped = null;
        Object previousUnmapped = null;
        Object nextMapped = null;
        Object nextUnmapped = null;
        boolean selectionHasMappings = false;
        LOOP: for (Object object : ((IStructuredItemContentProvider) getInput()).getElements(getInput())) {
            for (TreeIterator<Object> treeIterator = new AdapterFactoryTreeIterator<Object>(adapterFactory,
                    object); treeIterator.hasNext();) {
                Object child = treeIterator.next();
                if (selection.contains(child)) {
                    isReady = true;
                    if (!selectionHasMappings) {
                        for (Mapping mapping : mappingDomain.getMappingRoot().getMappings(child)) {
                            if (mapping.getInputs().contains(child) && !mapping.getOutputs().isEmpty()
                                    || mapping.getOutputs().contains(child) && !mapping.getInputs().isEmpty()) {
                                selectionHasMappings = true;
                                break;
                            }
                        }
                    }
                } else if (mappingDomain.getMappingRoot().getMappings(child).isEmpty()) {
                    if (isReady) {
                        if (nextUnmapped == null) {
                            nextUnmapped = child;
                            if (nextMapped != null) {
                                break LOOP;
                            }
                        }
                    } else {
                        previousUnmapped = child;
                    }
                } else {
                    if (isReady) {
                        if (nextMapped == null) {
                            nextMapped = child;
                            if (nextUnmapped != null) {
                                break LOOP;
                            }
                        }
                    } else {
                        previousMapped = child;
                    }
                }
            }
        }
        selectNextMappedObject.setObjectToSelect(nextMapped);
        selectPreviousMappedObject.setObjectToSelect(previousMapped);
        selectNextUnmappedObject.setObjectToSelect(nextUnmapped);
        selectPreviousUnmappedObject.setObjectToSelect(previousUnmapped);
        selectOtherMappedObjects.setEnabled(selectionHasMappings);
    }

    public void selectOtherMappedObjects() {
        Collection<Object> result = new HashSet<Object>();
        for (Object object : ((IStructuredSelection) doGetSelection()).toList()) {
            Collection<? extends Mapping> mappings = mappingDomain.getMappingRoot().getMappings(object);
            if (mappingDomain.getMappingRoot().isInputObject(object)) {
                for (Mapping mapping : mappings) {
                    result.addAll(mapping.getOutputs());
                }
            } else if (mappingDomain.getMappingRoot().isOutputObject(object)) {
                for (Mapping mapping : mappings) {
                    result.addAll(mapping.getInputs());
                }
            }
        }
        otherViewer.setSelection(new StructuredSelection(result.toArray()), true);
    }

    @Override
    public ISelection getSelection() {
        ISelection basicSelection = doGetSelection();
        if (otherViewer == null) {
            return basicSelection;
        } else {
            return new ComposedSelection(basicSelection,
                    new ISelection[] { basicSelection, otherViewer.doGetSelection() });
        }
    }

    public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager,
            IStatusLineManager statusLineManager) {
        String label = isTop ? "Top" : "Bottom";
        String oppositeLabel = isTop ? "Bottom" : "Top";

        selectNextMappedObject = new SelectObjectAction(
                MappingUIPlugin.getPlugin().getString("_UI_NextMappedObject_menu_item"),
                MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/SelectNext" + label + "MappedObject"));
        selectNextMappedObject
                .setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_NextMappedObject_description"));
        selectNextMappedObject.setHoverImageDescriptor(
                MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/SelectNext" + label + "MappedObject"));
        selectNextMappedObject.setDisabledImageDescriptor(
                MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/SelectNext" + label + "MappedObject"));
        toolBarManager.add(selectNextMappedObject);
        menuManager.add(selectNextMappedObject);

        selectPreviousMappedObject = new SelectObjectAction(
                MappingUIPlugin.getPlugin().getString("_UI_PreviousMappedObject_menu_item"), MappingUIPlugin
                        .getPlugin().getImageDescriptor("full/elcl16/SelectPrevious" + label + "MappedObject"));
        selectPreviousMappedObject
                .setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_PreviousMappedObject_description"));
        selectPreviousMappedObject.setHoverImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/clcl16/SelectPrevious" + label + "MappedObject"));
        selectPreviousMappedObject.setDisabledImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/dlcl16/SelectPrevious" + label + "MappedObject"));
        toolBarManager.add(selectPreviousMappedObject);
        menuManager.add(selectPreviousMappedObject);

        menuManager.add(new Separator());

        selectNextUnmappedObject = new SelectObjectAction(
                MappingUIPlugin.getPlugin().getString("_UI_NextUnmappedObject_menu_item"), MappingUIPlugin
                        .getPlugin().getImageDescriptor("full/elcl16/SelectNext" + label + "UnmappedObject"));
        selectNextUnmappedObject
                .setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_NextUnmappedObject_description"));
        selectNextUnmappedObject.setHoverImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/clcl16/SelectNext" + label + "UnmappedObject"));
        selectNextUnmappedObject.setDisabledImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/dlcl16/SelectNext" + label + "UnmappedObject"));
        toolBarManager.add(selectNextUnmappedObject);
        menuManager.add(selectNextUnmappedObject);

        selectPreviousUnmappedObject = new SelectObjectAction(
                MappingUIPlugin.getPlugin().getString("_UI_PreviousUnmappedObject_menu_item"), MappingUIPlugin
                        .getPlugin().getImageDescriptor("full/elcl16/SelectPrevious" + label + "UnmappedObject"));
        selectPreviousUnmappedObject
                .setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_PreviousUnmappedObject_description"));
        selectPreviousUnmappedObject.setHoverImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/clcl16/SelectPrevious" + label + "UnmappedObject"));
        selectPreviousUnmappedObject.setDisabledImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/dlcl16/SelectPrevious" + label + "UnmappedObject"));
        toolBarManager.add(selectPreviousUnmappedObject);
        menuManager.add(selectPreviousUnmappedObject);

        menuManager.add(new Separator());

        filterMappedObjects = new Action(MappingUIPlugin.getPlugin().getString("_UI_FilterMappedObjects_menu_item"),
                MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/HideAllMappedObjects")) {
            @Override
            public void run() {
                preserveState();
                Object input = getInput();
                setInput(input);
                restoreState();

                updateActions();
            }

            @Override
            public void setChecked(boolean checked) {
                super.setChecked(checked);
                setToolTipText(MappingUIPlugin.getPlugin()
                        .getString(checked ? "_UI_FilterMappedObjects_checked_description"
                                : "_UI_FilterMappedObjects_unchecked_description"));
            }
        };
        filterMappedObjects.setChecked(false);
        filterMappedObjects.setHoverImageDescriptor(
                MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/HideAllMappedObjects"));
        filterMappedObjects.setDisabledImageDescriptor(
                MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/HideAllMappedObjects"));
        toolBarManager.add(filterMappedObjects);
        menuManager.add(filterMappedObjects);

        menuManager.add(new Separator());

        selectOtherMappedObjects = new Action(
                MappingUIPlugin.getPlugin().getString("_UI_SelectOtherMappedObjects_menu_item"), MappingUIPlugin
                        .getPlugin().getImageDescriptor("full/elcl16/Select" + oppositeLabel + "MappedObjects")) {
            @Override
            public void run() {
                selectOtherMappedObjects();
            }
        };
        selectOtherMappedObjects.setEnabled(false);
        selectOtherMappedObjects
                .setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_SelectOtherMappedObjects_description"));
        selectOtherMappedObjects.setHoverImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/clcl16/Select" + oppositeLabel + "MappedObjects"));
        selectOtherMappedObjects.setDisabledImageDescriptor(MappingUIPlugin.getPlugin()
                .getImageDescriptor("full/dlcl16/Select" + oppositeLabel + "MappedObjects"));
        toolBarManager.add(selectOtherMappedObjects);
        menuManager.add(selectOtherMappedObjects);

        toolBarManager.update(true);
        menuManager.update(true);
    }

    protected Collection<Object> expandedObjects = new HashSet<Object>();
    protected Collection<Object> selectedObjects = new HashSet<Object>();

    public void preserveState() {
        Collection<Object> oldExpandedObjects = expandedObjects;
        expandedObjects = new HashSet<Object>(Arrays.asList(getExpandedElements()));
        oldExpandedObjects.removeAll(expandedObjects);
        for (Object oldExpandedObject : oldExpandedObjects) {
            Widget item = findItem(oldExpandedObject);
            if (item == null) {
                expandedObjects.add(oldExpandedObject);
            }
        }

        Collection<Object> oldSelectedObjects = selectedObjects;
        List<?> list = ((IStructuredSelection) getSelection()).toList();
        selectedObjects = new HashSet<Object>(list);
        if (selectedObjects.isEmpty()) {
            selectedObjects = oldSelectedObjects;
        }
    }

    public void restoreState() {
        setExpandedElements(expandedObjects.toArray());
        setSelection(new StructuredSelection(selectedObjects.toArray()), true);
    }
}