org.eclipse.emf.ecp.navigator.commands.DynamicContainmentCommands.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.ecp.navigator.commands.DynamicContainmentCommands.java

Source

/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 ******************************************************************************/
package org.eclipse.emf.ecp.navigator.commands;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecp.common.handler.CreateContainmentHandler;
import org.eclipse.emf.ecp.common.model.ECPWorkspaceManager;
import org.eclipse.emf.ecp.common.model.NoWorkspaceException;
import org.eclipse.emf.ecp.common.model.workSpaceModel.ECPProject;
import org.eclipse.emf.ecp.common.util.UiUtil;
import org.eclipse.emf.ecp.navigator.Activator;
import org.eclipse.emf.ecp.navigator.handler.NewModelElementWizardHandler;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;

/**
 * This class creates a group of commands to create different containments of a
 * model element through context menu. The created commands have all the same ID
 * and are handled with the same handler class {@link CreateMEHandler}.
 * 
 * @author Hodaie
 */
public class DynamicContainmentCommands extends CompoundContributionItem {

    private static final String COMMAND_ID = "org.eclipse.emf.ecp.navigator.createContaiment";
    private EObject selectedME;
    private ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
            ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
    private AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(adapterFactory);

    /**
     * . {@inheritDoc}
     */
    @Override
    protected IContributionItem[] getContributionItems() {
        // 1. get selected EObject
        selectedME = UiUtil.getSelectedEObject();
        if (selectedME == null) {
            return new IContributionItem[0];
        }
        try {
            if (ECPWorkspaceManager.getInstance().getWorkSpace().isRootObject(selectedME)) {
                return createNewWizard(selectedME.eClass());
            }
        } catch (NoWorkspaceException e) {
            Activator.getDefault().logException(e.getMessage(), e);
        }

        AdapterFactoryItemDelegator delegator = new AdapterFactoryItemDelegator(adapterFactory);

        List<CommandParameter> commandParameters = (List<CommandParameter>) delegator.getNewChildDescriptors(
                selectedME, AdapterFactoryEditingDomain.getEditingDomainFor(selectedME), null);

        IContributionItem[] commands = createCommands(commandParameters);
        return commands;

    }

    private IContributionItem[] createNewWizard(EClass eClass) {
        CommandContributionItemParameter commandParam = new CommandContributionItemParameter(
                PlatformUI.getWorkbench(), null, "org.eclipse.emf.ecp.navigator.newModelElementWizard",
                CommandContributionItem.STYLE_PUSH);
        List<IContributionItem> commands = new ArrayList<IContributionItem>();
        Map<Object, Object> commandParams = new HashMap<Object, Object>();

        commandParams.put(NewModelElementWizardHandler.COMMAND_ECLASS_PARAM, eClass);
        commandParam.label = "New Model Element";

        Image image = labelProvider.getImage(eClass);
        ImageDescriptor imageDescriptor = ImageDescriptor.createFromImage(image);
        commandParam.icon = imageDescriptor;

        // create command
        commandParam.parameters = commandParams;
        CommandContributionItem command = new CommandContributionItem(commandParam);
        commands.add(command);

        return commands.toArray(new IContributionItem[commands.size()]);
    }

    /**
     * .
     * 
     * @param commandParameters
     *            a list of EReference of containments of selected ME
     * @return an array of IContributionsItem (commands) to create different
     *         types of containments.
     */
    private IContributionItem[] createCommands(List<CommandParameter> commandParameters) {

        List<IContributionItem> commands = new ArrayList<IContributionItem>();
        Map<String, List<CommandParameter>> mapping = new HashMap<String, List<CommandParameter>>();
        for (CommandParameter commandParameter : commandParameters) {
            if (commandParameter.getValue() instanceof EObject) {
                EClass eClass = ((EObject) commandParameter.getValue()).eClass();
                List<CommandParameter> list = mapping.get(eClass.getName());
                if (list == null) {
                    list = new ArrayList<CommandParameter>();
                    mapping.put(eClass.getName(), list);
                }
                list.add(commandParameter);
            }
        }
        for (String eclass : mapping.keySet()) {
            List<CommandParameter> list = mapping.get(eclass);
            boolean showReferenceLable = (list.size() > 1);
            for (CommandParameter commandParameter : list) {
                EReference containment = commandParameter.getEReference();

                if (!containment.isMany()) {
                    if (selectedME.eGet(containment) != null) {
                        continue;
                    }
                }

                try {
                    ECPProject project = ECPWorkspaceManager.getInstance().getWorkSpace().getProject(selectedME);
                    if (project != null && project.getMetaModelElementContext()
                            .isNonDomainElement(containment.getEReferenceType())) {
                        continue;
                    }
                } catch (NoWorkspaceException e) {
                    Activator.getDefault().logException(e.getMessage(), e);
                }

                CommandContributionItemParameter commandParam = new CommandContributionItemParameter(
                        PlatformUI.getWorkbench(), null, COMMAND_ID, CommandContributionItem.STYLE_PUSH);

                Map<Object, Object> commandParams = new HashMap<Object, Object>();

                Object type = commandParameter.getValue();
                if (type instanceof EObject) {
                    commandParams.put(CreateContainmentHandler.COMMAND_ECLASS_PARAM, ((EObject) type).eClass());
                    commandParams.put(CreateContainmentHandler.COMMAND_ECREFERENCE_PARAM, containment.getName());
                    commandParam.label = "New " + ((EObject) type).eClass().getName();
                    if (showReferenceLable) {
                        commandParam.label = commandParam.label + " (" + containment.getName() + ")";
                    }
                    commandParam.icon = getImage(((EObject) type).eClass());
                } else {
                    commandParams.put(CreateContainmentHandler.COMMAND_ECLASS_PARAM,
                            containment.getEReferenceType());
                    commandParam.label = "New " + containment.getEReferenceType().getName();
                    commandParam.icon = getImage(containment.getEReferenceType());

                }

                // create command
                commandParam.parameters = commandParams;
                CommandContributionItem command = new CommandContributionItem(commandParam);
                commands.add(command);
            }

        }
        return commands.toArray(new IContributionItem[commands.size()]);
    }

    private ImageDescriptor getImage(EClass eClass) {
        EObject instance = eClass.getEPackage().getEFactoryInstance().create(eClass);
        Image image = labelProvider.getImage(instance);
        ImageDescriptor imageDescriptor = ImageDescriptor.createFromImage(image);
        return imageDescriptor;
    }

    @Override
    public void dispose() {
        if (adapterFactory != null) {
            adapterFactory.dispose();
        }
        super.dispose();
    }

}