/*  SimplePrintPreviewDialog
    (C) Copyright 2009
    Wildcrest Associates
    http://www.wildcrest.com
This source code may be freely used, modified, incorporated, and
distributed without restriction as part of any software that uses
J2PrinterWorks by Wildcrest Associates.
*/

import com.wildcrest.j2printerworks.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class SimplePrintPreviewDialog extends JDialog {
   public static final int CANCEL = 0;
   public static final int PRINT = 1;
   public static final int PAGESETUP = 2;

   private J2Printer printer;
   private int retVal;
   private ImagePanel imagePanel;
   private JSlider previewSlider;
   private JLabel previewSliderLabel;

   SimplePrintPreviewDialog(Frame frame, J2Printer printer) {
      super(frame, "Print Preview", true); // true = modal
      this.printer = printer;
      this.setResizable(false);

   // print preview panel
      JPanel previewPanel = new JPanel();
      previewPanel.setLayout(new BorderLayout());
      //add if want titled border: previewPanel.setBorder(new TitledBorder("Preview"));
      imagePanel = new ImagePanel(printer.getPageImage(1,.5,2,true)); // use drop shadow
      imagePanel.setBackground(this.getContentPane().getBackground());
      JPanel squareImagePanel = new JPanel();
      squareImagePanel.setLayout(new BorderLayout());
      int size = Math.max(imagePanel.getPreferredSize().height, imagePanel.getPreferredSize().width);
      squareImagePanel.setPreferredSize(new Dimension(size, size));
      squareImagePanel.add(imagePanel, "Center");

      previewPanel.add(squareImagePanel, "Center");
      int numberOfPages = printer.getPageable().getNumberOfPages();
      previewSlider = new JSlider(1,numberOfPages,1);
      previewSlider.setSnapToTicks(true);
      JPanel previewSliderPanel = new JPanel();
      previewSliderPanel.setBorder(new EmptyBorder(5,5,5,5));
      previewSliderPanel.setLayout(new BorderLayout());
      previewSliderLabel = new JLabel("Page 1 of " + numberOfPages, JLabel.CENTER);
      previewSliderPanel.add(previewSliderLabel, "South");
      previewSliderPanel.add(previewSlider, "North");

      previewPanel.add(previewSliderPanel, "South");
      previewSlider.addChangeListener(new ChangeListener() {
         public void stateChanged(ChangeEvent e) { previewSliderChanged(); }});

      this.getContentPane().add(previewPanel, "Center");

   // print + page setup + cancel buttons
      JPanel printCancel = new JPanel();
      JButton printButton = new JButton("Print");
      printButton.setFocusPainted(false);
      JButton pageSetupButton = new JButton("Page Setup");
      JButton cancelButton = new JButton("Cancel");
      printCancel.setLayout(new FlowLayout(FlowLayout.CENTER));
      printCancel.add(printButton);
      printCancel.add(pageSetupButton);
      printCancel.add(cancelButton);
      this.getContentPane().add(printCancel, "North");

      printButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) { print(); }});
      pageSetupButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) { pageSetup(); }});
      cancelButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) { cancel(); }});

      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) { cancel(); }});

      updateUI();

      pack();

      Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
      Rectangle frameDim = getBounds();
      setLocation( (screenDim.width - frameDim.width) / 2, (screenDim.height - frameDim.height) / 2);
   }

   void updateUI() {
      // update prieview UI
      if (previewSlider!=null) {
         int numberOfPages = printer.getPageable().getNumberOfPages();
         int val = previewSlider.getValue();
         previewSliderLabel.setText("Page " + val + " of " + numberOfPages);
         imagePanel.setImage(printer.getPageImage(val, .5, 2, true)); // use drop shadow
       }

       repaint();
   }

   void previewSliderChanged() {
      updateUI();
   }

   public int showDialog() {
      setVisible(true);
      return retVal;
   }

   public void print() {
      retVal = SimplePrintPreviewDialog.PRINT;
      setVisible(false);
   }

   public void pageSetup() {
      retVal = SimplePrintPreviewDialog.PAGESETUP;
      setVisible(false);
   }

   public void cancel() {
      retVal = SimplePrintPreviewDialog.CANCEL;
      setVisible(false);
   }

}

