/*  J2PrintToImage Test Application
    (C) Copyright 2007
    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 java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.table.*;
import java.io.*;
import java.util.*;
import com.wildcrest.j2printerworks.*;

public class J2PrintToImageTest extends JFrame {
   public J2PrintToImageTest() {
      getContentPane().setLayout(new BorderLayout(0, 0));
      setSize(800, 527);
      setVisible(false);
      JScrollPane1.setOpaque(true);
      getContentPane().add(BorderLayout.CENTER, JScrollPane1);
      JTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
      JScrollPane1.getViewport().add(JTable1);
      JTable1.setFont(new Font("Dialog", Font.PLAIN, 11));
      JTable1.setBounds(0, 0, 0, 0);
      JPanel1.setAlignmentY(0.0F);
      JPanel1.setLayout(new BoxLayout(JPanel1, BoxLayout.X_AXIS));
      getContentPane().add(BorderLayout.SOUTH, JPanel1);
      JButtonPrintToFile.setText("Print to File");
      JButtonPrintToFile.setActionCommand("Print");
      JPanel1.add(JButtonPrintToFile);
      JLabelSpacer1.setText("    ");
      JPanel1.add(JLabelSpacer1);
      JLabel1.setText("Page:");
      JPanel1.add(JLabel1);
      JLabel1.setFont(new Font("Dialog", Font.BOLD, 11));
      JTextFieldPageNum.setText("1");
      JTextFieldPageNum.setColumns(3);
      JPanel1.add(JTextFieldPageNum);
      JLabelSpacer2.setText("    ");
      JPanel1.add(JLabelSpacer2);
      JLabel2.setText("Scale:");
      JPanel1.add(JLabel2);
      JLabel2.setFont(new Font("Dialog", Font.BOLD, 11));
      JTextFieldScale.setText("1.0");
      JTextFieldScale.setColumns(3);
      JPanel1.add(JTextFieldScale);
      JLabelSpacer3.setText("    ");
      JPanel1.add(JLabelSpacer3);
      JCheckBoxOutline.setText("Draw outline");
      JCheckBoxOutline.setActionCommand("Draw outline");
      JCheckBoxOutline.setSelected(true);
      JPanel1.add(JCheckBoxOutline);
      JCheckBoxOutline.setFont(new Font("Dialog", Font.BOLD, 11));
      JLabelSpacer4.setText("    ");
      JPanel1.add(JLabelSpacer4);
      JLabel3.setText("File name:");
      JPanel1.add(JLabel3);
      JLabel3.setFont(new Font("Dialog", Font.BOLD, 11));
      JTextFieldFileName.setText("page1.jpg");
      JTextFieldFileName.setColumns(20);
      JPanel1.add(JTextFieldFileName);

      directory = new File(".");
      if (System.getProperty("os.name").startsWith("Windows"))
         directory = new File("C:\\");

      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      attributes = readDirectory(directory);
      JTable1.setModel(new MyTableModel(attributes));
      adjustColumnWidths(JTable1);

      pack();
      setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

      printer = new J2Printer();
      tablePrinter = new J2TablePrinter();
      tablePrinter.setTable(JTable1);
      tablePrinter.setMaximumPages(1, 0);
      printer.setPageable(tablePrinter);

      SymAction lSymAction = new SymAction();
      JButtonPrintToFile.addActionListener(lSymAction);
      SymItem lSymItem = new SymItem();
      JCheckBoxOutline.addItemListener(lSymItem);

      javax.swing.text.Document doc = JTextFieldPageNum.getDocument();
      doc.addDocumentListener(new javax.swing.event.DocumentListener() {
         public void changedUpdate(javax.swing.event.DocumentEvent e) {
            updateFileName();
         }

         public void insertUpdate(javax.swing.event.DocumentEvent e) {
            updateFileName();
         }

         public void removeUpdate(javax.swing.event.DocumentEvent e) {
            updateFileName();
         }
      });

      addWindowListener(new java.awt.event.WindowAdapter() {
         public void windowClosing(java.awt.event.WindowEvent event) {
            dispose(); // free the system resources
            System.exit(0); // close the application
         }
      });

   }

   public J2PrintToImageTest(String title) {
      this();
      setTitle(title);
   }

   void updateFileName() {
      JTextFieldFileName.setText("page" + JTextFieldPageNum.getText() + ".jpg");
   }

   class MyTableModel extends AbstractTableModel {
      String[] columnNames = {"Name", "Length", "Last modified", "Directory",
          "Read", "Write", "Hidden", "Path"};
      Vector[] attributes;
      MyTableModel(Vector[] attributes) {
         this.attributes = attributes;
      }

      public int getColumnCount() {
         return columnNames.length;
      }

      public int getRowCount() {
         return attributes[0].size();
      }

      public String getColumnName(int col) {
         return columnNames[col];
      }

      public Object getValueAt(int row, int col) {
         return attributes[col].elementAt(row);
      }

      public Class getColumnClass(int col) {
         return getValueAt(0, col).getClass();
      }

      public boolean isCellEditable(int row, int col) {
         return true;
      }

      public void setValueAt(Object value, int row, int col) {
         attributes[col].setElementAt(value, row);
         fireTableCellUpdated(row, col);
      }
   }

   ImageIcon getImageIcon(String fileName) {
      return new ImageIcon(this.getClass().getResource(fileName)); // works either from .jar or loose files
   }

   Vector[] readDirectory(File directory) {
      Vector[] attributes = new Vector[8];
      ImageIcon check = getImageIcon("images" + File.separator + "check.gif");
      ImageIcon ex = getImageIcon("images" + File.separator + "ex.gif");
      ImageIcon red = getImageIcon("images" + File.separator + "red-ball.gif");
      ImageIcon yellow = getImageIcon("images" + File.separator + "yellow-ball.gif");
      ImageIcon green = getImageIcon("images" + File.separator + "green-ball.gif");
      ImageIcon white = getImageIcon("images" + File.separator + "white-ball.gif");

      for (int i = 0; i < 8; i++)
         attributes[i] = new Vector();
      String path = directory.getPath();
      String[] contents = directory.list();
      for (int i = 0; i < contents.length; i++) {
         String fullName = path + File.separator + contents[i];
         File f = new File(fullName);
         attributes[0].addElement(f.getName());
         attributes[1].addElement(new Long(f.length()));
         attributes[2].addElement(new Date(f.lastModified()).toString());

         // fancy image versions (nice but 3-4X slower on JDK 1.2.2):
         attributes[3].addElement(f.isDirectory() ? check : white);
         attributes[4].addElement(f.canRead() ? green : red);
         attributes[5].addElement(f.canWrite() ? green : red);
         attributes[6].addElement(f.isHidden() ? yellow : white);

         attributes[7].addElement(f.getPath());
      }
      return attributes;
   }

   void adjustColumnWidths(JTable table) {
      boolean stringCol[] = {true, false, true, false, false, false, false, true};
      int[] headerWidths = {33, 39, 77, 50, 35, 35, 40, 26}; // hard-coded header widths (yuck, see below)
      for (int i = 0; i < table.getColumnCount(); i++) {
         TableColumn column = table.getColumnModel().getColumn(i);
         Component comp;
         int headerWidth = headerWidths[i] + 5;

         TableModel model = table.getModel();
         Object longest;
         if (stringCol[i]) {
            String longestStr = "";
            for (int j = 0; j < model.getRowCount(); j++)
               if ( ( (String) (model.getValueAt(j, i))).length() > longestStr.length())
                  longestStr = (String) (model.getValueAt(j, i));
            longest = longestStr;
         }
         else
            longest = model.getValueAt(0, i);

         comp = table.getDefaultRenderer(model.getColumnClass(i))
             .getTableCellRendererComponent(table, longest, false, false, 0, i);
         int cellWidth = comp.getPreferredSize().width;

         column.setPreferredWidth(Math.max(headerWidth, cellWidth));
      }
      return;
   }

   javax.swing.JScrollPane JScrollPane1 = new javax.swing.JScrollPane();
   javax.swing.JTable JTable1 = new javax.swing.JTable();
   javax.swing.JPanel JPanel1 = new javax.swing.JPanel();
   javax.swing.JButton JButtonPrintToFile = new javax.swing.JButton();
   javax.swing.JLabel JLabelSpacer1 = new javax.swing.JLabel();
   javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
   javax.swing.JTextField JTextFieldPageNum = new javax.swing.JTextField();
   javax.swing.JLabel JLabelSpacer2 = new javax.swing.JLabel();
   javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
   javax.swing.JTextField JTextFieldScale = new javax.swing.JTextField();
   javax.swing.JLabel JLabelSpacer3 = new javax.swing.JLabel();
   javax.swing.JCheckBox JCheckBoxOutline = new javax.swing.JCheckBox();
   javax.swing.JLabel JLabelSpacer4 = new javax.swing.JLabel();
   javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
   javax.swing.JTextField JTextFieldFileName = new javax.swing.JTextField();

   J2Printer printer;
   J2TablePrinter tablePrinter;
   File directory;
   Vector[] attributes;

   static public void main(String args[]) {
      (new J2PrintToImageTest("J2PrintToImage Test Application")).setVisible(true);
   }

   class SymAction implements java.awt.event.ActionListener {
      public void actionPerformed(java.awt.event.ActionEvent event) {
         Object object = event.getSource();
         if (object == JButtonPrintToFile)
            JButtonPrintToFile_actionPerformed(event);
      }
   }

   void JButtonPrintToFile_actionPerformed(java.awt.event.ActionEvent event) {
      int pageNum = Integer.valueOf(JTextFieldPageNum.getText()).intValue();
      double scale = Double.valueOf(JTextFieldScale.getText()).doubleValue();
      String filename = JTextFieldFileName.getText();
      BufferedImage image = printer.getPageImage(pageNum, scale, outline, true);
      printer.saveImageToJPEG(image, filename);

      JFrame frame = new JFrame("Print To Image test");
      ImagePanel imagePanel = new ImagePanel(image);
      frame.getContentPane().add(new JScrollPane(imagePanel));
      frame.pack();
      frame.setVisible(true);
   }

   class SymItem implements java.awt.event.ItemListener {
      public void itemStateChanged(java.awt.event.ItemEvent event) {
         Object object = event.getSource();
         if (object == JCheckBoxOutline)
            JCheckBoxOutline_itemStateChanged(event);
      }
   }

   boolean outline = true;

   void JCheckBoxOutline_itemStateChanged(java.awt.event.ItemEvent event) {
      outline = ( (JCheckBox) (event.getSource())).isSelected();

   }
}
