[PARTIAL] Implement basic keeps
[DONE]Incorporate Eric Schaeffer's fix to tables in static-content
[DONE] Incorporate Kelly Campell's fixes to GifJpegImage
+Incorporate Eric Schaeffer's further table fixes
+Incorporate Eric Schaeffer's background colour implementation
Other Bugs to fix:
colour not continued onto subsequent pages if coloured block goes over page
+Todo's and problems with AWT Previewer:
+
+- currently the layout process uses PDF fonts. This gives sometimes
+ trouble with java.awt.Font
+- we need some progress messages even if the process itself is fast
+- GIF format is supported by the viewer, but disabled in FOP. BMP is
+ not done, because there are no standard libraries.
+- more comments/english comments
+- print output using AWT
+- i18n for the user interface (yes, now we need this stuff)
+- toolbar images directory is not configurable
+- first preview is painted twice (flashing screen)
+- should "preview" be an option when calling FOP instead of having
+ it's own main method?
+
layout \
pdf \
render \
- svg
+ svg \
+ viewer
all: $(CLASSES) allsubs
--- /dev/null
+
+package org.apache.fop.apps;
+/*
+ originally contributed by
+ Juergen Verwohlt: Juergen.Verwohlt@af-software.de,
+ Rainer Steinkuhle: Rainer.Steinkuhle@af-software.de,
+ Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de
+ */
+
+
+import org.apache.fop.viewer.*;
+import org.apache.fop.render.awt.*;
+
+import javax.swing.UIManager;
+import java.awt.*;
+
+// SAX
+import org.xml.sax.Parser;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+
+// Java
+import java.io.FileReader;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.net.URL;
+
+
+
+
+/**
+ * initialize AWT previewer
+ */
+
+public class AWTCommandLine {
+
+
+ public AWTCommandLine(AWTRenderer aRenderer) {
+
+ PreviewDialog frame = new PreviewDialog(aRenderer);
+ frame.validate();
+
+ // center window
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ Dimension frameSize = frame.getSize();
+ if (frameSize.height > screenSize.height)
+ frameSize.height = screenSize.height;
+ if (frameSize.width > screenSize.width)
+ frameSize.width = screenSize.width;
+ frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
+ frame.setVisible(true);
+ }
+
+
+ static Parser createParser() {
+ String parserClassName =
+ System.getProperty("org.xml.sax.parser");
+ if (parserClassName == null) {
+ parserClassName = "com.jclark.xml.sax.Driver";
+ }
+ System.err.println("using SAX parser " + parserClassName);
+
+ try {
+ return (Parser)
+ Class.forName(parserClassName).newInstance();
+ } catch (ClassNotFoundException e) {
+ System.err.println("Could not find " + parserClassName);
+ } catch (InstantiationException e) {
+ System.err.println("Could not instantiate "
+ + parserClassName);
+ } catch (IllegalAccessException e) {
+ System.err.println("Could not access " + parserClassName);
+ } catch (ClassCastException e) {
+ System.err.println(parserClassName + " is not a SAX driver");
+ }
+ return null;
+ }
+
+ /**
+ * create an InputSource from a file name
+ *
+ * @param filename the name of the file
+ * @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();
+ String fSep = System.getProperty("file.separator");
+ if (fSep != null && fSep.length() == 1)
+ path = path.replace(fSep.charAt(0), '/');
+ if (path.length() > 0 && path.charAt(0) != '/')
+ path = '/' + path;
+ try {
+ return new InputSource(new URL("file", null,
+ path).toString());
+ }
+ catch (java.net.MalformedURLException e) {
+ throw new Error("unexpected MalformedURLException");
+ }
+ }
+
+
+
+ /* main
+ */
+ public static void main(String[] args) {
+ try {
+ UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ String srcPath = null;
+
+ System.err.println(Version.getVersion());
+ if (args.length == 1) {
+ srcPath = args[0];
+ }
+ else {
+ System.err.println("usage: java " +
+ "AWTCommandLine " +
+ "formatting-object-file");
+
+ System.exit(1);
+ }
+
+
+ AWTRenderer renderer = new AWTRenderer();
+ new AWTCommandLine(renderer);
+
+//init parser
+ Parser parser = createParser();
+
+ if (parser == null) {
+ System.err.println("ERROR: Unable to create SAX parser");
+ System.exit(1);
+ }
+
+ try {
+ Driver driver = new Driver();
+ driver.setRenderer(renderer);
+
+// init mappings: time
+ driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
+ driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+
+// build FO tree: time
+ driver.buildFOTree(parser, fileInputSource(srcPath));
+
+// layout FO tree: time
+ driver.format();
+
+// render: time
+ driver.render();
+
+ } catch (Exception e) {
+ System.err.println("FATAL ERROR: " + e.getMessage());
+ System.exit(1);
+ }
+
+ } // main
+} // AWTCommandLine
+
SUBDIRS=
-SOURCES=CommandLine.java \
+SOURCES=AWTCommandLine.java \
+ CommandLine.java \
Driver.java \
ErrorHandler.java \
FOPException.java \
BASEDIR:=../../../../..
include $(BASEDIR)/Makefile.rules
-SUBDIRS=pdf \
+SUBDIRS=awt \
+ pdf \
xml
SOURCES=Renderer.java
--- /dev/null
+
+
+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
+ */
+
+
+import org.apache.fop.layout.*;
+import org.apache.fop.image.*;
+import org.apache.fop.svg.*;
+import org.apache.fop.render.pdf.*;
+import org.apache.fop.viewer.*;
+
+
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.geom.*;
+import java.awt.font.*;
+import java.util.*;
+import java.io.*;
+import javax.swing.*;
+
+
+public class AWTRenderer implements org.apache.fop.render.Renderer {
+
+ protected int pageWidth = 0;
+ protected int pageHeight = 0;
+ protected double scaleFactor = 100.0;
+ protected int pageNumber = 0;
+
+ protected Hashtable fontNames = new Hashtable();
+ protected Hashtable fontStyles = new Hashtable();
+
+
+
+
+ protected Graphics2D graphics = null;
+
+ protected DocumentPanel documentPanel = null;
+
+
+ /** the current (internal) font name */
+ protected String currentFontName;
+
+ /** the current font size in millipoints */
+ protected int currentFontSize;
+
+ /** the current colour's red component */
+ protected float currentRed = 0;
+
+ /** the current colour's green component */
+ protected float currentGreen = 0;
+
+ /** the current colour's blue component */
+ protected float currentBlue = 0;
+
+ /** the current vertical position in millipoints from bottom */
+ protected int currentYPosition = 0;
+
+ /** the current horizontal position in millipoints from left */
+ protected int currentXPosition = 0;
+
+ /** the horizontal position of the current area container */
+ private int currentAreaContainerXPosition = 0;
+
+
+ public AWTRenderer() {
+ }
+
+ public void setGraphics(Graphics2D g) {
+ graphics = g;
+ if (graphics != null) {
+ graphics = g;
+ graphics.setColor(Color.red);
+ }
+ }
+
+ public int getPageNumber() {
+ return pageNumber;
+ }
+
+ public void setPageNumber(int aValue) {
+ pageNumber = aValue;
+ if (documentPanel == null)
+ return;
+ documentPanel.updateSize(pageNumber, scaleFactor / 100.0);
+ }
+
+ public void setScaleFactor(double newScaleFactor) {
+ scaleFactor = newScaleFactor;
+ if (documentPanel == null)
+ return;
+ documentPanel.updateSize(pageNumber, scaleFactor / 100.0);
+ }
+
+
+ public double getScaleFactor() {
+ return scaleFactor;
+ }
+
+
+ /**
+ * Vor dem Druck einzustellen:
+ *
+ * Seite/Seiten wählen
+ * Zoomfaktor
+ * Seitenformat / Quer- oder Hoch
+ **/
+ public void transform(Graphics2D g2d, double zoomPercent, double angle) {
+ AffineTransform at = g2d.getTransform();
+ at.rotate(angle);
+ at.scale(zoomPercent/100.0, zoomPercent/100.0);
+ g2d.setTransform(at);
+ }
+
+ protected void drawFrame() {
+
+ int width = pageWidth;
+ int height = pageHeight;
+
+ graphics.setColor(Color.white);
+ graphics.fillRect(0, 0, width, height);
+ graphics.setColor(Color.black);
+ graphics.drawRect(-1, -1, width+2, height+2);
+ graphics.drawLine(width+2, 0, width+2, height+2);
+ graphics.drawLine(width+3, 1, width+3, height+3);
+
+ graphics.drawLine(0, height+2, width+2, height+2);
+ graphics.drawLine(1, height+3, width+3, height+3);
+
+ }
+
+
+ public void render(AreaTree areaTree, PrintWriter writer) throws IOException {
+ documentPanel.setAreaTree(areaTree);
+ documentPanel.setPageCount(areaTree.getPages().size());
+ documentPanel.updateSize(pageNumber, scaleFactor/100.0);
+ render(areaTree, 0);
+ }
+
+ public void render(AreaTree areaTree, int aPageNumber) throws IOException {
+ Page page = (Page)areaTree.getPages().elementAt(aPageNumber);
+
+ pageWidth = (int)((float)page.getWidth() / 1000f);
+ pageHeight = (int)((float)page.getHeight() / 1000f);
+
+ transform(graphics, scaleFactor, 0);
+ drawFrame();
+
+ renderPage(page);
+ }
+
+ public void renderPage(Page page) {
+ AreaContainer body, before, after;
+
+ body = page.getBody();
+ before = page.getBefore();
+ after = page.getAfter();
+
+ this.currentFontName = "";
+ this.currentFontSize = 0;
+
+ renderAreaContainer(body);
+
+ if (before != null) {
+ renderAreaContainer(before);
+ }
+
+ if (after != null) {
+ renderAreaContainer(after);
+ }
+
+ }
+
+
+ public void renderAreaContainer(AreaContainer area) {
+
+
+ this.currentYPosition = area.getYPosition();
+ this.currentAreaContainerXPosition = area.getXPosition();
+
+ Enumeration e = area.getChildren().elements();
+ while (e.hasMoreElements()) {
+ org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
+ b.render(this);
+ }
+ }
+
+
+
+ protected Rectangle2D getBounds(org.apache.fop.layout.Area a) {
+ return new Rectangle2D.Double(currentAreaContainerXPosition,
+ currentYPosition,
+ a.getAllocationWidth(),
+ a.getHeight());
+ }
+
+ public void renderBlockArea(BlockArea area) {
+ int rx = this.currentAreaContainerXPosition
+ + area.getStartIndent();
+ int ry = this.currentYPosition;
+ int w = area.getContentWidth();
+ int h = area.getHeight();
+ Enumeration e = area.getChildren().elements();
+ while (e.hasMoreElements()) {
+ org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
+ b.render(this);
+ }
+ }
+
+
+ public void setupFontInfo(FontInfo fontInfo) {
+ FontSetup.setup(fontInfo);
+ Hashtable hash = fontInfo.getFonts();
+ org.apache.fop.render.pdf.Font f;
+ String name;
+ Object key;
+ int fontStyle;
+ for (Enumeration e = hash.keys(); e.hasMoreElements();) {
+ fontStyle = java.awt.Font.PLAIN;
+ key = e.nextElement();
+ f = (org.apache.fop.render.pdf.Font)hash.get(key);
+ name = f.fontName();
+
+ if (name.toUpperCase().indexOf("BOLD") > 0) {
+ fontStyle += java.awt.Font.BOLD;
+ }
+ if (name.toUpperCase().indexOf("ITALIC") > 0 ||
+ name.toUpperCase().indexOf("OBLIQUE") > 0) {
+ fontStyle += java.awt.Font.ITALIC;
+ }
+
+ int hyphenIndex = name.indexOf("-");
+
+ hyphenIndex = (hyphenIndex < 0) ? name.length() : hyphenIndex;
+ fontNames.put(key, name.substring(0, hyphenIndex));
+ fontStyles.put(key, new Integer(fontStyle));
+ }
+
+ }
+
+
+
+ public void renderDisplaySpace(DisplaySpace space) {
+ int d = space.getSize();
+ this.currentYPosition -= d;
+ }
+
+
+ public void renderImageArea(ImageArea area) {
+ int x = this.currentAreaContainerXPosition +
+ area.getXOffset();
+ int y = this.currentYPosition;
+ int w = area.getContentWidth();
+ int h = area.getHeight();
+
+
+ FopImage img = area.getImage();
+
+ if (img == null) {
+ System.out.println("area.getImage() is null");
+ }
+
+ int[] map = img.getimagemap();
+
+ String path = img.gethref();
+ // path = "c:/any.gif";
+
+ ImageIcon icon = new ImageIcon(path);
+
+ Image imgage = icon.getImage();
+
+ graphics.drawImage(imgage, currentXPosition / 1000,
+ pageHeight - y / 1000,
+ img.getWidth() / 1000,
+ img.getHeight() / 1000,
+ null);
+
+ currentYPosition -= h;
+
+
+ /* int xObjectNum = this.pdfDoc.addImage(img);
+
+ currentStream.add("ET\nq\n" + (img.getWidth()/1000f) + " 0 0 " +
+ (img.getHeight()/1000f) + " " +
+ ((x + img.getX())/1000f) + " " +
+ (((y - h) - img.getY())/1000f) + " cm\n" +
+ "/Im" + xObjectNum + " Do\nQ\nBT\n");
+ */
+ }
+
+
+
+
+ public void renderInlineArea(InlineArea area) {
+ char ch;
+ StringBuffer pdf = new StringBuffer();
+
+ String name = area.getFontState().getFontName();
+ int size = area.getFontState().getFontSize();
+
+ float red = area.getRed();
+ float green = area.getGreen();
+ float blue = area.getBlue();
+
+ if ((!name.equals(this.currentFontName))
+ || (size != this.currentFontSize)) {
+ this.currentFontName = name;
+ this.currentFontSize = size;
+ }
+
+ if ((red != this.currentRed)
+ || (green != this.currentGreen)
+ || (blue != this.currentBlue)) {
+ this.currentRed = red;
+ this.currentGreen = green;
+ this.currentBlue = blue;
+ }
+
+ int rx = this.currentXPosition;
+ int bl = this.currentYPosition;
+
+
+ String s = area.getText();
+ Color oldColor = graphics.getColor();
+ java.awt.Font oldFont = graphics.getFont();
+ java.awt.Font f = new java.awt.Font(fontNames.get(name).toString(),
+ ((Integer)fontStyles.get(name)).intValue(),
+ (int)(size / 1000f));
+
+
+ graphics.setColor(new Color(red, green, blue));
+
+ graphics.setFont(f);
+ graphics.drawString(s, rx / 1000f, (int)(pageHeight - bl / 1000f));
+ graphics.setFont(oldFont);
+ graphics.setColor(oldColor);
+
+
+ this.currentXPosition += area.getContentWidth();
+ }
+
+ public void renderInlineSpace(InlineSpace space) {
+ this.currentXPosition += space.getSize();
+ }
+
+
+ public void renderLineArea(LineArea area) {
+ int rx = this.currentAreaContainerXPosition
+ + area.getStartIndent();
+ int ry = this.currentYPosition;
+ int w = area.getContentWidth();
+ int h = area.getHeight();
+
+ this.currentYPosition -= area.getPlacementOffset();
+ this.currentXPosition = rx;
+
+ int bl = this.currentYPosition;
+
+ Enumeration e = area.getChildren().elements();
+ while (e.hasMoreElements()) {
+ org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
+ b.render(this);
+ }
+
+ this.currentYPosition = ry-h;
+ }
+
+ /**
+ * render rule area into PDF
+ *
+ * @param area area to render
+ */
+ public void renderRuleArea(RuleArea area) {
+ int rx = this.currentAreaContainerXPosition
+ + area.getStartIndent();
+ int ry = this.currentYPosition;
+ int w = area.getContentWidth();
+ int h = area.getHeight();
+ int th = area.getRuleThickness();
+ float r = area.getRed();
+ float g = area.getGreen();
+ float b = area.getBlue();
+
+
+ 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);
+
+
+
+ }
+
+
+ public void renderSVGArea(SVGArea area) {
+ int x = this.currentAreaContainerXPosition;
+ int y = this.currentYPosition;
+ int w = area.getContentWidth();
+ int h = area.getHeight();
+ 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");
+ }
+ } */
+ }
+
+
+ public void setProducer(String producer) {
+ // this.pdfDoc.setProducer(producer);
+ }
+
+
+ public void setComponent(DocumentPanel comp) {
+ documentPanel = comp;
+ }
+
+}
+
+
+
+
+
--- /dev/null
+
+
+BASEDIR:=../../../../../..
+include $(BASEDIR)/Makefile.rules
+
+SUBDIRS=
+
+SOURCES=AWTRenderer.java
+
+CLASSES=$(SOURCES:.java=.class)
+
+all: $(CLASSES) allsubs
+
+clean: cleanme cleansubs
+
+cleanme:
+ rm -f *.class
+
+$(TARGETS:%=%subs): %subs :
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && pwd && $(MAKE) $(MFLAGS) $*) || exit 1 ; \
+ done
+
--- /dev/null
+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
+ */
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.ImageIcon;
+import java.io.File;
+
+
+/**
+ * Klasse für UI-Kommandos. Die Kommandos können in das Menüsystem oder
+ * in eine Toolbar eingefügt werden.<br>
+ * <code>Commands</code> unterstützen mehrsprachigkeit.<br>
+ * Durch überschreiben der Methode <code>doit<code> kann die Klasse customisiert werden.
+ * Über die Methode <code>undoit</code> kann Undo-Funktionalität unterstützt werden.<br>
+ *
+ * @author Juergen.Verwohlt@af-software.de
+ * @version 1.0 18.03.99
+ */
+public class Command extends AbstractAction {
+
+ public static final String IMAGE_DIR = "../viewer/images/";
+
+ public Command(String name) {
+ this(name, (ImageIcon)null);
+ }
+
+ public Command(String name, ImageIcon anIcon) {
+ super(name, anIcon);
+ }
+
+
+ public Command(String name, ImageIcon anIcon, String path) {
+ this(name, anIcon);
+ File f = new File (IMAGE_DIR + path + ".gif");
+ if (!f.exists()) {
+ System.err.println("Icon not found: " + f.getAbsolutePath());
+ }
+
+ }
+
+ public Command(String name, String iconName) {
+ this(name, new ImageIcon(IMAGE_DIR + iconName + ".gif"), iconName);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ doit();
+ }
+
+ public void doit() {
+ System.err.println("Not implemented.");
+ }
+
+ public void undoit() {
+ System.err.println("Not implemented.");
+ }
+}
--- /dev/null
+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
+ */
+
+
+
+import java.awt.*;
+import javax.swing.*;
+
+
+import org.apache.fop.layout.*;
+import org.apache.fop.render.awt.*;
+
+
+ /**
+ * Diese Komponente stellt im Dialog das Dokument dar.
+ */
+public class DocumentPanel extends JComponent {
+ static final int V_BORDER = 80;
+ static final int H_BORDER = 70;
+
+ protected AWTRenderer renderer;
+ protected PreviewDialog previewDialog;
+ protected AreaTree areaTree;
+ protected int pageNumber = 0;
+
+ protected int docWidth;
+ protected int docHeight;
+ protected Color myColor = Color.lightGray;
+
+ public DocumentPanel(AWTRenderer aRenderer, PreviewDialog p) {
+ previewDialog = p;
+ renderer = aRenderer;
+ renderer.setComponent(this);
+ }
+
+ public void updateSize(int aPageNumber, double aFactor) {
+ if (areaTree == null)
+ return;
+
+ Page aPage = (Page)areaTree.getPages().elementAt(aPageNumber);
+ docWidth = aPage.getWidth() / 1000;
+ docHeight = aPage.getHeight() / 1000;
+ setSize((int)(aFactor * aPage.getWidth() / 1000.0 + 2*V_BORDER),
+ (int)(aFactor * aPage.getHeight()/ 1000.0 + 2*H_BORDER));
+ }
+
+ public void setAreaTree(AreaTree tree) {
+ areaTree = tree;
+ updateSize(pageNumber, 1.0);
+ getParent().getParent().doLayout();
+ }
+
+
+ public void paintComponent(Graphics g) {
+ Color ownColor = g.getColor();
+ g.setColor(myColor);
+ g.fillRect(0, 0, getWidth(), getHeight());
+ g.setColor(ownColor);
+ g.translate(V_BORDER, H_BORDER);
+
+ renderer.setGraphics((Graphics2D)g);
+ if (areaTree != null) {
+ try {
+ renderer.render(areaTree, pageNumber);
+ } catch(Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ g.translate(-V_BORDER, -H_BORDER);
+ }
+
+ public void setPageNumber(int number) {
+ pageNumber = number;
+ }
+
+ public Dimension getPreferredSize() {
+ return getSize();
+ }
+
+ public void setPageCount(int pageCount) {
+ previewDialog.setPageCount(pageCount);
+ }
+
+}
+
--- /dev/null
+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
+ */
+
+
+import javax.swing.*;
+import java.beans.PropertyChangeListener;
+
+public class IconToolBar extends JToolBar {
+
+ public JButton add(Action a) {
+ String name = (String) a.getValue(Action.NAME);
+ Icon icon = (Icon) a.getValue(Action.SMALL_ICON);
+ return add(a, name, icon);
+ }
+
+ public JButton add(Action a, String name, Icon icon) {
+ JButton b = new JButton(icon);
+ b.setToolTipText(name);
+ b.setEnabled(a.isEnabled());
+ b.addActionListener(a);
+ add(b);
+ PropertyChangeListener actionPropertyChangeListener =
+ createActionChangeListener(b);
+ a.addPropertyChangeListener(actionPropertyChangeListener);
+ return b;
+ }
+}
+
+
--- /dev/null
+
+
+BASEDIR:=../../../../..
+include $(BASEDIR)/Makefile.rules
+
+SUBDIRS=
+
+SOURCES=Command.java \
+ DocumentPanel.java \
+ IconToolBar.java \
+ PreviewDialog.java \
+ PreviewDialogAboutBox.java
+
+CLASSES=$(SOURCES:.java=.class)
+
+all: $(CLASSES) allsubs
+
+clean: cleanme cleansubs
+
+cleanme:
+ rm -f *.class
+
+$(TARGETS:%=%subs): %subs :
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && pwd && $(MAKE) $(MFLAGS) $*) || exit 1 ; \
+ done
+
--- /dev/null
+
+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
+ */
+
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import javax.swing.*;
+import java.beans.PropertyChangeListener;
+
+import org.apache.fop.layout.*;
+import org.apache.fop.render.awt.*;
+
+
+
+
+/**
+ * Frame and User Interface for Preview
+ */
+public class PreviewDialog extends JFrame {
+
+
+ protected int currentPage = 0;
+ protected int pageCount = 0;
+
+ protected AWTRenderer renderer;
+
+ protected IconToolBar toolBar = new IconToolBar();
+
+ protected Command printAction = new Command("Print", "Print");// { public void doit() {}}
+ protected Command firstPageAction = new Command("First page", "firstpg") { public void doit() {goToFirstPage(null);}};
+ protected Command previousPageAction = new Command("Previous page", "prevpg") { public void doit() {goToPreviousPage(null);}};
+ protected Command nextPageAction = new Command("Next page", "nextpg") { public void doit() {goToNextPage(null);}};
+ protected Command lastPageAction = new Command("Last page", "lastpg") { public void doit() {goToLastPage(null);}};
+
+ protected JLabel zoomLabel = new JLabel(); //{public float getAlignmentY() { return 0.0f; }};
+ protected JComboBox scale = new JComboBox() {public float getAlignmentY() { return 0.5f; }};
+
+ protected JScrollPane previewArea = new JScrollPane();
+ protected JLabel statusBar = new JLabel();
+ protected DocumentPanel docPanel;
+
+
+
+
+ public PreviewDialog(AWTRenderer aRenderer) {
+ renderer = aRenderer;
+
+
+ setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+ this.setSize(new Dimension(379, 476));
+ previewArea.setMinimumSize(new Dimension(50, 50));
+ statusBar.setText("");
+ statusBar.setBackground(new Color(0, 0, 231));
+ this.setTitle("FOP: AWT-Preview");
+
+ scale.addItem("25");
+ scale.addItem("50");
+ scale.addItem("75");
+ scale.addItem("100");
+ scale.addItem("150");
+ scale.addItem("200");
+
+ scale.setMaximumSize(new Dimension(80, 24));
+ scale.setPreferredSize(new Dimension(80, 24));
+
+ scale.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ scale_actionPerformed(e);
+ }
+ });
+
+ scale.setSelectedItem("100");
+ renderer.setScaleFactor(100.0);
+
+ zoomLabel.setText("Zoom");
+
+ this.setJMenuBar(setupMenue());
+
+ this.getContentPane().add(toolBar, BorderLayout.NORTH);
+ this.getContentPane().add(statusBar, BorderLayout.SOUTH);
+
+ toolBar.add(printAction);
+ toolBar.addSeparator();
+ toolBar.add(firstPageAction);
+ toolBar.add(previousPageAction);
+ toolBar.add(nextPageAction);
+ toolBar.add(lastPageAction);
+ toolBar.addSeparator();
+ toolBar.add(zoomLabel, null);
+ toolBar.addSeparator();
+ toolBar.add(scale, null);
+
+ this.getContentPane().add(previewArea, BorderLayout.CENTER);
+
+ docPanel = new DocumentPanel(renderer, this);
+
+
+ previewArea.setSize(docPanel.getSize());
+ previewArea.getViewport().add(docPanel);
+ statusBar.setText("FOTree --> AreaTree ...");
+
+ }
+
+
+ JMenuBar setupMenue() {
+ JMenuBar menuBar;
+ JMenuItem menuItem;
+ JMenu menu;
+ JMenu subMenu;
+
+ menuBar = new JMenuBar();
+ menu = new JMenu("File");
+ subMenu = new JMenu("OutputFormat");
+ subMenu.add(new Command("mHTML"));
+ subMenu.add(new Command("mPDF"));
+ subMenu.add(new Command("mRTF"));
+ subMenu.add(new Command("mTEXT"));
+ // menu.add(subMenu);
+ // menu.addSeparator();
+ menu.add(new Command("Print"));
+ menu.addSeparator();
+ menu.add(new Command("Exit") { public void doit() {dispose();}} );
+ menuBar.add(menu);
+ menu = new JMenu("View");
+ menu.add(new Command("First page") { public void doit() {goToFirstPage(null);}} );
+ menu.add(new Command("Previous page") { public void doit() {goToPreviousPage(null);}} );
+ menu.add(new Command("Next page") { public void doit() {goToNextPage(null);}} );
+ menu.add(new Command("Last page") { public void doit() {goToLastPage(null);}} );
+ menu.addSeparator();
+ subMenu = new JMenu("Zoom");
+ subMenu.add(new Command("25%") { public void doit() {setScale(25.0);}} );
+ subMenu.add(new Command("50%") { public void doit() {setScale(50.0);}} );
+ subMenu.add(new Command("75%") { public void doit() {setScale(75.0);}} );
+ subMenu.add(new Command("100%") { public void doit() {setScale(100.0);}} );
+ subMenu.add(new Command("150%") { public void doit() {setScale(150.0);}} );
+ subMenu.add(new Command("200%") { public void doit() {setScale(200.0);}} );
+ menu.add(subMenu);
+ menu.addSeparator();
+ menu.add(new Command("Default zoom") { public void doit() {setScale(100.0);}} );
+ menuBar.add(menu);
+ menu = new JMenu("Help");
+ menu.add(new Command("Index"));
+ menu.addSeparator();
+ menu.add(new Command("Introduction"));
+ menu.addSeparator();
+ menu.add(new Command("About"){ public void doit() {startHelpAbout(null);}} );
+ menuBar.add(menu);
+ return menuBar;
+ }
+
+
+ public void dispose() {
+ System.exit(0);
+ }
+
+
+ //Aktion Hilfe | Info durchgeführt
+
+ public void startHelpAbout(ActionEvent e) {
+ PreviewDialogAboutBox dlg = new PreviewDialogAboutBox(this);
+ Dimension dlgSize = dlg.getPreferredSize();
+ Dimension frmSize = getSize();
+ Point loc = getLocation();
+ dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
+ dlg.setModal(true);
+ dlg.show();
+ }
+
+ void goToPage(int number) {
+ docPanel.setPageNumber(number);
+ repaint();
+ previewArea.repaint();
+ statusBar.setText("Page " + (number + 1) + " of " + pageCount);
+ }
+
+ /**
+ * Shows the previous page.
+ */
+ void goToPreviousPage(ActionEvent e) {
+ if (currentPage <= 0)
+ return;
+ currentPage--;
+ goToPage(currentPage);
+ }
+
+
+ /**
+ * Shows the next page.
+ */
+ void goToNextPage(ActionEvent e) {
+ if (currentPage >= pageCount - 1)
+ return;
+ currentPage++;
+ goToPage(currentPage);
+ }
+
+ /**
+ * Shows the last page.
+ */
+ void goToLastPage(ActionEvent e) {
+
+ if (currentPage == pageCount - 1) return;
+ currentPage = pageCount - 1;
+
+ goToPage(currentPage);
+ }
+
+ /**
+ * Shows the first page.
+ */
+ void goToFirstPage(ActionEvent e) {
+ if (currentPage == 0)
+ return;
+ currentPage = 0;
+ goToPage(currentPage);
+ }
+
+ void print(ActionEvent e) {
+ Properties p = null;
+
+ Container parent = this.getRootPane();
+ while ( !( parent instanceof Frame )) parent = parent.getParent();
+ Frame f = (Frame)parent;
+
+ PrintJob pj = f.getToolkit().getPrintJob(f, getTitle(), p);
+ if(pj == null) return;
+ Graphics pg = pj.getGraphics();
+ if (pg != null) {
+ docPanel.paintAll(pg);
+ pg.dispose();
+ }
+ pj.end();
+ }
+
+ public void setScale(double scaleFactor) {
+
+ if (scaleFactor == 25.0)
+ scale.setSelectedIndex(0);
+ else if (scaleFactor == 50.0)
+ scale.setSelectedIndex(1);
+ else if (scaleFactor == 75.0)
+ scale.setSelectedIndex(2);
+ else if (scaleFactor == 100.0)
+ scale.setSelectedIndex(3);
+ else if (scaleFactor == 150.0)
+ scale.setSelectedIndex(4);
+ else if (scaleFactor == 200.0)
+ scale.setSelectedIndex(5);
+
+ renderer.setScaleFactor(scaleFactor);
+ previewArea.invalidate();
+ previewArea.repaint();
+ }
+
+ void scale_actionPerformed(ActionEvent e) {
+ setScale(new Double((String)scale.getSelectedItem()).doubleValue());
+ }
+
+
+ public void setPageCount(int aPageCount) {
+ pageCount = aPageCount;
+ statusBar.setText("Page 1 of " + pageCount);
+ }
+
+} // class PreviewDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null
+
+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
+ */
+
+
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.border.*;
+
+import org.apache.fop.apps.Version;
+
+
+
+public class PreviewDialogAboutBox extends Dialog implements ActionListener {
+
+ JPanel panel1 = new JPanel();
+ JPanel panel2 = new JPanel();
+ JPanel insetsPanel1 = new JPanel();
+ JPanel insetsPanel2 = new JPanel();
+ JPanel insetsPanel3 = new JPanel();
+ JButton button1 = new JButton();
+ JLabel imageControl1 = new JLabel();
+ ImageIcon imageIcon;
+ JLabel label1 = new JLabel();
+ JLabel label2 = new JLabel();
+ JLabel label3 = new JLabel();
+ JLabel label4 = new JLabel();
+ BorderLayout borderLayout1 = new BorderLayout();
+ BorderLayout borderLayout2 = new BorderLayout();
+ FlowLayout flowLayout1 = new FlowLayout();
+ FlowLayout flowLayout2 = new FlowLayout();
+ GridLayout gridLayout1 = new GridLayout();
+ String product = "FOP AWT-Preview";
+ String version = "Version: " + Version.getVersion();
+ String copyright = "See xml.apache.org";
+ String comments = "";//"Print Preview";
+
+ public PreviewDialogAboutBox(Frame parent) {
+ super(parent);
+ enableEvents(AWTEvent.WINDOW_EVENT_MASK);
+
+ //imageIcon = new ImageIcon(getClass().getResource("Hier der Grafikname"));
+ this.setTitle("Info");
+ setResizable(false);
+ panel1.setLayout(borderLayout1);
+ panel2.setLayout(borderLayout2);
+ insetsPanel1.setLayout(flowLayout1);
+ insetsPanel2.setLayout(flowLayout1);
+ insetsPanel2.setBorder(new EmptyBorder(10, 10, 10, 10));
+ gridLayout1.setRows(4);
+ gridLayout1.setColumns(1);
+ label1.setText(product);
+ label2.setText(version);
+ label3.setText(copyright);
+ label4.setText(comments);
+ insetsPanel3.setLayout(gridLayout1);
+ insetsPanel3.setBorder(new EmptyBorder(10, 60, 10, 10));
+ button1.setText("OK");
+ button1.addActionListener(this);
+ insetsPanel2.add(imageControl1, null);
+ panel2.add(insetsPanel2, BorderLayout.WEST);
+ this.add(panel1, null);
+ insetsPanel3.add(label1, null);
+ insetsPanel3.add(label2, null);
+ insetsPanel3.add(label3, null);
+ insetsPanel3.add(label4, null);
+ panel2.add(insetsPanel3, BorderLayout.CENTER);
+ insetsPanel1.add(button1, null);
+ panel1.add(insetsPanel1, BorderLayout.SOUTH);
+ panel1.add(panel2, BorderLayout.NORTH);
+ pack();
+ }
+
+ protected void processWindowEvent(WindowEvent e) {
+ if (e.getID() == WindowEvent.WINDOW_CLOSING) {
+ cancel();
+ }
+ super.processWindowEvent(e);
+ }
+
+ void cancel() {
+ dispose();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getSource() == button1) {
+ cancel();
+ }
+ }
+}
+