blob: 436e3b3f560f875b3bf7c9bc31d667fc360d109e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.openmeetings.app.data.record;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.Iterator;
import java.util.List;
import javax.swing.JTextArea;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.openmeetings.app.OpenmeetingsVariables;
import org.openmeetings.app.data.basic.Configurationmanagement;
import org.openmeetings.utils.geom.ArrowStyle;
import org.openmeetings.utils.geom.GeomPoint;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class BatikMethods {
private static final Logger log = Red5LoggerFactory.getLogger(BatikMethods.class, OpenmeetingsVariables.webAppRootKey);
@Autowired
private Configurationmanagement cfgManagement;
public void paintTextByWidthHeight(SVGGraphics2D g2d, int x1, int y1, int width, int height,
String text, int style, int size, Color fontColor) throws Exception {
//String default_export_font = Configurationmanagement.getInstance().getConfKey(3,"default_export_font").getConf_value();
this.drawTextByJTextArea(g2d, x1, y1, width, height, text, "Verdana", style, size, fontColor);
}
public void _paintTextByWidthHeight(SVGGraphics2D g2d, int x1, int y1, int width, int height,
String text, int style, int size, Color fontColor) throws Exception {
String default_export_font = cfgManagement.getConfKey(3,"default_export_font").getConf_value();
this.drawTextByString(g2d, x1, y1, width, height, text, default_export_font, style, size, fontColor);
}
@SuppressWarnings("rawtypes")
public void drawPointsObject(Graphics2D g2d, List pointsList, Color lineColor, int size,
double xObj, double yObj, float alpha) throws Exception {
for (Iterator iter = pointsList.iterator();iter.hasNext();) {
List point = (List) iter.next();
// log.debug("POINT FROM TO :" +
// Double.valueOf(point.get(1).toString()).doubleValue()+","+
// Double.valueOf(point.get(2).toString()).doubleValue()+","+
// Double.valueOf(point.get(3).toString()).doubleValue()+","+
// Double.valueOf(point.get(4).toString()).doubleValue());
this.drawThickLine2DPaint(g2d, Double.valueOf(point.get(1).toString()).doubleValue(),
Double.valueOf(point.get(2).toString()).doubleValue(),
Double.valueOf(point.get(3).toString()).doubleValue(),
Double.valueOf(point.get(4).toString()).doubleValue(),
size, lineColor, xObj, yObj, alpha);
}
}
public void drawLine(Graphics2D g2d, Double x1, Double y1, Double x2, Double y2, Color lineColor, int size,
double xObj, double yObj, float alpha) throws Exception {
this.drawThickLine2D(g2d, x1, y1, x2, y2,
size, lineColor, xObj, yObj, alpha);
}
public void paintEllipse2D(Graphics2D g2d, double x, double y, double width, double height,
Color linecoler, int thickness, Color fillColor, float alpha) throws Exception {
g2d.setStroke(new BasicStroke(thickness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
int[] rules = new int[8];
//all possible Compositing Rules:
rules[0] = AlphaComposite.SRC_OVER;
rules[1] = AlphaComposite.DST_OVER;
rules[2] = AlphaComposite.CLEAR;
rules[3] = AlphaComposite.SRC;
rules[4] = AlphaComposite.SRC_IN;
rules[5] = AlphaComposite.DST_IN;
rules[6] = AlphaComposite.SRC_OUT;
rules[7] = AlphaComposite.DST_OUT;
g2d.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC,alpha));
//int x, int y, int width, int height
if (linecoler != null) {
g2d.setPaint(linecoler);
g2d.draw(new Ellipse2D.Double(x,y,width,height));
}
if (fillColor != null) {
g2d.setPaint(fillColor);
g2d.fill(new Ellipse2D.Double(x,y,width,height));
}
}
public void paintRect2D(Graphics2D g2d, double x, double y, double width, double height,
Color linecoler, int thickness, Color fillColor, float alpha) throws Exception {
g2d.setStroke(new BasicStroke(thickness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
int[] rules = new int[8];
//all possible Compositing Rules:
rules[0] = AlphaComposite.SRC_OVER;
rules[1] = AlphaComposite.DST_OVER;
rules[2] = AlphaComposite.CLEAR;
rules[3] = AlphaComposite.SRC;
rules[4] = AlphaComposite.SRC_IN;
rules[5] = AlphaComposite.DST_IN;
rules[6] = AlphaComposite.SRC_OUT;
rules[7] = AlphaComposite.DST_OUT;
g2d.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC,alpha));
//int x, int y, int width, int height
if (linecoler != null) {
g2d.setPaint(linecoler);
g2d.draw(new Rectangle2D.Double(x,y,width,height));
}
if (fillColor != null) {
g2d.setPaint(fillColor);
g2d.fill(new Rectangle2D.Double(x,y,width,height));
}
}
public void paintRect(Graphics2D g2d, int x, int y, int width, int height,
Color linecoler, int thickness, Color fillColor) throws Exception {
//int x, int y, int width, int height
//g2d.fill(new Rectangle(x,y,width,height));
g2d.setStroke(new BasicStroke(thickness));
if (linecoler != null) {
g2d.setPaint(linecoler);
g2d.drawRect(x, y, width, height);
}
if (fillColor != null) {
g2d.setPaint(fillColor);
g2d.fillRect(x, y, width, height);
}
}
public void paintLine(Graphics2D g2d, int x1, int y1, int x2, int y2, Color col) throws Exception {
g2d.setPaint(col);
g2d.drawLine(x1, y1, x2, y2);
}
public void drawThickLine2DPaint(Graphics2D g2d, double x1, double y1, double x2, double y2,
int width, Color c, double xObj, double yObj, float alpha) throws Exception {
g2d.setPaint(c);
int[] rules = new int[8];
//all possible Compositing Rules:
rules[0] = AlphaComposite.SRC_OVER;
rules[1] = AlphaComposite.DST_OVER;
rules[2] = AlphaComposite.CLEAR;
rules[3] = AlphaComposite.SRC;
rules[4] = AlphaComposite.SRC_IN;
rules[5] = AlphaComposite.DST_IN;
rules[6] = AlphaComposite.SRC_OUT;
rules[7] = AlphaComposite.DST_OUT;
g2d.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC,alpha));
g2d.setStroke(new BasicStroke(width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
Line2D line = new Line2D.Double(x1, y1, x2, y2);
g2d.draw(line);
}
public void drawThickLine2D(Graphics2D g2d, double x1, double y1, double x2, double y2,
int width, Color c, double xObj, double yObj, float alpha) throws Exception {
g2d.setPaint(c);
int[] rules = new int[8];
//all possible Compositing Rules:
rules[0] = AlphaComposite.SRC_OVER;
rules[1] = AlphaComposite.DST_OVER;
rules[2] = AlphaComposite.CLEAR;
rules[3] = AlphaComposite.SRC;
rules[4] = AlphaComposite.SRC_IN;
rules[5] = AlphaComposite.DST_IN;
rules[6] = AlphaComposite.SRC_OUT;
rules[7] = AlphaComposite.DST_OUT;
g2d.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC,alpha));
g2d.setStroke(new BasicStroke(width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
Line2D line = new Line2D.Double(x1+xObj, y1+yObj, x2+xObj, y2+yObj);
g2d.draw(line);
}
public void drawThickLine(Graphics2D g2d, int x1, int y1, int x2, int y2, int width, Color c) throws Exception {
g2d.setPaint(c);
g2d.setStroke(new BasicStroke(width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1, y1, x2, y2);
}
public void paintTextByWidthHeightAndDocument(SVGGraphics2D g2d, int x1, int y1, int width, int height,
String text, int style, int size, Color fontColor, Document document) throws Exception {
//String default_export_font = Configurationmanagement.getInstance().getConfKey(3,"default_export_font").getConf_value();
this.drawText(g2d, x1, y1, width, height, text, "Verdana", style, size, fontColor, document);
}
public void drawText(SVGGraphics2D g2d, int x, int y, int width, int height,
String text, String default_export_font, int style, int size, Color fontColor,
Document document) throws Exception {
// g2d.setClip(x, y, width, height);
// g2d.setColor(Color.black);
// g2d.drawString(text, x, y+20);
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
// Get the root element (the 'svg' element).
Element svgRoot = document.getDocumentElement();
log.debug("svgNS DEBUG: "+svgNS);
//Element textElement = g2d.getDOMFactory().createElementNS(svgNS,"text");
Element rectangle = document.createElementNS(svgNS, "rect");
rectangle.setAttributeNS(svgNS, "x", "10");
rectangle.setAttributeNS(svgNS, "y", "20");
rectangle.setAttributeNS(svgNS, "width", "100");
rectangle.setAttributeNS(svgNS, "height", "50");
rectangle.setAttributeNS(svgNS, "fill", "red");
// Attach the rectangle to the root 'svg' element.
svgRoot.appendChild(rectangle);
}
public void drawTextByString(SVGGraphics2D g2d, int x, int y, int width, int height,
String text, String default_export_font, int style, int size, Color fontColor) throws Exception {
//g2d.setClip(x, y, width, height);
g2d.setColor(Color.black);
g2d.drawString(text, x, y);
}
public void drawTextByJTextArea(Graphics2D g2d, int x, int y, int width, int height,
String text, String default_export_font, int style, int size, Color fontColor) throws Exception {
// g2d.setClip(x, y, width, height);
// g2d.setColor(Color.black);
// g2d.drawString(text, x, y+20);
//Font font = new Font("Verdana", Font.PLAIN, 11);
Font font = new Font(default_export_font, style, size);
String[] stringsText = text.split("\r");
//log.debug("TEXT: "+stringsText);
//log.debug("TEXT: "+stringsText.length);
String newText = "";
for (int i=0;i<stringsText.length;i++) {
newText += stringsText[i];
if (i+1<stringsText.length) {
newText += "\n";
}
}
JTextArea n = new JTextArea( newText );
n.setFont(font);
n.setWrapStyleWord( true );
n.setLineWrap( true );
n.setForeground( fontColor );
//log.debug("Text at: "+x+" "+y);
//int x, int y, int width, int height
n.setBounds( x, y , width, height );
n.setOpaque( false );
//Text
SVGGraphics2D svgGenerator2 = (SVGGraphics2D) g2d.create(x, y, width, height);
//svgGenerator2.create(x, y, width, height);
//svgGenerator2.draw(.dra)
n.paint( svgGenerator2 );
}
public void drawArrow(SVGGraphics2D g2d,
GeomPoint start, GeomPoint end, float thickness, float alpha,
Color linecoler, Color fillColor) {
if (start.equals(end)) return;
// (double edgeControlPosition, double edgeControlSize,
// double headLength, double headWidth, double shaftControlPosition,
// double shaftControlSize, float shaftPosition, double shaftThickness)
ArrowStyle arrowStyle = new ArrowStyle(0.5, 0.5, thickness*5,
thickness*5, 0.5, 0.5, 0, thickness);
GeomPoint fullVect = end.subtract(start);
double halfWidth = (arrowStyle.headWidth != -1) ? arrowStyle.headWidth/2 : arrowStyle.headLength/2;
//Figure out the line start/end points
GeomPoint startNorm = new GeomPoint();
startNorm.setLocation(fullVect.getY(),-fullVect.getX());
startNorm.normalize(arrowStyle.shaftThickness/2);
GeomPoint start1 = start.add(startNorm);
GeomPoint start2 = start.subtract(startNorm);
GeomPoint end1 = end.add(startNorm);
GeomPoint end2 = end.subtract(startNorm);
//log.debug("startNorm: "+startNorm.toString());
//log.debug("start1: "+start1.toString());
//log.debug("start2: "+start2.toString());
//log.debug("end1: "+end1.toString());
//log.debug("end2: "+end2.toString());
//figure out where the arrow head starts
GeomPoint headPnt = fullVect.clone();
//log.debug("headPnt 1: "+headPnt.toString());
//log.debug("headPnt.length 1: "+headPnt.length());
//log.debug("arrowStyle.headLength 1: "+arrowStyle.headLength);
headPnt.normalize(headPnt.length()-arrowStyle.headLength);
//log.debug("headPnt 2: "+headPnt.toString());
headPnt = headPnt.add(start);
//log.debug("headPnt 3: "+headPnt.toString());
//calculate the arrowhead corners
GeomPoint headPntNorm = startNorm.clone();
//log.debug("headPntNorm ^^: "+headPntNorm.toString());
//log.debug("halfWidth ^^: "+halfWidth);
headPntNorm.normalize(halfWidth);
//log.debug("headPntNorm: "+headPntNorm.toString());
GeomPoint edge1 = headPnt.add(headPntNorm);
GeomPoint edge2 = headPnt.subtract(headPntNorm);
//log.debug("edge1: "+edge1.toString());
//log.debug("edge2: "+edge2.toString());
//Figure out where the arrow connects the the shaft, then calc the intersections
GeomPoint shaftCenter = GeomPoint.interpolate(end,headPnt,arrowStyle.shaftPosition);
//log.debug("end"+end.toString());
//log.debug("headPnt: "+headPnt.toString());
//log.debug("arrowStyle.shaftPosition: "+arrowStyle.shaftPosition);
//log.debug("shaftCenter: "+shaftCenter);
//log.debug("edge1: "+edge1);
//shaftCenter.setLocation(185.857864376269, 185.857864376269);
GeomPoint inter1 = GeomPoint.getLineIntersection(start1,end1,shaftCenter,edge1);
GeomPoint inter2 = GeomPoint.getLineIntersection(start2,end2,shaftCenter,edge2);
//log.debug("inter1: "+inter1.toString());
//log.debug("inter2: "+inter2.toString());
//Figure out the control points
GeomPoint edgeCenter = GeomPoint.interpolate(end,headPnt,(float) arrowStyle.edgeControlPosition);
GeomPoint edgeNorm = startNorm.clone();
edgeNorm.normalize(halfWidth*arrowStyle.edgeControlSize);
//log.debug("halfWidth*arrowStyle.edgeControlSize: "+(halfWidth*arrowStyle.edgeControlSize));
//log.debug("edgeNorm: "+edgeNorm.toString());
GeomPoint edgeCntrl1 = edgeCenter.add(edgeNorm);
GeomPoint edgeCntrl2 = edgeCenter.subtract(edgeNorm);
//log.debug("edgeCntrl1: "+edgeCntrl1.toString());
//log.debug("edgeCntrl2: "+edgeCntrl2.toString());
g2d.setPaint(new Color(255,0,0));
// graphics.moveTo(start1.x,start1.y);
// graphics.lineTo(inter1.x,inter1.y);
// graphics.lineTo(edge1.x,edge1.y);
// graphics.curveTo(edgeCntrl1.x,edgeCntrl1.y,end.x,end.y);
// graphics.curveTo(edgeCntrl2.x,edgeCntrl2.y,edge2.x,edge2.y);
// graphics.lineTo(inter2.x,inter2.y);
// graphics.lineTo(start2.x,start2.y);
// graphics.lineTo(start1.x,start1.y);
// log.debug("moveTo"+start1.x+","+start1.y);
// log.debug("lineTo"+inter1.x+","+inter1.y);
// log.debug("lineTo"+edge1.x+","+edge1.y);
// log.debug("quadTo"+edgeCntrl1.x+","+edgeCntrl1.y+","+end.x+","+end.y);
// log.debug("quadTo"+edgeCntrl2.x+","+edgeCntrl2.y+","+edge2.x+","+edge2.y);
// log.debug("lineTo"+inter2.x+","+inter2.y);
// log.debug("lineTo"+start2.x+","+start2.y);
// log.debug("lineTo"+start1.x+","+start1.y);
GeneralPath graphics = new GeneralPath();
graphics.moveTo(start1.x,start1.y);
graphics.lineTo(inter1.x,inter1.y);
graphics.lineTo(edge1.x,edge1.y);
graphics.quadTo(edgeCntrl1.x,edgeCntrl1.y,end.x,end.y);
graphics.quadTo(edgeCntrl2.x,edgeCntrl2.y,edge2.x,edge2.y);
graphics.lineTo(inter2.x,inter2.y);
graphics.lineTo(start2.x,start2.y);
graphics.lineTo(start1.x,start1.y);
graphics.closePath();
int[] rules = new int[8];
//all possible Compositing Rules:
rules[0] = AlphaComposite.SRC_OVER;
rules[1] = AlphaComposite.DST_OVER;
rules[2] = AlphaComposite.CLEAR;
rules[3] = AlphaComposite.SRC;
rules[4] = AlphaComposite.SRC_IN;
rules[5] = AlphaComposite.DST_IN;
rules[6] = AlphaComposite.SRC_OUT;
rules[7] = AlphaComposite.DST_OUT;
g2d.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC,alpha));
g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
if (linecoler != null) {
g2d.setPaint(linecoler);
g2d.draw(graphics);
}
if (fillColor != null) {
g2d.setPaint(fillColor);
g2d.fill(graphics);
}
}
public String workAroundPixelErrorInSVG(String xmlDef) throws Exception {
String resultingString = "";
boolean byPassedFirst = false;
while (xmlDef.indexOf("font-size:") != -1) {
log.debug("xmlDef "+xmlDef);
int i = xmlDef.indexOf("font-size:");
log.debug("Found i "+i);
if (byPassedFirst) {
log.debug("byPassedFirst DO PROCESS ");
String start = xmlDef.substring(0, i+10);
xmlDef = xmlDef.substring(i+10, xmlDef.length());
log.debug("byPassedFirst FIRST PART Process "+start);
log.debug("byPassedFirst END PART Process "+xmlDef);
int firstSemicolon = xmlDef.indexOf(";");
log.debug("firstSemicolon "+firstSemicolon);
String fontSize = xmlDef.substring(0, firstSemicolon);
log.debug("fontSize "+fontSize);
xmlDef = xmlDef.substring(firstSemicolon, xmlDef.length());
resultingString += start + fontSize + "px";
} else {
log.debug("byPassedFirst DO NOT PROCESS ");
String start = xmlDef.substring(0, i+10);
log.debug("byPassedFirst FIRST PART "+start);
xmlDef = xmlDef.substring(i+10, xmlDef.length());
log.debug("byPassedFirst END PART "+xmlDef);
resultingString += start;
byPassedFirst = true;
}
}
resultingString += xmlDef;
log.debug("###################### ");
log.debug("resultingString "+resultingString);
return resultingString;
}
}