package org.geogebra.desktop.export;
import java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import org.geogebra.common.awt.GGraphics2D;
import org.geogebra.common.euclidian.DrawableList;
import org.geogebra.common.euclidian.DrawableList.Link;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.util.StringUtil;
/**
* adds support for grouping objects in SVG files
*
* also now adds support for exporting size in cm from suggestion here
* http://forum.geogebra.org/viewtopic.php?f=8&t=38068
*
* and returning null from getTransform() (ie Identity matrix)
*
* needs this line changed in SVGGraphics2D.java (was private) protected
* PrintWriter os;
*
* @author Michael Borcherds
*/
public class SVGExtensions extends org.freehep.graphicsio.svg.SVGGraphics2D {
private double cmWidth;
private double cmHeight;
protected String title;
protected String desc;
public SVGExtensions(File file, Dimension size, double cmWidth,
double cmHeight) throws IOException {
super(file, size);
this.cmWidth = Kernel.checkDecimalFraction(cmWidth);
this.cmHeight = Kernel.checkDecimalFraction(cmHeight);
}
public void startGroup(String s) {
os.println("<g id=\"" + s + "\">");
}
public void endGroup(String s) {
os.println("</g><!-- " + s + " -->");
}
@Override
protected void writeSize(PrintWriter os) {
if (cmWidth > 0 && cmHeight > 0) {
// cm
os.println(" width=\"" + cmWidth + "cm\"");
os.println(" height=\"" + cmHeight + "cm\"");
} else {
super.writeSize(os);
}
}
public void setElementTitle(String title) {
this.title = title;
}
public String getElementTitle(String title) {
return this.title;
}
public void setElementDesc(String desc) {
this.desc = desc;
}
public String getElementDesc(String desc) {
return this.desc;
}
@Override
protected void appendElementTitleAndDescription(StringBuffer sb) {
if (title != null) {
sb.append("\n<title>");
sb.append(StringUtil.encodeXML(title));
sb.append("</title>");
}
if (desc != null) {
sb.append("\n<desc>");
sb.append(StringUtil.encodeXML(desc));
sb.append("</desc>\n");
}
}
/**
*
* Adapted from DrawableList (to handle SVG <title> and <desc>)
*
* @param list
* @param g2
*/
public final void drawAll(DrawableList list, GGraphics2D g2) {
Link cur = list.head;
while (cur != null) {
GeoElement geo = cur.d.getGeoElement();
// defined check needed in case the GeoList changed its size
if (geo.isDefined()) {
if (cur.d.needsUpdate()) {
cur.d.setNeedsUpdate(false);
cur.d.update();
}
if (geo.isGeoText()) {
setElementTitle(((GeoText) geo).getTextString());
} else {
setElementTitle(geo.getNameDescription());
}
if (geo.isIndependent()) {
// eg a:y = 4x + 3
// eg A =(3, 4)
setElementDesc(geo.getAlgebraDescriptionDefault());
} else {
setElementDesc(geo.getLongDescription());
}
cur.d.draw(g2);
}
cur = cur.next;
}
}
}