/******************************************************************************* * Copyright (c) 2008 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.jboss.tools.smooks.graphical.editors.model; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.configuration.editors.xml.AbstractXMLObject; import org.jboss.tools.smooks.configuration.editors.xml.TagObject; import org.jboss.tools.smooks.configuration.editors.xml.TagPropertyObject; import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel; import org.jboss.tools.smooks.gef.tree.model.TreeNodeConnection; import org.jboss.tools.smooks.gef.tree.model.TreeNodeModel; import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateGraphicalModel; import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateNodeGraphicalModel; import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateXMLModel; import org.jboss.tools.smooks.graphical.editors.model.freemarker.IFreemarkerTemplateModel; import org.jboss.tools.smooks.templating.model.ModelBuilder; import org.jboss.tools.smooks.templating.template.TemplateBuilder; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * @author Dart * */ public class InputDataTreeNodeModel extends TreeNodeModel { public InputDataTreeNodeModel(Object data, ITreeContentProvider contentProvider, ILabelProvider labelProvider) { super(data, contentProvider, labelProvider); // TODO Auto-generated constructor stub } @Override protected TreeNodeModel createChildModel(Object model, ITreeContentProvider contentProvider, ILabelProvider labelProvider) { return new InputDataTreeNodeModel(model, contentProvider, labelProvider); } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel#isLinkable * (java.lang.Class) */ @Override public boolean isLinkable(Class<?> connectionType) { return true; } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.tree.model.TreeNodeModel#canLinkWithSource * (java.lang.Object) */ @Override public boolean canLinkWithSource(Object model) { return super.canLinkWithSource(model); } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.tree.model.TreeNodeModel#canLinkWithTarget * (java.lang.Object) */ @Override public boolean canLinkWithTarget(Object model) { TreeNodeModel targetNode = (TreeNodeModel) model; if (targetNode == this || targetNode.getModelRootNode() == getModelRootNode()) { return false; } Object targetData = AdapterFactoryEditingDomain.unwrap(targetNode.getData()); AbstractSmooksGraphicalModel targetModel = targetNode; while (targetModel != null && !(targetModel instanceof FreemarkerTemplateGraphicalModel)) { targetModel = targetModel.getParent(); } if (targetData instanceof IFreemarkerTemplateModel && targetModel instanceof FreemarkerTemplateGraphicalModel) { TemplateBuilder builder = ((FreemarkerTemplateGraphicalModel) targetModel).getTemplateBuilder(); if (((IFreemarkerTemplateModel) targetData).isHidden(builder)) { return false; } List<TreeNodeConnection> exsitingConnection = targetNode.getTargetConnections(); if (!exsitingConnection.isEmpty()){ return false; } if (targetData instanceof FreemarkerTemplateXMLModel) { FreemarkerTemplateXMLModel targetDataModel = (FreemarkerTemplateXMLModel) targetData; if (!targetDataModel.getXMLNodeChildren().isEmpty()) { // The target node has child nodes. The only thing it can connect to on the source is // a collection node. Object sourceData = AdapterFactoryEditingDomain.unwrap(this.getData()); if(sourceData instanceof AbstractXMLObject) { Element sourceElement = ((AbstractXMLObject)sourceData).getReferenceElement(); if(sourceElement != null) { if(ModelBuilder.isCollection(sourceElement) || (!ModelBuilder.isStrictModel(sourceElement.getOwnerDocument()) && ModelBuilder.hasChildContent(sourceElement))) { return true; } } } return false; } } for (Iterator<?> iterator = exsitingConnection.iterator(); iterator.hasNext();) { TreeNodeConnection treeNodeConnection = (TreeNodeConnection) iterator.next(); if (treeNodeConnection.getSourceNode() == this) { return false; } } AbstractSmooksGraphicalModel pgm = targetNode; while (pgm != null && pgm instanceof FreemarkerTemplateNodeGraphicalModel) { Object pd = ((FreemarkerTemplateNodeGraphicalModel) pgm).getData(); if (pd instanceof IFreemarkerTemplateModel) { IFreemarkerTemplateModel iFreemarkerTemplateModel = (IFreemarkerTemplateModel) pd; if (iFreemarkerTemplateModel.isManyOccurs() && pgm.getTargetConnections().isEmpty()) { Node modelNode = iFreemarkerTemplateModel.getModelNode(); if (modelNode instanceof Element) { return !ModelBuilder.getEnforceCollectionSubMappingRules((Element) modelNode); } else { return false; } } } pgm = pgm.getParent(); } } if (targetData instanceof TagPropertyObject) { // Only OK to link to an attribute from a valid Value node... return isValidValueNode(); } else if (targetData instanceof TagObject) { if (targetNode.isValidValueNode()) { return isValidValueNode(); } else if (targetNode.isValidCollectionNode()) { return isValidCollectionNode(); } } else if (targetData instanceof EObject) { if (SmooksUIUtils.getSelectorFeature((EObject) targetData) != null) { return true; } } return false; } }