org.eclipse.papyrus.uml.diagram.activity.activitygroup.utils.Utils.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.papyrus.uml.diagram.activity.activitygroup.utils.Utils.java

Source

/*****************************************************************************
 * Copyright (c) 2011 Atos.
 *
 *    
 * 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:
 *   Arthur Daussy (Atos) - Initial API and implementation
 *   Arthur Daussy - 371712 : 372745: [ActivityDiagram] Major refactoring group framework
 *
 *****************************************************************************/
package org.eclipse.papyrus.uml.diagram.activity.activitygroup.utils;

import java.util.Collection;
import java.util.Collections;
import java.util.Set;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
import org.eclipse.gmf.runtime.notation.Bounds;
import org.eclipse.gmf.runtime.notation.LayoutConstraint;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.papyrus.uml.diagram.activity.activitygroup.predicates.DescendantsFilter;
import org.eclipse.papyrus.uml.diagram.activity.activitygroup.request.IGroupRequest;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.edit.providers.UMLItemProviderAdapterFactory;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;

public class Utils {

    /**
     * Debug message
     */
    private static final String OLD_PARENT = "Old parent :";

    /**
     * Return a iterable of each targeted edit part
     * 
     * @param req
     * @return
     */
    public static Iterable<IGraphicalEditPart> getTargetedEditPart(ChangeBoundsRequest req) {
        if (req != null && req.getEditParts() != null) {
            return Iterables
                    .transform(Iterables.filter((Iterable<Object>) req.getEditParts(), new Predicate<Object>() {

                        public boolean apply(Object input) {
                            return input instanceof IGraphicalEditPart;
                        }
                    }), new Function<Object, IGraphicalEditPart>() {

                        public IGraphicalEditPart apply(Object from) {
                            return (IGraphicalEditPart) from;
                        }
                    });
        }
        return Collections.EMPTY_LIST;
    }

    /**
     * Get the abslotue bounds of a figure after a change bounds request
     * 
     * @param request
     * @param host
     * @return
     */
    public static Rectangle getAbslotueRequestBounds(ChangeBoundsRequest request, IGraphicalEditPart host) {
        Rectangle bounds = getAbsoluteBounds(host);
        return request.getTransformedRectangle(bounds);
    }

    /**
     * Get the bounds of an edit part
     * 
     * @param part
     *        edit part to find bounds
     * @return part's bounds in absolute coordinates
     */
    public static Rectangle getAbsoluteBounds(IGraphicalEditPart part) {
        // take bounds from figure
        part.refresh();
        part.getFigure().invalidate();
        part.getFigure().validate();
        Rectangle bounds = part.getFigure().getBounds().getCopy();
        if (part.getNotationView() instanceof Node) {
            // rather update with up to date model bounds
            Node node = (Node) part.getNotationView();
            LayoutConstraint cst = node.getLayoutConstraint();
            if (cst instanceof Bounds) {
                Bounds b = (Bounds) cst;
                Point parentLoc = part.getFigure().getParent().getBounds().getLocation();
                if (b.getX() > 0) {
                    bounds.x = b.getX() + parentLoc.x;
                }
                if (b.getY() > 0) {
                    bounds.y = b.getY() + parentLoc.y;
                }
                if (b.getHeight() != -1) {
                    bounds.height = b.getHeight();
                }
                if (b.getWidth() != -1) {
                    bounds.width = b.getWidth();
                }
            }
        }
        part.getFigure().getParent().translateToAbsolute(bounds);
        return bounds;
    }

    //   /**
    //    * Get the bounds of an edit part
    //    * 
    //    * @param part
    //    *        edit part to find bounds
    //    * @return part's bounds in absolute coordinates
    //    */
    //   public static Rectangle getAbsoluteBounds(Shape s) {
    //      s.
    //      // take bounds from figure
    //      part.getTopGraphicEditPart().refresh();
    //      Rectangle bounds = part.getFigure().getBounds().getCopy();
    //
    //      if(part.getNotationView() instanceof Node) {
    //         // rather update with up to date model bounds
    //         Node node = (Node)part.getNotationView();
    //         LayoutConstraint cst = node.getLayoutConstraint();
    //         if(cst instanceof Bounds) {
    //            Bounds b = (Bounds)cst;
    //            Point parentLoc = part.getFigure().getParent().getBounds().getLocation();
    //            if(b.getX() > 0) {
    //               bounds.x = b.getX() + parentLoc.x;
    //            }
    //            if(b.getY() > 0) {
    //               bounds.y = b.getY() + parentLoc.y;
    //            }
    //            if(b.getHeight() != -1) {
    //               bounds.height = b.getHeight();
    //            }
    //            if(b.getWidth() != -1) {
    //               bounds.width = b.getWidth();
    //            }
    //         }
    //      }
    //
    //      part.getFigure().getParent().translateToAbsolute(bounds);
    //
    //      return bounds;
    //   }
    /**
     * Same as {@link EcoreUtil#filterDescendants(Collection)}
     * 
     * @param all
     * @return
     */
    public static Set<EObject> filterDescendants(Set<EObject> all) {
        return Sets.filter(all, new DescendantsFilter(all));
    }

    private static UMLItemProviderAdapterFactory adapter = new UMLItemProviderAdapterFactory();

    static AdapterFactoryLabelProvider factory = new AdapterFactoryLabelProvider(
            new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));

    public static String getCorrectLabel(Object object) {
        if (object instanceof EObject) {
            if (object instanceof Element) {
                Object provider = adapter.adapt(object, IItemLabelProvider.class);
                if (provider instanceof IItemLabelProvider) {
                    IItemLabelProvider labelProvider = (IItemLabelProvider) provider;
                    return labelProvider.getText(object);
                }
            } else {
                return factory.getText(object);
            }
        } else if (object instanceof EReference) {
            return ((EReference) object).getName();
        } else {
            return object.toString();
        }
        return "Error in getting name";////$NON-NLS-1$
    }

    public static String getCorrectLabel(IAdaptable object) {
        Object view = object.getAdapter(EObject.class);
        if (view instanceof EObject) {
            return getCorrectLabel(view);
        } else {
            return object.toString();
        }
    }

    /**
     * Get old parent references {@link EObject} sorted with {@link EReference} as keys
     * 
     * @param request
     * @return
     */
    public static Multimap<EReference, EObject> getOldParents(IGroupRequest request) {
        if (request.getNodeDescpitor() != null) {
            return getReferenceMultimap(request, request.getNodeDescpitor().getParentReferences());
        }
        return ArrayListMultimap.create();
    }

    /**
     * Get old getOldChildren references {@link EObject} sorted with {@link EReference} as keys
     * 
     * @param request
     * @return
     */
    public static Multimap<EReference, EObject> getOldChildren(IGroupRequest request) {
        if (request.getNodeDescpitor() != null) {
            return getReferenceMultimap(request, request.getNodeDescpitor().getChildrenReferences());
        }
        return ArrayListMultimap.create();
    }

    /**
     * Get the the multimap relative a request and a {@link Iterable} of {@link EReference}
     * 
     * @param request
     * @param references
     * @return
     */
    protected static Multimap<EReference, EObject> getReferenceMultimap(IGroupRequest request,
            Iterable<EReference> references) {
        Object elementAdapter = request.getTargetElement().getAdapter(EObject.class);
        if (elementAdapter instanceof EObject && references != null) {
            Multimap<EReference, EObject> result = ArrayListMultimap.create();
            EObject targetElement = (EObject) elementAdapter;
            if (targetElement != null) {
                for (EReference ref : references) {
                    if (ref.isMany()) {
                        Collection<EObject> values = (Collection<EObject>) targetElement.eGet(ref);
                        for (EObject v : values) {
                            result.put(ref, v);
                        }
                    } else {
                        Object value = targetElement.eGet(ref);
                        ;
                        if (value instanceof EObject) {
                            result.put(ref, (EObject) value);
                        }
                    }
                }
            }
            return result;
        }
        return ArrayListMultimap.create();
    }

    /**
     * Copy a ChangeBoundsRequest.
     * Do not copy metadata
     * 
     * @param req
     * @param part
     * @return
     */
    public static ChangeBoundsRequest getChangeBoundsRequestCopy(final ChangeBoundsRequest req,
            final EditPart part) {
        ChangeBoundsRequest auxRequest = new ChangeBoundsRequest(req.getType());
        auxRequest.setLocation(req.getLocation());
        auxRequest.setEditParts(Collections.singletonList(part));
        auxRequest.setMoveDelta(req.getMoveDelta());
        auxRequest.setResizeDirection(req.getResizeDirection());
        auxRequest.setSizeDelta(req.getSizeDelta());
        return auxRequest;
    }

    public static Rectangle getAbslotueRequestBounds(CreateViewRequest initialRequest) {
        Point location = initialRequest.getLocation();
        Dimension size = initialRequest.getSize();
        /**
         * TODO get default size
         */
        Rectangle creationBounds = new Rectangle(location != null ? location : new Point(0, 0),
                size != null ? size : new Dimension(20, 20));
        return creationBounds;
    }
}