/******************************************************************************* * 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.editparts.freemarker; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.ConnectionEditPolicy; import org.eclipse.gef.requests.GroupRequest; import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator; import org.jboss.tools.smooks.configuration.editors.GraphicsConstants; import org.jboss.tools.smooks.configuration.editors.xml.TagObject; import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel; import org.jboss.tools.smooks.gef.tree.command.DeleteConnectionCommand; import org.jboss.tools.smooks.gef.tree.editparts.TreeNodeConnectionEditPart; import org.jboss.tools.smooks.gef.tree.editpolicy.TreeNodeEndpointEditPolicy; 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.FreemarkerModelAnalyzer; import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateNodeGraphicalModel; import org.jboss.tools.smooks.templating.template.Mapping; import org.jboss.tools.smooks.templating.template.TemplateBuilder; import org.jboss.tools.smooks.templating.template.result.RemoveResult; /** * @author Dart * */ public class FreemarkerTemplateConnectionEditPart extends TreeNodeConnectionEditPart { public FreemarkerTemplateConnectionEditPart() { super(); } @Override protected void createEditPolicies() { this.installEditPolicy(EditPolicy.CONNECTION_ROLE, new FreemarkerTemplateConnectionEditPolicy()); this.installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new TreeNodeEndpointEditPolicy()); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ @Override protected void refreshVisuals() { TreeNodeConnection connection = (TreeNodeConnection) this.getModel(); AbstractSmooksGraphicalModel target = connection.getTargetNode(); Object data = target.getData(); if (data instanceof TagObject) { if (FreemarkerModelAnalyzer.isChoiceElement(((TagObject) data) .getReferenceElement())) { this.setMarkerImage(SmooksConfigurationActivator.getDefault() .getImageRegistry() .get(GraphicsConstants.IMAGE_XSL_CHOICE)); } } super.refreshVisuals(); } public class FreemarkerTemplateConnectionEditPolicy extends ConnectionEditPolicy { @Override protected Command getDeleteCommand(GroupRequest request) { Object connection = getHost().getModel(); EditPart host = getHost(); if (connection != null && connection instanceof TreeNodeConnection) { if (host instanceof TreeNodeConnectionEditPart) { if (!((TreeNodeConnectionEditPart) host).isCanDelete()) { return null; } } DeleteFreeMarkerConnectionCommand command = new DeleteFreeMarkerConnectionCommand( (TreeNodeConnection) connection); return command; } return null; } } public class DeleteFreeMarkerConnectionCommand extends DeleteConnectionCommand { private List<TreeNodeConnection> relatedConnections = new ArrayList<TreeNodeConnection>(); public DeleteFreeMarkerConnectionCommand(TreeNodeConnection connection) { super(connection); } @Override public void execute() { Object target = connection.getTargetNode(); if (target instanceof FreemarkerTemplateNodeGraphicalModel) { RemoveResult removeResult; try { TemplateBuilder builder = ((FreemarkerTemplateNodeGraphicalModel) target) .getTemplateBuilder(); Object mapping = connection.getData(); if (builder == null || mapping == null) return; if (mapping instanceof Mapping) { relatedConnections.clear(); removeResult = builder.removeMapping((Mapping) mapping); relatedConnections.addAll(removeMappingConnections( removeResult.getRemoveMappings(), (FreemarkerTemplateNodeGraphicalModel) target)); } for (TreeNodeConnection con : relatedConnections) { con.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } super.execute(); } @Override public void redo() { super.redo(); } @Override public void undo() { super.undo(); for (TreeNodeConnection c : relatedConnections) { c.connect(); } } public List<TreeNodeConnection> removeMappingConnections( List<Mapping> removeMappings, AbstractSmooksGraphicalModel node) { if (removeMappings == null || removeMappings.isEmpty()) { return Collections.emptyList(); } // Remove from all the children first... for (AbstractSmooksGraphicalModel child : node.getChildren()) { if (child instanceof TreeNodeModel) { relatedConnections.addAll(removeMappingConnections( removeMappings, (TreeNodeModel) child)); } } // Now remove from this node... if (node.getTargetConnections() != null && !node.getTargetConnections().isEmpty()) { List<TreeNodeConnection> connectionsToRemove = new ArrayList<TreeNodeConnection>(); for (TreeNodeConnection connection : node .getTargetConnections()) { Object connectionData = connection.getData(); if (connectionData instanceof Mapping) { for (Mapping mapping : removeMappings) { if(mapping.getMappingNode() == ((Mapping)connectionData).getMappingNode() && mapping.getSrcPath().equals(((Mapping)connectionData).getSrcPath())){ connectionsToRemove.add(connection); } } } } return connectionsToRemove; } return Collections.emptyList(); } } }