/*  J2TreePrinter 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 javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.io.*;
import java.util.*;
import com.wildcrest.j2printerworks.*;

public class J2TreePrinterTestApplication extends JApplet {
   public void init() {
      getContentPane().setLayout(new BorderLayout(0, 0));
      setSize(700, 527);
      JPanel0.setDoubleBuffered(false);
      JPanel0.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
      getContentPane().add(BorderLayout.NORTH, JPanel0);
      JButton0.setText("New directory");
      JButton0.setActionCommand("Print");
      JPanel0.add(JButton0);
      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);
      JButton1.setText("Print");
      JButton1.setActionCommand("Print");
      JPanel1.add(JButton1);
      JButton2.setText("Print Preview");
      JButton2.setActionCommand("Print");
      JPanel1.add(JButton2);
      JButton3.setText("Simple Page Setup");
      JButton3.setActionCommand("Print");
      JPanel1.add(JButton3);
      JButton4.setText("Detailed Page Setup");
      JButton4.setActionCommand("Print");
      JPanel1.add(JButton4);
      JLabelSpacer.setText("  ");
      JPanel1.add(JLabelSpacer);
      JPanel1.add(JLabel1);

      //System.out.println(System.getProperty("java.version"));
      JButton0.setFocusPainted(false); // turn off "has focus" display

      directory = new File("..");

      // enable these 5 lines to prompt for directory at beginning
      /*
      JFileChooser chooser = new JFileChooser();
      chooser.setCurrentDirectory(directory);
      chooser.setFileSelectionMode(chooser.DIRECTORIES_ONLY);
      chooser.setDialogTitle("Select a directory then Open");
      if (chooser.showOpenDialog(getParent())==JFileChooser.APPROVE_OPTION) directory = chooser.getSelectedFile();
       */

      tree = makeFileTree(directory.getAbsolutePath());
      expandAllRows(tree);

      printer = new J2Printer();
      printer.addPropertyChangeListener(new MyPrintingEventHandler());

      // locale tests (either of the next two lines work):
      //java.util.Locale.setDefault(java.util.Locale.JAPAN); // set overall default locale...
      //printer.setLocale(java.util.Locale.FRANCE);           // ...or set locale for the printer
      //         use arg: new java.util.Locale("nl","NL") if Locale not predefined in Java

      treePrinter = new J2TreePrinter();
      treePrinter.setTree(tree);
      tree.setPreferredSize(new Dimension(614, tree.getPreferredSize().height));
      getContentPane().add(new JScrollPane(tree), "Center");

      // Java-style border: tree.setBorder(new javax.swing.border.LineBorder(Color.green,20));
      // J2PW-style border: treePrinter.setOutsideLines(true);
      // (can use either or both)

      SymAction lSymAction = new SymAction();
      JButton1.addActionListener(lSymAction);
      JButton2.addActionListener(lSymAction);
      JButton3.addActionListener(lSymAction);
      JButton4.addActionListener(lSymAction);
      JButton0.addActionListener(lSymAction);
    }

   javax.swing.JPanel JPanel0 = new javax.swing.JPanel();
   javax.swing.JButton JButton0 = new javax.swing.JButton();
   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 JButton1 = new javax.swing.JButton();
   javax.swing.JButton JButton2 = new javax.swing.JButton();
   javax.swing.JButton JButton3 = new javax.swing.JButton();
   javax.swing.JButton JButton4 = new javax.swing.JButton();
   javax.swing.JLabel JLabelSpacer = new javax.swing.JLabel();
   javax.swing.JLabel JLabel1 = new javax.swing.JLabel();

   J2Printer printer;
   J2TreePrinter treePrinter;
   JTree tree;
   File directory;

   class MyPrintingEventHandler extends PrintingEventHandler {
      int totalPages;

      public void printingStart() {
         showProgress("About to print..."); // printing started
         totalPages = printer.getPageable().getNumberOfPages(); // expensive so do only once
      }

      public void printingDone() {
         windowToFront(); // needed prior to JDK 1.4.1 due to Bug Parade #4514422
         brieflyShowProgress("Printing done");
      }

      public void printDialogOK() {
         windowToFront(); // needed prior to JDK 1.4.1 due to Bug Parade #4514422
         showProgress("Start printing...");
      }

      public void printDialogCanceled() {
         windowToFront(); // needed prior to JDK 1.4.1 due to Bug Parade #4514422
         brieflyShowProgress("Printing canceled");
      }

      public void pageSetupDialogOK() {
         brieflyShowProgress("Page setup dialog OK");
      }

      public void pageSetupDialogCanceled() {
         brieflyShowProgress("Page setup dialog canceled");
      }

      public void pageStart(int pageNum) {
         showProgress("Printing page " + pageNum + " of " + totalPages);
      }

   }

   private void showProgress(String str) {
      JLabel1.setText(str);
   }

   private void brieflyShowProgress(String str) {
      showProgress(str);
      new Thread() {
         public void run() {
            try { sleep(1500); } catch (Exception e) {}
            SwingUtilities.invokeLater( new Runnable() { public void run() { showProgress(" "); } } );
      } }.start(); // from different thread, wait 1 sec then erase
   }

   void windowToFront() { driverFrame.toFront(); } // needed under JDK 1.4 due to Bug Parade #4514422

   // main method so can run applet as an application
   static public void main(String args[]) {
      class DriverFrame extends JFrame {
         public DriverFrame() {
            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
               }
            });
            this.setTitle("J2TreePrinter Test Application");
            this.setSize(640, 480);
            J2TreePrinterTestApplication applet = new J2TreePrinterTestApplication();
            applet.init();
            this.getContentPane().add(applet);
         }
      }

      driverFrame = new DriverFrame();
      driverFrame.show();
   }

   static JFrame driverFrame;

   class SymAction implements java.awt.event.ActionListener {
      public void actionPerformed(java.awt.event.ActionEvent event) {
         Object object = event.getSource();
         if (object == JButton1)
            JButton1_actionPerformed(event);
         else if (object == JButton2)
            JButton2_actionPerformed(event);
         else if (object == JButton3)
            JButton3_actionPerformed(event);
         else if (object == JButton4)
            JButton4_actionPerformed(event);
         else if (object == JButton0)
            JButton0_actionPerformed(event);
      }
   }

   void JButton1_actionPerformed(java.awt.event.ActionEvent event) {
      printer.print(treePrinter);
   }

   void JButton2_actionPerformed(java.awt.event.ActionEvent event) {

      printer.setPrintPreviewScale(1.0);

      // test setIconImage (javax.imageio.ImageIO requires JDK 1.6 or later)
      //try { printer.setPrintPreviewIconImage(javax.imageio.ImageIO.read(new java.io.File("J2PrinterWorksC16.gif")));
      //} catch (Exception e) {}

     // test custom print preview page setup dialog:
      J2TreePrinterPageSetupDialog J2TreePrinterPageSetupDialog1 = new J2TreePrinterPageSetupDialog(printer, treePrinter);
      J2TreePrinterPageSetupDialog1.setModal(true);
      J2TreePrinterPageSetupDialog1.setTitle("Page Setup");
      //printer.PreviewPageSetupDialog(J2TreePrinterPageSetupDialog1);

      // test omitting Page Setup button from Print Preview dialog:
      //printer.showPrintPreviewPageSetupButton(false);

      // NOTE: "this" = Component from which dialog is displayed, so dialog is brought to front along with JApplet
      printer.showPrintPreviewDialog(driverFrame, treePrinter);
   }

   void JButton3_actionPerformed(java.awt.event.ActionEvent event) {
      // Simple (system) Page Setup:
      printer.showPageSetupDialog();
      windowToFront(); // needed under JDK 1.4 due to Bug Parade #4514422

   }

   void JButton4_actionPerformed(java.awt.event.ActionEvent event) {
      // Detailed Page Setup:
      J2TreePrinterPageSetupDialog J2TreePrinterPageSetupDialog1 = new J2TreePrinterPageSetupDialog(printer, treePrinter);
      J2TreePrinterPageSetupDialog1.setModal(true);
      J2TreePrinterPageSetupDialog1.setTitle("Page Setup");
      J2TreePrinterPageSetupDialog1.show();
   }

   void JButton0_actionPerformed(java.awt.event.ActionEvent event) { // new directory
      JFileChooser chooser = new JFileChooser();
      chooser.setCurrentDirectory(directory);

      chooser.setFileSelectionMode(chooser.DIRECTORIES_ONLY);
      chooser.setDialogTitle("Select a directory then Open");
      if (chooser.showOpenDialog(getParent()) != JFileChooser.APPROVE_OPTION)
         return;

      File newDir = chooser.getSelectedFile();
      if (newDir.equals(directory))
         return;
      directory = newDir;

      JTree newtree = makeFileTree(directory.getAbsolutePath());
      tree.setModel(newtree.getModel());
      expandAllRows(tree);
      treePrinter.setTree(tree);
      repaint();
   }

// make JTree for file directories
   JTree makeFileTree(String path) {
      DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("root");
      File f = new File(path);
      if (path.equals("."))
         f = new File(new File(new File(new File(path).list()[0]).getAbsolutePath()).getParent());
      buildTree(rootNode, f.getParent(), f.getName());
      return new JTree(rootNode.getFirstChild());
   }

   void buildTree(DefaultMutableTreeNode node, String path, String file) {
      path = path + File.separator + file;
      File f = new File(path);
      if (f.isDirectory()) {
         DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(file);
         String[] files = f.list();
         for (int i = 0; i < files.length; i++)
            buildTree(newNode, path, files[i]);
         node.add(newNode);
      }
      else
         node.add(new DefaultMutableTreeNode(file, false));
   }

   void expandAllRows(JTree tree) { // brute force JTree row expander
      while (true) {
         int rowCount = tree.getRowCount();
         for (int i = 0; i < rowCount; i++)
            tree.expandRow(i);
         if (rowCount == tree.getRowCount())
            break;
      }
   }

}
