/*  J2TextPrinter 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.event.*;
import java.beans.*;
import java.io.*;

import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.rtf.*;
import javax.swing.text.html.*;
import javax.swing.tree.*;
import javax.swing.border.*;

import com.wildcrest.j2printerworks.*;

public class J2TextPrinterTestApplication extends javax.swing.JFrame {
   public J2TextPrinterTestApplication() {
      setJMenuBar(JMenuBar1);
      setTitle("J2TextPrinter Test Application");
      getContentPane().setLayout(new BorderLayout(0, 0));
      getContentPane().setBackground(new java.awt.Color(223, 223, 223));
      setSize(600, 440);
      setVisible(false);
      saveFileDialog.setMode(FileDialog.SAVE);
      saveFileDialog.setTitle("Save");
      //$$ saveFileDialog.move(24,336);
      openFileDialog.setMode(FileDialog.LOAD);
      openFileDialog.setTitle("Open");
      //$$ openFileDialog.move(0,336);
      JPanelTextPane1.setLayout(new BorderLayout(0, 0));
      getContentPane().add(BorderLayout.CENTER, JPanelTextPane1);
      JScrollPane1.setOpaque(true);
      JScrollPane1.setDoubleBuffered(true);
      JPanelTextPane1.add(BorderLayout.CENTER, JScrollPane1);
      JScrollPane1.getViewport().add(mainJTextPane);
      mainJTextPane.setBounds(0, 0, 597, 437);
      mainJTextPane.setEditable(false);
      //$$ JMenuBar1.move(168,312);
      fileMenu.setText("File");
      fileMenu.setActionCommand("File");
      fileMenu.setMnemonic( (int) 'F');
      JMenuBar1.add(fileMenu);
      newItem.setText("New");
      newItem.setActionCommand("New");
      newItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.Event.CTRL_MASK));
      newItem.setMnemonic( (int) 'N');
      fileMenu.add(newItem);
      openItem.setText("Open...");
      openItem.setActionCommand("Open...");
      openItem.setMnemonic( (int) 'O');
      fileMenu.add(openItem);
      saveItem.setText("Save");
      saveItem.setActionCommand("Save");
      saveItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.Event.CTRL_MASK));
      saveItem.setMnemonic( (int) 'S');
      fileMenu.add(saveItem);
      saveAsItem.setText("Save As...");
      saveAsItem.setActionCommand("Save As...");
      saveAsItem.setMnemonic( (int) 'A');
      fileMenu.add(saveAsItem);
      saveAsSlides.setText("Save As HTML Slide Show...");
      saveAsSlides.setActionCommand("Save As HTML Slide Show...");
      saveAsSlides.setMnemonic( (int) 'H');
      fileMenu.add(saveAsSlides);
      fileMenu.add(JSeparator1);
      printPreviewItem.setText("Print Preview...");
      printPreviewItem.setActionCommand("Exit");
      fileMenu.add(printPreviewItem);
      pageSetupItem.setText("Simple Page Setup...");
      pageSetupItem.setActionCommand("Exit");
      fileMenu.add(pageSetupItem);
      extendedPageSetupItem.setText("Detailed Page Setup...");
      extendedPageSetupItem.setActionCommand("Exit");
      fileMenu.add(extendedPageSetupItem);
      printItem.setText("Print");
      printItem.setActionCommand("Exit");
      printItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.Event.CTRL_MASK));
      printItem.setMnemonic( (int) 'X');
      fileMenu.add(printItem);
      fileMenu.add(JSeparator2);
      exitItem.setText("Exit");
      exitItem.setActionCommand("Exit");
      exitItem.setMnemonic( (int) 'X');
      fileMenu.add(exitItem);
      editMenu.setText("Edit");
      editMenu.setActionCommand("Edit");
      editMenu.setMnemonic( (int) 'E');
      JMenuBar1.add(editMenu);
      cutItem.setText("Cut");
      cutItem.setActionCommand("Cut");
      cutItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.Event.CTRL_MASK));
      cutItem.setMnemonic( (int) 'T');
      editMenu.add(cutItem);
      copyItem.setText("Copy");
      copyItem.setActionCommand("Copy");
      copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.Event.CTRL_MASK));
      copyItem.setMnemonic( (int) 'C');
      editMenu.add(copyItem);
      pasteItem.setText("Paste");
      pasteItem.setActionCommand("Paste");
      pasteItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.Event.CTRL_MASK));
      pasteItem.setMnemonic( (int) 'P');
      editMenu.add(pasteItem);
      fontMenu.setText("Font");
      fontMenu.setActionCommand("Help");
      fontMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(fontMenu);
      serifItem.setText("Serif");
      serifItem.setActionCommand("Serif");
      serifItem.setSelected(true);
      serifItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.Event.CTRL_MASK));
      fontMenu.add(serifItem);
      sansSerifItem.setText("SansSerif");
      sansSerifItem.setActionCommand("SansSerif");
      sansSerifItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.Event.CTRL_MASK));
      fontMenu.add(sansSerifItem);
      monospacedItem.setText("Monospaced");
      monospacedItem.setActionCommand("Monospaced");
      monospacedItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.Event.CTRL_MASK));
      fontMenu.add(monospacedItem);
      sizeMenu.setText("Size");
      sizeMenu.setActionCommand("Help");
      sizeMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(sizeMenu);
      size8Item.setText("8");
      size8Item.setActionCommand("About...");
      sizeMenu.add(size8Item);
      size10Item.setText("10");
      size10Item.setActionCommand("About...");
      size10Item.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_0, java.awt.Event.CTRL_MASK));
      sizeMenu.add(size10Item);
      size12Item.setText("12");
      size12Item.setActionCommand("About...");
      size12Item.setSelected(true);
      size12Item.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_2, java.awt.Event.CTRL_MASK));
      sizeMenu.add(size12Item);
      size14Item.setText("14");
      size14Item.setActionCommand("About...");
      size14Item.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_4, java.awt.Event.CTRL_MASK));
      sizeMenu.add(size14Item);
      size18Item.setText("18");
      size18Item.setActionCommand("About...");
      size18Item.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_8, java.awt.Event.CTRL_MASK));
      sizeMenu.add(size18Item);
      size20Item.setText("20");
      size20Item.setActionCommand("About...");
      sizeMenu.add(size20Item);
      size24Item.setText("24");
      size24Item.setActionCommand("About...");
      sizeMenu.add(size24Item);
      styleMenu.setText("Style");
      styleMenu.setActionCommand("Help");
      styleMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(styleMenu);
      plainItem.setText("Plain");
      plainItem.setActionCommand("About...");
      plainItem.setSelected(true);
      plainItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.Event.CTRL_MASK));
      styleMenu.add(plainItem);
      boldItem.setText("Bold");
      boldItem.setActionCommand("About...");
      boldItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.Event.CTRL_MASK));
      styleMenu.add(boldItem);
      italicItem.setText("Italic");
      italicItem.setActionCommand("About...");
      italicItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.Event.CTRL_MASK));
      styleMenu.add(italicItem);
      underlineItem.setText("Underline");
      underlineItem.setActionCommand("About...");
      underlineItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.Event.CTRL_MASK));
      styleMenu.add(underlineItem);
      colorMenu.setText("Color");
      colorMenu.setActionCommand("Help");
      colorMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(colorMenu);
      blackItem.setText("Black");
      blackItem.setActionCommand("About...");
      blackItem.setSelected(true);
      blackItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_K, java.awt.Event.CTRL_MASK));
      colorMenu.add(blackItem);
      blueItem.setText("Blue");
      blueItem.setActionCommand("About...");
      blueItem.setForeground(java.awt.Color.blue);
      colorMenu.add(blueItem);
      redItem.setText("Red");
      redItem.setActionCommand("About...");
      redItem.setForeground(new java.awt.Color(128, 0, 0));
      colorMenu.add(redItem);
      greenItem.setText("Green");
      greenItem.setActionCommand("About...");
      greenItem.setForeground(new java.awt.Color(0, 128, 0));
      greenItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.Event.CTRL_MASK));
      colorMenu.add(greenItem);
      alignMenu.setText("Align");
      alignMenu.setActionCommand("Help");
      alignMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(alignMenu);
      leftMenu.setText("Left");
      leftMenu.setActionCommand("About...");
      leftMenu.setSelected(true);
      leftMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.Event.CTRL_MASK));
      alignMenu.add(leftMenu);
      centerMenu.setText("Center");
      centerMenu.setActionCommand("About...");
      alignMenu.add(centerMenu);
      rightMenu.setText("Right");
      rightMenu.setActionCommand("About...");
      rightMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.Event.CTRL_MASK));
      alignMenu.add(rightMenu);
      justifiedMenu.setText("Justified");
      justifiedMenu.setActionCommand("About...");
      alignMenu.add(justifiedMenu);
      insertMenu.setText("Insert");
      insertMenu.setActionCommand("Help");
      insertMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(insertMenu);
      imageItem.setText("Insert Image...");
      imageItem.setActionCommand("About...");
      insertMenu.add(imageItem);
      insertJTextField.setText("Insert JTextField");
      insertJTextField.setActionCommand("Insert JButton");
      insertMenu.add(insertJTextField);
      insertJPanel.setText("Insert JPanel");
      insertJPanel.setActionCommand("Insert JButton");
      insertMenu.add(insertJPanel);
      insertJTable.setText("Insert JTable");
      insertJTable.setActionCommand("Insert JTable");
      insertMenu.add(insertJTable);
      insertJTree.setText("Insert JTree");
      insertJTree.setActionCommand("Insert JTable");
      insertMenu.add(insertJTree);
      pagebreakItem.setText("Insert Page Break");
      pagebreakItem.setActionCommand("About...");
      insertMenu.add(pagebreakItem);
      localeMenu.setText("Locale");
      localeMenu.setActionCommand("Locale");
      localeMenu.setMnemonic( (int) 'L');
      JMenuBar1.add(localeMenu);
      enItem.setText("English");
      localeMenu.add(enItem);
      deItem.setText("German");
      localeMenu.add(deItem);
      esItem.setText("Spanish");
      localeMenu.add(esItem);
      frItem.setText("French");
      localeMenu.add(frItem);
      itItem.setText("Italian");
      localeMenu.add(itItem);
      jaItem.setText("Japanese");
      localeMenu.add(jaItem);
      nlItem.setText("Dutch");
      localeMenu.add(nlItem);
      svItem.setText("Swedish");
      localeMenu.add(svItem);
      koItem.setText("Korean");
      localeMenu.add(koItem);
      helpMenu.setText("Help");
      helpMenu.setActionCommand("Help");
      helpMenu.setMnemonic( (int) 'H');
      JMenuBar1.add(helpMenu);
      aboutItem.setText("About...");
      aboutItem.setActionCommand("About...");
      aboutItem.setMnemonic( (int) 'A');
      helpMenu.add(aboutItem);

      setLocation(10, 10);

      SymWindow aSymWindow = new SymWindow();
      this.addWindowListener(aSymWindow);
      SymAction lSymAction = new SymAction();
      openItem.addActionListener(lSymAction);
      saveItem.addActionListener(lSymAction);
      exitItem.addActionListener(lSymAction);
      aboutItem.addActionListener(lSymAction);
      printItem.addActionListener(lSymAction);
      newItem.addActionListener(lSymAction);
      serifItem.addActionListener(lSymAction);
      sansSerifItem.addActionListener(lSymAction);
      monospacedItem.addActionListener(lSymAction);
      extendedPageSetupItem.addActionListener(lSymAction);
      saveAsItem.addActionListener(lSymAction);
      saveAsSlides.addActionListener(lSymAction);
      cutItem.addActionListener(lSymAction);
      copyItem.addActionListener(lSymAction);
      pasteItem.addActionListener(lSymAction);
      SymCaret lSymCaret = new SymCaret();
      mainJTextPane.addCaretListener(lSymCaret);
      size10Item.addActionListener(lSymAction);
      size12Item.addActionListener(lSymAction);
      size14Item.addActionListener(lSymAction);
      size18Item.addActionListener(lSymAction);
      size20Item.addActionListener(lSymAction);
      size24Item.addActionListener(lSymAction);
      blackItem.addActionListener(lSymAction);
      blueItem.addActionListener(lSymAction);
      redItem.addActionListener(lSymAction);
      greenItem.addActionListener(lSymAction);
      leftMenu.addActionListener(lSymAction);
      centerMenu.addActionListener(lSymAction);
      rightMenu.addActionListener(lSymAction);
      boldItem.addActionListener(lSymAction);
      italicItem.addActionListener(lSymAction);
      underlineItem.addActionListener(lSymAction);
      imageItem.addActionListener(lSymAction);
      pagebreakItem.addActionListener(lSymAction);
      size8Item.addActionListener(lSymAction);
      plainItem.addActionListener(lSymAction);
      justifiedMenu.addActionListener(lSymAction);
      printPreviewItem.addActionListener(lSymAction);
      pageSetupItem.addActionListener(lSymAction);
      insertJTextField.addActionListener(lSymAction);
      insertJTable.addActionListener(lSymAction);
      insertJTree.addActionListener(lSymAction);
      insertJPanel.addActionListener(lSymAction);
      enItem.addActionListener(lSymAction);
      deItem.addActionListener(lSymAction);
      esItem.addActionListener(lSymAction);
      frItem.addActionListener(lSymAction);
      itItem.addActionListener(lSymAction);
      jaItem.addActionListener(lSymAction);
      nlItem.addActionListener(lSymAction);
      svItem.addActionListener(lSymAction);
      koItem.addActionListener(lSymAction);
      SymComponent aSymComponent = new SymComponent();
      this.addComponentListener(aSymComponent);

      printer.addPropertyChangeListener(new MyPrintingEventHandler());
      printer.setPrintPreviewScale(1.0);
      printer.setParentFrame(this);
      //printer.setCrossPlatformDialogs(false);		// requires J2Printer14

      // direct print required for JDK 1.2.x:
      if (System.getProperty("java.version").startsWith("1.2")) textPrinter.setDirectPrint(true);

      initPane();

      enItem.setState(true);
      setLocale(java.util.Locale.ENGLISH);

   }

   public J2TextPrinterTestApplication(String sTitle) {
      this();
      setTitle(sTitle);
   }

   static public void main(String args[]) {
      try {
         //Create a new instance of our application's frame, and make it visible.
         (new J2TextPrinterTestApplication()).setVisible(true);
      } catch (Throwable t) {
         t.printStackTrace();
         //Ensure the application exits with an error condition.
         System.exit(1);
      }
   }

   public void addNotify() {
      // Record the size of the window prior to calling parents addNotify.
      Dimension size = getSize();

      super.addNotify();

      if (frameSizeAdjusted)
         return;
      frameSizeAdjusted = true;

      // Adjust size of frame according to the insets and menu bar
      javax.swing.JMenuBar menuBar = getRootPane().getJMenuBar();
      int menuBarHeight = 0;
      if (menuBar != null)
         menuBarHeight = menuBar.getPreferredSize().height;
      Insets insets = getInsets();
      setSize(insets.left + insets.right + size.width, insets.top + insets.bottom + size.height + menuBarHeight);
   }

   // Used by addNotify
   boolean frameSizeAdjusted = false;

   J2Printer printer = new J2Printer();
   //J2Printer14 printer = new J2Printer14();
   J2TextPrinter textPrinter = new J2TextPrinter();

   java.awt.FileDialog saveFileDialog = new java.awt.FileDialog(this);
   java.awt.FileDialog openFileDialog = new java.awt.FileDialog(this);
   javax.swing.JPanel JPanelTextPane1 = new javax.swing.JPanel();
   javax.swing.JScrollPane JScrollPane1 = new javax.swing.JScrollPane();
   javax.swing.JTextPane mainJTextPane = new javax.swing.JTextPane();
   javax.swing.JMenuBar JMenuBar1 = new javax.swing.JMenuBar();
   javax.swing.JMenu fileMenu = new javax.swing.JMenu();
   javax.swing.JMenuItem newItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem openItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem saveItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem saveAsItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem saveAsSlides = new javax.swing.JMenuItem();
   javax.swing.JSeparator JSeparator1 = new javax.swing.JSeparator();
   javax.swing.JMenuItem printPreviewItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem pageSetupItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem extendedPageSetupItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem printItem = new javax.swing.JMenuItem();
   javax.swing.JSeparator JSeparator2 = new javax.swing.JSeparator();
   javax.swing.JMenuItem exitItem = new javax.swing.JMenuItem();
   javax.swing.JMenu editMenu = new javax.swing.JMenu();
   javax.swing.JMenuItem cutItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem copyItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem pasteItem = new javax.swing.JMenuItem();
   javax.swing.JMenu fontMenu = new javax.swing.JMenu();
   javax.swing.JCheckBoxMenuItem serifItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem sansSerifItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem monospacedItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JMenu sizeMenu = new javax.swing.JMenu();
   javax.swing.JCheckBoxMenuItem size8Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem size10Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem size12Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem size14Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem size18Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem size20Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem size24Item = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JMenu styleMenu = new javax.swing.JMenu();
   javax.swing.JCheckBoxMenuItem plainItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem boldItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem italicItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem underlineItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JMenu colorMenu = new javax.swing.JMenu();
   javax.swing.JCheckBoxMenuItem blackItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem blueItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem redItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem greenItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JMenu alignMenu = new javax.swing.JMenu();
   javax.swing.JCheckBoxMenuItem leftMenu = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem centerMenu = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem rightMenu = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem justifiedMenu = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JMenu insertMenu = new javax.swing.JMenu();
   javax.swing.JMenuItem imageItem = new javax.swing.JMenuItem();
   javax.swing.JMenuItem insertJTextField = new javax.swing.JMenuItem();
   javax.swing.JMenuItem insertJPanel = new javax.swing.JMenuItem();
   javax.swing.JMenuItem insertJTable = new javax.swing.JMenuItem();
   javax.swing.JMenuItem insertJTree = new javax.swing.JMenuItem();
   javax.swing.JMenuItem pagebreakItem = new javax.swing.JMenuItem();
   javax.swing.JMenu helpMenu = new javax.swing.JMenu();
   javax.swing.JMenu localeMenu = new javax.swing.JMenu();
   javax.swing.JCheckBoxMenuItem deItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem enItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem esItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem frItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem itItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem jaItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem nlItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem svItem = new javax.swing.JCheckBoxMenuItem();
   javax.swing.JCheckBoxMenuItem koItem = new javax.swing.JCheckBoxMenuItem();

   javax.swing.JMenuItem aboutItem = new javax.swing.JMenuItem();

   String fontFamily;
   int fontSize;
   boolean fontBold, fontItalic, fontUnderline;
   Color fontColor;
   int fontAlign;
   boolean firstTime = true;


   void exitApplication() {
      try {
         // Beep
         Toolkit.getDefaultToolkit().beep();
         // Show a confirmation dialog
         int reply = JOptionPane.showConfirmDialog(this,
             "Do you really want to exit?",
             "JFC Application - Exit",
             JOptionPane.YES_NO_OPTION,
             JOptionPane.QUESTION_MESSAGE);
         // If the confirmation was affirmative, handle exiting.
         if (reply == JOptionPane.YES_OPTION) {
            this.setVisible(false); // hide the Frame
            this.dispose(); // free the system resources
            System.exit(0); // close the application
         }
      } catch (Exception e) {
      }
   }

   class SymWindow extends java.awt.event.WindowAdapter {
      public void windowClosing(java.awt.event.WindowEvent event) {
         Object object = event.getSource();
         if (object == J2TextPrinterTestApplication.this)
            J2TextPrinterTestApplication_windowClosing(event);
      }
   }

   void J2TextPrinterTestApplication_windowClosing(java.awt.event.WindowEvent event) {
      exitApplication();
      SwingUtilities.invokeLater(new Runnable() { public void run() { setVisible(true); } } );
   }

   class SymAction implements java.awt.event.ActionListener {
      public void actionPerformed(java.awt.event.ActionEvent event) {
         Object object = event.getSource();
         if (object == openItem)
            openItem_actionPerformed(event);
         else if (object == saveItem)
            saveItem_actionPerformed(event);
         else if (object == exitItem)
            exitItem_actionPerformed(event);
         else if (object == aboutItem)
            aboutItem_actionPerformed(event);
         if (object == printItem)
            printItem_actionPerformed(event);
         else if (object == newItem)
            newItem_actionPerformed(event);
         if (object == serifItem)
            serifItem_actionPerformed(event);
         else if (object == sansSerifItem)
            sansSerifItem_actionPerformed(event);
         else if (object == monospacedItem)
            monospacedItem_actionPerformed(event);
         else if (object == extendedPageSetupItem)
            extendedPageSetupItem_actionPerformed(event);
         else if (object == saveAsItem)
            saveAsItem_actionPerformed(event);
         else if (object == saveAsSlides)
            saveAsSlides_actionPerformed(event);
         else if (object == cutItem)
            cutItem_actionPerformed(event);
         else if (object == copyItem)
            copyItem_actionPerformed(event);
         else if (object == pasteItem)
            pasteItem_actionPerformed(event);
         if (object == size10Item)
            size10Item_actionPerformed(event);
         else if (object == size12Item)
            size12Item_actionPerformed(event);
         else if (object == size14Item)
            size14Item_actionPerformed(event);
         else if (object == size18Item)
            size18Item_actionPerformed(event);
         else if (object == size20Item)
            size20Item_actionPerformed(event);
         else if (object == size24Item)
            size24Item_actionPerformed(event);
         else if (object == blackItem)
            blackItem_actionPerformed(event);
         else if (object == blueItem)
            blueItem_actionPerformed(event);
         else if (object == redItem)
            redItem_actionPerformed(event);
         else if (object == greenItem)
            greenItem_actionPerformed(event);
         else if (object == leftMenu)
            leftMenu_actionPerformed(event);
         else if (object == centerMenu)
            centerMenu_actionPerformed(event);
         else if (object == rightMenu)
            rightMenu_actionPerformed(event);
         else if (object == boldItem)
            boldItem_actionPerformed(event);
         else if (object == italicItem)
            italicItem_actionPerformed(event);
         else if (object == underlineItem)
            underlineItem_actionPerformed(event);
         else if (object == imageItem)
            imageItem_actionPerformed(event);
         else if (object == pagebreakItem)
            pagebreakItem_actionPerformed(event);
         if (object == size8Item)
            size8Item_actionPerformed(event);
         else if (object == plainItem)
            plainItem_actionPerformed(event);
         else if (object == justifiedMenu)
            justifiedMenu_actionPerformed(event);
         else if (object == printPreviewItem)
            printPreviewItem_actionPerformed(event);
         else if (object == pageSetupItem)
            pageSetupItem_actionPerformed(event);
         else if (object == insertJTextField)
            insertJTextField_actionPerformed(event);
         else if (object == insertJTable)
            insertJTable_actionPerformed(event);
         else if (object == insertJTree)
            insertJTree_actionPerformed(event);
         else if (object == insertJPanel)
            insertJPanel_actionPerformed(event);
         else if (object == enItem || object == deItem || object == esItem|| object == frItem||
                  object == itItem|| object == jaItem|| object == nlItem || object == svItem || object == koItem)
            locale_actionPerformed(event);
         repaint(); // needed to clean up menu pull-downs
      }
   }


   void openItem_actionPerformed(java.awt.event.ActionEvent event) {
      try {
         // openFileDialog Show the FileDialog
         openFileDialog.setVisible(true);
      } catch (Exception e) {}

      if (openFileDialog.getFile() == null)
         return; // if cancel
      String fileName = openFileDialog.getDirectory() + openFileDialog.getFile();

      if (fileName.toLowerCase().endsWith(".ssd")) { // read "Serialized StyledDocument"
         try {
            FileInputStream fis = new FileInputStream(fileName);
            ObjectInputStream ois = new ObjectInputStream(fis);
            StyledDocument doc = (StyledDocument) ois.readObject();
            ois.close();
            mainJTextPane.setStyledDocument(doc);
            textPrinter.setPane(mainJTextPane);
            validate();
            mainJTextPane.revalidate();
            repaint();
            return;
         } catch (Exception e) {
            System.out.println(e);
         }
      }

      EditorKit editorKit = new StyledEditorKit();
      mainJTextPane.setEditorKit(editorKit);

      if (fileName.toLowerCase().endsWith(".html")
          || fileName.toLowerCase().endsWith(".htm")) {
        mainJTextPane.setContentType("text/html");
      }
      else if (fileName.toLowerCase().endsWith(".rtf"))
         mainJTextPane.setContentType("text/rtf");
      else
         mainJTextPane.setContentType("text/plain");

      try {
         // java.net.URL url = new java.net.URL("file",null,fileName); // don't use, doesn't find images in HTML doc directory
         java.net.URL url = new File(fileName).toURL(); // this one does
         mainJTextPane.setPage(url); // asynchronous load, returns immediately!
         // use this if want to force wait for page done: waitForSetPageDone(mainJTextPane);
      } catch (Exception e) {
         System.out.println("Exception reading URL: " + e);
         e.printStackTrace();
      }

      /* alternate method to read HTML from a text file and define JTextPane using setText, which is synchronous
      mainJTextPane = new JTextPane();
      mainJTextPane.setContentType("text/html");
      String s = readFile(fileName);
      s = fixSrcTags(s);
      mainJTextPane.setText(s);
      */

      // Examples of Java-style borders:
      // mainJTextPane.setBorder(new LineBorder(Color.green,20));
      // mainJTextPane.setBorder(new EmptyBorder(10,10,10,10));
      // mainJTextPane.setBorder(new CompoundBorder(new LineBorder(Color.green,20),new EmptyBorder(10,10,10,10)));
      // J2PW-style border: textPrinter.setOutsideLines(true);
      // (can use either or both)

      return;
   }


   // simple method to read text (e.g. HTML) file into long String with no line breaks
   private String readFile(String fileName) {
     // read file
     StringBuffer buffer = new StringBuffer();
     try {
       BufferedReader inData = new BufferedReader(new FileReader(fileName));
       String inLine;
       while ( (inLine = inData.readLine()) != null) {
         buffer.append(inLine);
         buffer.append(' ');
       }
       inData.close();
     }
     catch (IOException e) { e.getMessage(); return ""; }
     return buffer.toString();
   }

   // minimal code for converting local HTML <IMG SRC=...> file references
   // (which work with setPage) to URL file references (which work with setText)
   // (deficiencies: should look for SRC= only inside <IMG> tag, should ignore SRC=HTTP://...)
   private String fixSrcTags(String s) {
     StringBuffer sb = new StringBuffer();
     int ptr = 0;
     String path = new File(".").getAbsolutePath();
     path = path.substring(0,path.length()-1);
     while (true) {
       int i = s.indexOf("src=", ptr);
       if (i < 0) i = s.indexOf("SRC=", ptr);
       if (i < 0) {
         sb.append(s.substring(ptr));
         break;
       }
       sb.append(s.substring(ptr, i + 4));
       ptr = i + 4;
       if (s.substring(ptr, ptr + 1).equals("\"")) {
         sb.append("\"");
         ptr++;
       }
       sb.append("file:/");
       sb.append(path);
     }
     return sb.toString();
   }

   void waitForSetPageDone(JTextPane jtp) {
      // After jtp.setPage(url), need to wait until page fully loaded since setPage is asynchronous and returns
      // immediately!  We'd be OK without this if we could assume user would wait to see entire document before
      // printing.  Otherwise, we need a PropertyChange listener on property "page", here's how we do it:
      synchronized (jtp) { // acquire lock
         jtp.addPropertyChangeListener(
            new java.beans.PropertyChangeListener() {
               public void propertyChange(PropertyChangeEvent evt) {
                  if (evt != null && evt.getPropertyName() != null && evt.getPropertyName().equals("page"))
                     synchronized ((JTextPane)evt.getSource()) { // evt.getSource() is jtp
                       ((JTextPane)evt.getSource()).notify();
                  }
               }
            }
         );
         try {  // release lock, wait for notify, unblock after 5 sec to be safe
            jtp.wait(5000);
         } catch (InterruptedException ie) { System.err.println(ie); }
      }
   }


   void saveItem_actionPerformed(java.awt.event.ActionEvent event) {
     try {
       // saveFileDialog Show the FileDialog
       saveFileDialog.setVisible(true);
     }
     catch (Exception e) {
     }
     String fileName = saveFileDialog.getDirectory() + saveFileDialog.getFile();
     if (fileName.equals("nullnull"))
       return;

     if (!fileName.endsWith(".ssd"))
       fileName = fileName + ".ssd";
     try {
       FileOutputStream fos = new FileOutputStream(fileName);
       ObjectOutputStream oos = new ObjectOutputStream(fos);
       oos.writeObject(mainJTextPane.getStyledDocument());
       oos.flush();
       oos.close();
     }
     catch (Exception e) {}

   }

   void saveAsSlides_actionPerformed(java.awt.event.ActionEvent event) {

     try {
       // saveFileDialog Show the FileDialog
       saveFileDialog.setVisible(true);
     }
     catch (Exception e) {
     }
     String fileName = saveFileDialog.getDirectory() + saveFileDialog.getFile();
     if (fileName.equals("nullnull"))
       return;

     textPrinter.setPane(mainJTextPane);
     printer.setPageable(textPrinter);
     printer.printToHTML(saveFileDialog.getDirectory(), saveFileDialog.getFile(), 1.0, true);
   }

   void exitItem_actionPerformed(java.awt.event.ActionEvent event) {
      exitApplication();
   }

   void aboutItem_actionPerformed(java.awt.event.ActionEvent event) {

      // J2TextPrinterAboutDialog Create with owner and show as modal
      J2TextPrinterAboutDialog J2TextPrinterAboutDialog1 = new J2TextPrinterAboutDialog(this);
      J2TextPrinterAboutDialog1.setModal(true);
      J2TextPrinterAboutDialog1.show();
   }


   private boolean hasInsertedComponent(JTextPane pane) {
      Element element;
      Component component;
      int len = pane.getDocument().getLength();
      StyledDocument doc = pane.getStyledDocument();
      for (int i = 0; i < len; i++) {
         element = doc.getCharacterElement(i);
         component = StyleConstants.getComponent(element.getAttributes());
         if (component != null)
            return true;
      }
      return false;
   }

   void newItem_actionPerformed(java.awt.event.ActionEvent event) {
      initPane();
   }

   private void initPane() {
      mainJTextPane.selectAll();
      mainJTextPane.cut();
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setFontFamily(attribute, "Serif");
      StyleConstants.setFontSize(attribute, 12);
      StyleConstants.setBold(attribute, false);
      StyleConstants.setItalic(attribute, false);
      StyleConstants.setUnderline(attribute, false);
      StyleConstants.setAlignment(attribute, StyleConstants.ALIGN_LEFT);
      StyleConstants.setForeground(attribute, Color.black);
      mainJTextPane.setCharacterAttributes(attribute, true);
   }

   // utility method to check the selected menu item uncheck all the other menu items
   private void checkMeUncheckRest(String thisItem, JMenu m) {
      for (int i = 0; i < m.getItemCount(); i++) {
         // System.out.println(thisItem + " " + m.getItem(i).getActionCommand());
         if (thisItem.equals(m.getItem(i).getText()))
            ( (JCheckBoxMenuItem) m.getItem(i)).setSelected(true);
         else
            ( (JCheckBoxMenuItem) m.getItem(i)).setSelected(false);
      }
   }

   private void insertImage() {
      try {
         // openFileDialog Show the FileDialog
         openFileDialog.setVisible(true);
      } catch (Exception e) {}

      String fileName = openFileDialog.getDirectory() + openFileDialog.getFile();
      if (fileName.equals("nullnull"))
         return;
      mainJTextPane.insertIcon(new javax.swing.ImageIcon(fileName));
   }

   private void insertJPanel() { // test the inserting of a component (JPanel)
      JPanel jp = new JPanel() { // define JPanel subclass
         public Dimension getPreferredSize() {
            return new Dimension(180, 150);
         } // specify size

         public void paint(Graphics g) { // override paint method
            g.drawLine(25, 135, 25, 25);
            g.drawLine(15, 125, 175, 125);
            g.setColor(Color.yellow);
            g.fillRect(50, 100, 25, 25);
            g.setColor(Color.black);
            g.drawRect(50, 100, 25, 25);
            g.setColor(Color.pink);
            g.fillRect(85, 75, 25, 50);
            g.setColor(Color.black);
            g.drawRect(85, 75, 25, 50);
            g.setColor(Color.orange);
            g.fillRect(120, 50, 25, 75);
            g.setColor(Color.black);
            g.drawRect(120, 50, 25, 75);
            g.setFont(new Font("SansSerif", Font.PLAIN, 10));
            g.drawString("Graphics", 40, 95);
            g.drawString("in a", 90, 70);
            g.drawString("JPanel", 115, 45);
         }

         private void writeObject(java.io.ObjectOutputStream out) throws IOException {}

         private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {}

      };
      mainJTextPane.insertComponent(jp); // insert Component
   }

   private void insertJTable() { // test the inserting of a component (JTable)
      Object[] columns = {"This", "is", "a", "JTable"};
      Object[][] data = { {"table", "", "", ""}
          , {"", "data", "", ""}
          , {"", "", "goes", ""}
          , {"", "", "", "here"}
      };
      JScrollPane jsp = new JScrollPane(new JTable(data, columns));
      jsp.setPreferredSize(new Dimension(400, 83));
      mainJTextPane.insertComponent(jsp);
      // inserting with scrollpane looks good, has column headers, etc., but JTextPane
      // throws exceptions typing text immediate following, see Bug Parade 4353673
      // a plain JTable doesn't have these problems:
      //JTable table = new JTable(data,columns);
      //mainJTextPane.insertComponent(table);
   }

   private void insertJTree() { // test the inserting of a component (JTree)
      DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode("This");
      dmtn.add(new DefaultMutableTreeNode("is"));
      dmtn.add(new DefaultMutableTreeNode("a"));
      dmtn.add(new DefaultMutableTreeNode("JTree"));
      JScrollPane jspt = new JScrollPane(new JTree(dmtn));
      jspt.setBorder(new javax.swing.border.EmptyBorder(0, 0, 0, 0));
      jspt.setPreferredSize(new Dimension(85, 85));
      mainJTextPane.insertComponent(jspt);
   }

   private void insertJTextField() { // test the inserting of a component (JTextField)
      mainJTextPane.insertComponent(new JTextField("This is a JTextField"));
   }

   void extendedPageSetupItem_actionPerformed(java.awt.event.ActionEvent event) {
      try {
         // J2TextPrinterPageSetupDialog Create with title, show as modal
         {
            J2TextPrinterPageSetupDialog J2TextPrinterPageSetupDialog1 = new J2TextPrinterPageSetupDialog(printer, textPrinter);
            J2TextPrinterPageSetupDialog1.setModal(true);
            J2TextPrinterPageSetupDialog1.setTitle("Page Setup");
            J2TextPrinterPageSetupDialog1.setLocation(75, 75);
            J2TextPrinterPageSetupDialog1.show();
         }
      } catch (Exception e) {
      }
   }

   void saveAsItem_actionPerformed(java.awt.event.ActionEvent event) {
      saveItem_actionPerformed(event);
   }

   void cutItem_actionPerformed(java.awt.event.ActionEvent event) {
      mainJTextPane.cut();
   }

   void copyItem_actionPerformed(java.awt.event.ActionEvent event) {
      mainJTextPane.copy();
   }

   void pasteItem_actionPerformed(java.awt.event.ActionEvent event) {
      mainJTextPane.paste();
   }

   class SymCaret implements javax.swing.event.CaretListener {
      public void caretUpdate(javax.swing.event.CaretEvent event) {
         Object object = event.getSource();
         if (object == mainJTextPane)
            mainJTextPane_caretUpdate(event);
      }
   }

   void mainJTextPane_caretUpdate(javax.swing.event.CaretEvent event) {
      try {
         int position = Math.max(0, event.getDot() - 1); // workaround since getting attributes at caret is off by one
         Element element = mainJTextPane.getStyledDocument().getCharacterElement(position);
         AttributeSet attributes = element.getAttributes();
         fontFamily = StyleConstants.getFontFamily(attributes);
         checkMeUncheckRest(fontFamily, fontMenu);
         fontSize = StyleConstants.getFontSize(attributes);
         checkMeUncheckRest(new Integer(fontSize).toString(), sizeMenu);
         fontBold = StyleConstants.isBold(attributes);
         fontItalic = StyleConstants.isItalic(attributes);
         fontUnderline = StyleConstants.isUnderline(attributes);
         updateStyleMenu();
         fontColor = StyleConstants.getForeground(attributes);
         checkMeUncheckRest(colorName(fontColor), colorMenu);
         fontAlign = StyleConstants.getAlignment(attributes);
         checkMeUncheckRest(alignName(fontAlign), alignMenu);
      } catch (Exception e) {
      }
   }

   void updateStyleMenu() {
      boldItem.setSelected(fontBold);
      italicItem.setSelected(fontItalic);
      underlineItem.setSelected(fontUnderline);
      if (fontBold | fontItalic | fontUnderline)
         plainItem.setSelected(false);
      else
         plainItem.setSelected(true);
   }

   private String alignName(int align) {
      if (align == StyleConstants.ALIGN_LEFT)
         return "Left";
      if (align == StyleConstants.ALIGN_CENTER)
         return "Center";
      if (align == StyleConstants.ALIGN_RIGHT)
         return "Right";
      if (align == StyleConstants.ALIGN_JUSTIFIED)
         return "Justified";
      return "Left";
   }

   private String colorName(Color color) {
      if (color.equals(Color.black))
         return "Black";
      if (color.equals(Color.blue))
         return "Blue";
      if (color.equals(Color.red))
         return "Red";
      if (color.equals(Color.green))
         return "Green";
      return "Black";
   }

   private void setFontSize(int fontSize) {
      this.fontSize = fontSize;
      String sizeString = (fontSize + " ").trim();
      checkMeUncheckRest(sizeString, sizeMenu);
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setFontSize(attribute, fontSize);
      mainJTextPane.setCharacterAttributes(attribute, false);
   }

   void size8Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(8);
   }

   void size10Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(10);
   }

   void size12Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(12);
   }

   void size14Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(14);
   }

   void size18Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(18);
   }

   void size20Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(20);
   }

   void size24Item_actionPerformed(java.awt.event.ActionEvent event) {
      setFontSize(24);
   }

   private void setFontColor(Color fontColor) {
      this.fontColor = fontColor;
      String colorString = colorName(fontColor);
      checkMeUncheckRest(colorString, colorMenu);
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setForeground(attribute, fontColor);
      mainJTextPane.setCharacterAttributes(attribute, false);
   }

   void blackItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontColor(Color.black);
   }

   void blueItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontColor(Color.blue);
   }

   void redItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontColor(Color.red);
   }

   void greenItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontColor(Color.green);
   }

   private void setFontAlignment(int fontAlign) {
      this.fontAlign = fontAlign;
      String alignString = alignName(fontAlign);
      checkMeUncheckRest(alignString, alignMenu);
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setAlignment(attribute, fontAlign);
      mainJTextPane.setParagraphAttributes(attribute, false);
      mainJTextPane.setCharacterAttributes(attribute, false);
   }

   void justifiedMenu_actionPerformed(java.awt.event.ActionEvent event) {
      setFontAlignment(StyleConstants.ALIGN_JUSTIFIED);
   }

   void leftMenu_actionPerformed(java.awt.event.ActionEvent event) {
      setFontAlignment(StyleConstants.ALIGN_LEFT);
   }

   void centerMenu_actionPerformed(java.awt.event.ActionEvent event) {
      setFontAlignment(StyleConstants.ALIGN_CENTER);
   }

   void rightMenu_actionPerformed(java.awt.event.ActionEvent event) {
      setFontAlignment(StyleConstants.ALIGN_RIGHT);
   }

   private void setFontFamily(String fontFamily) {
      this.fontFamily = fontFamily;
      checkMeUncheckRest(fontFamily, alignMenu);
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setFontFamily(attribute, fontFamily);
      mainJTextPane.setCharacterAttributes(attribute, false);
   }

   void serifItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontFamily("Serif");
   }

   void sansSerifItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontFamily("SansSerif");
   }

   void monospacedItem_actionPerformed(java.awt.event.ActionEvent event) {
      setFontFamily("Monospaced");
   }

   void plainItem_actionPerformed(java.awt.event.ActionEvent event) {
      checkMeUncheckRest(event.getActionCommand(), styleMenu);
      fontBold = false;
      fontItalic = false;
      fontUnderline = false;
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setBold(attribute, fontBold);
      StyleConstants.setItalic(attribute, fontItalic);
      StyleConstants.setUnderline(attribute, fontUnderline);
      mainJTextPane.setCharacterAttributes(attribute, false);
      updateStyleMenu();
   }

   void boldItem_actionPerformed(java.awt.event.ActionEvent event) {
      fontBold = boldItem.isSelected();
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setBold(attribute, fontBold);
      mainJTextPane.setCharacterAttributes(attribute, false);
      updateStyleMenu();
   }

   void italicItem_actionPerformed(java.awt.event.ActionEvent event) {
      fontItalic = italicItem.isSelected();
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setItalic(attribute, fontItalic);
      mainJTextPane.setCharacterAttributes(attribute, false);
      updateStyleMenu();
   }

   void underlineItem_actionPerformed(java.awt.event.ActionEvent event) {
      fontUnderline = underlineItem.isSelected();
      SimpleAttributeSet attribute = new SimpleAttributeSet();
      StyleConstants.setUnderline(attribute, fontUnderline);
      mainJTextPane.setCharacterAttributes(attribute, false);
      updateStyleMenu();
   }

   void imageItem_actionPerformed(java.awt.event.ActionEvent event) {
      insertImage();
   }

   void pagebreakItem_actionPerformed(java.awt.event.ActionEvent event) {
      mainJTextPane.replaceSelection("\n<<<<\f>>>>\n");
   }


   void printItem_actionPerformed(java.awt.event.ActionEvent event) {
     // Since setCloningUsed(true) is the default, first determine if this JTextPane is clonable
     // since some documents (e.g. certain HTML documents with embedded components) are not
     boolean isCloneable = true;
     textPrinter.setCloningUsed(true);     // which is the default
     try { JTextPane pane = textPrinter.clone(mainJTextPane); } // easiest way to test if cloneable
     catch (CloneException e) { // if weren't able to clone...
       isCloneable = false;
       textPrinter.setCloningUsed(false);
     }

     // If has inserted components and is not clonable, then we must remove JTextPane from view hierarchy
     if (hasInsertedComponent(mainJTextPane) == true && !isCloneable) {
       System.out.println("Has embedded component and can't clone, must remove from view hierarchy");
       JScrollPane1.getViewport().remove(mainJTextPane); // remove from view hierarchy (can't easily put back, easier to make over)
     }

     // then print normally
     textPrinter.setPane(mainJTextPane);
     printer.setPageable(textPrinter);
     printer.print();
   }

   void printPreviewItem_actionPerformed(java.awt.event.ActionEvent event) {
      // test custom print preview page setup dialog:
      J2TextPrinterPageSetupDialog J2TextPrinterPageSetupDialog1 = new J2TextPrinterPageSetupDialog(printer, textPrinter);
      J2TextPrinterPageSetupDialog1.setModal(true);
      J2TextPrinterPageSetupDialog1.setTitle("Page Setup");

      printer.setPrintPreviewPageSetupDialog(J2TextPrinterPageSetupDialog1);

      // test omitting Page Setup button from Print Preview dialog:
      //J2TextPrinter1.showPrintPreviewPageSetupButton(false);


     // Since setCloningUsed(true) is the default, first determine if this JTextPane is clonable
     // since some documents (e.g. certain HTML documents with embedded components) are not
     boolean isCloneable = true;
     textPrinter.setCloningUsed(true);     // which is the default
     try { JTextPane pane = textPrinter.clone(mainJTextPane); } // easiest way to test if cloneable
     catch (CloneException e) { // if weren't able to clone...
       isCloneable = false;
       textPrinter.setCloningUsed(false);
     }

     // If has inserted components and is not clonable, then we must remove JTextPane from view hierarchy
     if (hasInsertedComponent(mainJTextPane) == true && !isCloneable) {
       System.out.println("Has embedded component and can't clone, must remove from view hierarchy");
       JScrollPane1.getViewport().remove(mainJTextPane); // remove from view hierarchy (can't easily put back, easier to make over)
     }

     // then print normally
     textPrinter.setPane(mainJTextPane);
     printer.setPageable(textPrinter);
     // test: textPrinter.setMaximumPages(2);
     // test: textPrinter.setScale(.5);
     // test: printer.printToPDF("test.pdf");
     printer.showPrintPreviewDialog(this);  // modal

     // if removed from view hierarchy, restore with an empty JTextPane
     if (hasInsertedComponent(mainJTextPane) == true && !isCloneable) {
       JScrollPane1 = new JScrollPane();
       JScrollPane1.setOpaque(true);
       JScrollPane1.setDoubleBuffered(true);
       JPanelTextPane1.add(BorderLayout.CENTER, JScrollPane1);
       String str = mainJTextPane.getText();
       String type = mainJTextPane.getContentType();
       mainJTextPane = new JTextPane();
       mainJTextPane.setContentType(type);
       mainJTextPane.setText(str);
       JScrollPane1.getViewport().add(mainJTextPane);
       mainJTextPane.setBounds(0, 0, 597, 437);
       setVisible(false);
       setVisible(true);
       repaint();
     }

      textPrinter.hideImagingFrame(); // hide imaging frame, left behind if has embedded components
   }


   void pageSetupItem_actionPerformed(java.awt.event.ActionEvent event) {
      printer.showPageSetupDialog();
      windowToFront(); // needed under JDK 1.4 due to Bug Parade #4514422
   }

   class MyPrintingEventHandler extends PrintingEventHandler {
      int totalPages;
      String appName = "J2TextPrinterTestApplication";

      public void printingStart() {
         windowToFront(); // needed prior to JDK 1.4.1 due to Bug Parade #4514422
         showProgress(appName + ": 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(appName + ": Printing done");
         textPrinter.hideImagingFrame(); // hide imaging frame, left behind if has embedded components
      }

      public void printDialogOK() {
         windowToFront(); // needed prior to JDK 1.4.1 due to Bug Parade #4514422
         showProgress(appName + ": Start printing...");
      }

      public void printDialogCanceled() {
         windowToFront(); // needed prior to JDK 1.4.1 due to Bug Parade #4514422
         brieflyShowProgress(appName + ": Printing canceled");
      }

      public void pageSetupDialogOK() {
         brieflyShowProgress("Page setup dialog OK");
      }

      public void pageSetupDialogCanceled() {
         brieflyShowProgress("Page setup dialog canceled");
      }

      public void pageStart(int pageNum) {
         showProgress(appName + ": Printing page " + pageNum + " of " + totalPages);
      }

   }

   private void showProgress(String str) { this.setTitle(str); this.repaint();}

   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("J2TextPrinterTestApplication"); } } );
      } }.start(); // from different thread, wait 1 sec then erase
   }

   private void windowToFront() { this.toFront(); } // needed under JDK 1.4 due to Bug Parade #4514422

   void insertJTextField_actionPerformed(java.awt.event.ActionEvent event) {
      insertJTextField();
   }

   void insertJTable_actionPerformed(java.awt.event.ActionEvent event) {
      insertJTable();
   }

   void insertJTree_actionPerformed(java.awt.event.ActionEvent event) {
      insertJTree();
   }

   void insertJPanel_actionPerformed(java.awt.event.ActionEvent event) {
      insertJPanel();
   }

   void locale_actionPerformed(java.awt.event.ActionEvent event) {
      String locale = event.getActionCommand();
      checkMeUncheckRest(locale, localeMenu);
      if (locale.equals("English")) java.util.Locale.setDefault(java.util.Locale.ENGLISH);
      else if (locale.equals("German")) java.util.Locale.setDefault(java.util.Locale.GERMAN);
      else if (locale.equals("Spanish")) java.util.Locale.setDefault( new java.util.Locale("es","ES") );
      else if (locale.equals("French")) java.util.Locale.setDefault(java.util.Locale.FRENCH);
      else if (locale.equals("Italian")) java.util.Locale.setDefault(java.util.Locale.ITALIAN);
      else if (locale.equals("Japanese")) java.util.Locale.setDefault(java.util.Locale.JAPANESE);
      else if (locale.equals("Dutch")) java.util.Locale.setDefault( new java.util.Locale("nl","NL") );
      else if (locale.equals("Swedish")) java.util.Locale.setDefault(new java.util.Locale("sv","SV") );
      else if (locale.equals("Korean")) java.util.Locale.setDefault(java.util.Locale.KOREAN);
   }

   class SymComponent extends java.awt.event.ComponentAdapter {
      public void componentResized(java.awt.event.ComponentEvent event) {
         Object object = event.getSource();
         if (object == J2TextPrinterTestApplication.this)
            J2TextPrinterTestApplication_componentResized(event);
      }
   }

   void J2TextPrinterTestApplication_componentResized(java.awt.event.ComponentEvent event) {
      try {
         Thread.currentThread().sleep(100);
      } catch (Exception e) {}
      validate();
      mainJTextPane.revalidate();
      repaint(); // JTextPane needs help redrawing after resize
   }
}
