Package org.fusesource.ide.camel.editor.editor

Source Code of org.fusesource.ide.camel.editor.editor.CamelModelLoader

/*******************************************************************************
* Copyright (c) 2013 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
*     Red Hat, Inc. - initial API and implementation
******************************************************************************/

package org.fusesource.ide.camel.editor.editor;


import java.util.ArrayList;
import java.util.List;

import org.eclipse.graphiti.features.IAddFeature;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.impl.AddContext;
import org.eclipse.graphiti.features.context.impl.CreateConnectionContext;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.fusesource.ide.camel.editor.Activator;
import org.fusesource.ide.camel.editor.features.create.CreateFlowFeature;
import org.fusesource.ide.camel.editor.utils.DiagramUtils;
import org.fusesource.ide.camel.model.AbstractNode;
import org.fusesource.ide.camel.model.RouteSupport;


public class CamelModelLoader {
  private Diagram diagram;
  private IFeatureProvider featureProvider;

  public CamelModelLoader(Diagram diagram, IFeatureProvider featureProvider) {
    this.diagram = diagram;
    this.featureProvider = featureProvider;
  }

  public void loadModel(RouteSupport route) {
    if (route == null) {
      return;
    }
    List<AbstractNode> processedNodes = new ArrayList<AbstractNode>();
    List<AbstractNode> children = route.getRootNodes();
    int x = 40;
    int y = 40;
    for (AbstractNode node : children) {
      y = addProcessor(route, node, x, y, processedNodes);
    }
  }

  private int addProcessor(AbstractNode route, AbstractNode node, int x, int y, List<AbstractNode> processedNodes) {
    // Create the context information
    AddContext addContext = new AddContext();
    addContext.setNewObject(node);
    addContext.setTargetContainer(diagram);
    addContext.setX(x);
    addContext.setY(y);
    y += 100;

    IAddFeature addFeature = featureProvider.getAddFeature(addContext);
    if (addFeature.canAdd(addContext)) {
      PictogramElement destState = null;
      if (processedNodes.contains(node) == false) {
        destState = addFeature.add(addContext);
      } else {
        destState = featureProvider.getPictogramElementForBusinessObject(node);
      }
      // remember the node
      processedNodes.add(node);
     
      if (!(route instanceof RouteSupport)) {
        // lets remove the current connection between the parent and node so that
        // createFeature.canCreate() returns true
        route.removeConnection(node);

        CreateFlowFeature createFeature = new CreateFlowFeature(featureProvider);
        CreateConnectionContext connectContext = new CreateConnectionContext();
        PictogramElement srcState = featureProvider.getPictogramElementForBusinessObject(route);
        //PictogramElement destState = featureProvider.getPictogramElementForBusinessObject(node);
        if (srcState == destState) {
          Activator.getLogger().debug("Should not be the same element for different nodes: " + route + " and " + node);
        }
        connectContext.setSourcePictogramElement(srcState);
        connectContext.setTargetPictogramElement(destState);
        Anchor srcAnchor = DiagramUtils.getAnchor(srcState);
        Anchor destAnchor = DiagramUtils.getAnchor(destState);
        if (srcAnchor != null && destAnchor != null) {
          connectContext.setSourceAnchor(srcAnchor);
          connectContext.setTargetAnchor(destAnchor);
          if (createFeature.canCreate(connectContext)) {
            createFeature.execute(connectContext);
          }
        }
      }

      List<AbstractNode> children = node.getOutputs();
      for (AbstractNode child : children) {
        y = addProcessor(node, child, x, y, processedNodes);
      }
    } else {
      Activator.getLogger().warning("Cannot add node: " + node);
    }

    return y;
  }


}
TOP

Related Classes of org.fusesource.ide.camel.editor.editor.CamelModelLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.