From fdda8be07f25a1c51bbf7163e1c8de60fab752d7 Mon Sep 17 00:00:00 2001 From: fotis Date: Mon, 7 Aug 2000 11:08:49 +0000 Subject: [PATCH] updates AWT viewer to new SVG support, implements a goto function for the user git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193608 13f79535-47bb-0310-9956-ffa450edef68 --- src/org/apache/fop/apps/AWTCommandLine.java | 16 +- .../apache/fop/render/awt/AWTRenderer.java | 613 ++++++++++++++++-- src/org/apache/fop/viewer/GoToPageDialog.java | 88 +++ src/org/apache/fop/viewer/IconToolBar.java | 6 +- .../apache/fop/viewer/LoadableProperties.java | 2 +- .../apache/fop/viewer/MessageException.java | 2 +- src/org/apache/fop/viewer/MessagesDialog.java | 2 +- src/org/apache/fop/viewer/PreviewDialog.java | 38 +- .../fop/viewer/PreviewDialogAboutBox.java | 7 +- .../apache/fop/viewer/ProgressListener.java | 7 +- .../fop/viewer/SecureResourceBundle.java | 2 +- src/org/apache/fop/viewer/Translator.java | 2 +- src/org/apache/fop/viewer/UserMessage.java | 6 +- .../apache/fop/viewer/resources/resources.de | 22 + .../apache/fop/viewer/resources/resources.ru | 20 + 15 files changed, 745 insertions(+), 88 deletions(-) create mode 100644 src/org/apache/fop/viewer/GoToPageDialog.java diff --git a/src/org/apache/fop/apps/AWTCommandLine.java b/src/org/apache/fop/apps/AWTCommandLine.java index de3c870e5..7a7236baa 100644 --- a/src/org/apache/fop/apps/AWTCommandLine.java +++ b/src/org/apache/fop/apps/AWTCommandLine.java @@ -2,9 +2,9 @@ package org.apache.fop.apps; /* originally contributed by - Juergen Verwohlt: Juergen.Verwohlt@jcatalog.com, - Rainer Steinkuhle: Rainer.Steinkuhle@jcatalog.com, - Stanislav Gorkhover: Stanislav.Gorkhover@jcatalog.com + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com */ import org.apache.fop.messaging.MessageHandler; import org.apache.fop.viewer.*; @@ -60,7 +60,6 @@ public class AWTCommandLine { UserMessage.setTranslator(getResourceBundle(TRANSLATION_PATH + "messages." + language)); resource.setMissingEmphasized(false); - AWTRenderer renderer = new AWTRenderer(resource); PreviewDialog frame = createPreviewDialog(renderer, resource); renderer.setProgressListener(frame); @@ -80,7 +79,7 @@ public class AWTCommandLine { parser.setFeature("http://xml.org/sax/features/namespace-prefixes", true); } catch (SAXException e) { MessageHandler.errorln("Error in setting up parser feature namespace-prefixes"); - MessageHandler.errorln("You need a parser which supports SAX version 2"); + MessageHandler.errorln("You need a parser which supports SAX version 2"); System.exit(1); } @@ -93,6 +92,8 @@ public class AWTCommandLine { driver.addElementMapping("org.apache.fop.fo.StandardElementMapping"); driver.addElementMapping("org.apache.fop.svg.SVGElementMapping"); + driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping"); + driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping"); // build FO tree: time frame.progress(resource.getString("Build FO tree") + " ..."); @@ -107,6 +108,7 @@ public class AWTCommandLine { driver.render(); frame.progress(resource.getString("Show")); + frame.showPage(); } catch (Exception e) { MessageHandler.errorln("FATAL ERROR: " + e.getMessage()); @@ -167,7 +169,6 @@ public class AWTCommandLine { * @return the InputSource created */ protected static InputSource fileInputSource(String filename) { - /* this code adapted from James Clark's in XT */ File file = new File(filename); String path = file.getAbsolutePath(); @@ -216,7 +217,7 @@ public class AWTCommandLine { if (args.length < 1 || args.length > 3) { MessageHandler.errorln("usage: java AWTCommandLine " + "formatting-object-file [language] "); - System.exit(1); + System.exit(1); } srcPath = args[0]; @@ -229,3 +230,4 @@ public class AWTCommandLine { } // main } // AWTCommandLine + diff --git a/src/org/apache/fop/render/awt/AWTRenderer.java b/src/org/apache/fop/render/awt/AWTRenderer.java index 3ee58664f..33ab073ef 100644 --- a/src/org/apache/fop/render/awt/AWTRenderer.java +++ b/src/org/apache/fop/render/awt/AWTRenderer.java @@ -4,9 +4,9 @@ package org.apache.fop.render.awt; /* originally contributed by - Juergen Verwohlt: Juergen.Verwohlt@af-software.de, - Rainer Steinkuhle: Rainer.Steinkuhle@af-software.de, - Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com */ import org.apache.fop.layout.*; @@ -28,6 +28,7 @@ import java.awt.image.*; import java.awt.geom.*; import java.awt.font.*; import java.util.*; +import java.net.URL; import java.io.*; import java.beans.*; import javax.swing.*; @@ -59,7 +60,7 @@ public class AWTRenderer implements Renderer, Printable, Pageable { */ private BufferedImage pageImage = null; private Graphics2D graphics = null; - + /** * The current (internal) font name */ @@ -92,6 +93,7 @@ public class AWTRenderer implements Renderer, Printable, Pageable { */ private int currentAreaContainerXPosition = 0; + static { JAVA_FONT_NAMES = new Hashtable(); JAVA_FONT_NAMES.put("Times", "serif"); @@ -115,7 +117,7 @@ public class AWTRenderer implements Renderer, Printable, Pageable { public void setScaleFactor(double newScaleFactor) { scaleFactor = newScaleFactor; - } + } public double getScaleFactor() { return scaleFactor; @@ -140,6 +142,7 @@ public class AWTRenderer implements Renderer, Printable, Pageable { protected void addLine(int x1, int y1, int x2, int y2, int th, float r, float g, float b) { graphics.setColor(new Color (r,g,b)); + // graphics.setColor(Color.red); graphics.drawLine((int)(x1/1000f), pageHeight - (int)(y1/1000f), (int)(x2/1000f), pageHeight - (int)(y2/1000f)); } @@ -159,8 +162,9 @@ public class AWTRenderer implements Renderer, Printable, Pageable { protected void addRect(int x, int y, int w, int h, float r, float g, float b) { graphics.setColor(new Color (r,g,b)); - graphics.fill3DRect((int) (x/1000f), pageHeight - (int) (y/1000f), - (int) (w/1000f), -(int) (h/1000f),false); + // graphics.setColor(Color.green); + graphics.drawRect((int) (x/1000f), pageHeight - (int) (y/1000f), + (int) (w/1000f), -(int) (h/1000f)); } /** @@ -186,11 +190,11 @@ public class AWTRenderer implements Renderer, Printable, Pageable { } /** - * Vor dem Druck einzustellen: + * To configure before print. * - * Seite/Seiten wählen - * Zoomfaktor - * Seitenformat / Quer- oder Hoch + * Choose pages + * Zoom factor + * Page format / Landscape or Portrait **/ public void transform(Graphics2D g2d, double zoomPercent, double angle) { AffineTransform at = g2d.getTransform(); @@ -225,27 +229,28 @@ public class AWTRenderer implements Renderer, Printable, Pageable { if (tree == null) { return 0; } - + return tree.getPages().size(); } public void render(int aPageNumber) { if (tree != null) { - try { + try { render(tree, aPageNumber); } catch (IOException e) { + e.printStackTrace(); // This exception can't occur because we are not dealing with // any files. } } } - + public void render(AreaTree areaTree, PrintWriter writer) throws IOException { tree = areaTree; - render(areaTree,0); + render(areaTree, 0); } - + public void render(AreaTree areaTree, int aPageNumber) throws IOException { tree = areaTree; @@ -254,13 +259,13 @@ public class AWTRenderer implements Renderer, Printable, Pageable { pageWidth = (int)((float)page.getWidth() / 1000f); pageHeight = (int)((float)page.getHeight() / 1000f); - + pageImage = new BufferedImage((int)((pageWidth * (int)scaleFactor)/100), (int)((pageHeight * (int)scaleFactor)/100), BufferedImage.TYPE_INT_RGB); graphics = pageImage.createGraphics(); - + transform(graphics, scaleFactor, 0); drawFrame(); @@ -286,6 +291,13 @@ public class AWTRenderer implements Renderer, Printable, Pageable { if (after != null) { renderAreaContainer(after); } + + // SG: Wollen wir Links abbilden? + /* + if (page.hasLinks()) { + .... + } + */ } public void renderAreaContainer(AreaContainer area) { @@ -320,7 +332,7 @@ public class AWTRenderer implements Renderer, Printable, Pageable { (org.apache.fop.layout.Box) e.nextElement(); b.render(this); } - + if (area.getPosition() != org.apache.fop.fo.properties.Position.STATIC) { this.currentYPosition = saveY; @@ -338,7 +350,7 @@ public class AWTRenderer implements Renderer, Printable, Pageable { if (area instanceof BlockArea) { rx += ((BlockArea)area).getStartIndent(); } - + h = area.getContentHeight(); int ry = this.currentYPosition; ColorType bg = area.getBackgroundColor(); @@ -461,9 +473,9 @@ public class AWTRenderer implements Renderer, Printable, Pageable { try { byte[] map = img.getBitmaps(); - + String path = img.getURL(); - + ImageIcon icon = new ImageIcon(path); Image imgage = icon.getImage(); @@ -584,54 +596,32 @@ public class AWTRenderer implements Renderer, Printable, Pageable { Color oldColor = graphics.getColor(); graphics.setColor(new Color(r, g, b)); - graphics.fillRect((int)(rx / 1000f), (int)(pageHeight - ry / 1000f), (int)(w / 1000f), (int)(th / 1000f)); graphics.setColor(oldColor); } - /** render a foreign object area */ - public void renderForeignObjectArea(ForeignObjectArea area) - { - // if necessary need to scale and align the content - area.getObject().render(this); - } - public void renderSVGArea(SVGArea area) { + int x = this.currentAreaContainerXPosition; int y = this.currentYPosition; int w = area.getContentWidth(); int h = area.getHeight(); + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Object o = e.nextElement(); + if(o instanceof GraphicImpl) { + renderElement(area, (GraphicImpl)o, x, y, null); + } + } + this.currentYPosition -= h; - -// Enumeration e = area.getChildren().elements(); -// while (e.hasMoreElements()) { -// Object o = e.nextElement(); -// if (o instanceof RectGraphic) { -// int rx = ((RectGraphic)o).x; -// int ry = ((RectGraphic)o).y; -// int rw = ((RectGraphic)o).width; -// int rh = ((RectGraphic)o).height; -// addRect(x+rx,y-ry,rw,-rh,0,0,0); -// } else if (o instanceof LineGraphic) { -// int x1 = ((LineGraphic)o).x1; -// int y1 = ((LineGraphic)o).y1; -// int x2 = ((LineGraphic)o).x2; -// int y2 = ((LineGraphic)o).y2; -// addLine(x+x1,y-y1,x+x2,y-y2,0,0,0,0); -// } else if (o instanceof TextGraphic) { -// int tx = ((TextGraphic)o).x; -// int ty = ((TextGraphic)o).y; -// String s = ((TextGraphic)o).s; -// currentStream.add("1 0 0 1 " -// + ((x+tx)/1000f) + " " -// + ((y-ty)/1000f) + " Tm " -// + "(" + s + ") Tj\n"); -// } -// } + } + protected String getJavaFontName(String aName) { if (aName == null) return null; @@ -697,6 +687,517 @@ public class AWTRenderer implements Renderer, Printable, Pageable { return new Color(ct.red(), ct.green(), ct.blue()); } + + + /** + * Draws an image. + * TODO: protect other image formats (JIMI) + */ + public void renderImage(String href, float x, float y, float width, float height, Vector transform) { + // What is with transformations? + try { + URL url = new URL(href); + ImageIcon imageIcon = new ImageIcon(url); + + AffineTransform fullTransform = new AffineTransform(); + AffineTransform aTransform; + + transform = (transform == null) ? new Vector() : transform; + for (int i = 0; i < transform.size(); i++) { + org.w3c.dom.svg.SVGTransform t = (org.w3c.dom.svg.SVGTransform)transform.elementAt(i); + SVGMatrix matrix = t.getMatrix(); + aTransform = new AffineTransform(matrix.getA(), matrix.getB(), matrix.getC(), + matrix.getD(), matrix.getE(), matrix.getF()); + fullTransform.concatenate(aTransform); + } + + BufferedImage bi = new BufferedImage((int) width, (int) height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bi.createGraphics(); + BufferedImageOp bop = new AffineTransformOp(fullTransform, + AffineTransformOp.TYPE_NEAREST_NEIGHBOR); + g2d.drawImage(imageIcon.getImage(), 0, 0, (int) width, (int) height, imageIcon.getImageObserver()); + graphics.drawImage(bi, bop, (int) x, (int) y); + } catch (Exception ex) { + MessageHandler.errorln("AWTRenderer: renderImage(): " + ex.getMessage()); + } + } + + + + public void renderElement(SVGArea svgarea, GraphicImpl area, int posx, int posy, + Vector parentTransforms) { + int x = posx; + int y = posy; + Hashtable style = area.oldgetStyle(); + DrawingInstruction di = createInstruction(area, style); + + Object o = null; + Vector v = area.oldgetTransform(); + v = (v == null) ? new Vector() : v; + Vector trans = new Vector(v); + parentTransforms = (parentTransforms == null) ? new Vector() : parentTransforms; + + if (parentTransforms != null) { + trans.addAll(0, parentTransforms); + } + + float red = (float) graphics.getColor().getRed(); + float green = (float) graphics.getColor().getGreen(); + float blue = (float) graphics.getColor().getBlue(); + Color c = null; + + ColorType ct = null; + try { + o = style.get("fill"); + if (o != null && o instanceof ColorType) { + ct = (ColorType) o; + c = new Color((int) (ct.red() * 255f), (int) (ct.green() * 255f), (int) (ct.blue() * 255f)); + } + o = style.get("stroke"); + if (c == null && o != null && o instanceof ColorType) { + ct = (ColorType) o; + c = new Color((int) (ct.red() * 255f), (int) (ct.green() * 255f), (int) (ct.blue() * 255f)); + } + } catch (Exception ex) { + MessageHandler.errorln("Can't set color: R G B : " + (int) (ct.red() * 255f) + " " + (int) (ct.green() * 255f) + " " + (int) (ct.blue() * 255f)); + c = Color.pink; + } + + if (c == null) { + c = new Color((int) red, (int) green, (int) blue); + } + Color oldColor = graphics.getColor(); + + if (area instanceof SVGLineElement) { + graphics.setColor(c); + SVGLineElementImpl lg = (SVGLineElementImpl) area; + + float x1 = lg.getX1().getBaseVal().getValue() * 1000 + posx; + float y1 = posy - lg.getY1().getBaseVal().getValue() * 1000 ; + float x2 = lg.getX2().getBaseVal().getValue() * 1000 + posx; + float y2 = posy - lg.getY2().getBaseVal().getValue() * 1000; + // TODO: + // The thickness of contour protect. + int th = 1; + o = style.get("stroke-width"); + if (o != null) + th = (int)((SVGLengthImpl)o).getValue(); + Line2D.Double aLine = new Line2D.Double(x1 / 1000f, pageHeight - y1 / 1000f, + x2 / 1000f, pageHeight - y2 / 1000f); + drawShape(transformShape(trans, aLine), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGRectElement) { + graphics.setColor(c); + SVGRectElement rg = (SVGRectElement)area; + float rectx = rg.getX().getBaseVal().getValue() * 1000 + posx; + float recty = posy - rg.getY().getBaseVal().getValue() * 1000; + float rx = rg.getRx().getBaseVal().getValue() * 1000; + float ry = rg.getRy().getBaseVal().getValue() * 1000; + float rw = rg.getWidth().getBaseVal().getValue() * 1000; + float rh = rg.getHeight().getBaseVal().getValue() * 1000; + + // TODO: + // rx and ry are roundings. + // RoundRectangle2D.Double + Rectangle aRectangle = new Rectangle(); + aRectangle.setRect(rectx / 1000d, pageHeight - recty / 1000d, rw / 1000d, rh / 1000d); + drawShape(transformShape(trans, aRectangle), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGCircleElement) { + graphics.setColor(c); + SVGCircleElement cg = (SVGCircleElement)area; + float cx = cg.getCx().getBaseVal().getValue() * 1000 + posx; + float cy = posy - cg.getCy().getBaseVal().getValue() * 1000; + float r = cg.getR().getBaseVal().getValue(); + Ellipse2D.Double anEllipse = new Ellipse2D.Double(cx / 1000d - r, + pageHeight - cy / 1000d - r, + r * 2d, r * 2d); + drawShape(transformShape(trans, anEllipse), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGEllipseElement) { + graphics.setColor(c); + SVGEllipseElement cg = (SVGEllipseElement)area; + float cx = cg.getCx().getBaseVal().getValue() * 1000 + posx; + float cy = posy - cg.getCy().getBaseVal().getValue() * 1000; + float rx = cg.getRx().getBaseVal().getValue(); + float ry = cg.getRy().getBaseVal().getValue(); + Ellipse2D.Double anEllipse = new Ellipse2D.Double(cx / 1000d - rx, + pageHeight - cy / 1000d - ry, + rx * 2d, ry * 2d); + drawShape(transformShape(trans, anEllipse), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGImageElementImpl) { + SVGImageElementImpl ig = (SVGImageElementImpl)area; + renderImage(ig.link, ig.x + posx / 1000f, pageHeight - (posy / 1000f - ig.y), ig.width, ig.height, trans); + } else if(area instanceof SVGUseElementImpl) { + SVGUseElementImpl ug = (SVGUseElementImpl)area; + String ref = ug.link; + ref = ref.substring(1, ref.length()); + GraphicImpl graph = null; + graph = area.locateDef(ref); + if(graph != null) { + // probably not the best way to do this, should be able + // to render without the style being set. + GraphicImpl parent = graph.getGraphicParent(); + graph.setParent(area); + // need to clip (if necessary) to the use area + // the style of the linked element is as if is was + // a direct descendant of the use element. + + renderElement(svgarea, graph, posx, posy, trans); + graph.setParent(parent); + } + } else if (area instanceof SVGPolylineElementImpl) { + graphics.setColor(c); + Vector points = ((SVGPolylineElementImpl)area).points; + PathPoint p = null; + Point2D.Double p1 = null; + Point2D.Double p2 = null; + if (points.size() > 0) { + p = (PathPoint) points.elementAt(0); + double xc = p.x * 1000f + posx; + double yc = posy - p.y * 1000f; + p1 = new Point2D.Double(xc / 1000f, pageHeight - yc / 1000f); + + int[] xarr = {(int) xc}; + int[] yarr = {(int) yc}; + graphics.drawPolyline(xarr, yarr, 1); + } + Line2D.Double aLine; + for (int i = 1; i< points.size(); i++) { + p = (PathPoint) points.elementAt(i); + p2 = new Point2D.Double(p.x + posx / 1000f, pageHeight - (posy - p.y * 1000f) / 1000f); + aLine = new Line2D.Double(p1, p2); + graphics.draw(transformShape(trans, aLine)); + p1 = p2; + } + graphics.setColor(oldColor); + } else if (area instanceof SVGPolygonElementImpl) { + graphics.setColor(c); + java.awt.Polygon aPolygon = convertPolygon(((SVGPolygonElementImpl)area), posx, posy); + drawShape(transformShape(trans, aPolygon), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGGElementImpl) { + renderGArea(svgarea, (SVGGElementImpl)area, x, y, parentTransforms); + } else if (area instanceof SVGPathElementImpl) { + graphics.setColor(c); + GeneralPath path = convertPath((SVGPathElementImpl) area, posx, posy); + drawShape(transformShape(trans, path), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGTextElementImpl) { + MessageHandler.errorln("SVGTextElementImpl is not implemented yet."); + // renderText(svgarea, (SVGTextElementImpl)area, 0, 0, di); + } else if (area instanceof SVGArea) { + // the x and y pos will be wrong! + Enumeration e = ((SVGArea)area).getChildren().elements(); + while (e.hasMoreElements()) { + Object el = e.nextElement(); + if(o instanceof GraphicImpl) { + renderElement((SVGArea)area, (GraphicImpl)el, x, y, parentTransforms); + } + } + } + + // should be done with some cleanup code, so only + // required values are reset. + } // renderElement + + + public void renderGArea(SVGArea svgarea, SVGGElementImpl area, int posx, int posy, Vector v) { + + + Vector trans = new Vector(area.oldgetTransform()); + trans.addAll(0, v); + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Object o = e.nextElement(); + if(o instanceof GraphicImpl) { + renderElement(svgarea, (GraphicImpl)o, posx, posy, trans); + } + } + } + public void renderGArea(SVGArea svgarea, SVGGElementImpl area, int posx, int posy) + { + renderGArea(svgarea, area, posx, posy, new Vector()); + } + + + /** + * Applies SVGTransform to the shape and gets the transformed shape. + * The type of the new shape may be different to the original type. + */ + public Shape transformShape(Vector trans, Shape shape) { + if (trans == null || trans.size() == 0) { + return shape; + } + + AffineTransform at; + for(int i = trans.size() - 1; i >= 0; i--) { + org.w3c.dom.svg.SVGTransform t = (org.w3c.dom.svg.SVGTransform)trans.elementAt(i); + SVGMatrix matrix = t.getMatrix(); + at = new AffineTransform(matrix.getA(), matrix.getB(), matrix.getC(), + matrix.getD(), matrix.getE(), matrix.getF()); + shape = at.createTransformedShape(shape); + } + return shape; + } + + + /** + * Mapps a SVG-Polygon to a AWT-Polygon. + */ + public java.awt.Polygon convertPolygon(SVGPolygonElementImpl svgpl, int x, int y) { + java.awt.Polygon aPolygon = new java.awt.Polygon(); + Vector points = svgpl.points; + + PathPoint p; + for (int i = 0; i < points.size(); i++) { + p = (PathPoint) points.elementAt(i); + aPolygon.addPoint((int) (x / 1000f + p.x), pageHeight - (int) (y / 1000f - p.y)); + } + + return aPolygon; + } + + // TODO: other attributes of DrawingInstruction protect too. + protected DrawingInstruction createInstruction(GraphicImpl area, Hashtable style) { + DrawingInstruction di = new DrawingInstruction(); + Object sp; + sp = style.get("fill"); + if(sp != null && !(sp instanceof String && sp.equals("none"))) { + di.fill = true; + } + // ... + return di; + } + + // Draws a shape. + // TODO: other attributes of DrawingInstruction protect too. + protected void drawShape(Shape s, DrawingInstruction di) { + if (di.fill) { + graphics.fill(s); + } else { + graphics.draw(s); + } + } + + /** + * Mapps a SVG-Path to a AWT-GeneralPath. + */ + public GeneralPath convertPath(SVGPathElementImpl svgpath, float x, float y) { + Vector points = svgpath.pathElements; + GeneralPath path = new GeneralPath(); + + float lastx = 0; + float lasty = 0; + SVGPathSegImpl pathmoveto = null; + + for(Enumeration e = points.elements(); e.hasMoreElements(); ) { + SVGPathSegImpl pc = (SVGPathSegImpl)e.nextElement(); + float[] vals = pc.getValues(); + float lastcx = 0; + float lastcy = 0; + switch(pc.getPathSegType()) { + case SVGPathSeg.PATHSEG_MOVETO_ABS: + lastx = vals[0]; + lasty = vals[1]; + pathmoveto = pc; + path.moveTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_MOVETO_REL: + if (pathmoveto == null) { + lastx = vals[0]; + lasty = vals[1]; + path.moveTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + pathmoveto = pc; + } else { + lastx += vals[0]; + lasty += vals[1]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + + } + break; + case SVGPathSeg.PATHSEG_LINETO_ABS: + lastx = vals[0]; + lasty = vals[1]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_REL: + lastx += vals[0]; + lasty += vals[1]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS: + lasty = vals[0]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL: + lasty += vals[0]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS: + lastx = vals[0]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL: + lastx += vals[0]; + path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: + lastx = vals[4]; + lasty = vals[5]; + lastcx = vals[2]; + lastcy = vals[3]; + path.curveTo(x / 1000f + vals[0], pageHeight - y / 1000f + vals[1], + x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, + x / 1000f + lastx, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: + path.curveTo(x / 1000f + vals[0] + lastx, pageHeight - y / 1000f + vals[1] + lasty, + x / 1000f + lastx + vals[2], pageHeight - y / 1000f + lasty + vals[3], + x / 1000f + lastx + vals[4], pageHeight - y / 1000f + lasty + vals[5]); + lastcx = vals[2] + lastx; + lastcy = vals[3] + lasty; + lastx += vals[4]; + lasty += vals[5]; + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + lastx = vals[2]; + lasty = vals[3]; + path.curveTo(x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, + x / 1000f + vals[0], pageHeight - y / 1000f + vals[1], + x / 1000f + lastx, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + path.curveTo(x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, + x / 1000f + lastx + vals[0], pageHeight - y / 1000f + lasty + vals[1], + x / 1000f + lastx + vals[2], pageHeight - y / 1000f + lasty + vals[3]); + lastx += vals[2]; + lasty += vals[3]; + break; + case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + lastx = vals[0]; + lasty = vals[1]; + lastcx = 0; + lastcy = 0; + path.quadTo(x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, + x / 1000f + lastx, pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + + path.quadTo(x / 1000f + lastcx , pageHeight - y / 1000f + lastcy, + x / 1000f + lastx + vals[0], pageHeight - y / 1000f + lasty + vals[1]); + + lastx += vals[0]; + lasty += vals[1]; + lastcx = 0; + lastcy = 0; + break; + case SVGPathSeg.PATHSEG_ARC_ABS: { + // Arc2D.Double arc = new Arc2D.Double(); + // arc.setAngles(current point, end point); .... + double rx = vals[0]; + double ry = vals[1]; + double theta = vals[2]; + boolean largearcflag = (vals[3] == 1.0); + boolean sweepflag = (vals[4] == 1.0); + + double cx = lastx; + double cy = lasty; + + path.curveTo(x / 1000f + lastx, pageHeight - y / 1000f + lasty, + x / 1000f + vals[0], pageHeight - y / 1000f + vals[1], + x / 1000f + vals[5], pageHeight - y / 1000f + vals[6]); + + lastcx = 0; //?? + lastcy = 0; //?? + lastx = vals[5]; + lasty = vals[6]; + } + break; + case SVGPathSeg.PATHSEG_ARC_REL: { + double rx = vals[0]; + double ry = vals[1]; + double theta = vals[2]; + boolean largearcflag = (vals[3] == 1.0); + boolean sweepflag = (vals[4] == 1.0); + + path.curveTo(x / 1000f + lastx, pageHeight - y / 1000f + lasty, + x / 1000f + (vals[0] + lastx), pageHeight - y / 1000f + (vals[1] + lasty), + x / 1000f + (vals[5] + lastx) , pageHeight - y / 1000f + (vals[6] + lasty)); + lastcx = 0; //?? + lastcy = 0; //?? + lastx += vals[5]; + lasty += vals[6]; + } + break; + case SVGPathSeg.PATHSEG_CLOSEPATH: + path.closePath(); + break; + + + } // switch + } // for points.elements() + + return path; + } // convertPath +/* + if(di == null) { + currentStream.add("S\n"); + } else { + if(di.fill) { + if(di.stroke) { + if(!di.nonzero) + currentStream.add("B*\n"); + else + currentStream.add("B\n"); + } else { + if(!di.nonzero) + currentStream.add("f*\n"); + else + currentStream.add("f\n"); + } + } else { +// if(di.stroke) + currentStream.add("S\n"); + } + } +*/ + + /* + * by pdfrenderer übernommen. + * + */ + class DrawingInstruction { + boolean stroke = false; + boolean nonzero = false; // non-zero fill rule "f*", "B*" operator + boolean fill = false; + int linecap = 0; // butt + int linejoin = 0; // miter + int miterwidth = 8; + } + + public void renderForeignObjectArea(ForeignObjectArea area) { + area.getObject().render(this); + } + } + diff --git a/src/org/apache/fop/viewer/GoToPageDialog.java b/src/org/apache/fop/viewer/GoToPageDialog.java new file mode 100644 index 000000000..c5b1f4198 --- /dev/null +++ b/src/org/apache/fop/viewer/GoToPageDialog.java @@ -0,0 +1,88 @@ +/* + originally contributed by + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com + */ + +package org.apache.fop.viewer; + +import java.awt.*; +import javax.swing.*; +import java.awt.event.*; + +import org.apache.fop.messaging.MessageHandler; + +public class GoToPageDialog extends JDialog { + JPanel panel1 = new JPanel(); + GridBagLayout gridBagLayout1 = new GridBagLayout(); + JLabel pgNbLabel = new JLabel(); + JTextField pgNbField = new JTextField(); + JButton okButton = new JButton(); + JButton cancelButton = new JButton(); + + int pageNumber = -1; + + public GoToPageDialog(Frame frame, String title, boolean modal) { + super(frame, title, modal); + try { + jbInit(); + pack(); + } + catch(Exception ex) { + MessageHandler.errorln("GoToPageDialog: Konstruktor: " + ex.getMessage()); + } + } + + public GoToPageDialog() { + this(null, "", false); + } + + void jbInit() throws Exception { + panel1.setLayout(gridBagLayout1); + pgNbLabel.setText("Page number"); + okButton.setText("Ok"); + okButton.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed(ActionEvent e) { + okButton_actionPerformed(e); + } + }); + cancelButton.setText("Cancel"); + cancelButton.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed(ActionEvent e) { + cancelButton_actionPerformed(e); + } + }); + panel1.setMinimumSize(new Dimension(250, 78)); + getContentPane().add(panel1); + panel1.add(pgNbLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 10, 5), 0, 0)); + panel1.add(pgNbField, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(10, 5, 10, 10), 0, 0)); + panel1.add(okButton, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 10, 5), 0, 0)); + panel1.add(cancelButton, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 10, 10), 0, 0)); + } + + void okButton_actionPerformed(ActionEvent e) { + try { + pageNumber = Integer.parseInt(pgNbField.getText()); + dispose(); + } catch (Exception ex) { + pgNbField.setText("???"); + } + + } + + void cancelButton_actionPerformed(ActionEvent e) { + pageNumber = -1; + dispose(); + } + + public int getPageNumber() { + return pageNumber; + } +} \ No newline at end of file diff --git a/src/org/apache/fop/viewer/IconToolBar.java b/src/org/apache/fop/viewer/IconToolBar.java index 7b5a09e11..8704aec91 100644 --- a/src/org/apache/fop/viewer/IconToolBar.java +++ b/src/org/apache/fop/viewer/IconToolBar.java @@ -2,9 +2,9 @@ package org.apache.fop.viewer; /* originally contributed by - Juergen Verwohlt: Juergen.Verwohlt@af-software.de, - Rainer Steinkuhle: Rainer.Steinkuhle@af-software.de, - Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com */ diff --git a/src/org/apache/fop/viewer/LoadableProperties.java b/src/org/apache/fop/viewer/LoadableProperties.java index 9de062037..95010f25b 100644 --- a/src/org/apache/fop/viewer/LoadableProperties.java +++ b/src/org/apache/fop/viewer/LoadableProperties.java @@ -13,7 +13,7 @@ import java.util.*; * Schlüsselwerte mit Leerzeichen zu. * * @version 02.12.99 - * @author Stanislav.Gorkhover@af-software.de + * @author Stanislav.Gorkhover@jCatalog.com * */ public class LoadableProperties extends Hashtable { diff --git a/src/org/apache/fop/viewer/MessageException.java b/src/org/apache/fop/viewer/MessageException.java index 6dd531fff..53da10fc3 100644 --- a/src/org/apache/fop/viewer/MessageException.java +++ b/src/org/apache/fop/viewer/MessageException.java @@ -9,7 +9,7 @@ import java.lang.Exception; * Aufrufer hochgereicht werden, bis schliesslich ein Aufrufer die * Meldung zur Anzeige bringt. * - * @author Juergen.Verwohlt@af-software.de + * @author Juergen.Verwohlt@jCatalog.com * @version 1.0 28.05.99 * */ diff --git a/src/org/apache/fop/viewer/MessagesDialog.java b/src/org/apache/fop/viewer/MessagesDialog.java index c8c518dab..33b763b0c 100644 --- a/src/org/apache/fop/viewer/MessagesDialog.java +++ b/src/org/apache/fop/viewer/MessagesDialog.java @@ -18,7 +18,7 @@ import org.apache.fop.apps.*; * eine Detailanzeige einzublenden, in der z.B. bei Fehlern der StackTrace ausgegeben * werden kann. * - * @author Juergen.Verwohlt@af-software.de + * @author Juergen.Verwohlt@jCatalog.com * @version 1.0 09.06.99 */ public class MessagesDialog extends JOptionPane { diff --git a/src/org/apache/fop/viewer/PreviewDialog.java b/src/org/apache/fop/viewer/PreviewDialog.java index 178083b9c..8aeb7325c 100644 --- a/src/org/apache/fop/viewer/PreviewDialog.java +++ b/src/org/apache/fop/viewer/PreviewDialog.java @@ -2,12 +2,11 @@ package org.apache.fop.viewer; /* originally contributed by - Juergen Verwohlt: Juergen.Verwohlt@af-software.de, - Rainer Steinkuhle: Rainer.Steinkuhle@af-software.de, - Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com */ - import java.awt.*; import java.awt.print.*; import java.awt.event.*; @@ -61,7 +60,7 @@ public class PreviewDialog extends JFrame implements ProgressListener { public PreviewDialog(AWTRenderer aRenderer, Translator aRes) { res = aRes; renderer = aRenderer; - + printAction = new Command(res.getString("Print"), "Print") { public void doit() {print();}}; firstPageAction = @@ -187,6 +186,8 @@ public class PreviewDialog extends JFrame implements ProgressListener { public void doit() {goToNextPage(null);}} ); menu.add(new Command(res.getString("Last page")) { public void doit() {goToLastPage(null);}} ); + menu.add(new Command(res.getString("Go to Page") + " ...") { + public void doit() {goToPage(null);}} ); menu.addSeparator(); subMenu = new JMenu(res.getString("Zoom")); subMenu.add(new Command("25%") { @@ -278,6 +279,24 @@ public class PreviewDialog extends JFrame implements ProgressListener { goToPage(currentPage); } + /** + * Shows a page by number. + */ + private void goToPage(ActionEvent e) { + + GoToPageDialog d = new GoToPageDialog(this, res.getString("Go to Page"), true); + d.setLocation((int) getLocation().getX() + 50, (int) getLocation().getY() + 50); + d.show(); + currentPage = d.getPageNumber(); + + if (currentPage < 1 || currentPage > pageCount) + return; + + currentPage--; + + goToPage(currentPage); + } + /** * Shows the first page. */ @@ -342,8 +361,11 @@ public class PreviewDialog extends JFrame implements ProgressListener { BufferedImage pageImage = null; Graphics graphics = null; + renderer.render(currentPage); pageImage = renderer.getLastRenderedPage(); + if (pageImage == null) + return; graphics = pageImage.getGraphics(); graphics.setColor(Color.black); graphics.drawRect(0, 0, pageImage.getWidth() - 1, @@ -352,11 +374,15 @@ public class PreviewDialog extends JFrame implements ProgressListener { previewImageLabel.setIcon(new ImageIcon(pageImage)); pageCount = renderer.getPageCount(); - + statisticsStatus.setText(res.getString("Page") + " " + (currentPage + 1) + " " + res.getString("of") + " " + pageCount); } + + public void dispose() { + System.exit(0); + } } // class PreviewDialog diff --git a/src/org/apache/fop/viewer/PreviewDialogAboutBox.java b/src/org/apache/fop/viewer/PreviewDialogAboutBox.java index 2d272203d..9aea565d6 100644 --- a/src/org/apache/fop/viewer/PreviewDialogAboutBox.java +++ b/src/org/apache/fop/viewer/PreviewDialogAboutBox.java @@ -3,13 +3,12 @@ package org.apache.fop.viewer; /* originally contributed by - Juergen Verwohlt: Juergen.Verwohlt@af-software.de, - Rainer Steinkuhle: Rainer.Steinkuhle@af-software.de, - Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com */ - import java.awt.*; import java.awt.event.*; import javax.swing.*; diff --git a/src/org/apache/fop/viewer/ProgressListener.java b/src/org/apache/fop/viewer/ProgressListener.java index 6f2c9ed9b..751838917 100644 --- a/src/org/apache/fop/viewer/ProgressListener.java +++ b/src/org/apache/fop/viewer/ProgressListener.java @@ -2,13 +2,12 @@ package org.apache.fop.viewer; /* originally contributed by - Juergen Verwohlt: Juergen.Verwohlt@af-software.de, - Rainer Steinkuhle: Rainer.Steinkuhle@af-software.de, - Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de + Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com, + Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com, + Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com */ - public interface ProgressListener { public void progress(int percentage); public void progress(String message); diff --git a/src/org/apache/fop/viewer/SecureResourceBundle.java b/src/org/apache/fop/viewer/SecureResourceBundle.java index 41c997183..3f68d6c16 100644 --- a/src/org/apache/fop/viewer/SecureResourceBundle.java +++ b/src/org/apache/fop/viewer/SecureResourceBundle.java @@ -11,7 +11,7 @@ import java.io.*; * Key key not found zurückgibt. * @see PropertyResourceBundle * - * @author Stanislav.Gorkhover@af-software.de + * @author Stanislav.Gorkhover@jCatalog.com * @version 1.0 18.03.1999 */ public class SecureResourceBundle extends ResourceBundle implements Translator { diff --git a/src/org/apache/fop/viewer/Translator.java b/src/org/apache/fop/viewer/Translator.java index e19e1f429..6c4da08f8 100644 --- a/src/org/apache/fop/viewer/Translator.java +++ b/src/org/apache/fop/viewer/Translator.java @@ -5,7 +5,7 @@ package org.apache.fop.viewer; * Definition für die Übersetzer-Klassen. * * @version 03.12.99 - * @author Stanislav.Gorkhover@af-software.de + * @author Stanislav.Gorkhover@jCatalog.com * */ public interface Translator { diff --git a/src/org/apache/fop/viewer/UserMessage.java b/src/org/apache/fop/viewer/UserMessage.java index 1cdda30d8..360cbb236 100644 --- a/src/org/apache/fop/viewer/UserMessage.java +++ b/src/org/apache/fop/viewer/UserMessage.java @@ -18,13 +18,13 @@ import javax.swing.JComponent.*; * @author S. Gorkhover * @version 18.03.1999 * - * @changed 23.04.99 Juergen.Verwohlt@af-software.de + * @changed 23.04.99 Juergen.Verwohlt@jCatalog.com * @subject Weitere Ausgabemethoden: show(String, String) und show(String,String,Frame) * - * @changed 28.05.99 Juergen.Verwohlt@af-software.de + * @changed 28.05.99 Juergen.Verwohlt@jCatalog.com * @subject MessageException unterstützen * - * @changed 09.06.99 Juergen.Verwohlt@af-software.de + * @changed 09.06.99 Juergen.Verwohlt@jCatalog.com * @subject Neue Klasse MessagesException zur Anzeige verwenden */ public class UserMessage { diff --git a/src/org/apache/fop/viewer/resources/resources.de b/src/org/apache/fop/viewer/resources/resources.de index 0a513ff8f..400a326ba 100644 --- a/src/org/apache/fop/viewer/resources/resources.de +++ b/src/org/apache/fop/viewer/resources/resources.de @@ -1,23 +1,45 @@ File=Datei + Exit=Beenden + View=Anzeige + Previous page=Vorherige Seite + Next page=Nächste Seite + Last page=Letzte Seite + Help=Hilfe + Default zoom=Standardzoom + Introduction=Einleitung + About=Über + Show=Anzeigen + Preview=Vorschau + First page=Erste Seite + Print=Drucken + Page=Seite + of=von + Init parser=Initializiere Parser + Init mappings=Initializiere Abbildung + Build FO tree=Baue FO-Baum + Layout FO tree=Formatiere FO-Baum + Render=Gebe aus + Close=Schließen +Go to Page=Gehe zur Seite diff --git a/src/org/apache/fop/viewer/resources/resources.ru b/src/org/apache/fop/viewer/resources/resources.ru index e443d4621..84309253e 100644 --- a/src/org/apache/fop/viewer/resources/resources.ru +++ b/src/org/apache/fop/viewer/resources/resources.ru @@ -1,18 +1,38 @@ File=Ôàéë + Exit=Çàêîí÷èòü + View=Âèä + First page=Ïåðâàÿ ñòðàíèöà + Previous page=Ïðåäûäóùàÿ ñòðàíèöà + Next page=Ñëåäóþùàÿ ñòðàíèöà + Last page=Ïîñëåäíÿÿ ñòðàíèöà + +Go to Page=Èäòè ê ñòðàíèöå + Help=Ïîìîùü + Default zoom=Ñòàíäàðòíûé ìàñøòàá + Introduction=Ââåäåíèå + About=Î ïðîãðàììå + Show=Ïîêàç + Preview=Ïðîñìîòð + Print=Ïå÷àòàòü + Page=Ñòðàíèöà + of=èç + Zoom=Ìàñøòàá + Close=Çàêðûòü + -- 2.39.5