org.eclipse.emf.refactor.refactoring.runtime.ui.ApplicationMenu.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.refactor.refactoring.runtime.ui.ApplicationMenu.java

Source

/*******************************************************************************
 * Copyright (c) Philipps University of Marburg. 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:
 *     Philipps University of Marburg - initial API and implementation
 *******************************************************************************/
package org.eclipse.emf.refactor.refactoring.runtime.ui;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.refactor.refactoring.configuration.managers.ConfigurationManager;
import org.eclipse.emf.refactor.refactoring.core.Refactoring;
import org.eclipse.emf.refactor.refactoring.managers.ProjectManager;
import org.eclipse.emf.refactor.refactoring.papyrus.managers.PapyrusManager;
import org.eclipse.emf.refactor.refactoring.papyrus.managers.PapyrusSelectionManager;
import org.eclipse.emf.refactor.refactoring.runtime.config.RuntimeConfig;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.impl.EObjectTreeElementImpl;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

/**
 * Class for invoking EMF model refactoring out from a selection
 * of objects in the workbench.
 * @generated NOT
 * @author Florian Mantz
 */
public class ApplicationMenu extends ContributionItem {

    /**
     * Interface name of GMF editors' graphical edit parts.
     */
    private static final String GMF_EDITPART_IDENTIFIER = "org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart";

    /**
     * Method of IGraphicalEditPart that returns the corresponding EObject. 
     */
    private static Method gmfMethod = null;

    /**
     * List of EObjects selected in the workbench. 
     */
    private final List<EObject> selection;

    private final List<IGraphicalEditPart> editParts;

    /**
     * The menu is created each time when it is displayed
     */
    public ApplicationMenu() {
        ISelection orgSelection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
                .getSelection();
        System.out.println("===>>> orgSelection: " + orgSelection);

        if (!orgSelection.isEmpty()
                && ((StructuredSelection) orgSelection).getFirstElement() instanceof IGraphicalEditPart) {
            PapyrusManager.getInstance()
                    .setDiagram((Diagram) EcoreUtil.getRootContainer(
                            ((IGraphicalEditPart) ((StructuredSelection) orgSelection).getFirstElement())
                                    .getNotationView()));
        }

        selection = getESelection(orgSelection);
        editParts = PapyrusSelectionManager.getEditParts();
        System.out.println("===>>> selection: " + selection);
    }

    /**
     * The menu is created each time when it is displayed
     */
    public ApplicationMenu(String id) {
        super(id);
        ISelection orgSelection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
                .getSelection();
        selection = getESelection(orgSelection);
        editParts = PapyrusSelectionManager.getEditParts();
    }

    /**
     * Sets the selected EObject list out of the origin selection.
     * @param selection Origin selection in the workbench.
     * @return List of selected EObjects.
     */
    private List<EObject> getESelection(ISelection selection) {
        List<EObject> r = new ArrayList<EObject>();
        for (Object o : this.getSelection(selection)) {
            if (o instanceof org.eclipse.emf.ecore.EObject) {
                r.add((EObject) o);
            }
        }
        return r;
    }

    /**
     * Returns a list of relevant objects from the given selection.
     * @param selection Origin selection in the workbench.
     * @return List of relevant objects from the given selection.
     */
    @SuppressWarnings("rawtypes")
    private Object[] getSelection(ISelection selection) {
        if (null != selection && selection instanceof StructuredSelection) {
            StructuredSelection ss = (StructuredSelection) selection;
            if (null == ss.getFirstElement()) {
                return ss.toArray();
            }
            List<Object> list = new ArrayList<Object>();
            final Iterator i = ss.iterator();
            while (i.hasNext()) {
                final Object selectedEObject = i.next();
                final Class cl = selectedEObject.getClass();
                //Usual EMF-Tree:
                boolean added = checkEMFTree(list, selectedEObject);
                if (!added) {
                    added = checkGmf(list, selectedEObject, cl);
                }
            }
            return list.toArray();
        }
        return new Object[0];
    }

    /**
     * Checks whether the selected Object is an edit part of an gmf
     * generated editor and adds the corresponding EObject to the
     * given list.
     * @param list List of relevant objects from the given selection.
     * @param selectedEObject Object to be checked.
     * @param cl Class of the object to be checked.
     * @return true if the object was inserted to the list, false
     * otherwise. 
     */
    @SuppressWarnings("rawtypes")
    private boolean checkGmf(List<Object> list, final Object selectedEObject, final Class cl) {
        RuntimeConfig config = new RuntimeConfig();
        if (config.isSupportGmfDiagramEditors() && RuntimeConfig.checkIsTypeOf(cl, GMF_EDITPART_IDENTIFIER, true)) {
            try {
                ApplicationMenu.gmfMethod = selectedEObject.getClass().getMethod("resolveSemanticElement",
                        new Class[0]);
                list.add(ApplicationMenu.gmfMethod.invoke(selectedEObject));
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * Checks whether the given selectedObject is of type EObject
     * and then adds it to the list.
     * @param list List of relevant objects from the given selection.
     * @param selectedEObject Object to be checked.
     * @return true if the object was inserted to the list, false
     * otherwise.
     */
    private boolean checkEMFTree(List<Object> list, final Object selectedEObject) {
        if (selectedEObject instanceof EObject) {
            list.add(selectedEObject);
            return true;
        } else if (selectedEObject instanceof EObjectTreeElementImpl) {
            list.add(((EObjectTreeElementImpl) selectedEObject).getEObject());
            return true;
        }
        return false;
    }

    /**
     * @see org.eclipse.jface.action.ContributionItem#fill
     * (org.eclipse.swt.widgets.Menu, int)
     */
    @Override
    public void fill(Menu menu, int index) {
        ConfigurationManager.getInstance();
        IProject project = ProjectManager.getActualProject();
        LinkedList<Refactoring> refactorings = ConfigurationManager.getSelectedRefactorings(project);
        for (final Refactoring r : refactorings) {
            try {
                if (r.getGui().showInMenu(this.selection)) {
                    MenuItem menuItem = new MenuItem(menu, SWT.CHECK, menu.getItemCount());
                    menuItem.setText(r.getName());
                    menuItem.setEnabled(true);
                    menuItem.addSelectionListener(new SelectionAdapter() {
                        public void widgetSelected(SelectionEvent e) {
                            try {
                                //1. Set Selection:
                                r.getController().setSelection(selection);
                                r.getController().setEditParts(editParts);
                                //2. Preselect Values:
                                r.getController().getDataManagementObject().preselect(selection);
                                //3. Show Refactoring-Gui:
                                Shell shell = Display.getDefault().getActiveShell();
                                RefactoringWizardOpenOperation dialog = new RefactoringWizardOpenOperation(
                                        r.getGui().show());
                                dialog.run(shell, "Refactoring: " + r.getName());

                            } catch (Exception e2) {
                                MessageDialog.openError(null, "Error", e2.getMessage());
                            }
                        }
                    });
                }
            } catch (Exception e) {

            }
        }
    }
}