From: fotis Date: Tue, 25 Jan 2000 13:58:04 +0000 (+0000) Subject: changes (made by Stanislav Gorkhover): X-Git-Tag: pre-columns~591 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ee3fe3c904ac8fa7f8be0a7a9f2c2b35f59cc111;p=xmlgraphics-fop.git changes (made by Stanislav Gorkhover): - 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 --- diff --git a/src/org/apache/fop/apps/AWTCommandLine.java b/src/org/apache/fop/apps/AWTCommandLine.java index b99a0e35a..372aa4adc 100644 --- a/src/org/apache/fop/apps/AWTCommandLine.java +++ b/src/org/apache/fop/apps/AWTCommandLine.java @@ -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 diff --git a/src/org/apache/fop/apps/CommandLine.java b/src/org/apache/fop/apps/CommandLine.java index b6622bd7b..82720499f 100644 --- a/src/org/apache/fop/apps/CommandLine.java +++ b/src/org/apache/fop/apps/CommandLine.java @@ -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 { diff --git a/src/org/apache/fop/render/awt/AWTRenderer.java b/src/org/apache/fop/render/awt/AWTRenderer.java index 656b36679..110f05ea1 100644 --- a/src/org/apache/fop/render/awt/AWTRenderer.java +++ b/src/org/apache/fop/render/awt/AWTRenderer.java @@ -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()); + } + } diff --git a/src/org/apache/fop/viewer/Command.java b/src/org/apache/fop/viewer/Command.java index 81e5826b2..aa63e7876 100644 --- a/src/org/apache/fop/viewer/Command.java +++ b/src/org/apache/fop/viewer/Command.java @@ -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); diff --git a/src/org/apache/fop/viewer/DocumentPanel.java b/src/org/apache/fop/viewer/DocumentPanel.java index 8255bc1da..abdf75f2b 100644 --- a/src/org/apache/fop/viewer/DocumentPanel.java +++ b/src/org/apache/fop/viewer/DocumentPanel.java @@ -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 index 000000000..1a6e957a7 --- /dev/null +++ b/src/org/apache/fop/viewer/LoadableProperties.java @@ -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 index 000000000..6dd531fff --- /dev/null +++ b/src/org/apache/fop/viewer/MessageException.java @@ -0,0 +1,68 @@ +package org.apache.fop.viewer; + +import java.lang.Exception; + +/** + * Die Klasse MessageException 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 index 000000000..c8c518dab --- /dev/null +++ b/src/org/apache/fop/viewer/MessagesDialog.java @@ -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 MessagesDialog dient der Anzeige von Meldungen. + * Die Klasse erweitert JOptionPane 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; + } +} diff --git a/src/org/apache/fop/viewer/PreviewDialog.java b/src/org/apache/fop/viewer/PreviewDialog.java index f2dd658d2..1757e5773 100644 --- a/src/org/apache/fop/viewer/PreviewDialog.java +++ b/src/org/apache/fop/viewer/PreviewDialog.java @@ -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 index 000000000..6f2c9ed9b --- /dev/null +++ b/src/org/apache/fop/viewer/ProgressListener.java @@ -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 index 000000000..186b247ad --- /dev/null +++ b/src/org/apache/fop/viewer/SecureResourceBundle.java @@ -0,0 +1,97 @@ +package org.apache.fop.viewer; + +import java.util.*; +import java.io.*; + + +/** + * Die Klasse SecureResourceBundle ist ein Resourceundle, das im Falle eines fehlenden + * Eintrages keinen Absturz verursacht, sondern die Meldung + * Key key not found 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 in. + */ + + 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 null wird nie zurückgegeben. + * Schreibt die fehlenden Suchschlüssel in die Protokoll-Datei. + * @return Object + * + */ + 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 ""; + } + + 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 index 000000000..e19e1f429 --- /dev/null +++ b/src/org/apache/fop/viewer/Translator.java @@ -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 index 000000000..d10580f7e --- /dev/null +++ b/src/org/apache/fop/viewer/UserMessage.java @@ -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 UserMessage ist ein utility zum Abfragen oder zum Informieren des Benutzers.
+ * 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 frame. + * @param + * @return + */ + 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 index 000000000..8db0001a8 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/messages.de @@ -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: +# =:: +# +# 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 index 000000000..7e8953845 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/messages.en @@ -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: +# ======= +# =:: +# +# +# 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 index 000000000..2a0ffe465 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.de @@ -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 index 000000000..acf0ef669 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.en @@ -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 index 000000000..97219031d --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.fi @@ -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 index 000000000..5287dcbb9 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.fr @@ -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 index 000000000..05cdb0a0a --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.it @@ -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 index 000000000..9b727e151 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.pl @@ -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 index 000000000..9f58dc012 --- /dev/null +++ b/src/org/apache/fop/viewer/resources/resources.ru @@ -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=Ìàñøòàá