]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
changes (made by Stanislav Gorkhover):
authorfotis <fotis@unknown>
Tue, 25 Jan 2000 13:58:04 +0000 (13:58 +0000)
committerfotis <fotis@unknown>
Tue, 25 Jan 2000 13:58:04 +0000 (13:58 +0000)
- previewer is internationalized
- translations included
- support for printing

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193273 13f79535-47bb-0310-9956-ffa450edef68

22 files changed:
src/org/apache/fop/apps/AWTCommandLine.java
src/org/apache/fop/apps/CommandLine.java
src/org/apache/fop/render/awt/AWTRenderer.java
src/org/apache/fop/viewer/Command.java
src/org/apache/fop/viewer/DocumentPanel.java
src/org/apache/fop/viewer/LoadableProperties.java [new file with mode: 0644]
src/org/apache/fop/viewer/MessageException.java [new file with mode: 0644]
src/org/apache/fop/viewer/MessagesDialog.java [new file with mode: 0644]
src/org/apache/fop/viewer/PreviewDialog.java
src/org/apache/fop/viewer/ProgressListener.java [new file with mode: 0644]
src/org/apache/fop/viewer/SecureResourceBundle.java [new file with mode: 0644]
src/org/apache/fop/viewer/Translator.java [new file with mode: 0644]
src/org/apache/fop/viewer/UserMessage.java [new file with mode: 0644]
src/org/apache/fop/viewer/resources/messages.de [new file with mode: 0644]
src/org/apache/fop/viewer/resources/messages.en [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.de [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.en [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.fi [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.fr [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.it [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.pl [new file with mode: 0644]
src/org/apache/fop/viewer/resources/resources.ru [new file with mode: 0644]

index b99a0e35a4d3f24a46ec8b25ae519206cfa31cc0..372aa4adc53f4808006e183d10f87986bbef83b5 100644 (file)
@@ -29,8 +29,9 @@ import java.io.FileWriter;
 import java.io.PrintWriter;
 import java.io.IOException;
 import java.io.FileNotFoundException;
+import java.io.FileInputStream;
 import java.net.URL;
-
+import java.util.*;
 
 
 
@@ -41,34 +42,85 @@ import java.net.URL;
 public class AWTCommandLine {
 
 
-  public AWTCommandLine(AWTRenderer aRenderer) {
+  public static String DEFAULT_TRANSLATION_PATH
+                               = "../viewer/resources/resources." +
+                                 System.getProperty("user.language");
 
-    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);
+  private Translator resource;
+
+
+
+  public AWTCommandLine(String srcFile, String translationPath) {
+
+    resource = getResourceBundle(translationPath);
+
+    String messPath = new File(translationPath).getAbsoluteFile().getParent();
+    if (!messPath.endsWith(System.getProperty("file.separator")))
+      messPath += System.getProperty("file.separator");
+    messPath += "messages." + System.getProperty("user.language");
+    System.out.println("Set messages resource: " + messPath);
+    UserMessage.setTranslator(getResourceBundle(messPath));
+
+    resource.setMissingEmphasized(false);
+
+    if (!resource.isSourceFound())
+      UserMessage.show("TRANSLATION_SOURCE_NOT_FOUND",
+                       new File(translationPath).getAbsolutePath());
+
+    AWTRenderer renderer = new AWTRenderer(resource);
+    PreviewDialog frame = createPreviewDialog(renderer, resource);
+    renderer.setProgressListener(frame);
+
+
+//init parser
+    frame.progress(resource.getString("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
+        frame.progress(resource.getString("Init mappings") + " ...");
+
+           driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
+           driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+
+// build FO tree: time
+        frame.progress(resource.getString("Build FO tree") + " ...");
+           driver.buildFOTree(parser, fileInputSource(srcFile));
+
+// layout FO tree: time
+        frame.progress(resource.getString("Layout FO tree") + " ...");
+           driver.format();
+
+// render: time
+        frame.progress(resource.getString("Render") + " ...");
+        driver.render();
+        
+        frame.progress(resource.getString("Show"));
+
+       } catch (Exception e) {
+           System.err.println("FATAL ERROR: " + e.getMessage());
+        e.printStackTrace();
+           System.exit(1);
+       }
   }
 
- /**
-     * creates a SAX parser, using the value of org.xml.sax.parser
-     * defaulting to org.apache.xerces.parsers.SAXParser
-     *
-     * @return the created SAX parser
-     */
 
     static Parser createParser() {
        String parserClassName =
            System.getProperty("org.xml.sax.parser");
        if (parserClassName == null) {
-           parserClassName = "org.apache.xerces.parsers.SAXParser";
+           parserClassName = "com.jclark.xml.sax.Driver";
        }
        System.err.println("using SAX parser " + parserClassName);
 
@@ -88,6 +140,26 @@ public class AWTCommandLine {
        return null;
     }
 
+
+
+  protected PreviewDialog createPreviewDialog(AWTRenderer renderer, Translator res) {
+    PreviewDialog frame = new PreviewDialog(renderer, res);
+    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);
+    return frame;
+  }
+
+
+
   /**
    * create an InputSource from a file name
    *
@@ -114,6 +186,17 @@ public class AWTCommandLine {
   }
 
 
+  private SecureResourceBundle getResourceBundle(String path) {
+    FileInputStream in = null;
+    try {
+    in = new FileInputStream(path);
+    } catch(Exception ex) {
+      System.out.println("Abgefangene Exception: " + ex.getMessage());
+    }
+    return new SecureResourceBundle(in);
+  }
+
+
 
   /* main
    */
@@ -125,52 +208,34 @@ public class AWTCommandLine {
     }
 
     String srcPath = null;
+    String translationFile = null;
+    String imageDir = null;
 
     System.err.println(Version.getVersion());
-    if (args.length == 1) {
-      srcPath = args[0];
-    }
-    else {
-      System.err.println("usage: java " +
-                         "AWTCommandLine " +
-                         "formatting-object-file");
-
+    if (args.length < 1 || args.length > 3) {
+      System.err.println("usage: java AWTCommandLine " +
+                         "formatting-object-file [translation-file] " +
+                         "[image-dir]");
       System.exit(1);
     }
 
+    srcPath = args[0];
+    if (args.length > 1) {
+      translationFile = args[1];
+    }
+    if (args.length > 2) {
+      imageDir = args[2];
+      if (!imageDir.endsWith(System.getProperty("file.separator")))
+        imageDir += System.getProperty("file.separator");
+        
+      Command.IMAGE_DIR = imageDir;
+    }
 
-    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();
+    if (translationFile == null)
+      translationFile = DEFAULT_TRANSLATION_PATH;
 
-// render: time
-        driver.render();
 
-       } catch (Exception e) {
-           System.err.println("FATAL ERROR: " + e.getMessage());
-           System.exit(1);
-       }
+    new AWTCommandLine(srcPath, translationFile);
 
   }  // main
 }  // AWTCommandLine
index b6622bd7bf6af591ff3523e981cf83a3eabefaf9..82720499ffb89cfc9b2d50d9dab8e0b451872584 100644 (file)
@@ -69,7 +69,7 @@ import java.net.URL;
  * mainline class.
  *
  * Gets input and output filenames from the command line.
- * Creates a SAX Parser (defaulting to XP).
+ * Creates a SAX Parser (defaulting to Xerces).
  * 
  */
 public class CommandLine {
index 656b36679544efae8f47525b511c2d0b92081a61..110f05ea1969f3455fa5a721152757114789b3c6 100644 (file)
@@ -9,12 +9,16 @@ package org.apache.fop.render.awt;
   Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de
  */
 
+
 import org.apache.fop.layout.*;
+import org.apache.fop.datatypes.*;
 import org.apache.fop.image.*;
 import org.apache.fop.svg.*;
 import org.apache.fop.render.pdf.*;
 import org.apache.fop.viewer.*;
+import org.apache.fop.apps.*;
+
+
 
 
 import java.awt.*;
@@ -23,20 +27,28 @@ import java.awt.geom.*;
 import java.awt.font.*;
 import java.util.*;
 import java.io.*;
+import java.beans.*;
 import javax.swing.*;
+import java.awt.print.*;
 
 
-public class AWTRenderer implements org.apache.fop.render.Renderer {
+public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, Pageable {
 
   protected int pageWidth    = 0;
   protected int pageHeight   = 0;
   protected double scaleFactor = 100.0;
   protected int pageNumber = 0;
+  protected AreaTree tree;
+  protected ProgressListener progressListener = null;
+
+  protected Translator res = null;
 
   protected Hashtable fontNames = new Hashtable();
   protected Hashtable fontStyles = new Hashtable();
 
 
+  // Key - Font name, Value - java Font name.
+  protected static Hashtable JAVA_FONT_NAMES;
 
 
   protected Graphics2D graphics = null;
@@ -69,7 +81,21 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
   private int currentAreaContainerXPosition = 0;
 
 
-  public AWTRenderer() {
+  // String oldFontName = null;
+
+
+  static {
+    JAVA_FONT_NAMES = new Hashtable();
+    JAVA_FONT_NAMES.put("Times", "serif");
+    JAVA_FONT_NAMES.put("Times-Roman", "serif");
+    JAVA_FONT_NAMES.put("Courier", "monospaced");
+    JAVA_FONT_NAMES.put("Helvetica", "sansserif");
+    // JAVA_FONT_NAMES.put("Serif", "sansserif");
+  }
+
+
+  public AWTRenderer(Translator aRes) {
+    res = aRes;
   }
 
   public void setGraphics(Graphics2D g) {
@@ -137,13 +163,15 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
 
 
   public void render(AreaTree areaTree, PrintWriter writer) throws IOException {
+    tree = areaTree;
     documentPanel.setAreaTree(areaTree);
     documentPanel.setPageCount(areaTree.getPages().size());
+    documentPanel.setPageNumber(0);
     documentPanel.updateSize(pageNumber, scaleFactor/100.0);
-    render(areaTree, 0);
   }
 
   public void render(AreaTree areaTree, int aPageNumber) throws IOException {
+    tree = areaTree;
     Page page = (Page)areaTree.getPages().elementAt(aPageNumber);
 
     pageWidth  = (int)((float)page.getWidth() / 1000f);
@@ -206,6 +234,17 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
        int ry = this.currentYPosition;
        int w = area.getContentWidth();
        int h = area.getHeight();
+    ColorType bg = area.getBackgroundColor();
+       if ((bg != null) && (bg.alpha() == 0)) {
+      Color oldColor = graphics.getColor();
+      // Color bgColor = new Color(bg.red(), bg.green(), bg.blue());
+      Color bgColor = colorType2Color(bg);
+      graphics.setColor(bgColor);
+      graphics.fillRect((int)(rx / 1000f), (int)(pageHeight - ry/ 1000f),
+                        (int)(w / 1000f), (int)(h / 1000f));
+      graphics.setColor(oldColor);
+    }
+
        Enumeration e = area.getChildren().elements();
        while (e.hasMoreElements()) {
            org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
@@ -215,12 +254,13 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
 
 
   public void setupFontInfo(FontInfo fontInfo) {
-         FontSetup.setup(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();
@@ -271,7 +311,7 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
     String path = img.gethref();
     // path = "c:/any.gif";
 
-    ImageIcon icon = new ImageIcon(path); 
+    ImageIcon icon = new ImageIcon(path);
 
     Image imgage = icon.getImage();
 
@@ -282,22 +322,12 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
                        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) {
+  public void renderInlineArea(InlineArea area) {
        char ch;
        StringBuffer pdf = new StringBuffer();
 
@@ -329,16 +359,34 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
        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(),
+    String aFontName = fontNames.get(name).toString();
+
+    aFontName = getJavaFontName(aFontName);
+
+    java.awt.Font f = new java.awt.Font(aFontName,
                                         ((Integer)fontStyles.get(name)).intValue(),
                                         (int)(size / 1000f));
 
-
     graphics.setColor(new Color(red, green, blue));
 
+
+    /*
+    Die KLasse TextLayout nimmt für die Ausgabe eigenen Schriftsatz,
+    der i.R. breiter ist. Deshalb wird bis diese Tatsache sich geklärt/
+    geregelt hat weniger schöne Ausgabe über Graphics benutzt.
+    */
+
+    /*
+    FontRenderContext newContext = new FontRenderContext(null, true, false);
+    TextLayout layout = new TextLayout(s, f, newContext);
+    layout.draw(graphics, rx / 1000f, (int)(pageHeight - bl / 1000f));
+   */
+
     graphics.setFont(f);
     graphics.drawString(s, rx / 1000f, (int)(pageHeight - bl / 1000f));
     graphics.setFont(oldFont);
+
+
     graphics.setColor(oldColor);
 
 
@@ -396,8 +444,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
                       (int)(w / 1000f), (int)(th / 1000f));
     graphics.setColor(oldColor);
 
-
-
     }
 
 
@@ -436,8 +482,17 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
     }
 
 
+
+  protected String getJavaFontName(String aName) {
+    if (aName == null)
+      return null;
+
+    Object o = JAVA_FONT_NAMES.get(aName);
+
+    return (o == null) ? aName : o.toString();
+  }
+
   public void setProducer(String producer) {
-    // this.pdfDoc.setProducer(producer);
   }
 
 
@@ -445,6 +500,54 @@ public class AWTRenderer implements org.apache.fop.render.Renderer {
     documentPanel = comp;
   }
 
+  public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
+    if (pageIndex >= tree.getPages().size())
+      return NO_SUCH_PAGE;
+
+    Graphics2D oldGraphics = graphics;
+    int oldPageNumber = pageNumber;
+
+    graphics = (Graphics2D)g;
+    Page aPage = (Page)tree.getPages().elementAt(pageIndex);
+    renderPage(aPage);
+    graphics = oldGraphics;
+
+    return PAGE_EXISTS;
+  }
+
+  public int getNumberOfPages() {
+    return tree.getPages().size();
+  }
+
+  public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
+    if (pageIndex >= tree.getPages().size())
+      return null;
+
+    Page page = (Page)tree.getPages().elementAt(pageIndex);
+    PageFormat pageFormat = new PageFormat();
+    Paper paper = new Paper();
+    paper.setImageableArea(0, 0, page.getWidth() / 1000d, page.getHeight() / 1000d);
+    paper.setSize(page.getWidth() / 1000d, page.getHeight() / 1000d);
+    pageFormat.setPaper(paper);
+
+    return pageFormat;
+  }
+
+  public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
+    return this;
+  }
+
+
+  public void setProgressListener(ProgressListener l) {
+    progressListener = l;
+  }
+
+  public static Color colorType2Color(ColorType ct) {
+    if (ct == null)
+      return null;
+    return new Color(ct.red(), ct.green(), ct.blue());
+  }
+
 }
 
 
index 81e5826b2a4118c325575cdb81082b5754b0f175..aa63e7876ebd15cb09430d955521d19de3a59b1a 100644 (file)
@@ -24,7 +24,7 @@ import java.io.File;
  */
 public class Command extends AbstractAction {
 
-  public static final String IMAGE_DIR = "../viewer/images/";
+  public static String IMAGE_DIR = "../viewer/images/";
 
   public Command(String name) {
     this(name, (ImageIcon)null);
index 8255bc1da914e0f5aa127fb76388a3a73e0206b6..abdf75f2b043d54c0faa27371bb84732f7be65e2 100644 (file)
@@ -1,12 +1,5 @@
 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.*;
@@ -31,12 +24,14 @@ public class DocumentPanel extends JComponent {
 
   protected int docWidth;
   protected int docHeight;
-  protected Color myColor = Color.lightGray;
+  protected Color myColor;
+  protected int pageCount = 0;
 
   public DocumentPanel(AWTRenderer aRenderer, PreviewDialog p) {
     previewDialog = p;
     renderer = aRenderer;
     renderer.setComponent(this);
+    myColor = previewDialog.getBackground();
   }
 
   public void updateSize(int aPageNumber, double aFactor) {
@@ -46,6 +41,7 @@ public class DocumentPanel extends JComponent {
     Page aPage = (Page)areaTree.getPages().elementAt(aPageNumber);
     docWidth  = aPage.getWidth() / 1000;
     docHeight = aPage.getHeight() / 1000;
+    // Ruft paintComponent auf.
     setSize((int)(aFactor * aPage.getWidth() / 1000.0 + 2*V_BORDER),
             (int)(aFactor * aPage.getHeight()/ 1000.0 + 2*H_BORDER));
   }
@@ -83,7 +79,8 @@ public class DocumentPanel extends JComponent {
     return getSize();
   }
 
-  public void setPageCount(int pageCount) {
+  public void setPageCount(int aPageCount) {
+    pageCount = aPageCount;
     previewDialog.setPageCount(pageCount);
   }
 
diff --git a/src/org/apache/fop/viewer/LoadableProperties.java b/src/org/apache/fop/viewer/LoadableProperties.java
new file mode 100644 (file)
index 0000000..1a6e957
--- /dev/null
@@ -0,0 +1,79 @@
+package org.apache.fop.viewer;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Erweitert Hashtable um die Methode load.
+ * Die Zeilen der Textdatei, die mit # oder ! anfangen sind Kommentarzeilen.
+ * Eine gültige Zeile ist entweder eine Kommentarzeile oder eine Zeile mit dem
+ * Gleichheitszeichen "in der Mitte".
+ * Die Klasse LoadableProperties lässt im Gegensatz zu der Klasse Properties die
+ * Schlüsselwerte mit Leerzeichen zu.
+ *
+ * @version 02.12.99
+ * @author Stanislav.Gorkhover@af-software.de
+ *
+ */
+public class LoadableProperties extends Hashtable {
+
+  public LoadableProperties() {
+    super();
+  }
+
+
+  public void load(InputStream inStream) throws IOException {
+
+    BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "8859_1"));
+
+    String aKey;
+    String aValue;
+    int index;
+    String line = getNextLine(in);
+    while (line != null) {
+      line = line.trim();
+      if (isValid(line)) {
+        index = line.indexOf("=");
+        aKey = line.substring(0, index);
+        aValue = line.substring(index + 1);
+        put(aKey, aValue);
+      }
+      line = getNextLine(in);
+    }
+  }
+
+
+  private boolean isValid(String str) {
+    if (str == null)
+      return false;
+    if (str.length() > 0) {
+      if (str.startsWith("#") || str.startsWith("!")) {
+        return false;
+      }
+    }
+    else {
+      return false;
+    }
+
+    int index = str.indexOf("=");
+    if (index > 0 && str.length() > index) {
+      return true;
+    }
+    else {
+      System.out.println(getClass().getName() + ": load(): invalid line " +
+                         str + "." + " Character '=' missed.");
+      return false;
+    }
+  }
+
+  private String getNextLine(BufferedReader br) {
+    try {
+      return br.readLine();
+    } catch (Exception e) {
+      return null;
+    }
+
+  }
+
+
+}
diff --git a/src/org/apache/fop/viewer/MessageException.java b/src/org/apache/fop/viewer/MessageException.java
new file mode 100644 (file)
index 0000000..6dd531f
--- /dev/null
@@ -0,0 +1,68 @@
+package org.apache.fop.viewer;
+
+import java.lang.Exception;
+
+/**
+ * Die Klasse <code>MessageException</code> ist eine Exception, die
+ * mit einer Meldung und deren Parametern versehen werden kann.
+ * Dadurch kann die Meldung über den Exception-Mechanismus an die
+ * Aufrufer hochgereicht werden, bis schliesslich ein Aufrufer die
+ * Meldung zur Anzeige bringt.
+ *
+ * @author Juergen.Verwohlt@af-software.de
+ * @version 1.0 28.05.99
+ *
+ */
+public class MessageException extends Exception {
+
+  /** Angabe der auslösenden Exception, wie z.B. NullPointerException.
+    * Dieses Feld ist optional.
+    */
+  protected Exception exception;
+
+  /**
+   * ID der Meldung, die für diese Exception ausgegeben werden soll
+   */
+  protected String    messageId;
+
+  /**
+   * Parameterliste zur Meldung
+   */
+  protected String[]  parameterList;
+
+
+  // Konstruktoren
+
+  public MessageException() {
+    this("UNKNOWN_EXCEPTION");
+  }
+
+  public MessageException(String aMessageId) {
+    this(aMessageId, null);
+  }
+
+  public MessageException(String aMessageId, String[] aParameterList) {
+    this(aMessageId, aParameterList, null);
+  }
+
+  public MessageException(String aMessageId, String[] aParameterList, Exception anException) {
+    super(aMessageId);
+    messageId     = aMessageId;
+    parameterList = aParameterList;
+    exception     = anException;
+  }
+
+  // Zugriffsmethoden
+
+  public String getMessageId() {
+    return messageId;
+  }
+
+  public String[] getParameterList() {
+    return parameterList;
+  }
+
+  public Exception getException() {
+    return exception;
+  }
+}
diff --git a/src/org/apache/fop/viewer/MessagesDialog.java b/src/org/apache/fop/viewer/MessagesDialog.java
new file mode 100644 (file)
index 0000000..c8c518d
--- /dev/null
@@ -0,0 +1,230 @@
+package org.apache.fop.viewer;
+
+import javax.swing.*;
+
+import java.beans.*;
+import java.io.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.event.*;
+
+
+import org.apache.fop.apps.*;
+
+
+/**
+ * Die Klasse <code>MessagesDialog</code> dient der Anzeige von Meldungen.
+ * Die Klasse erweitert <code>JOptionPane</code> um die Möglichkeit, auf Knopfdruck
+ * eine Detailanzeige einzublenden, in der z.B. bei Fehlern der StackTrace ausgegeben
+ * werden kann.
+ *
+ * @author Juergen.Verwohlt@af-software.de
+ * @version 1.0 09.06.99
+ */
+public class MessagesDialog extends JOptionPane {
+
+  static Translator res;
+
+  public static void setTranslator(Translator aRes) {
+    res = aRes;
+    iniConstants();
+  }
+
+
+  static String DETAIL_OPTION;
+  static String YES_OPTION;
+  static String NO_OPTION;
+  static String CANCEL_OPTION;
+  static String OK_OPTION;
+
+  static String[] defaultDetailOption;
+  static String[] yesNoDetailOption;
+  static String[] yesNoCancelDetailOption;
+  static String[] okCancelDetailOption;
+
+  static String[] defaultOption;
+  static String[] yesNoOption;
+  static String[] yesNoCancelOption;
+  static String[] okCancelOption;
+
+
+
+  private static void iniConstants() {
+    DETAIL_OPTION = res.getString("Details");
+    YES_OPTION = res.getString("Yes");
+    NO_OPTION = res.getString("No");
+    CANCEL_OPTION = res.getString("Cancel");
+    OK_OPTION = res.getString("Ok");
+
+    defaultDetailOption     = new String[] { OK_OPTION, DETAIL_OPTION };
+    yesNoDetailOption       = new String[] { YES_OPTION, NO_OPTION, DETAIL_OPTION };
+    yesNoCancelDetailOption = new String[] { YES_OPTION, NO_OPTION, CANCEL_OPTION, DETAIL_OPTION };
+    okCancelDetailOption    = new String[] { OK_OPTION, CANCEL_OPTION, DETAIL_OPTION };
+
+    defaultOption     = new String[] { OK_OPTION };
+    yesNoOption       = new String[] { YES_OPTION, NO_OPTION };
+    yesNoCancelOption = new String[] { YES_OPTION, NO_OPTION, CANCEL_OPTION };
+    okCancelOption    = new String[] { OK_OPTION, CANCEL_OPTION };
+  }
+
+
+  protected String detailInformation = null;
+  protected JDialog dialog = null;
+  protected boolean showsDetails = false;
+
+//  MessagesDialog.showConfirmDialog(null,preparedMes,title,
+//                optionTypeIndex,messageTypeIndex);
+
+  public MessagesDialog(Object message, int messageType, int optionType,
+                     Icon icon, Object[] options, Object initialValue) {
+    super(message, messageType, optionType, icon, options, initialValue);
+    setMinimumSize(new Dimension(240, 96));
+  }
+
+  public static int showConfirmDialog(Component parentComponent, Object message,
+                                      String title, int optionType, int messageType) {
+    Object[] options;
+
+    switch (optionType) {
+      case JOptionPane.YES_NO_OPTION:
+        options = yesNoOption; break;
+      case JOptionPane.YES_NO_CANCEL_OPTION:
+        options = yesNoCancelOption; break;
+      case JOptionPane.OK_CANCEL_OPTION:
+        options = okCancelOption; break;
+      default:
+        options = defaultOption;
+    }
+
+    MessagesDialog pane = new MessagesDialog(message, messageType,
+                                       JOptionPane.DEFAULT_OPTION, null,
+                                       options, options[0]);
+
+    pane.setInitialValue(options[0]);
+
+    JDialog dialog = pane.createDialog(parentComponent, title);
+
+    pane.setDialog(dialog);
+    pane.selectInitialValue();
+
+    dialog.show();
+
+    Object selectedValue = pane.getValue();
+
+    if(selectedValue == null)
+      return CLOSED_OPTION;
+
+    if (selectedValue.equals(OK_OPTION))
+      return JOptionPane.OK_OPTION;
+    if (selectedValue.equals(CANCEL_OPTION))
+      return JOptionPane.CANCEL_OPTION;
+    if (selectedValue.equals(YES_OPTION))
+      return JOptionPane.YES_OPTION;
+    if (selectedValue.equals(NO_OPTION))
+      return JOptionPane.NO_OPTION;
+
+    return CLOSED_OPTION;
+  }
+
+  /**
+   * Öffnet ein Dialogfenster, bei dem zusätzlich zu den spez. Buttons noch ein
+   * 'Detail'-Button erscheint. Wird dieser Knopf vom Benutzer betätigt, erscheint
+   * die übergebene Detailinformation in einem scrollbaren Bereich des Dialogs.
+   */
+  public static int showDetailDialog(Component parentComponent, Object message, String title, int optionType,
+                                     int messageType, Icon icon, String newDetailInformation) {
+    Object[] options;
+
+    switch (optionType) {
+      case JOptionPane.YES_NO_OPTION:
+        options = yesNoDetailOption; break;
+      case JOptionPane.YES_NO_CANCEL_OPTION:
+        options = yesNoCancelDetailOption; break;
+      case JOptionPane.OK_CANCEL_OPTION:
+        options = okCancelDetailOption; break;
+      default:
+        options = defaultDetailOption;
+    }
+
+    MessagesDialog pane = new MessagesDialog(message, messageType,
+                                       JOptionPane.DEFAULT_OPTION, icon,
+                                       options, options[0]);
+
+    pane.setDetailInformation(newDetailInformation);
+    pane.setInitialValue(options[0]);
+
+    JDialog dialog = pane.createDialog(parentComponent, title);
+
+    pane.setDialog(dialog);
+    pane.selectInitialValue();
+
+    dialog.show();
+
+    Object selectedValue = pane.getValue();
+
+    if(selectedValue == null)
+      return CLOSED_OPTION;
+
+    if (((String)selectedValue).equals(DETAIL_OPTION))
+      return CLOSED_OPTION;
+
+    if (selectedValue.equals(OK_OPTION))
+      return JOptionPane.OK_OPTION;
+    if (selectedValue.equals(CANCEL_OPTION))
+      return JOptionPane.CANCEL_OPTION;
+    if (selectedValue.equals(YES_OPTION))
+      return JOptionPane.YES_OPTION;
+    if (selectedValue.equals(NO_OPTION))
+      return JOptionPane.NO_OPTION;
+
+    return CLOSED_OPTION;
+  }
+
+  /**
+   * Die Methode fügt in den übergebenen Dialog eine scrollbare Textkomponente ein,
+   * in der die Detailinformation angezeigt wird.
+   *
+   * @param JDialog dialog   Der Dialog, in den die Textkomponente eingefügt werden soll
+   */
+  protected void displayDetails(JDialog dialog) {
+    if (getDetailInformation() != null && dialog != null && showsDetails == false) {
+      showsDetails = true;
+      JScrollPane aScrollPane = new JScrollPane();
+      JTextArea aTextArea = new JTextArea();
+      StringWriter aStringWriter = new StringWriter();
+
+      aTextArea.setText(getDetailInformation());
+      aTextArea.setEditable(false);
+
+      aScrollPane.getViewport().add(aTextArea, null);
+      dialog.getContentPane().add(aScrollPane, BorderLayout.SOUTH);
+      aScrollPane.setPreferredSize(new Dimension(320, 240));
+      dialog.pack();
+    }
+  }
+
+  // Zugriff
+
+  public void setValue(Object aValue) {
+    if (aValue != null && DETAIL_OPTION.equals(aValue))
+      displayDetails(getDialog());
+    else
+      super.setValue(aValue);
+  }
+
+  public String getDetailInformation() {
+    return detailInformation;
+  }
+
+  public void setDetailInformation(String aValue) {
+    detailInformation = aValue;
+  }
+
+  public JDialog getDialog() {
+    return dialog;
+  }
+
+  public void setDialog(JDialog aValue) {
+    dialog = aValue;
+  }
+}
index f2dd658d2bad5a4818d5cf1f42b3580241958245..1757e5773f02548352e6e54362d3c538ab4c0bf6 100644 (file)
@@ -10,11 +10,13 @@ package org.apache.fop.viewer;
 
 
 import java.awt.*;
+import java.awt.print.*;
 import java.awt.event.*;
 import java.util.*;
 import javax.swing.*;
-import java.beans.PropertyChangeListener;
+import java.beans.*;
 
+import org.apache.fop.apps.AWTCommandLine;
 import org.apache.fop.layout.*;
 import org.apache.fop.render.awt.*;
 
@@ -24,8 +26,9 @@ import org.apache.fop.render.awt.*;
 /**
  * Frame and User Interface for Preview
  */
-public class PreviewDialog extends JFrame {
+public class PreviewDialog extends JFrame implements ProgressListener {
 
+  protected Translator res;
 
   protected int currentPage = 0;
   protected int pageCount = 0;
@@ -34,32 +37,47 @@ public class PreviewDialog extends JFrame {
 
   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 Command printAction;
+  protected Command firstPageAction;
+  protected Command previousPageAction;
+  protected Command nextPageAction;
+  protected Command lastPageAction;
+
+
+
+
 
   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 JLabel statusBar = new JLabel();
+  protected JPanel statusBar = new JPanel();
+  protected GridBagLayout statusBarLayout = new GridBagLayout();
+
+  protected JLabel statisticsStatus = new JLabel();
+  protected JLabel processStatus = new JLabel();
+  protected JLabel infoStatus = new JLabel();
   protected DocumentPanel docPanel;
 
 
 
 
-  public PreviewDialog(AWTRenderer aRenderer) {
+  public PreviewDialog(AWTRenderer aRenderer, Translator aRes) {
+    res = aRes;
     renderer = aRenderer;
 
+    printAction        = new Command(res.getString("Print"), "Print") { public void doit() {print();}};
+    firstPageAction    = new Command(res.getString("First page"),   "firstpg") { public void doit() {goToFirstPage(null);}};
+    previousPageAction = new Command(res.getString("Previous page"), "prevpg") { public void doit() {goToPreviousPage(null);}};
+    nextPageAction     = new Command(res.getString("Next page"),     "nextpg") { public void doit() {goToNextPage(null);}};
+    lastPageAction     = new Command(res.getString("Last page"),     "lastpg") { public void doit() {goToLastPage(null);}};
 
     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");
+
+    this.setTitle("FOP: AWT-" + res.getString("Preview"));
 
     scale.addItem("25");
     scale.addItem("50");
@@ -80,12 +98,11 @@ public class PreviewDialog extends JFrame {
     scale.setSelectedItem("100");
     renderer.setScaleFactor(100.0);
 
-    zoomLabel.setText("Zoom");
+    zoomLabel.setText(res.getString("Zoom"));
 
     this.setJMenuBar(setupMenue());
 
     this.getContentPane().add(toolBar, BorderLayout.NORTH);
-    this.getContentPane().add(statusBar, BorderLayout.SOUTH);
 
     toolBar.add(printAction);
     toolBar.addSeparator();
@@ -99,14 +116,33 @@ public class PreviewDialog extends JFrame {
     toolBar.add(scale, null);
 
     this.getContentPane().add(previewArea, BorderLayout.CENTER);
+    this.getContentPane().add(statusBar, BorderLayout.SOUTH);
 
-    docPanel = new DocumentPanel(renderer, this);
 
+    statisticsStatus.setBorder(BorderFactory.createEtchedBorder());
+    processStatus.setBorder(BorderFactory.createEtchedBorder());
+    infoStatus.setBorder(BorderFactory.createEtchedBorder());
+
+    statusBar.setLayout(statusBarLayout);
+
+    processStatus.setPreferredSize(new Dimension(200, 21));
+    statisticsStatus.setPreferredSize(new Dimension(100, 21));
+    infoStatus.setPreferredSize(new Dimension(100, 21));
+    processStatus.setMinimumSize(new Dimension(200, 21));
+    statisticsStatus.setMinimumSize(new Dimension(100, 21));
+    infoStatus.setMinimumSize(new Dimension(100, 21));
+    statusBar.add(processStatus, new GridBagConstraints(0, 0, 2, 1, 2.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 5), 0, 0));
+    statusBar.add(statisticsStatus, new GridBagConstraints(2, 0, 1, 2, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 5), 0, 0));
+    statusBar.add(infoStatus, new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+
+
+    docPanel = new DocumentPanel(renderer, this);
 
     previewArea.setSize(docPanel.getSize());
     previewArea.getViewport().add(docPanel);
-    statusBar.setText("FOTree --> AreaTree ...");
-
   }
 
 
@@ -117,7 +153,7 @@ public class PreviewDialog extends JFrame {
     JMenu     subMenu;
 
     menuBar = new JMenuBar();
-      menu = new JMenu("File");
+      menu = new JMenu(res.getString("File"));
         subMenu = new JMenu("OutputFormat");
           subMenu.add(new Command("mHTML"));
           subMenu.add(new Command("mPDF"));
@@ -125,17 +161,17 @@ public class PreviewDialog extends JFrame {
           subMenu.add(new Command("mTEXT"));
         // menu.add(subMenu);
         // menu.addSeparator();
-        menu.add(new Command("Print"));
+        menu.add(new Command(res.getString("Print")) {public void doit(){print();}});
         menu.addSeparator();
-        menu.add(new Command("Exit") { public void doit() {dispose();}} );
+        menu.add(new Command(res.getString("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 = new JMenu(res.getString("View"));
+        menu.add(new Command(res.getString("First page")) { public void doit() {goToFirstPage(null);}} );
+        menu.add(new Command(res.getString("Previous page")) { public void doit() {goToPreviousPage(null);}} );
+        menu.add(new Command(res.getString("Next page")) { public void doit() {goToNextPage(null);}} );
+        menu.add(new Command(res.getString("Last page")) { public void doit() {goToLastPage(null);}} );
         menu.addSeparator();
-        subMenu = new JMenu("Zoom");
+        subMenu = new JMenu(res.getString("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);}} );
@@ -144,24 +180,22 @@ public class PreviewDialog extends JFrame {
           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);}} );
+        menu.add(new Command(res.getString("Default zoom")) { public void doit() {setScale(100.0);}} );
       menuBar.add(menu);
-      menu = new JMenu("Help");
-        menu.add(new Command("Index"));
+      menu = new JMenu(res.getString("Help"));
+        menu.add(new Command(res.getString("Index")));
         menu.addSeparator();
-        menu.add(new Command("Introduction"));
+        menu.add(new Command(res.getString("Introduction")));
         menu.addSeparator();
-        menu.add(new Command("About"){ public void doit() {startHelpAbout(null);}} );
+        menu.add(new Command(res.getString("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) {
@@ -178,7 +212,8 @@ public class PreviewDialog extends JFrame {
     docPanel.setPageNumber(number);
     repaint();
     previewArea.repaint();
-    statusBar.setText("Page " + (number + 1) + " of " + pageCount);
+    statisticsStatus.setText(res.getString("Page") + " " + (currentPage + 1) + " " + res.getString("of") + " " +
+                             pageCount);
   }
 
   /**
@@ -223,21 +258,20 @@ public class PreviewDialog extends JFrame {
     goToPage(currentPage);
   }
 
-  void print(ActionEvent e) {
-    Properties p = null;
+  void print() {
 
-    Container parent = this.getRootPane();
-    while ( !( parent instanceof Frame )) parent = parent.getParent();
-    Frame f = (Frame)parent;
+    PrinterJob pj = PrinterJob.getPrinterJob();
+    // Nicht nötig, Pageable get a Printable.
+    // pj.setPrintable(renderer);
+    pj.setPageable(renderer);
 
-    PrintJob pj = f.getToolkit().getPrintJob(f, getTitle(), p);
-    if(pj == null) return;
-    Graphics pg = pj.getGraphics();
-    if (pg != null) {
-      docPanel.paintAll(pg);
-      pg.dispose();
+    if (pj.printDialog()) {
+      try {
+        pj.print();
+      } catch(PrinterException pe) {
+        pe.printStackTrace();
+      }
     }
-    pj.end();
   }
 
   public void setScale(double scaleFactor) {
@@ -267,26 +301,24 @@ public class PreviewDialog extends JFrame {
 
   public void setPageCount(int aPageCount) {
     pageCount = aPageCount;
-    statusBar.setText("Page 1 of " + pageCount);
+    statisticsStatus.setText(res.getString("Page") + " " + (currentPage + 1) +
+                             " " + res.getString("of") + " " + pageCount);
   }
 
-}  // class PreviewDialog
-
-
-
-
-
-
-
-
-
-
-
-
 
+  public void progress(int percentage) {
+    processStatus.setText(percentage + "%");
+  }
 
+  public void progress(int percentage, String message) {
+    processStatus.setText(message + " " + percentage + "%");
+  }
 
+  public void progress(String message) {
+    processStatus.setText(message);
+  }
 
 
+}  // class PreviewDialog
 
 
diff --git a/src/org/apache/fop/viewer/ProgressListener.java b/src/org/apache/fop/viewer/ProgressListener.java
new file mode 100644 (file)
index 0000000..6f2c9ed
--- /dev/null
@@ -0,0 +1,17 @@
+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
+ */
+
+
+
+public interface ProgressListener {
+  public void progress(int percentage);
+  public void progress(String message);
+  public void progress(int percentage, String message);
+}
+
diff --git a/src/org/apache/fop/viewer/SecureResourceBundle.java b/src/org/apache/fop/viewer/SecureResourceBundle.java
new file mode 100644 (file)
index 0000000..186b247
--- /dev/null
@@ -0,0 +1,97 @@
+package org.apache.fop.viewer;
+
+import java.util.*;
+import java.io.*;
+
+
+/**
+ * Die Klasse <code>SecureResourceBundle</code> ist ein Resourceundle, das im Falle eines fehlenden
+ * Eintrages keinen Absturz verursacht, sondern die Meldung
+ * <strong>Key <i>key</i> not found</strong> zurückgibt.
+ * @see PropertyResourceBundle
+ *
+ * @author Stanislav.Gorkhover@af-software.de
+ * @version 1.0 18.03.1999
+ */
+public class SecureResourceBundle extends ResourceBundle implements Translator {
+
+  // Fehlende keys mit einer Meldung zurückgeben.
+  private boolean isMissingEmphasized = false;
+
+  //private Properties lookup = new Properties();
+  private LoadableProperties lookup = new LoadableProperties();
+
+  private boolean isSourceFound = true;
+
+  public void setMissingEmphasized(boolean flag) {
+    isMissingEmphasized = flag;
+  }
+
+  /**
+  * Kreiert ein ResourceBundle mit der Quelle in <strong>in</strong>.
+  */
+
+  public SecureResourceBundle(InputStream in) {
+    try {
+      lookup.load(in);
+    } catch(Exception ex) {
+      System.out.println("Abgefangene Exception: " + ex.getMessage());
+      isSourceFound = false;
+    }
+  }
+
+
+
+  public Enumeration getKeys() {
+    return lookup.keys();
+  }
+
+
+
+  /**
+  * Händelt den abgefragten Key, liefert entweder den zugehörigen Wert oder eine Meldung.
+  * Die <strong>null</strong> wird nie zurückgegeben.
+  * Schreibt die fehlenden Suchschlüssel in die Protokoll-Datei.
+  * @return <code>Object</code><UL>
+  * <LI>den zu dem Suchschlüssel <strong>key</strong> gefundenen Wert, falls vorhanden, <br>
+  * <LI>Meldung <strong>Key <i>key</i> not found</strong>, falls der Suchschlüssel fehlt
+  * und die Eigenschaft "jCatalog.DevelopmentStartModus" in der ini-Datei aus true gesetzt ist.
+  * <LI>Meldung <strong>Key is null</strong>, falls der Suchschlüssel <code>null</code> ist.
+  * </UL>
+  *
+  */
+  public Object handleGetObject(String key) {
+
+    if (key == null)
+      return "Key is null";
+
+    Object obj = lookup.get(key);
+    if (obj != null)
+      return obj;
+    else {
+      if (isMissingEmphasized) {
+        System.out.println(getClass().getName() + ": missing key: " + key);
+        return getMissedRepresentation(key.toString());
+      }
+      else
+        return key.toString();
+    }
+  }
+
+  /**
+   * Stellt fest, ob es den Key gibt.
+   */
+  public boolean contains(String key) {
+    return (key == null || lookup.get(key) == null) ? false : true;
+  }
+
+
+  private String getMissedRepresentation(String str) {
+    return "<!" + str + "!>";
+  }
+
+  public boolean isSourceFound() {
+    return isSourceFound;
+  }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/fop/viewer/Translator.java b/src/org/apache/fop/viewer/Translator.java
new file mode 100644 (file)
index 0000000..e19e1f4
--- /dev/null
@@ -0,0 +1,29 @@
+package org.apache.fop.viewer;
+
+
+/**
+ * Definition für die Übersetzer-Klassen.
+ *
+ * @version 03.12.99
+ * @author Stanislav.Gorkhover@af-software.de
+ *
+ */
+public interface Translator {
+
+  /**
+   * Übersetzt ein Wort.
+   */
+  public String getString(String key);
+  /**
+   * Ein Translator soll die fehlenden keys hervorheben können.
+   */
+  public void setMissingEmphasized(boolean b);
+  /**
+   * Gibt an ob die Übersetzungsquelle gefunden ist.
+   */
+  public boolean isSourceFound();
+  /**
+   * Gibt an ob ein Key in der Übersetzungsquelle vorhanden ist.
+   */
+  public boolean contains(String key);
+}
\ No newline at end of file
diff --git a/src/org/apache/fop/viewer/UserMessage.java b/src/org/apache/fop/viewer/UserMessage.java
new file mode 100644 (file)
index 0000000..d10580f
--- /dev/null
@@ -0,0 +1,345 @@
+package org.apache.fop.viewer;
+
+import java.awt.*;
+import java.io.*;
+import java.awt.event.*;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.JComponent.*;
+
+
+
+/**
+ * Klasse <code>UserMessage</code> ist ein utility zum Abfragen oder zum Informieren des Benutzers.<br>
+ * Eine Meldung besteht aus dem Identifikator (Suchschlüssel im Meldungspool), einem Dialogtitel, einem Buttonset und
+ * dem Meldungstext mit eventuellen Platzhaltern für die Parameter.
+ *
+ * @author S. Gorkhover
+ * @version 18.03.1999
+ *
+ * @changed 23.04.99 Juergen.Verwohlt@af-software.de
+ * @subject Weitere Ausgabemethoden: show(String, String) und show(String,String,Frame)
+ *
+ * @changed 28.05.99 Juergen.Verwohlt@af-software.de
+ * @subject MessageException unterstützen
+ *
+ * @changed 09.06.99 Juergen.Verwohlt@af-software.de
+ * @subject Neue Klasse MessagesException zur Anzeige verwenden
+ */
+public class UserMessage {
+
+  private static Translator res = null;
+
+  public static void setTranslator(Translator aRes) {
+    res = aRes;
+    if (res == null) {
+      System.out.println("UserMessage: setTranslator(null) !");
+      res = new SecureResourceBundle(null);
+    }
+
+    MessagesDialog.setTranslator(res);
+  }
+
+
+  // Zulässige Werte für Dialogart:
+  /**
+  * Möglicher Wert des Meldungstypes. Fenster-Title "Info" (de).
+  */
+  private static final int INFO      = JOptionPane.PLAIN_MESSAGE;
+  /**
+  * Möglicher Wert des Meldungstypes. Fenster-Title "Warnung" (de).
+  */
+  private static final int WARNING   = JOptionPane.WARNING_MESSAGE;
+  /**
+  * Möglicher Wert des Meldungstypes. Fenster-Title "Frage" (de).
+  */
+  private static final int QUESTION  = JOptionPane.QUESTION_MESSAGE;
+  /**
+  * Möglicher Wert des Meldungstypes. Fenster-Title "Fehler" (de).
+  */
+  private static final int ERROR     = JOptionPane.ERROR_MESSAGE;
+  /**
+  * Möglicher Wert des Meldungstypes. Fenster-Title "Systemfehler" (de).
+  */
+  private static final int SYS_ERROR = JOptionPane.ERROR_MESSAGE;
+
+
+
+  /* Style Constanten orientieren sich auf die
+  *  Constanten der ButtonDialog-Klasse und legen das Dialog-ButtonSet fest.
+  */
+  /** Wert für Setzten keines Buttons */
+  public static final int STYLE_NOBUTTON   = -2;
+  /** Wert für Setzten von nur Ja-Button.*/
+  public static final int STYLE_Y     = JOptionPane.DEFAULT_OPTION;
+  //ButtonDialog.YES;            // = 1
+  /** Wert für Setzten von Ja- und Nein-Buttons.*/
+  public static final int STYLE_Y_N   = JOptionPane.YES_NO_OPTION;
+  //ButtonDialog.YES_NO;         // = 2;
+  /** Wert für Setzten von Ja-, Nein-und Abbruch Buttons.*/
+  public static final int STYLE_Y_N_C = JOptionPane.YES_NO_CANCEL_OPTION;
+  //ButtonDialog.YES_NO_CANCEL;  // = 3;
+
+
+  // Platzhalter für Parameter in der Properties-Datei
+  private static final String PARAMETER_TAG = "&&&";
+
+
+  /**
+  * Benutzer-Antwort-Constanten orientieren sich auf die
+  * Constanten der ButtonDialog-Klasse
+  */
+  /**Möglicher Rückgabewert @see ButtonDialog*/
+  public static final int YES    = JOptionPane.YES_OPTION;
+  //ButtonDialog.YES;            // = 2
+  /**Möglicher Rückgabewert @see ButtonDialog*/
+  public static final int NO     = JOptionPane.NO_OPTION;
+  //ButtonDialog.NO;            // = 4;
+  /**Möglicher Rückgabewert @see ButtonDialog*/
+  public static final int CANCEL = JOptionPane.CANCEL_OPTION;
+  //ButtonDialog.CANCEL;        // = 8;
+
+
+  // Default-Values
+  private static int buttonType = STYLE_Y;
+  private static int iconType   = WARNING;
+  private static String currentIconName = "";
+  private static String actMessId = null;
+  // private static MessagesDialog nobuttonDialog = null;
+
+
+  /**
+  * Ersetzt die eventuellen Platzhalter durch die übergebenen Parameter
+  */
+  static String prepareMessage(String rawText, String[] par) {
+    System.out.println("prepareMessage(): " + rawText + ", parameter: " + par);
+    int index = rawText.indexOf(PARAMETER_TAG);
+    String composedMess = "";
+    if ((index == -1) && (par == null)) return rawText;
+    if ((index != -1) && (par == null)) {
+      System.out.println("Message " + actMessId+ " erwartet Parameter. Aufgerufen ohne Parameter");
+      return rawText;
+    }
+    if ((index == -1) && (par != null)) {
+      System.out.println("Message " + actMessId + " erwartet keine Parameter. Aufgerufen mit folgenden Parametern:");
+      for(int i = 0; i < par.length; ++i)
+        System.out.println(par[i].toString());
+      return rawText;
+    }
+    int tagCount = 0;
+    while (rawText.indexOf(PARAMETER_TAG) != -1) {
+      index = rawText.indexOf(PARAMETER_TAG);
+      try {
+        composedMess += rawText.substring(0, index) + par[tagCount];
+      } catch(ArrayIndexOutOfBoundsException ex) {
+        System.out.println("Anzahl der übergebenen Parameter zu der Meldung " + actMessId + " ist weniger als erwartet.");
+        ex.printStackTrace();
+        return composedMess + rawText;
+      }
+      rawText = rawText.substring(index+PARAMETER_TAG.length());
+      tagCount++;
+    }
+    composedMess += rawText;
+    if (tagCount != par.length)
+      System.out.println("Die zu der Meldung " + actMessId + "  übergebenen Parameter sind mehr als die Meldung vorsieht.");
+    return composedMess;
+  }
+
+  /**
+  * Gibt den Title fürs Dialogfenster.
+  * Dieser wird durch die Dialogart festgelegt
+  * (erster Teil in der MeldungsDefinition in der Properties-Datei).
+  */
+  static String getTitle(String strVal) {
+    String title = null;
+    int choice = getValue(strVal);
+    switch (choice) {
+      case INFO      : title = "Info"; currentIconName = "info.gif"; break;
+      case WARNING   : title = "Warning"; currentIconName = "warn.gif"; break;
+      case QUESTION  : title = "Question"; currentIconName = "quest.gif"; break;
+      case ERROR     : title = "Error"; currentIconName = "error.gif"; break;
+      default : title =  "Ungültiger IonType für diese Meldung. Prüfen in Übersetzungsdatei.";
+    }
+    return title;
+  }
+
+  /**
+  * Liefert den Wert der über den Nemen übergebenen Klassenvariablen.
+  */
+  static int getValue(String fieldName) {
+
+    int val = -1;
+    if (fieldName.equals("INFO")) return INFO;
+    else if (fieldName.equals("WARNING")) return WARNING;
+    else if (fieldName.equals("ERROR")) return ERROR;
+    else if (fieldName.equals("SYS_ERROR")) return SYS_ERROR;
+    else if (fieldName.equals("QUESTION")) return QUESTION;
+    else if (fieldName.equals("STYLE_NOBUTTON")) return STYLE_NOBUTTON;
+    else if (fieldName.equals("STYLE_Y")) return STYLE_Y;
+    else if (fieldName.equals("STYLE_Y_N")) return STYLE_Y_N;
+    else if (fieldName.equals("STYLE_Y_N_C")) return STYLE_Y_N_C;
+    return val;
+  }
+
+  private static String getStackTrace(Exception exception) {
+
+    if (exception == null)
+      return "null";
+
+    String stack = "";
+
+    StringWriter strWriter = new StringWriter();
+    exception.printStackTrace(new PrintWriter(strWriter));
+    stack = strWriter.toString();
+    stack = stack.replace('\r', ' ');
+    stack = stack.replace('\t', ' ');
+    return stack;
+  }
+
+  private static int display(String textID, String[] param, Exception exception, Frame frame) {
+
+    String translatedMes = "";
+    String preparedMes = "";
+    String messageType = "";
+    String optionType = "";
+    String title = "";
+    MessagesDialog dialog = null;
+    actMessId = textID;
+
+    boolean messageFound = res.contains(textID);
+    translatedMes = res.getString(textID);
+
+    if (messageFound) {
+      try {
+        messageType   = translatedMes.substring(0, translatedMes.indexOf(':'));
+        translatedMes = translatedMes.substring(translatedMes.indexOf(':')+1);
+
+        optionType    = translatedMes.substring(0, translatedMes.indexOf(':'));
+        translatedMes = translatedMes.substring(translatedMes.indexOf(':')+1);
+
+      } catch(Exception ex) {
+          System.out.println("FALSCHES FORMAT: MESSAGE: " + textID);
+      }
+    }
+    else { // Message not found
+      System.out.println("UserMessage: textID '" + textID + "' not found. Return " +
+                   "value 'CANCEL' = " + CANCEL);
+
+      //return CANCEL;
+
+      messageType = "ERROR";
+      optionType = "STYLE_Y";
+      translatedMes = "textID '"+textID +"' not found." +
+                      "\nIt is possible the message file not found.";
+    }
+
+    preparedMes = prepareMessage(translatedMes, param);
+    // Exception exception = getException(param);
+
+    // WARNING -> nach Warnung übersetzen
+    title = res.getString(getTitle(messageType));
+
+    // WARNING -> JOptionPane.WARNING_MESSAGE
+    int messageTypeIndex = getValue(messageType);
+
+    // Button Set idetifizieren
+    int optionTypeIndex = getValue(optionType);
+
+    int result = CANCEL;
+
+    if (exception != null) {
+      String str = getStackTrace(exception);
+      if (exception instanceof MessageException ) {
+        MessageException ex = (MessageException)exception;
+        if (ex.getException() != null)
+          str += "\n" + getStackTrace(ex.getException());
+      }
+      result = MessagesDialog.showDetailDialog(null, preparedMes, title,
+                             optionTypeIndex, messageTypeIndex, null, str);
+    }
+    else {
+      if (optionTypeIndex == STYLE_NOBUTTON) {
+        // Wird nicht mehr unterstützt
+        System.out.println("UserMessage: STYLE_NOBUTTON wird nicht unterstützt");
+        return result;
+      }
+      else {
+       result = MessagesDialog.showConfirmDialog(null,preparedMes,title,
+                optionTypeIndex,messageTypeIndex);
+      }
+    }
+    return result;
+  }
+
+  /**
+  * Öffnet das Dialogfenster mit der Übersetzung der per Suchschlüssel übergebenen Meldung
+  * mit eingesetzten Parametern. Für die Übersetzung der Parameter trägt die aufrufende Stelle die Sorge.
+  * Der Dialog ist modal zum Frame <code>frame</code>.
+  * @param <UL>
+  * <LI> textID - Suchschlüssel der Meldung im Meldungspool,
+  * <LI> param - Array der in die Meldung einzusetztenden Parameter,
+  * <LI> frame - das Fenster, zu dem der Dialog modal ist.
+  * </UL>
+  * @return <UL>
+  * <LI> -1 wenn keine Rückgabe möglich ist oder Dialog NICHT MODAL ist.
+  * <LI> ButtonDialog.YES = 2
+  * <LI> ButtonDialog.NO = 4
+  * <LI> ButtonDialog.CANCEL = 8
+  * <LI> Wird das Dialog-Fenster ohne Buttonklick geschlossen (Kreuzchen oben rechts), so ist die Rückgabe gleich ButtonDialog.CANCEL.
+  * </UL>
+  */
+  public static int show(String messageId, String[] parameterList,
+                         Exception anException, Frame parentFrame) {
+    return display(messageId, parameterList, anException, parentFrame);
+  }
+
+  public static int show(String messageId, String[] parameterList,
+                         Exception anException) {
+    return display(messageId, parameterList, anException, (Frame)null);
+  }
+
+  public static int show(String messageId, String[] parameterList,
+                         Frame parentFrame) {
+    return display(messageId, parameterList, (Exception)null, parentFrame);
+  }
+
+  public static int show(String messageId, String[] parameterList) {
+    return display(messageId, parameterList, (Exception)null, (Frame)null);
+  }
+
+  public static int show(String messageId, String parameter,
+                         Frame parentFrame) {
+    return display(messageId, new String[] { parameter }, (Exception)null, parentFrame);
+  }
+
+  public static int show(String messageId, String parameter) {
+    return display(messageId, new String[] { parameter }, (Exception)null, (Frame)null);
+  }
+
+  public static int show(String messageId, Frame parentFrame) {
+    return display(messageId, (String[])null, (Exception)null, parentFrame);
+  }
+
+  public static int show(String messageId) {
+    return display(messageId, (String[])null, (Exception)null, (Frame)null);
+  }
+
+  public static int show(String messageId, Exception anException, Frame aFrame) {
+    return display(messageId, (String[])null, anException, aFrame);
+  }
+
+  public static int show(String messageId, Exception anException) {
+    return display(messageId, (String[])null, anException, (Frame)null);
+  }
+
+  public static int show(Exception anException, Frame aFrame) {
+    if (anException instanceof MessageException) {
+      MessageException ex = (MessageException)anException;
+      return show(ex.getMessageId(), ex.getParameterList(), ex, aFrame);
+    }
+    else
+      return show("UNHANDLED_EXCEPTION", (String[])null, anException, aFrame);
+  }
+
+}
+
diff --git a/src/org/apache/fop/viewer/resources/messages.de b/src/org/apache/fop/viewer/resources/messages.de
new file mode 100644 (file)
index 0000000..8db0001
--- /dev/null
@@ -0,0 +1,78 @@
+###############################################################################
+#
+#  In dieser Datei werden im Abschnitt "Messages" Meldungen auf deutsch 
+#  definiert. 
+#  Zu beachten: Beim Definieren einer neuen neuen Meldung, diese soweit möglich 
+#  in allen Sprachen anlegen. 
+#
+#
+#
+#  MELDUNG DEFINIEREN
+#  ==================
+#  
+#  Eine Meldung hat eine eindeutige textuelle ID. Diese steht links vom Gleichheitszeichen.
+#  Zu jeder Meldung wird angegeben:
+#    - iconType (Typen siehe unten)
+#    - buttonType  (Typen siehe unten)
+#    - Meldungstext mit evtl. Platzhaltern für Parameter.
+#
+#  Ein Parameterplatzhalter ist ein dreifaches kaumänisches "und". Siehe Beispielmeldung 
+#  "No_Records_found". 
+#  
+#  Die Angaben erfolgen in einer Zeile, jeweils durch einen Doppelpunkt getrennt.
+#
+#  Format:
+#  <MESSAGE_ID>=<iconType>:<buttonType>:<Meldungstext>
+#
+#  Zulässige Werte für:
+#    iconType:
+#        INFO
+#        WARNING
+#        ERROR
+#        QUESTION
+#
+#    buttonType:
+#        STYLE_Y      ("yes" Button)
+#        STYLE_Y_N    ("yes" and "no" Buttons) 
+#        STYLE_Y_N_C  ("yes", "no" and "cancel" Buttons)  
+#
+#
+#  Beispiel mit einem String-Array:
+#  ================================
+#    Messagedefinition:
+#      No_Records_found=WARNING:STYLE_Y:Die Tabelle &&& enthält keinen Eintrag. Erwartet mind. &&&. Weitermachen?
+#    Aufruf: 
+#      answer = UserMessage.show("No_Records_found", new String[] {"Mitarbeiter", "" + minNumber}, aShowFrame);
+#      if (answer == UserMessage.NO)
+#        return;   
+#
+#  Beispiel mit einer Exception:
+#  =============================
+#    Messagedefinition:
+#      UNEXPECTED_EXCEPTION=ERROR:STYLE_Y:Wow! An exception!
+#
+#    Aufruf:
+#      try {
+#        String str = null;
+#        int index = str.indexOf("abc"); 
+#      } catch (Exception ex) {
+#        UserMessage.show("UNEXPECTED_EXCEPTION", ex);  
+#      } 
+#
+#
+#
+#
+#################################################################################################
+
+
+# Titles
+Info=Info
+Warning=Warnung
+Question=Frage
+Error=Fehler
+
+# Messages
+TRANSLATION_SOURCE_NOT_FOUND=WARNING:STYLE_Y:Die Übersetzungsdatei &&& ist nicht gefunden.
+UNKNOWN_EXCEPTION=ERROR:STYLE_Y:Unbekannter Fehler
+UNHANDLED_EXCEPTION=ERROR:STYLE_Y:Interner Fehler
+
diff --git a/src/org/apache/fop/viewer/resources/messages.en b/src/org/apache/fop/viewer/resources/messages.en
new file mode 100644 (file)
index 0000000..7e89538
--- /dev/null
@@ -0,0 +1,80 @@
+###############################################################################
+#
+#  This file contains the english messages.
+#  
+#  NOTICE:  When defining a new message it has to be created in message files for each language.
+#  
+#
+#
+#  
+#  DEFINING A MESSAGE
+#  ==================
+#  
+#  A message has a uinique CHARACTER ID. It is placed on the left hand side of the equation.
+#  For each message there are additional switches:
+#    - iconType (see below)
+#    - buttonType (see below)
+#    - messageText may contain placeholders for parameters.
+  
+#  A placeholder pattern is a "&&&" . See Examplemessage "No_Records_found".
+#  
+#  A messsage definition is placed within a single row, its switches are seperated by a colon ":". 
+#
+#  Format:
+#  =======
+#  <MESSAGE_ID>=<iconType>:<buttonType>:<message text>
+#
+#
+#  Allowed values for:
+#  ===================
+#    iconType:
+#        INFO
+#        WARNING
+#        ERROR
+#        QUESTION
+#
+#    buttonType:
+#        STYLE_Y      ("yes" Button)
+#        STYLE_Y_N    ("yes" and "no" Buttons) 
+#        STYLE_Y_N_C  ("yes", "no" and "cancel" Buttons)  
+#
+#
+#  Example with a parameter array:
+#  ================================
+#    Message definition:
+#      No_Records_found=WARNING:STYLE_Y:The Table &&& has no records. Expected at least &&&. Continue?
+#    Aufruf: 
+#      answer = UserMessage.show("No_Records_found", new String[] {"Employee", "" + minNumber}, aShowFrame);
+#      if (answer == UserMessage.NO)
+#        return;   
+#
+#  Example with an Exception:
+#  =============================
+#    Message definition:
+#      UNEXPECTED_EXCEPTION=ERROR:STYLE_Y:Wow! An exception!
+#
+#    Aufruf:
+#      try {
+#        String str = null;
+#        int index = str.indexOf("abc"); 
+#      } catch (Exception ex) {
+#        UserMessage.show("UNEXPECTED_EXCEPTION", ex);  
+#      } 
+#
+#
+#
+#
+#################################################################################################
+
+
+# Titles
+Info=Info
+Warning=Warning
+Question=Question
+Error=Error
+
+# Messages
+TRANSLATION_SOURCE_NOT_FOUND=WARNING:STYLE_Y:The translation file &&& is not found.
+UNKNOWN_EXCEPTION=ERROR:STYLE_Y:Unknown error.
+UNHANDLED_EXCEPTION=ERROR:STYLE_Y:Internal error.
+
diff --git a/src/org/apache/fop/viewer/resources/resources.de b/src/org/apache/fop/viewer/resources/resources.de
new file mode 100644 (file)
index 0000000..2a0ffe4
--- /dev/null
@@ -0,0 +1,21 @@
+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
diff --git a/src/org/apache/fop/viewer/resources/resources.en b/src/org/apache/fop/viewer/resources/resources.en
new file mode 100644 (file)
index 0000000..acf0ef6
--- /dev/null
@@ -0,0 +1,4 @@
+# Diese Datei ist nur dafür da, daß die Warnung 
+# "Übersetzungsdatei nicht gefunden" nicht hochkommt.
+# Die Suchschlüssel für die zu übersetzenden Begriffe sind 
+# englisch. Daher wäre eine Übersetzung redundant.
diff --git a/src/org/apache/fop/viewer/resources/resources.fi b/src/org/apache/fop/viewer/resources/resources.fi
new file mode 100644 (file)
index 0000000..9721903
--- /dev/null
@@ -0,0 +1,16 @@
+File=Tiedosto
+Print=Tulosta
+Exit=Poistu
+View=Näytä
+First page=Ensimmäinen sivu
+Previous page=Edellinen sivu
+Next page=Seuraava sivu
+Last page=Viimeinen sivu
+Default zoom=Normaali zoom
+Help=Ohje
+Index=Sisällys
+Introduction=Esittely
+About=Tietoja
+Page=Sivu
+
+
diff --git a/src/org/apache/fop/viewer/resources/resources.fr b/src/org/apache/fop/viewer/resources/resources.fr
new file mode 100644 (file)
index 0000000..5287dcb
--- /dev/null
@@ -0,0 +1,13 @@
+File=Fichier
+Print=Imprimer
+Exit=Quitter
+View=Affichage
+First page=Première page
+Previous page=Page précédente
+Next page=Page suivante
+Last page=Dernière page
+Help=Aide
+Default zoom=Zoom par défaut
+Introduction=Introduction
+About=A propos
+
diff --git a/src/org/apache/fop/viewer/resources/resources.it b/src/org/apache/fop/viewer/resources/resources.it
new file mode 100644 (file)
index 0000000..05cdb0a
--- /dev/null
@@ -0,0 +1,14 @@
+File=File
+Exit=Esci
+View=Vista
+First page=Prima pagina
+Previous page=Pagina precedente
+Next page=Pagina seguente
+Last page=Ultima pagina
+Help=Aiuto
+Default zoom=Zoom di default
+Introduction=Introduzione
+About=Riguardo a...
+Index=Indice
+Print=Stampa
+
diff --git a/src/org/apache/fop/viewer/resources/resources.pl b/src/org/apache/fop/viewer/resources/resources.pl
new file mode 100644 (file)
index 0000000..9b727e1
--- /dev/null
@@ -0,0 +1,17 @@
+File=Plik
+Print=Drukuj
+Exit=Zakoñcz
+View=Widok
+First page=Pierwsza strona
+Previous page=Poprzednia strona
+Next page=Nastêpna strona
+Last page=Ostatnia strona
+Zoom=Powiêkszenie
+Default zoom=Domy¶lne powiekszenie
+Help=Pomoc
+Index=Indeks
+Introduction=Wstêp
+About=O programie
+Page=Strona
+
+
diff --git a/src/org/apache/fop/viewer/resources/resources.ru b/src/org/apache/fop/viewer/resources/resources.ru
new file mode 100644 (file)
index 0000000..9f58dc0
--- /dev/null
@@ -0,0 +1,17 @@
+File=Ôàéë
+Exit=Çàêîí÷èòü
+View=Âèä
+First page=Ïåðâàÿ ñòðàíèöà
+Previous page=Ïðåëûëóùàÿ ñòðàíèöà
+Next page=Ñëåäóþùàÿ ñòðàíèöà
+Last page=Ïîñëåäíÿÿ ñòðàíèöà
+Help=Ïîìîùü
+Default zoom=Ñòàíäàîòíûé ìàñøòàá
+Introduction=Ââåäåíèå
+About=Πïðîãðàììå
+Show=Ïîêàç
+Preview=Ïðîñìîòð
+Print=Ïå÷àòàòü
+Page=Ñòîàíèöà
+of=èç
+Zoom=Ìàñøòàá