/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.print; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.openflexo.foundation.gen.ScreenshotGenerator; import org.openflexo.localization.FlexoLocalization; import org.openflexo.toolbox.FileUtils; import org.openflexo.view.FlexoDialog; import org.openflexo.view.controller.FlexoController; public class PrintPreviewDialog extends FlexoDialog { protected static final Logger logger = Logger.getLogger(PrintPreviewDialog.class.getPackage().getName()); public enum ReturnedStatus { CONTINUE_PRINTING, CANCELLED }; protected PrintManagingController _controller; protected ReturnedStatus status = ReturnedStatus.CONTINUE_PRINTING; protected FlexoPrintableComponent _printableComponent; private JTextField scaleTF; private JLabel pagesLabel; private JScrollPane scrollPane; public PrintPreviewDialog(PrintManagingController controller, FlexoPrintableComponent printableProcessView) { super(controller.getFlexoFrame(), true); _controller = controller; _printableComponent = printableProcessView; setTitle(FlexoLocalization.localizedForKey("print_preview")); JPanel topPanel = new JPanel(new FlowLayout()); JButton plusScale = new JButton("+"); JButton minusScale = new JButton("-"); final JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 0, 500, 100); slider.setMajorTickSpacing(100); slider.setMinorTickSpacing(20); slider.setPaintTicks(true); slider.setPaintLabels(true); pagesLabel = new JLabel("?? x ?? pages"); scaleTF = new JTextField("" + (int) (printableProcessView.getPrintableDelegate().getScale() * 100) + "%"); topPanel.add(minusScale); topPanel.add(slider); topPanel.add(scaleTF); topPanel.add(plusScale); topPanel.add(pagesLabel); final ChangeListener sliderChangeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (slider.getValue() > 0) { _printableComponent.getPrintableDelegate().setScale((double) slider.getValue() / 100); update(); _printableComponent.getPrintableDelegate().refresh(); } } }; plusScale.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().setScale(_printableComponent.getPrintableDelegate().getScale() * 1.1); update(); slider.removeChangeListener(sliderChangeListener); slider.setValue((int) (_printableComponent.getPrintableDelegate().getScale() * 100)); slider.addChangeListener(sliderChangeListener); _printableComponent.getPrintableDelegate().refresh(); } }); minusScale.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().setScale(_printableComponent.getPrintableDelegate().getScale() * 0.9); update(); slider.removeChangeListener(sliderChangeListener); slider.setValue((int) (_printableComponent.getPrintableDelegate().getScale() * 100)); slider.addChangeListener(sliderChangeListener); _printableComponent.getPrintableDelegate().refresh(); } }); slider.addChangeListener(sliderChangeListener); printableProcessView.getPrintableDelegate().preview(controller.getPrintManager().getPageFormat()); scrollPane = new JScrollPane((Component) printableProcessView); scrollPane.getViewport().setPreferredSize(new Dimension(700, 500)); final JSlider previewScaleSlider = new JSlider(SwingConstants.VERTICAL, 0, 200, 100); previewScaleSlider.setMajorTickSpacing(50); previewScaleSlider.setMinorTickSpacing(10); previewScaleSlider.setPaintTicks(true); previewScaleSlider.setPaintLabels(true); final ChangeListener previewScaleChangeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (previewScaleSlider.getValue() > 0) { _printableComponent.getPrintableDelegate().setPreviewScale((double) previewScaleSlider.getValue() / 100); update(); _printableComponent.getPrintableDelegate().refresh(); } } }; previewScaleSlider.addChangeListener(previewScaleChangeListener); final JCheckBox showPages = new JCheckBox(FlexoLocalization.localizedForKey("show_pages"), _printableComponent .getPrintableDelegate().showPages()); showPages.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().setShowPages(showPages.isSelected()); update(); _printableComponent.getPrintableDelegate().refresh(); } }); final JCheckBox showTitle = new JCheckBox(FlexoLocalization.localizedForKey("show_title"), _printableComponent .getPrintableDelegate().showTitles()); showTitle.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().setShowTitles(showTitle.isSelected()); update(); _printableComponent.getPrintableDelegate().refresh(); } }); final JTextField titleTF = new JTextField(30); titleTF.setText(_printableComponent.getPrintableDelegate().getPrintTitle()); titleTF.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().setPrintTitle(titleTF.getText()); update(); _printableComponent.getPrintableDelegate().refresh(); } }); JPanel paramsPanel = new JPanel(new FlowLayout()); paramsPanel.add(showPages); paramsPanel.add(showTitle); paramsPanel.add(titleTF); JPanel centerPane = new JPanel(new BorderLayout()); centerPane.add(previewScaleSlider, BorderLayout.WEST); centerPane.add(scrollPane, BorderLayout.CENTER); centerPane.add(paramsPanel, BorderLayout.SOUTH); JPanel bottomPanel = new JPanel(new FlowLayout()); JButton printButton = new JButton(); printButton.setText(FlexoLocalization.localizedForKey("print", printButton)); printButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { status = ReturnedStatus.CONTINUE_PRINTING; print(); dispose(); } }); JButton saveAsJPGButton = new JButton(); saveAsJPGButton.setText(FlexoLocalization.localizedForKey("save_as_image", saveAsJPGButton)); saveAsJPGButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { status = ReturnedStatus.CANCELLED; saveAsJpeg(); dispose(); } }); JButton cancelButton = new JButton(); cancelButton.setText(FlexoLocalization.localizedForKey("cancel", cancelButton)); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { status = ReturnedStatus.CANCELLED; dispose(); } }); JButton pageSetupButton = new JButton(); pageSetupButton.setText(FlexoLocalization.localizedForKey("page_setup", pageSetupButton)); pageSetupButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().setPageFormat(_controller.getPrintManager().pageSetup()); update(); slider.removeChangeListener(sliderChangeListener); slider.setValue((int) (_printableComponent.getPrintableDelegate().getScale() * 100)); slider.addChangeListener(sliderChangeListener); _printableComponent.getPrintableDelegate().refresh(); } }); JButton fitToPageButton = new JButton(); fitToPageButton.setText(FlexoLocalization.localizedForKey("fit_to_page", fitToPageButton)); fitToPageButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _printableComponent.getPrintableDelegate().fitToPage(); update(); slider.removeChangeListener(sliderChangeListener); slider.setValue((int) (_printableComponent.getPrintableDelegate().getScale() * 100)); slider.addChangeListener(sliderChangeListener); _printableComponent.getPrintableDelegate().refresh(); } }); bottomPanel.add(printButton); bottomPanel.add(saveAsJPGButton); bottomPanel.add(cancelButton); bottomPanel.add(pageSetupButton); bottomPanel.add(fitToPageButton); JPanel contentPane = new JPanel(new BorderLayout()); contentPane.add(topPanel, BorderLayout.NORTH); contentPane.add(centerPane, BorderLayout.CENTER); contentPane.add(bottomPanel, BorderLayout.SOUTH); getRootPane().setDefaultButton(printButton); getContentPane().add(contentPane); setDefaultCloseOperation(DISPOSE_ON_CLOSE); validate(); pack(); update(); setVisible(true); } protected void update() { scaleTF.setText("" + (int) (_printableComponent.getPrintableDelegate().getScale() * 100) + "%"); pagesLabel.setText(_printableComponent.getPrintableDelegate().getWidthPageNb() + " x " + _printableComponent.getPrintableDelegate().getHeightPageNb() + " " + FlexoLocalization.localizedForKey("pages")); scrollPane.getViewport().reshape(scrollPane.getViewport().getViewPosition().x, scrollPane.getViewport().getViewPosition().y, _printableComponent.getWidth(), _printableComponent.getHeight()); scrollPane.revalidate(); scrollPane.repaint(); } public ReturnedStatus getStatus() { return status; } public void print() { _controller.getPrintManager().printPageable(_printableComponent.getPrintableDelegate()); } public void saveAsJpeg() { JFileChooser chooser = new JFileChooser(); chooser.setDialogType(JFileChooser.SAVE_DIALOG); chooser.setDialogTitle(FlexoLocalization.localizedForKey("save_as_image", chooser)); File dest = null; int returnVal = chooser.showSaveDialog(null); if (returnVal == JFileChooser.CANCEL_OPTION) { return; } if (returnVal == JFileChooser.APPROVE_OPTION) { if (isValidProjectName(chooser.getSelectedFile().getName())) { dest = chooser.getSelectedFile(); if (!dest.getName().toLowerCase().endsWith(".png")) { dest = new File(dest.getAbsolutePath() + ".png"); } } else { if (logger.isLoggable(Level.WARNING)) { logger.warning("Invalid file name. The following characters are not allowed: " + FileUtils.BAD_CHARACTERS_FOR_FILE_NAME_REG_EXP); } FlexoController.notify(FlexoLocalization.localizedForKey("file_name_cannot_contain_\\___&_#_{_}_[_]_%_~")); } } else { if (logger.isLoggable(Level.WARNING)) { logger.warning("No project specified !"); } } if (dest == null) { return; } ScreenshotGenerator.ScreenshotImage image = ScreenshotGenerator.getImage(getPrintableComponent().getFlexoModelObject()); try { if (!dest.exists()) { FileUtils.createNewFile(dest); } ImageIO.write(image.image, "png", dest); } catch (Exception e) { e.printStackTrace(); FlexoController.showError(e.getMessage()); } } private static boolean isValidProjectName(String absolutePath) { return absolutePath != null && absolutePath.trim().length() > 0 && !FileUtils.BAD_CHARACTERS_FOR_FILE_NAME_PATTERN.matcher(absolutePath).find(); } public FlexoPrintableComponent getPrintableComponent() { return _printableComponent; } }