/*
* Copyright 2012 Odysseus Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.odysseus.ithaka.digraph.io.graphml.yfiles;
import java.awt.Font;
import java.util.Iterator;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import de.odysseus.ithaka.digraph.io.graphml.GraphMLPropertyDomain;
import de.odysseus.ithaka.digraph.layout.DigraphLayoutArc;
import de.odysseus.ithaka.digraph.layout.DigraphLayoutPoint;
public class EdgeGraphicsProperty<V, E> extends AbstractGraphicsProperty<DigraphLayoutArc<V, E>> {
private final LabelResolver<? super E> labels;
public EdgeGraphicsProperty(LabelResolver<? super E> labels, Font font) {
super(GraphMLPropertyDomain.Edge, "edgegraphics", font);
this.labels = labels;
}
@Override
protected void writeDataContent(XMLStreamWriter writer, DigraphLayoutArc<V, E> edge) throws XMLStreamException {
// <y:PolyLineEdge>
writer.writeStartElement(getPrefix(), "PolyLineEdge", getNamespaceURI());
Iterator<DigraphLayoutPoint> bendPoints = edge.getBendPoints().iterator();
double sdx = edge.getSource().getPoint().x + edge.getSource().getDimension().w / 2.0;
double sdy = edge.getSource().getPoint().y + edge.getSource().getDimension().h / 2.0;
double tdx = edge.getTarget().getPoint().x + edge.getTarget().getDimension().w / 2.0;
double tdy = edge.getTarget().getPoint().y + edge.getTarget().getDimension().h / 2.0;
if (bendPoints.hasNext()) {
// <y:Path sx="0.0" sy="-15.0" tx="29.5" ty="0.0">
writer.writeStartElement(getPrefix(), "Path", getNamespaceURI());
writer.writeAttribute("sx", String.valueOf(edge.getStartPoint().x - sdx));
writer.writeAttribute("sy", String.valueOf(edge.getStartPoint().y - sdy));
writer.writeAttribute("tx", String.valueOf(edge.getEndPoint().x - tdx));
writer.writeAttribute("ty", String.valueOf(edge.getEndPoint().y - tdy));
do {
// <y:Point x="425.0" y="0.0"/>
DigraphLayoutPoint bendPoint = bendPoints.next();
writer.writeEmptyElement(getPrefix(), "Point", getNamespaceURI());
writer.writeAttribute("x", String.valueOf(bendPoint.x));
writer.writeAttribute("y", String.valueOf(bendPoint.y));
} while (bendPoints.hasNext());
// </y:Path>
writer.writeEndElement();
} else {
// <y:Path sx="0.0" sy="-15.0" tx="29.5" ty="0.0"/>
writer.writeEmptyElement(getPrefix(), "Path", getNamespaceURI());
writer.writeAttribute("sx", String.valueOf(edge.getStartPoint().x - sdx));
writer.writeAttribute("sy", String.valueOf(edge.getStartPoint().y - sdy));
writer.writeAttribute("tx", String.valueOf(edge.getEndPoint().x - tdx));
writer.writeAttribute("ty", String.valueOf(edge.getEndPoint().y - tdy));
}
// <y:LineStyle type="line" width="1.0" color="#000000"/>
writer.writeEmptyElement(getPrefix(), "LineStyle", getNamespaceURI());
writer.writeAttribute("type", "line");
writer.writeAttribute("width", "1");
writer.writeAttribute("color", "#333333");
// <y:Arrows source="none" target="standard"/>
writer.writeEmptyElement(getPrefix(), "Arrows", getNamespaceURI());
writer.writeAttribute("source", "none");
writer.writeAttribute("target", "standard");
// <y:EdgeLabel>Happy New Year!</y:EdgeLabel>
if (labels != null) {
String label = labels.getLabel(edge.getEdge());
if (label != null && label.trim().length() > 0) {
writer.writeStartElement(getPrefix(), "EdgeLabel", getNamespaceURI());
writeLabelFontAttributes(writer);
writer.writeCharacters(label);
writer.writeEndElement();
}
}
// <y:BendStyle smoothed="false"/>
writer.writeEmptyElement(getPrefix(), "BendStyle", getNamespaceURI());
writer.writeAttribute("smoothed", "false");
// </y:PolyLineEdge>
writer.writeEndElement();
}
}