Java tutorial
/* * 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; } }