/******************************************************************************* * 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.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.IFigure; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel; import org.jboss.tools.smooks.gef.tree.editparts.CreateConnectionCommand; import org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart; import org.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure; 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.FreemarkerTemplateConnection; 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.IFreemarkerTemplateModel; import org.jboss.tools.smooks.templating.template.Mapping; import org.jboss.tools.smooks.templating.template.TemplateBuilder; /** * @author Dart * */ public class FreemarkerXMLNodeEditPart extends TreeNodeEditPart { private Font hiddenLabelFont; private Font oldFont; private Color oldColor; @Override public void deactivate() { super.deactivate(); if (hiddenLabelFont != null) { hiddenLabelFont.dispose(); } } /** * @return the xslLabelFont */ public Font getHiddenLabelFont() { if (hiddenLabelFont == null) { IFigure figure = getFigure(); FontData fd = new FontData(); fd.setStyle(SWT.ITALIC); if (figure != null) { FontData[] fds = figure.getFont().getFontData(); if (fds != null && fds.length > 0) { fd.setHeight(fds[0].getHeight()); fd.setName(fds[0].getName()); fd.setLocale(fds[0].getLocale()); } } hiddenLabelFont = new Font(null, fd); } return hiddenLabelFont; } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#canDirectEdit * () */ @Override protected boolean canDirectEdit() { // TODO Auto-generated method stub return super.canDirectEdit(); } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#isDragLink() */ @Override protected boolean isDragLink() { // TODO Auto-generated method stub return super.isDragLink(); } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#refreshVisuals * () */ @Override protected void refreshVisuals() { AbstractSmooksGraphicalModel model = (AbstractSmooksGraphicalModel) getModel(); TreeNodeFigure figure = (TreeNodeFigure) getFigure(); Object data = model.getData(); if (oldFont != null && oldColor != null) { figure.getLabel().setFont(oldFont); figure.setNodeLabelForegroundColor(oldColor); } super.refreshVisuals(); if (data instanceof IFreemarkerTemplateModel ) { AbstractSmooksGraphicalModel pm = (AbstractSmooksGraphicalModel) model; while (pm != null && !(pm instanceof FreemarkerTemplateGraphicalModel)) { pm = pm.getParent(); } TemplateBuilder builder = ((FreemarkerTemplateGraphicalModel) pm).getTemplateBuilder(); if (((IFreemarkerTemplateModel) data).isHidden(builder)) { if (oldFont == null) { oldFont = figure.getLabel().getFont(); } if (oldColor == null) { oldColor = figure.getLabel().getForegroundColor(); } // figure.getLabel().setFont(getHiddenLabelFont()); figure.setNodeLabelForegroundColor(ColorConstants.lightGray); figure.getLabel().repaint(); } } } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#propertyChange * (java.beans.PropertyChangeEvent) */ @Override public void propertyChange(PropertyChangeEvent evt) { super.propertyChange(evt); String proName = evt.getPropertyName(); if (TreeNodeModel.PRO_ADD_SOURCE_CONNECTION.equals(proName) || TreeNodeModel.PRO_ADD_TARGET_CONNECTION.equals(proName) || TreeNodeModel.PRO_REMOVE_SOURCE_CONNECTION.equals(proName) || TreeNodeModel.PRO_REMOVE_TARGET_CONNECTION.equals(proName)) { AbstractSmooksGraphicalModel pm = (AbstractSmooksGraphicalModel) this.getModel(); while (pm != null && !(pm instanceof FreemarkerTemplateGraphicalModel)) { pm = pm.getParent(); } if (pm != null && pm instanceof FreemarkerTemplateGraphicalModel) { List<AbstractSmooksGraphicalModel> children = pm.getChildrenWithoutDynamic(); refreshAllChildren(children); } } } private void refreshAllChildren(List<AbstractSmooksGraphicalModel> children){ for (Iterator<?> iterator = children.iterator(); iterator.hasNext();) { AbstractSmooksGraphicalModel abstractSmooksGraphicalModel = (AbstractSmooksGraphicalModel) iterator .next(); abstractSmooksGraphicalModel.fireVisualChanged(); refreshAllChildren(abstractSmooksGraphicalModel.getChildrenWithoutDynamic()); } } public class CreateFreemarkerXMLConnectionCommand extends CreateConnectionCommand{ private List<TreeNodeConnection> relatedConnections = new ArrayList<TreeNodeConnection>(); 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(); } @Override public void execute() { super.execute(); Object target = getTempConnectionHandle().getTargetNode(); if (target instanceof FreemarkerTemplateNodeGraphicalModel) { FreemarkerTemplateConnection connection = (FreemarkerTemplateConnection)this.getTempConnectionHandle(); List<Mapping> removeMappings = connection.getRemoveMappings(); if(removeMappings!=null){ relatedConnections.clear(); relatedConnections.addAll(removeMappingConnections(removeMappings, (FreemarkerTemplateNodeGraphicalModel)target)); for (TreeNodeConnection con : relatedConnections) { con.disconnect(); } } } } @Override public void undo() { super.undo(); for (TreeNodeConnection c : relatedConnections) { c.connect(); } } } public CreateConnectionCommand createCreateConnectionCommand() { return new CreateFreemarkerXMLConnectionCommand(); } }