From d3fda87403f1db9d0f419816759ac61e45c7f1cb Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Wed, 15 Jun 2005 12:24:01 +0000 Subject: [PATCH] Bugzilla: #35358 Improvements on Viewer application: - Separated out the preview panels and control logic from the buttons and dialog to make it easier to use elsewhere. - Added a continuous scrolling mode similar to that used by acrobat reader. Also added continuous facing mode. - Added fit-width and fit-to-page zoom options. Submitted by: Richard Wheeldon Updated german and french translations by myself. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198748 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/fop/render/awt/AWTRenderer.java | 83 ++-- .../apache/fop/render/awt/viewer/Command.java | 8 +- .../render/awt/viewer/ImageProxyPanel.java | 129 ++++++ .../fop/render/awt/viewer/PreviewDialog.java | 390 ++++++++---------- .../fop/render/awt/viewer/PreviewPanel.java | 377 +++++++++++++++++ .../apache/fop/render/awt/viewer/package.html | 10 + .../awt/viewer/resources/Viewer.properties | 36 +- .../awt/viewer/resources/Viewer_de.properties | 45 +- .../awt/viewer/resources/Viewer_fr.properties | 49 ++- .../fop/render/java2d/Java2DRenderer.java | 42 +- .../fop/render/print/PrintRenderer.java | 56 +-- 11 files changed, 901 insertions(+), 324 deletions(-) create mode 100644 src/java/org/apache/fop/render/awt/viewer/ImageProxyPanel.java create mode 100644 src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java create mode 100644 src/java/org/apache/fop/render/awt/viewer/package.html diff --git a/src/java/org/apache/fop/render/awt/AWTRenderer.java b/src/java/org/apache/fop/render/awt/AWTRenderer.java index a771a739f..4c65205f0 100644 --- a/src/java/org/apache/fop/render/awt/AWTRenderer.java +++ b/src/java/org/apache/fop/render/awt/AWTRenderer.java @@ -29,10 +29,10 @@ package org.apache.fop.render.awt; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.print.PageFormat; import java.awt.print.Pageable; @@ -82,22 +82,34 @@ public class AWTRenderer extends Java2DRenderer implements Pageable, Printable { createPreviewDialog(); } - public void renderPage(PageViewport pageViewport) throws IOException, - FOPException { + public void renderPage(PageViewport pageViewport) + throws IOException, FOPException { super.renderPage(pageViewport); - - // Shows the page if it's the first one - if (getCurrentPageNumber() == 1) { - frame.showPage(); - } frame.setInfo(); - } public void stopRenderer() throws IOException { super.stopRenderer(); frame.setStatus(translator.getString("Status.Show")); + frame.reload(); // Refreshes view of page + } + + /** + * Returns the dimensions of the specified page + * @exception FOPException If the page is out of range or has not been rendered. + */ + public Dimension getPageImageSize(int pageNum) throws FOPException { + Rectangle2D bounds = getPageViewport(pageNum).getViewArea(); + pageWidth = (int) Math.round(bounds.getWidth() / 1000f); + pageHeight = (int) Math.round(bounds.getHeight() / 1000f); + double scaleX = scaleFactor + * FOUserAgent.DEFAULT_PX2MM / userAgent.getPixelUnitToMillimeter(); + double scaleY = scaleFactor + * FOUserAgent.DEFAULT_PX2MM / userAgent.getPixelUnitToMillimeter(); + int bitmapWidth = (int) ((pageWidth * scaleX) + 0.5); + int bitmapHeight = (int) ((pageHeight * scaleY) + 0.5); + return new Dimension(bitmapWidth, bitmapHeight); } /** Creates and initialize the AWT Viewer main window */ @@ -153,30 +165,35 @@ public class AWTRenderer extends Java2DRenderer implements Pageable, Printable { /** @see java.awt.print.Pageable#getPageFormat(int) */ public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException { - if (pageIndex >= getNumberOfPages()) - return null; - - PageFormat pageFormat = new PageFormat(); - - Paper paper = new Paper(); - pageFormat.setPaper(paper); - - Rectangle2D dim = getPageViewport(pageIndex).getViewArea(); - double width = dim.getWidth(); - double height = dim.getHeight(); - - // if the width is greater than the height assume lanscape mode - // and swap the width and height values in the paper format - if (width > height) { - paper.setImageableArea(0, 0, height / 1000d, width / 1000d); - paper.setSize(height / 1000d, width / 1000d); - pageFormat.setOrientation(PageFormat.LANDSCAPE); - } else { - paper.setImageableArea(0, 0, width / 1000d, height / 1000d); - paper.setSize(width / 1000d, height / 1000d); - pageFormat.setOrientation(PageFormat.PORTRAIT); + try { + if (pageIndex >= getNumberOfPages()) { + return null; + } + + PageFormat pageFormat = new PageFormat(); + + Paper paper = new Paper(); + pageFormat.setPaper(paper); + + Rectangle2D dim = getPageViewport(pageIndex).getViewArea(); + double width = dim.getWidth(); + double height = dim.getHeight(); + + // if the width is greater than the height assume lanscape mode + // and swap the width and height values in the paper format + if (width > height) { + paper.setImageableArea(0, 0, height / 1000d, width / 1000d); + paper.setSize(height / 1000d, width / 1000d); + pageFormat.setOrientation(PageFormat.LANDSCAPE); + } else { + paper.setImageableArea(0, 0, width / 1000d, height / 1000d); + paper.setSize(width / 1000d, height / 1000d); + pageFormat.setOrientation(PageFormat.PORTRAIT); + } + return pageFormat; + } catch (FOPException fopEx) { + throw new IndexOutOfBoundsException(fopEx.getMessage()); } - return pageFormat; } /** @see java.awt.print.Pageable#getPrintable(int) */ @@ -207,7 +224,7 @@ public class AWTRenderer extends Java2DRenderer implements Pageable, Printable { * @see org.apache.fop.render.java2d.Java2DRenderer#drawBackAndBorders(org.apache.fop.area.Area, * float, float, float, float) * - * @param block the area to get the traits from + * @param area the area to get the traits from * @param startx the start x position * @param starty the start y position * @param width the width of the area diff --git a/src/java/org/apache/fop/render/awt/viewer/Command.java b/src/java/org/apache/fop/render/awt/viewer/Command.java index 725255a0e..66ff5c21b 100644 --- a/src/java/org/apache/fop/render/awt/viewer/Command.java +++ b/src/java/org/apache/fop/render/awt/viewer/Command.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,10 +44,14 @@ public class Command extends AbstractAction { * Creates Command object with a given name and * sets the name as a tooltip text. No associated icon image. * @param name of the command + * @param mnemonic A Key */ - public Command(String name) { + public Command(String name, int mnemonic) { super(name); putValue(SHORT_DESCRIPTION, name); + if (mnemonic > 0) { + putValue(MNEMONIC_KEY, new Integer(mnemonic)); + } } /** diff --git a/src/java/org/apache/fop/render/awt/viewer/ImageProxyPanel.java b/src/java/org/apache/fop/render/awt/viewer/ImageProxyPanel.java new file mode 100644 index 000000000..a3946fbdc --- /dev/null +++ b/src/java/org/apache/fop/render/awt/viewer/ImageProxyPanel.java @@ -0,0 +1,129 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.awt.viewer; + +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.image.BufferedImage; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import javax.swing.JPanel; + +import org.apache.fop.apps.FOPException; +import org.apache.fop.render.awt.AWTRenderer; + +/** + * Panel used to display a single page of a document. + * This is basically a lazy-load display panel which + * gets the size of the image for layout purposes but + * doesn't get the actual image data until needed. + * The image data is then accessed via a soft reference, + * so it will be garbage collected when moving through + * large documents. + */ +public class ImageProxyPanel extends JPanel { + + /** The reference to the BufferedImage storing the page data */ + private Reference imageRef; + + /** The maximum and preferred size of the panel */ + private Dimension size; + + /** The renderer. Shared with PreviewPanel and PreviewDialog. */ + private AWTRenderer renderer; + + /** The page to be rendered. */ + private int page; + + /** + * Panel constructor. Doesn't allocate anything until needed. + */ + public ImageProxyPanel(AWTRenderer renderer, int page) { + this.renderer = renderer; + this.page = page; + } + + /** + * Returns the size of the page plus the border. + */ + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + /** + * Returns the size of the page plus the border. + */ + public Dimension getPreferredSize() { + if (size == null) { + try { + Insets insets = getInsets(); + size = renderer.getPageImageSize(page); + size = new Dimension(size.width + insets.left + insets.right, + size.height + insets.top + insets.bottom); + } catch (FOPException fopEx) { + // Arbitary size. Doesn't really matter what's returned here. + return new Dimension(10, 10); + } + } + return size; + } + + /** + * Sets the number of the page to be displayed and refreshes the display. + */ + public void setPage(int pg) { + if (page != pg) { + page = pg; + imageRef = null; + repaint(); + } + } + + /** + * Gets the image data and paints it on screen. Will make + * calls to getPageImage as required. + * @see org.apache.fop.render.java2d.Java2DRenderer#getPageImage() + */ + public synchronized void paintComponent(Graphics graphics) { + try { + if (isOpaque()) { //paint background + graphics.setColor(getBackground()); + graphics.fillRect(0, 0, getWidth(), getHeight()); + } + + super.paintComponent(graphics); + + BufferedImage image = null; + if (imageRef == null || imageRef.get() == null) { + image = renderer.getPageImage(page); + imageRef = new SoftReference(image); + } else { + image = (BufferedImage)imageRef.get(); + } + + int x = (getWidth() - image.getWidth()) / 2; + int y = (getHeight() - image.getHeight()) / 2; + + graphics.drawImage(image, x, y, image.getWidth(), image.getHeight(), null); + } catch (FOPException fopEx) { + fopEx.printStackTrace(); + } + } +} diff --git a/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java b/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java index 816310077..6992689bf 100644 --- a/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java +++ b/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java @@ -24,7 +24,6 @@ package org.apache.fop.render.awt.viewer; // Java import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; @@ -33,33 +32,34 @@ import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.image.BufferedImage; +import java.awt.event.KeyEvent; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; +import java.text.DecimalFormat; + import javax.swing.BorderFactory; -import javax.swing.ImageIcon; +import javax.swing.ButtonGroup; import javax.swing.JComboBox; +import javax.swing.JRadioButtonMenuItem; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JButton; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import javax.swing.UIManager; -import javax.swing.border.EmptyBorder; -import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; -import org.apache.fop.apps.Fop; -import org.apache.fop.fo.Constants; +import org.apache.fop.apps.FOPException; import org.apache.fop.render.awt.AWTRenderer; -/** AWT Viewer main window. */ +/** + * AWT Viewer main window. + * Surrounds a PreviewPanel with a bunch of pretty buttons and controls. + */ public class PreviewDialog extends JFrame { /** The Translator for localization */ @@ -68,14 +68,6 @@ public class PreviewDialog extends JFrame { protected AWTRenderer renderer; /** The FOUserAgent associated with this window */ protected FOUserAgent foUserAgent; - /** The Fop object used for refreshing/reloading the view */ - protected Fop fop; - - /** The number of the page which is currently visible */ - private int currentPage = 0; - - /** The Reloader, when the user clicks on menu "reload" */ - private Reloader reloader; /** The JCombobox to rescale the rendered page view */ private JComboBox scale; @@ -83,15 +75,18 @@ public class PreviewDialog extends JFrame { /** The JLabel for the process status bar */ private JLabel processStatus; - /** The JLabel that holds the rendered page */ - private JLabel pageLabel; - /** The JLabel information status bar */ private JLabel infoStatus; + /** The main display area */ + private PreviewPanel previewPanel; + + /** Formats the text in the scale combobox. */ + private DecimalFormat percentFormat = new DecimalFormat("###0.0#"); + /** * Creates a new PreviewDialog that uses the given renderer. - * @param aRenderer the to use renderer + * @param foUserAgent the user agent */ public PreviewDialog(FOUserAgent foUserAgent) { renderer = (AWTRenderer) foUserAgent.getRendererOverride(); @@ -101,7 +96,7 @@ public class PreviewDialog extends JFrame { //Commands aka Actions Command printAction = new Command(translator.getString("Menu.Print"), "Print") { public void doit() { - startPrinterJob(); + startPrinterJob(true); } }; Command firstPageAction = new Command(translator.getString("Menu.First.page"), @@ -129,16 +124,16 @@ public class PreviewDialog extends JFrame { }; Command reloadAction = new Command(translator.getString("Menu.Reload"), "reload") { public void doit() { - reload(); + previewPanel.reload(); } }; - Command debugAction = new Command("Debug", "debug") { + Command debugAction = new Command(translator.getString("Menu.Debug"), "debug") { // TODO use Translator public void doit() { - debug(); + previewPanel.debug(); } }; - Command aboutAction = new Command("About FOP", "fopLogo") { + Command aboutAction = new Command(translator.getString("Menu.About"), "fopLogo") { public void doit() { startHelpAbout(); } @@ -148,7 +143,9 @@ public class PreviewDialog extends JFrame { try { UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) { } + } catch (Exception e) { + System.err.println("Couldn't set system look & feel!"); + } setTitle("FOP: AWT-" + translator.getString("Title.Preview")); setDefaultCloseOperation(DISPOSE_ON_CLOSE); @@ -159,26 +156,23 @@ public class PreviewDialog extends JFrame { setSize(screen.width * 61 / 100, screen.height * 9 / 10); //Page view stuff - pageLabel = new JLabel(); - pageLabel.setHorizontalAlignment(0 /* CENTER */); - pageLabel.setBorder(new EmptyBorder(20, 0, 20, 0)); - JScrollPane previewArea = new JScrollPane(pageLabel); - previewArea.getViewport().setBackground(Color.gray); - previewArea.setMinimumSize(new Dimension(50, 50)); - getContentPane().add(previewArea, BorderLayout.CENTER); + previewPanel = new PreviewPanel(foUserAgent, renderer); + getContentPane().add(previewPanel, BorderLayout.CENTER); //Scaling combobox scale = new JComboBox(); + scale.addItem(translator.getString("Menu.Fit.Window")); + scale.addItem(translator.getString("Menu.Fit.Width")); scale.addItem("25%"); scale.addItem("50%"); scale.addItem("75%"); scale.addItem("100%"); scale.addItem("150%"); scale.addItem("200%"); - scale.addItem("400%"); scale.setMaximumSize(new Dimension(80, 24)); scale.setPreferredSize(new Dimension(80, 24)); scale.setSelectedItem("100%"); + scale.setEditable(true); scale.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { scaleActionPerformed(e); @@ -197,7 +191,7 @@ public class PreviewDialog extends JFrame { toolBar.add(previousPageAction); toolBar.add(nextPageAction); toolBar.add(lastPageAction); - toolBar.addSeparator(new Dimension(20,0)); + toolBar.addSeparator(new Dimension(20, 0)); toolBar.add(new JLabel(translator.getString("Menu.Zoom") + " ")); toolBar.add(scale); toolBar.addSeparator(); @@ -244,101 +238,140 @@ public class PreviewDialog extends JFrame { private JMenuBar setupMenu() { JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu(translator.getString("Menu.File")); - + menu.setMnemonic(KeyEvent.VK_F); //Adds mostly the same actions, but without icons - menu.add(new Command(translator.getString("Menu.Print")) { + menu.add(new Command(translator.getString("Menu.Print"), KeyEvent.VK_P) { public void doit() { - startPrinterJob(); + startPrinterJob(true); } }); // inputHandler must be set to allow reloading if (foUserAgent.getInputHandler() != null) { - menu.add(new Command(translator.getString("Menu.Reload")) { + menu.add(new Command(translator.getString("Menu.Reload"), KeyEvent.VK_R) { public void doit() { reload(); } }); } menu.addSeparator(); - menu.add(new Command(translator.getString("Menu.Exit")) { + menu.add(new Command(translator.getString("Menu.Exit"), KeyEvent.VK_X) { public void doit() { dispose(); } }); menuBar.add(menu); + menu = new JMenu(translator.getString("Menu.View")); - menu.add(new Command(translator.getString("Menu.First.page")) { + menu.setMnemonic(KeyEvent.VK_V); + menu.add(new Command(translator.getString("Menu.First.page"), KeyEvent.VK_F) { public void doit() { goToFirstPage(); } }); - menu.add(new Command(translator.getString("Menu.Prev.page")) { + menu.add(new Command(translator.getString("Menu.Prev.page"), KeyEvent.VK_P) { public void doit() { goToPreviousPage(); } }); - menu.add(new Command(translator.getString("Menu.Next.page")) { + menu.add(new Command(translator.getString("Menu.Next.page"), KeyEvent.VK_N) { public void doit() { goToNextPage(); } }); - menu.add(new Command(translator.getString("Menu.Last.page")) { + menu.add(new Command(translator.getString("Menu.Last.page"), KeyEvent.VK_L) { public void doit() { goToLastPage(); } }); - menu.add(new Command(translator.getString("Menu.Go.to.Page") + " ...") { + menu.add(new Command(translator.getString("Menu.Go.to.Page"), KeyEvent.VK_G) { public void doit() { showGoToPageDialog(); } }); menu.addSeparator(); JMenu subMenu = new JMenu(translator.getString("Menu.Zoom")); - subMenu.add(new Command("25%") { + subMenu.setMnemonic(KeyEvent.VK_Z); + subMenu.add(new Command("25%", 0) { public void doit() { setScale(25.0); } }); - subMenu.add(new Command("50%") { + subMenu.add(new Command("50%", 0) { public void doit() { setScale(50.0); } }); - subMenu.add(new Command("75%") { + subMenu.add(new Command("75%", 0) { public void doit() { setScale(75.0); } }); - subMenu.add(new Command("100%") { + subMenu.add(new Command("100%", 0) { public void doit() { setScale(100.0); } }); - subMenu.add(new Command("150%") { + subMenu.add(new Command("150%", 0) { public void doit() { setScale(150.0); } }); - subMenu.add(new Command("200%") { + subMenu.add(new Command("200%", 0) { public void doit() { setScale(200.0); } }); - subMenu.add(new Command("400%") { + menu.add(subMenu); + menu.addSeparator(); + menu.add(new Command(translator.getString("Menu.Default.zoom"), KeyEvent.VK_D) { public void doit() { - setScale(400.0); + setScale(100.0); + } + }); + menu.add(new Command(translator.getString("Menu.Fit.Window"), KeyEvent.VK_F) { + public void doit() { + setScaleToFitWindow(); + } + }); + menu.add(new Command(translator.getString("Menu.Fit.Width"), KeyEvent.VK_W) { + public void doit() { + setScaleToFitWidth(); } }); - menu.add(subMenu); menu.addSeparator(); - menu.add(new Command(translator.getString("Menu.Default.zoom")) { + + ButtonGroup group = new ButtonGroup(); + JRadioButtonMenuItem single = new JRadioButtonMenuItem( + new Command(translator.getString("Menu.Single"), KeyEvent.VK_S) { public void doit() { - setScale(100.0); + previewPanel.setDisplayMode(PreviewPanel.SINGLE); } }); + JRadioButtonMenuItem cont = new JRadioButtonMenuItem( + new Command(translator.getString("Menu.Continuous"), KeyEvent.VK_C) { + public void doit() { + previewPanel.setDisplayMode(PreviewPanel.CONTINUOUS); + } + }); + JRadioButtonMenuItem facing = new JRadioButtonMenuItem( + new Command(translator.getString("Menu.Facing"), 0) { + public void doit() { + previewPanel.setDisplayMode(PreviewPanel.CONT_FACING); + } + }); + single.setSelected(true); + group.add(single); + group.add(cont); + group.add(facing); + menu.add(single); + menu.add(cont); + menu.add(facing); + menuBar.add(menu); + menu = new JMenu(translator.getString("Menu.Help")); - menu.add(new Command(translator.getString("Menu.About")) { + menu.setMnemonic(KeyEvent.VK_H); + menu.add(new Command(translator.getString("Menu.About"), KeyEvent.VK_A) { public void doit() { startHelpAbout(); } @@ -347,119 +380,70 @@ public class PreviewDialog extends JFrame { return menuBar; } - /** Shows the About box */ - private void startHelpAbout() { - PreviewDialogAboutBox dlg = new PreviewDialogAboutBox(this, translator); - //Centers the box - Dimension dlgSize = dlg.getPreferredSize(); - Dimension frmSize = getSize(); - Point loc = getLocation(); - dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, - (frmSize.height - dlgSize.height) / 2 + loc.y); - dlg.setVisible(true); + public void reload() { + previewPanel.reload(); } /** * Changes the current visible page * @param number the page number to go to */ - private void goToPage(int number) { - currentPage = number; - showPage(); - setInfo(); + public void goToPage(int number) { + if (number != previewPanel.getPage()) { + previewPanel.setPage(number); + setInfo(); + } } /** * Shows the previous page. */ - private void goToPreviousPage() { - if (currentPage <= 0) { - return; + public void goToPreviousPage() { + int page = previewPanel.getPage(); + if (page > 0) { + goToPage(page - 1); } - currentPage--; - goToPage(currentPage); } /** * Shows the next page. */ - private void goToNextPage() { - if (currentPage >= renderer.getNumberOfPages() - 1) { - return; + public void goToNextPage() { + int page = previewPanel.getPage(); + if (page < renderer.getNumberOfPages() - 1) { + goToPage(page + 1); } - currentPage++; - goToPage(currentPage); } - /** - * Shows the last page. - */ - private void goToLastPage() { - if (currentPage == renderer.getNumberOfPages() - 1) { - return; - } - currentPage = renderer.getNumberOfPages() - 1; - goToPage(currentPage); - } - - /** - * Reloads and reformats document. - */ - private synchronized void reload() { - if (reloader == null || !reloader.isAlive()) { - reloader = new Reloader(); - reloader.start(); - } + /** Shows the first page. */ + public void goToFirstPage() { + goToPage(0); } /** - * Allows a (yet) simple visual debug of the document. + * Shows the last page. */ - private void debug(){ - renderer.debug = !renderer.debug; - reload(); + public void goToLastPage() { + goToPage(renderer.getNumberOfPages() - 1); } - /** - * This class is used to reload document in a thread safe way. - */ - private class Reloader extends Thread { - public void run() { - - if (!renderer.renderingDone) { - // do not allow the reloading while FOP is - // still rendering - JOptionPane.showMessageDialog(getContentPane(), - "Cannot perform the requested operation until " - + "all page are rendererd. Please wait", - "Please wait ", 1 /* INFORMATION_MESSAGE */); - return; - } - - if (fop == null) { - fop = new Fop(Constants.RENDER_AWT, foUserAgent); - } - - pageLabel.setIcon(null); - int savedCurrentPage = currentPage; - currentPage = 0; - renderer.clearViewportList(); - - try { - setStatus(translator.getString("Status.Build.FO.tree")); - foUserAgent.getInputHandler().render(fop); - goToPage(savedCurrentPage); - setStatus(translator.getString("Status.Show")); - } catch (FOPException e) { - reportException(e); - } - } + /** Shows the About box */ + private void startHelpAbout() { + PreviewDialogAboutBox dlg = new PreviewDialogAboutBox(this, translator); + //Centers the box + Dimension dlgSize = dlg.getPreferredSize(); + Dimension frmSize = getSize(); + Point loc = getLocation(); + dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, + (frmSize.height - dlgSize.height) / 2 + loc.y); + dlg.setVisible(true); } /** * Shows "go to page" dialog and then goes to the selected page */ private void showGoToPageDialog() { + int currentPage = previewPanel.getPage(); GoToPageDialog d = new GoToPageDialog(this, translator.getString("Menu.Go.to.Page"), translator); d.setLocation((int)getLocation().getX() + 50, @@ -473,20 +457,65 @@ public class PreviewDialog extends JFrame { goToPage(currentPage); } - /** Shows the first page. */ - private void goToFirstPage() { - if (currentPage == 0) { - return; + /** Scales page image */ + public void setScale(double scaleFactor) { +// if (scaleFactor == 25.0) { +// scale.setSelectedIndex(0); +// } else if (scaleFactor == 50.0) { +// scale.setSelectedIndex(1); +// } else if (scaleFactor == 75.0) { +// scale.setSelectedIndex(2); +// } else if (scaleFactor == 100.0) { +// scale.setSelectedIndex(3); +// } else if (scaleFactor == 150.0) { +// scale.setSelectedIndex(4); +// } else if (scaleFactor == 200.0) { +// scale.setSelectedIndex(5); +// } else if (scaleFactor == 400.0) { +// scale.setSelectedIndex(6); +// } else { + scale.setSelectedItem(percentFormat.format(scaleFactor) + "%"); +// } + previewPanel.setScaleFactor(scaleFactor / 100d); + } + + public void setScaleToFitWindow() { + try { + setScale(previewPanel.getScaleToFitWindow() * 100); + } catch (FOPException fopEx) { + fopEx.printStackTrace(); + } + } + + public void setScaleToFitWidth() { + try { + setScale(previewPanel.getScaleToFitWidth() * 100); + } catch (FOPException fopEx) { + fopEx.printStackTrace(); + } + } + + private void scaleActionPerformed(ActionEvent e) { + try { + int index = scale.getSelectedIndex(); + if (index == 0) { + setScale(previewPanel.getScaleToFitWindow() * 100); + } else if (index == 1) { + setScale(previewPanel.getScaleToFitWidth() * 100); + } else { + String item = (String)scale.getSelectedItem(); + setScale(Double.parseDouble(item.substring(0, item.indexOf('%')))); + } + } catch (FOPException fopEx) { + fopEx.printStackTrace(); } - currentPage = 0; - goToPage(currentPage); } /** Prints the document */ - private void startPrinterJob() { + public void startPrinterJob(boolean showDialog) { PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPageable(renderer); - if (pj.printDialog()) { + if (!showDialog || pj.printDialog()) { try { pj.print(); } catch (PrinterException e) { @@ -495,32 +524,6 @@ public class PreviewDialog extends JFrame { } } - /** Scales page image */ - private void setScale(double scaleFactor) { - if (scaleFactor == 25.0) { - scale.setSelectedIndex(0); - } else if (scaleFactor == 50.0) { - scale.setSelectedIndex(1); - } else if (scaleFactor == 75.0) { - scale.setSelectedIndex(2); - } else if (scaleFactor == 100.0) { - scale.setSelectedIndex(3); - } else if (scaleFactor == 150.0) { - scale.setSelectedIndex(4); - } else if (scaleFactor == 200.0) { - scale.setSelectedIndex(5); - } else if (scaleFactor == 400.0) { - scale.setSelectedIndex(6); - } - renderer.setScaleFactor(scaleFactor / 100d); - reload(); - } - - private void scaleActionPerformed(ActionEvent e) { - String item = (String)scale.getSelectedItem(); - setScale(Double.parseDouble(item.substring(0, item.indexOf('%')))); - } - /** * Sets message to be shown in the status bar in a thread safe way. * @param message the message @@ -559,49 +562,14 @@ public class PreviewDialog extends JFrame { private class ShowInfo implements Runnable { public void run() { - String message = translator.getString("Status.Page") + " " - + (currentPage + 1) + " " + + (previewPanel.getPage() + 1) + " " + translator.getString("Status.of") + " " - + renderer.getCurrentPageNumber(); - + + (renderer.getNumberOfPages()); infoStatus.setText(message); } } - /** Starts rendering process and shows the current page. */ - public synchronized void showPage() { - ShowPageImage viewer = new ShowPageImage(); - - if (SwingUtilities.isEventDispatchThread()) { - viewer.run(); - } else { - SwingUtilities.invokeLater(viewer); - } - } - - /** This class is used to render the page image in a thread safe way. */ - private class ShowPageImage implements Runnable { - - /** - * The run method that does the actual rendering of the viewed page - */ - public void run() { - - setStatus(translator.getString("Status.Build.FO.tree")); - - BufferedImage pageImage = null; - try { - pageImage = renderer.getPageImage(currentPage); - } catch (FOPException e) { - reportException(e); - } - pageLabel.setIcon(new ImageIcon(pageImage)); - - setStatus(translator.getString("Status.Show")); - } - } - /** * Opens standard Swing error dialog box and reports given exception details. * @param e the Exception diff --git a/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java b/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java new file mode 100644 index 000000000..30becc657 --- /dev/null +++ b/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java @@ -0,0 +1,377 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.fop.render.awt.viewer; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.geom.Rectangle2D; + +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JViewport; +import javax.swing.SwingUtilities; +import javax.swing.border.EmptyBorder; + +import org.apache.fop.apps.Fop; +import org.apache.fop.apps.FOPException; +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.area.PageViewport; + +import org.apache.fop.fo.Constants; +import org.apache.fop.render.awt.AWTRenderer; + + +/** + * Holds a scrollpane with the rendered page(s) and handles actions performed + * to alter the display of the page. + * + * Use PreviewPanel when you want to embed a preview in your own application + * with your own controls. Use PreviewDialog when you want to use the standard + * Fop controls. + * + * In order to embed a PreviewPanel in your own app, use the following: + *
+ * FOUserAgent ua = new FOUserAgent();
+ * ua.setRendererOverride(new AWTRenderer());
+ * previewPanel = new PreviewPanel(ua);
+ * 
+ */ +public class PreviewPanel extends JPanel { + + /** Constant for setting single page display. */ + public static final int SINGLE = 1; + /** Constant for setting continuous page display. */ + public static final int CONTINUOUS = 2; + /** Constant for displaying even/odd pages side by side in continuous form. */ + public static final int CONT_FACING = 3; + + /** The number of pixels left empty at the top bottom and sides of the page. */ + private static final int BORDER_SPACING = 10; + + /** The main display area */ + private JScrollPane previewArea; + + /** The AWT renderer - often shared with PreviewDialog */ + private AWTRenderer renderer; + + /** The FOUserAgent associated with this panel - often shared with PreviewDialog */ + protected FOUserAgent foUserAgent; + /** The number of the page which is currently selected */ + private int currentPage = 0; + + /** The index of the first page displayed on screen. */ + private int firstPage = 0; + + /** The number of pages concurrently displayed on screen. */ + private int pageRange = 1; + + /** The display mode. One of SINGLE, CONTINUOUS or CONT_FACING. */ + private int displayMode = SINGLE; + + /** The component(s) that hold the rendered page(s) */ + private ImageProxyPanel[] pagePanels = null; + + /** + * Panel showing the page panels in a grid. Usually the dimensions + * of the grid are 1x1, nx1 or nx2. + */ + private JPanel gridPanel = null; + + /** Asynchronous reloader thread, used when reload() method is called. */ + private Reloader reloader; + + /** The Fop object used for refreshing/reloading the view */ + protected Fop fop; + + /** + * Allows any mouse drag on the page area to scroll the display window. + */ + private ViewportScroller scroller; + + + public PreviewPanel(FOUserAgent foUserAgent, AWTRenderer renderer) { + super(new GridLayout(1, 1)); + this.renderer = renderer; + this.foUserAgent = foUserAgent; + + gridPanel = new JPanel(); + gridPanel.setLayout(new GridLayout(0, 1)); // rows, cols + + previewArea = new JScrollPane(gridPanel); + previewArea.getViewport().setBackground(Color.gray); + + // FIXME should add scroll wheel support here at some point. + scroller = new ViewportScroller(previewArea.getViewport()); + previewArea.addMouseListener(scroller); + previewArea.addMouseMotionListener(scroller); + + previewArea.setMinimumSize(new Dimension(50, 50)); + add(previewArea); + } + + /** + * @return the currently visible page + */ + public int getPage() { + return currentPage; + } + + /** + * Selects the given page, displays it on screen and notifies + * listeners about the change in selection. + * @param number the page number + */ + public void setPage(int number) { + if (displayMode == CONTINUOUS || displayMode == CONT_FACING) { + // FIXME Should scroll so page is visible + currentPage = number; + } else { // single page mode + currentPage = number; + firstPage = currentPage; + } + showPage(); + } + + /** + * Sets the display mode. + * @param mode One of SINGLE, CONTINUOUS or CONT_FACING. + */ + public void setDisplayMode(int mode) { + if (mode != displayMode) { + displayMode = mode; + gridPanel.setLayout(new GridLayout(0, displayMode == CONT_FACING ? 2 : 1)); + reload(); + } + } + + /** + * Returns the display mode. + * @return mode One of SINGLE, CONTINUOUS or CONT_FACING. + */ + public int getDisplayMode() { + return displayMode; + } + + /** + * Reloads and reformats document. + */ + public synchronized void reload() { + if (reloader == null || !reloader.isAlive()) { + reloader = new Reloader(); + reloader.start(); + } + } + + /** + * Allows a (yet) simple visual debug of the document. + */ + void debug() { + renderer.debug = !renderer.debug; + reload(); + } + + /** + * Allows any mouse drag on the page area to scroll the display window. + */ + private class ViewportScroller implements MouseListener, MouseMotionListener { + /** The viewport to be scrolled */ + private final JViewport viewport; + /** Starting position of a mouse drag - X co-ordinate */ + private int startPosX = 0; + /** Starting position of a mouse drag - Y co-ordinate */ + private int startPosY = 0; + + ViewportScroller(JViewport vp) { + viewport = vp; + } + + // ***** MouseMotionListener ***** + + public synchronized void mouseDragged(MouseEvent e) { + if (viewport == null) { + return; + } + int x = e.getX(); + int y = e.getY(); + int xmove = x - startPosX; + int ymove = y - startPosY; + int viewWidth = viewport.getExtentSize().width; + int viewHeight = viewport.getExtentSize().height; + int imageWidth = viewport.getViewSize().width; + int imageHeight = viewport.getViewSize().height; + + Point viewPoint = viewport.getViewPosition(); + int viewX = Math.max(0, Math.min(imageWidth - viewWidth, viewPoint.x - xmove)); + int viewY = Math.max(0, Math.min(imageHeight - viewHeight, viewPoint.y - ymove)); + + viewport.setViewPosition(new Point(viewX, viewY)); + + startPosX = x; + startPosY = y; + } + + public void mouseMoved(MouseEvent e) { } + + // ***** MouseListener ***** + + public void mousePressed(MouseEvent e) { + startPosX = e.getX(); + startPosY = e.getY(); + } + + public void mouseExited(MouseEvent e) { } + public void mouseEntered(MouseEvent e) { } + public void mouseClicked(MouseEvent e) { } + public void mouseReleased(MouseEvent e) { } + } + + /** + * This class is used to reload document in a thread safe way. + */ + private class Reloader extends Thread { + + public void run() { + if (!renderer.renderingDone) { + // do not allow the reloading while FOP is still rendering + JOptionPane.showMessageDialog(previewArea, + "Cannot perform the requested operation until " + + "all page are rendererd. Please wait", + "Please wait ", 1 /* INFORMATION_MESSAGE */); + return; + } + + if (fop == null) { + fop = new Fop(Constants.RENDER_AWT, foUserAgent); + } + + pagePanels = null; + + int savedCurrentPage = currentPage; + currentPage = 0; + + gridPanel.removeAll(); + switch(displayMode) { + case CONT_FACING: + // This page intentionally left blank + // Makes 0th/1st page on rhs + gridPanel.add(new JLabel("")); + case CONTINUOUS: + currentPage = 0; + firstPage = 0; + pageRange = renderer.getNumberOfPages(); + break; + case SINGLE: + default: + currentPage = 0; + firstPage = 0; + pageRange = 1; + break; + } + + pagePanels = new ImageProxyPanel[pageRange]; + for (int pg = 0; pg < pageRange; pg++) { + pagePanels[pg] = new ImageProxyPanel(renderer, pg + firstPage); + pagePanels[pg].setBorder(new EmptyBorder( + BORDER_SPACING, BORDER_SPACING, BORDER_SPACING, BORDER_SPACING)); + gridPanel.add(pagePanels[pg]); + } + + renderer.clearViewportList(); + + try { + foUserAgent.getInputHandler().render(fop); + setPage(savedCurrentPage); + } catch (FOPException e) { + e.printStackTrace(); + // FIXME Should show exception in gui - was reportException(e); + } + } + } + + /** + * Scales page image + * @param scale [0;1] + */ + public void setScaleFactor(double scale) { + renderer.setScaleFactor(scale); + reload(); + } + + /** + * Returns the scale factor required in order to fit either the current + * page within the current window or to fit two adjacent pages within + * the display if the displaymode is continuous. + */ + public double getScaleToFitWindow() throws FOPException { + Dimension extents = previewArea.getViewport().getExtentSize(); + return getScaleToFit(extents.getWidth() - 2 * BORDER_SPACING, + extents.getHeight() - 2 * BORDER_SPACING); + } + + /** + * As getScaleToFitWindow, but ignoring the Y axis. + */ + public double getScaleToFitWidth() throws FOPException { + Dimension extents = previewArea.getViewport().getExtentSize(); + return getScaleToFit(extents.getWidth() - 2 * BORDER_SPACING, Double.MAX_VALUE); + } + + /** + * Returns the scale factor required in order to fit either the current page or + * two adjacent pages within a window of the given height and width, depending + * on the display mode. In order to ignore either dimension, + * just specify it as Double.MAX_VALUE. + */ + public double getScaleToFit(double viewWidth, double viewHeight) throws FOPException { + PageViewport pageViewport = renderer.getPageViewport(currentPage); + Rectangle2D pageSize = pageViewport.getViewArea(); + double widthScale = viewWidth / (pageSize.getWidth() / 1000f); + double heightScale = viewHeight / (pageSize.getHeight() / 1000f); + return Math.min(displayMode == CONT_FACING ? widthScale / 2 : widthScale, heightScale); + } + + /** Starts rendering process and shows the current page. */ + public synchronized void showPage() { + ShowPageImage viewer = new ShowPageImage(); + + if (SwingUtilities.isEventDispatchThread()) { + viewer.run(); + } else { + SwingUtilities.invokeLater(viewer); + } + } + + /** This class is used to render the page image in a thread safe way. */ + private class ShowPageImage implements Runnable { + + /** + * The run method that does the actual rendering of the viewed page + */ + public void run() { + for (int pg = firstPage; pg < firstPage + pageRange; pg++) { + pagePanels[pg - firstPage].setPage(pg); + } + revalidate(); + } + } +} diff --git a/src/java/org/apache/fop/render/awt/viewer/package.html b/src/java/org/apache/fop/render/awt/viewer/package.html new file mode 100644 index 000000000..7146478ea --- /dev/null +++ b/src/java/org/apache/fop/render/awt/viewer/package.html @@ -0,0 +1,10 @@ + +org.apache.fop.render.awt.viewer + +

AWT Viewer PreviewDialog and PreviewPanel.

+

The PreviewPanel allows users to embed FOP previews in their own +applications. The PreviewDialog is the default viewer for the -awt +switch and surrounds the PreviewPanel with a bunch of controls, menu +items etc.

+ + diff --git a/src/java/org/apache/fop/render/awt/viewer/resources/Viewer.properties b/src/java/org/apache/fop/render/awt/viewer/resources/Viewer.properties index 422dc5c58..b1b1d1af9 100644 --- a/src/java/org/apache/fop/render/awt/viewer/resources/Viewer.properties +++ b/src/java/org/apache/fop/render/awt/viewer/resources/Viewer.properties @@ -1,10 +1,18 @@ -############################################################################# -# Copyright (C) The Apache Software Foundation. All rights reserved. # -# ------------------------------------------------------------------------- # -# This software is published under the terms of the Apache Software License # -# version 1.1, a copy of which has been included with this distribution in # -# the LICENSE file. # -############################################################################# +# +# Copyright 1999-2005 The Apache Software Foundation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # # AWT viewer's GUI resources. Default bundle. # @@ -18,10 +26,16 @@ Menu.Last.page=Last page Menu.Go.to.Page=Go to Page Menu.Help=Help Menu.Default.zoom=Default zoom -Menu.About=About -Menu.Print=Print +Menu.About=About Apache FOP... +Menu.Print=Print... Menu.Zoom=Zoom Menu.Reload=Reload +Menu.Fit.Window=Fit in window +Menu.Fit.Width=Fit Width +Menu.Single=Single Page +Menu.Continuous=Continuous +Menu.Facing=Continuous Facing +Menu.Debug=Debug Title.Preview=Preview @@ -37,8 +51,8 @@ Label.Page.number=Page number Button.Ok=Ok Button.Cancel=Cancel -About.Product=FOP AWT Viewer +About.Product=Apache FOP - AWT Viewer About.Version=Version: About.Copyright=See http://xml.apache.org/fop -About.Title=About +About.Title=About Apache FOP diff --git a/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_de.properties b/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_de.properties index 63ebb8785..a61116dc5 100644 --- a/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_de.properties +++ b/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_de.properties @@ -1,10 +1,18 @@ -############################################################################# -# Copyright (C) The Apache Software Foundation. All rights reserved. # -# ------------------------------------------------------------------------- # -# This software is published under the terms of the Apache Software License # -# version 1.1, a copy of which has been included with this distribution in # -# the LICENSE file. # -############################################################################# +# +# Copyright 1999-2005 The Apache Software Foundation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # # AWT viewer's GUI resources. German bundle. # @@ -15,18 +23,31 @@ Menu.First.page=Erste Seite Menu.Prev.page=Vorherige Seite Menu.Next.page=N\u00e4chste Seite Menu.Last.page=Letzte Seite +Menu.Go.to.Page=Gehe zur Seite... Menu.Help=Hilfe Menu.Default.zoom=Standardzoom -Menu.About=\u00dcber -Menu.Print=Drucken -Menu.Go.to.Page=Gehe zur Seite +Menu.About=\u00dcber Apache FOP... +Menu.Print=Drucken... +Menu.Zoom=Zoom +Menu.Reload=Neu laden +Menu.Fit.Window=In Fenster einpassen +Menu.Fit.Width=Auf Seitenbreite einpassen +Menu.Single=Einzelseiten +Menu.Continuous=Fortlaufende Seiten +Menu.Facing=Seiten nebeneinander und fortlaufend Title.Preview=Vorschau Status.Show=Anzeigen Status.Page=Seite Status.of=von -Status.Build.FO.tree=Baue FO-Baum +Status.Build.FO.tree=Baue FO-Baum... + +Exception.Occured=Es wurde ein Fehler festgestellt +Exception.Error=Fehler -Button.Cancel=Abbrechen Label.Page.number=Seitennummer +Button.Ok=OK +Button.Cancel=Abbrechen + +About.Title=\u00dber Apache FOP diff --git a/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_fr.properties b/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_fr.properties index 89bb37a64..7464121a8 100644 --- a/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_fr.properties +++ b/src/java/org/apache/fop/render/awt/viewer/resources/Viewer_fr.properties @@ -1,21 +1,52 @@ -############################################################################# -# Copyright (C) The Apache Software Foundation. All rights reserved. # -# ------------------------------------------------------------------------- # -# This software is published under the terms of the Apache Software License # -# version 1.1, a copy of which has been included with this distribution in # -# the LICENSE file. # -############################################################################# +# +# Copyright 1999-2005 The Apache Software Foundation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # # AWT viewer's GUI resources. French bundle. # Menu.File=Fichier -Menu.Print=Imprimer Menu.Exit=Quitter Menu.View=Affichage Menu.First.page=Premi\u00e8re page Menu.Prev.page=Page pr\u00e9c\u00e9dente Menu.Next.page=Page suivante Menu.Last.page=Derni\u00e8re page +Menu.Go.to.Page=Aller à la page... Menu.Help=Aide Menu.Default.zoom=Zoom par d\u00e9faut -Menu.About=A propos +Menu.About=\u00c0 propos Apache FOP +Menu.Print=Imprimer... +Menu.Reload=Redémarrer +Menu.Fit.Window=Ajuster dans la fen\u00eatre +Menu.Fit.Width=Ajuster sur la largeur de la page +Menu.Single=Pages s\u00e9par\u00e9es +Menu.Continuous=Pages continues +Menu.Facing=Pages juxtapos\u00e9es + +Title.Preview=Pr\u00e9sentation + +Status.Show=Pr\u00e9senter +Status.Page=Page +Status.of=de +Status.Build.FO.tree=Construisant l'arbre FO... + +Exception.Occured=Une erreur a \u00e9t\u00e9 constatée +Exception.Error=Erreur + +Label.Page.number=Num\u00e9ro de page +Button.Ok=OK +Button.Cancel=Annuler + +About.Title=\u00c0 propos Apache FOP diff --git a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java index 69a3ac6cb..9952234fe 100644 --- a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java +++ b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java @@ -35,7 +35,6 @@ import java.awt.image.DataBufferByte; import java.awt.image.PixelInterleavedSampleModel; import java.awt.image.Raster; import java.awt.image.SampleModel; -import java.awt.image.SinglePixelPackedSampleModel; import java.awt.image.WritableRaster; import java.io.IOException; import java.io.OutputStream; @@ -148,7 +147,8 @@ public abstract class Java2DRenderer extends AbstractRenderer { public boolean renderingDone; /** Default constructor */ - public Java2DRenderer() {} + public Java2DRenderer() { + } /** * @see org.apache.fop.render.Renderer#setUserAgent(org.apache.fop.apps.FOUserAgent) @@ -226,14 +226,6 @@ public abstract class Java2DRenderer extends AbstractRenderer { setCurrentPageNumber(0); } - /** - * @param the 0-based pageIndex - * @return the corresponding PageViewport - */ - public PageViewport getPageViewport(int pageIndex) { - return (PageViewport) pageViewportList.get(pageIndex); - } - /** * This method override only stores the PageViewport in a List. No actual * rendering is performed here. A renderer override renderPage() to get the @@ -245,9 +237,9 @@ public abstract class Java2DRenderer extends AbstractRenderer { * the Area Tree * @see org.apache.fop.render.Renderer */ - public void renderPage(PageViewport pageViewport) throws IOException, - FOPException { - pageViewportList.add(pageViewport.clone());// FIXME clone + public void renderPage(PageViewport pageViewport) + throws IOException, FOPException { + pageViewportList.add(pageViewport.clone()); // FIXME clone currentPageNumber++; } @@ -321,6 +313,21 @@ public abstract class Java2DRenderer extends AbstractRenderer { return currentPageImage; } + + /** + * Returns the page viewport + * @param pageNum the page number + * @exception FOPException If the page is out of range. + */ + public PageViewport getPageViewport(int pageNum) throws FOPException { + if (pageNum < 0 || pageNum >= pageViewportList.size()) { + throw new FOPException("Requested page number is out of range: " + pageNum + + "; only " + pageViewportList.size() + + " page(s) available."); + } + return (PageViewport) pageViewportList.get(pageNum); + } + /** * Generates a desired page from the renderer's page viewport list. * @@ -330,14 +337,7 @@ public abstract class Java2DRenderer extends AbstractRenderer { * @throws FOPException */ public BufferedImage getPageImage(int pageNum) throws FOPException { - if (pageNum < 0 || pageNum >= pageViewportList.size()) { - throw new FOPException("out-of-range page number (" + pageNum - + ") requested; only " + pageViewportList.size() - + " page(s) available."); - } - PageViewport pageViewport = (PageViewport) pageViewportList - .get(pageNum); - return getPageImage(pageViewport); + return getPageImage(getPageViewport(pageNum)); } /** diff --git a/src/java/org/apache/fop/render/print/PrintRenderer.java b/src/java/org/apache/fop/render/print/PrintRenderer.java index 3e165ccec..bb52ac2ff 100644 --- a/src/java/org/apache/fop/render/print/PrintRenderer.java +++ b/src/java/org/apache/fop/render/print/PrintRenderer.java @@ -142,7 +142,7 @@ public class PrintRenderer extends Java2DRenderer implements Pageable, Printable public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException { - if (pageIndex >= getNumberOfPages()){ + if (pageIndex >= getNumberOfPages()) { return NO_SUCH_PAGE; } @@ -156,37 +156,43 @@ public class PrintRenderer extends Java2DRenderer implements Pageable, Printable return NO_SUCH_PAGE; } - g2.drawImage(image,null,0,0); + g2.drawImage(image, null, 0, 0); return PAGE_EXISTS; } + /** @see java.awt.print.Pageable#getPageFormat(int) */ public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException { - if (pageIndex >= getNumberOfPages()) - return null; - - PageFormat pageFormat = new PageFormat(); - - Paper paper = new Paper(); - pageFormat.setPaper(paper); - - Rectangle2D dim = getPageViewport(pageIndex).getViewArea(); - double width = dim.getWidth(); - double height = dim.getHeight(); - - // if the width is greater than the height assume lanscape mode - // and swap the width and height values in the paper format - if (width > height) { - paper.setImageableArea(0, 0, height / 1000d, width / 1000d); - paper.setSize(height / 1000d, width / 1000d); - pageFormat.setOrientation(PageFormat.LANDSCAPE); - } else { - paper.setImageableArea(0, 0, width / 1000d, height / 1000d); - paper.setSize(width / 1000d, height / 1000d); - pageFormat.setOrientation(PageFormat.PORTRAIT); + try { + if (pageIndex >= getNumberOfPages()) { + return null; + } + + PageFormat pageFormat = new PageFormat(); + + Paper paper = new Paper(); + pageFormat.setPaper(paper); + + Rectangle2D dim = getPageViewport(pageIndex).getViewArea(); + double width = dim.getWidth(); + double height = dim.getHeight(); + + // if the width is greater than the height assume lanscape mode + // and swap the width and height values in the paper format + if (width > height) { + paper.setImageableArea(0, 0, height / 1000d, width / 1000d); + paper.setSize(height / 1000d, width / 1000d); + pageFormat.setOrientation(PageFormat.LANDSCAPE); + } else { + paper.setImageableArea(0, 0, width / 1000d, height / 1000d); + paper.setSize(width / 1000d, height / 1000d); + pageFormat.setOrientation(PageFormat.PORTRAIT); + } + return pageFormat; + } catch (FOPException fopEx) { + throw new IndexOutOfBoundsException(fopEx.getMessage()); } - return pageFormat; } public Printable getPrintable(int pageIndex) -- 2.39.5