New_processDiagramEditorUtil.java :  » Workflow-Engines » osbl-1_0 » newprocess » diagram » part » Java Open Source

Java Open Source » Workflow Engines » osbl 1_0 
osbl 1_0 » newprocess » diagram » part » New_processDiagramEditorUtil.java
package newprocess.diagram.part;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import newprocess.Globals;
import newprocess.Loader;
import newprocess.NewprocessFactory;
import newprocess.NewprocessPackage;
import newprocess.Process;
import newprocess.diagram.edit.parts.ProcessEditPart;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.edit.ui.util.EditUIUtil;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.ui.PartInitException;

/**
 * @generated
 */
public class New_processDiagramEditorUtil {

  /**
   * @generated
   */
  public static boolean openDiagram(Resource diagram)
      throws PartInitException {
    return EditUIUtil.openEditor((EObject) diagram.getContents().get(0));
  }

  /**
   * @generated
   */
  private static void setCharset(URI uri) {
    IFile file = getFile(uri);
    if (file == null) {
      return;
    }
    try {
      file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$
    } catch (CoreException e) {
      New_processDiagramEditorPlugin.getInstance().logError(
          "Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$
    }
  }

  /**
   * @generated
   */
  public static IFile getFile(URI uri) {
    if (uri.toString().startsWith("platform:/resource")) { //$NON-NLS-1$
      String path = uri.toString().substring(
          "platform:/resource".length()); //$NON-NLS-1$
      IResource workspaceResource = ResourcesPlugin.getWorkspace()
          .getRoot().findMember(new Path(path));
      if (workspaceResource instanceof IFile) {
        return (IFile) workspaceResource;
      }
    }
    return null;
  }

  /**
   * @generated
   */
  public static boolean exists(IPath path) {
    return ResourcesPlugin.getWorkspace().getRoot().exists(path);
  }

  /**
   * <p>
   * This method should be called within a workspace modify operation since it creates resources.
   * </p>
   * @generated
   * @return the created resource, or <code>null</code> if the resource was not created
   */
  public static final Resource createDiagram(URI diagramURI, URI modelURI,
      IProgressMonitor progressMonitor) {
    TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
        .createEditingDomain();
    progressMonitor.beginTask("Creating diagram and model files", 3);
    final Resource diagramResource = editingDomain.getResourceSet()
        .createResource(diagramURI);
    final Resource modelResource = editingDomain.getResourceSet()
        .createResource(modelURI);
    final String diagramName = diagramURI.lastSegment();
    AbstractTransactionalCommand command = new AbstractTransactionalCommand(
        editingDomain,
        "Creating diagram and model", Collections.EMPTY_LIST) { //$NON-NLS-1$
      protected CommandResult doExecuteWithResult(
          IProgressMonitor monitor, IAdaptable info)
          throws ExecutionException {
        Process model = createInitialModel();
        attachModelToResource(model, modelResource);
        Diagram diagram = ViewService
            .createDiagram(
                model,
                ProcessEditPart.MODEL_ID,
                New_processDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
        if (diagram != null) {
          diagramResource.getContents().add(diagram);
          diagram.setName(diagramName);
          diagram.setElement(model);
        }
        try {
          Map options = new HashMap();
          options.put(XMIResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
          modelResource.save(options);
          diagramResource.save(options);
        } catch (IOException e) {

          New_processDiagramEditorPlugin.getInstance().logError(
              "Unable to store model and diagram resources", e); //$NON-NLS-1$
        }
        return CommandResult.newOKCommandResult();
      }
    };
    try {
      OperationHistoryFactory.getOperationHistory().execute(command,
          new SubProgressMonitor(progressMonitor, 1), null);
    } catch (ExecutionException e) {
      New_processDiagramEditorPlugin.getInstance().logError(
          "Unable to create model and diagram", e); //$NON-NLS-1$
    }
    setCharset(modelURI);
    setCharset(diagramURI);
    return diagramResource;
  }

  /**
   * Create a new instance of domain element associated with canvas.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated NOT
   * @author sh
   */
  private static Process createInitialModel() {
    //return NewprocessFactory.eINSTANCE.createProcess();
    // ************* custom *****************************
    Process process = NewprocessFactory.eINSTANCE.createProcess();

    // create the Globals
    EReference globalsContainer = NewprocessPackage.eINSTANCE
        .getProcess_HasGlobals();
    Globals globals = NewprocessFactory.eINSTANCE.createGlobals();
    EClass globalsClass = globals.eClass();
    EObject globalsNode = EMFCoreUtil.create(process, globalsContainer,
        globalsClass);

    // create the Loader
    EReference loaderContainer = NewprocessPackage.eINSTANCE
        .getGlobals_HasLoader();
    Loader loader = NewprocessFactory.eINSTANCE.createLoader();
    EClass loaderEClass = loader.eClass();
    EMFCoreUtil.create(globalsNode, loaderContainer, loaderEClass);
    return process;
  }

  /**
   * Store model element in the resource.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  private static void attachModelToResource(Process model, Resource resource) {
    resource.getContents().add(model);
  }

  /**
   * @generated
   */
  public static void selectElementsInDiagram(
      IDiagramWorkbenchPart diagramPart, List/*EditPart*/editParts) {
    diagramPart.getDiagramGraphicalViewer().deselectAll();

    EditPart firstPrimary = null;
    for (Iterator it = editParts.iterator(); it.hasNext();) {
      EditPart nextPart = (EditPart) it.next();
      diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);
      if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {
        firstPrimary = nextPart;
      }
    }

    if (!editParts.isEmpty()) {
      diagramPart.getDiagramGraphicalViewer().reveal(
          firstPrimary != null ? firstPrimary : (EditPart) editParts
              .get(0));
    }
  }

  /**
   * @generated
   */
  public static View findView(DiagramEditPart diagramEditPart,
      EObject targetElement, LazyElement2ViewMap lazyElement2ViewMap) {
    boolean hasStructuralURI = false;
    if (targetElement.eResource() instanceof XMLResource) {
      hasStructuralURI = ((XMLResource) targetElement.eResource())
          .getID(targetElement) == null;
    }

    View view = null;
    if (hasStructuralURI
        && !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {
      view = (View) lazyElement2ViewMap.getElement2ViewMap().get(
          targetElement);
    } else if (findElementsInDiagramByID(diagramEditPart, targetElement,
        lazyElement2ViewMap.editPartTmpHolder) > 0) {
      EditPart editPart = (EditPart) lazyElement2ViewMap.editPartTmpHolder
          .get(0);
      lazyElement2ViewMap.editPartTmpHolder.clear();
      view = editPart.getModel() instanceof View ? (View) editPart
          .getModel() : null;
    }

    return (view == null) ? diagramEditPart.getDiagramView() : view;
  }

  /**
   * @generated
   */
  private static int findElementsInDiagramByID(DiagramEditPart diagramPart,
      EObject element, List editPartCollector) {
    IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart
        .getViewer();
    final int intialNumOfEditParts = editPartCollector.size();

    if (element instanceof View) { // support notation element lookup
      EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(
          element);
      if (editPart != null) {
        editPartCollector.add(editPart);
        return 1;
      }
    }

    String elementID = EMFCoreUtil.getProxyID(element);
    List associatedParts = viewer.findEditPartsForElement(elementID,
        IGraphicalEditPart.class);
    // perform the possible hierarchy disjoint -> take the top-most parts only
    for (Iterator editPartIt = associatedParts.iterator(); editPartIt
        .hasNext();) {
      EditPart nextPart = (EditPart) editPartIt.next();
      EditPart parentPart = nextPart.getParent();
      while (parentPart != null && !associatedParts.contains(parentPart)) {
        parentPart = parentPart.getParent();
      }
      if (parentPart == null) {
        editPartCollector.add(nextPart);
      }
    }

    if (intialNumOfEditParts == editPartCollector.size()) {
      if (!associatedParts.isEmpty()) {
        editPartCollector.add(associatedParts.iterator().next());
      } else {
        if (element.eContainer() != null) {
          return findElementsInDiagramByID(diagramPart, element
              .eContainer(), editPartCollector);
        }
      }
    }
    return editPartCollector.size() - intialNumOfEditParts;
  }

  /**
   * @generated
   */
  public static class LazyElement2ViewMap {
    /**
     * @generated
     */
    private Map element2ViewMap;
    /**
     * @generated
     */
    private View scope;
    /**
     * @generated
     */
    private Set elementSet;
    /**
     * @generated
     */
    public final List editPartTmpHolder = new ArrayList();

    /**
     * @generated
     */
    public LazyElement2ViewMap(View scope, Set elements) {
      this.scope = scope;
      this.elementSet = elements;
    }

    /**
     * @generated
     */
    public final Map getElement2ViewMap() {
      if (element2ViewMap == null) {
        element2ViewMap = new HashMap();
        // map possible notation elements to itself as these can't be found by view.getElement()
        for (Iterator it = elementSet.iterator(); it.hasNext();) {
          EObject element = (EObject) it.next();
          if (element instanceof View) {
            View view = (View) element;
            if (view.getDiagram() == scope.getDiagram()) {
              element2ViewMap.put(element, element); // take only those that part of our diagram
            }
          }
        }

        buildElement2ViewMap(scope, element2ViewMap, elementSet);
      }
      return element2ViewMap;
    }

    /**
     * @generated
     */
    static Map buildElement2ViewMap(View parentView, Map element2ViewMap,
        Set elements) {
      if (elements.size() == element2ViewMap.size())
        return element2ViewMap;

      if (parentView.isSetElement()
          && !element2ViewMap.containsKey(parentView.getElement())
          && elements.contains(parentView.getElement())) {
        element2ViewMap.put(parentView.getElement(), parentView);
        if (elements.size() == element2ViewMap.size())
          return element2ViewMap;
      }

      for (Iterator it = parentView.getChildren().iterator(); it
          .hasNext();) {
        buildElement2ViewMap((View) it.next(), element2ViewMap,
            elements);
        if (elements.size() == element2ViewMap.size())
          return element2ViewMap;
      }
      for (Iterator it = parentView.getSourceEdges().iterator(); it
          .hasNext();) {
        buildElement2ViewMap((View) it.next(), element2ViewMap,
            elements);
        if (elements.size() == element2ViewMap.size())
          return element2ViewMap;
      }
      for (Iterator it = parentView.getSourceEdges().iterator(); it
          .hasNext();) {
        buildElement2ViewMap((View) it.next(), element2ViewMap,
            elements);
        if (elements.size() == element2ViewMap.size())
          return element2ViewMap;
      }
      return element2ViewMap;
    }
  } //LazyElement2ViewMap  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.