/*  PrintTextFile

    (C) Copyright 1998-1999
    Wildcrest Associates
    http://www.wildcrest.com
    
Perform hardcopy printing of multipage single font text documents.  
Supports pagination, line wrap, line separators, line spacing, tab expansion, 
margins, headers, footers, date and page numbering, and font selection. 

This source code may be freely used, modified, incorporated, and
distributed without restriction as part of any software that uses
TextPrinter by Wildcrest Associates.

*/

import java.awt.*;
import java.io.*;
import java.lang.*;

import com.wildcrest.TextPrinter;

public class PrintTextFile extends Frame
{
	public PrintTextFile()
	{
		// This code is automatically generated by Visual Cafe when you add
		// components to the visual environment. It instantiates and initializes
		// the components. To modify the code, only use code syntax that matches
		// what Visual Cafe can generate, or Visual Cafe may be unable to back
		// parse your Java file into its visual environment.
		
    	printer = new TextPrinter();
    	
    	printer.setLeftMargin(defaultMargin("LEFT"));
    	printer.setRightMargin(defaultMargin("RIGHT"));
    	printer.setTopMargin(defaultMargin("TOP"));
    	printer.setBottomMargin(defaultMargin("BOTTOM"));
	    
		//{{INIT_CONTROLS
		setLayout(new BorderLayout(0,0));
		setVisible(false);
		setSize(687,428);
		setBackground(new Color(16777215));
		openFileDialog1 = new java.awt.FileDialog(this);
		openFileDialog1.setMode(FileDialog.LOAD);
		openFileDialog1.setTitle("Open");
		//$$ openFileDialog1.move(0,260);
		textAreaConv = new java.awt.TextArea();
		textAreaConv.setBounds(0,22,687,406);
		textAreaConv.setFont(new Font("Dialog", Font.PLAIN, 12));
		add("Center", textAreaConv);
		labelFileName = new java.awt.Label("   Contents of text file");
		labelFileName.setBounds(0,0,687,22);
		labelFileName.setFont(new Font("Dialog", Font.PLAIN, 11));
		add("North", labelFileName);
		setTitle("A Basic Application");
		//}}

		//{{INIT_MENUS
		mainMenuBar = new java.awt.MenuBar();
		menu1 = new java.awt.Menu("File");
		miOpen = new java.awt.MenuItem("Open...");
		menu1.add(miOpen);
		menu1.addSeparator();
		menuItemPageSetup = new java.awt.MenuItem("Page Setup...");
		menu1.add(menuItemPageSetup);
		miPrint = new java.awt.MenuItem("Print");
		menu1.add(miPrint);
		menu1.addSeparator();
		miExit = new java.awt.MenuItem("Exit");
		menu1.add(miExit);
		mainMenuBar.add(menu1);
		menuFont = new java.awt.Menu("Font");
		checkboxMenuItemSerif = new java.awt.CheckboxMenuItem("Serif");
		checkboxMenuItemSerif.setState(false);
		menuFont.add(checkboxMenuItemSerif);
		checkboxMenuItemSansSerif = new java.awt.CheckboxMenuItem("SansSerif");
		checkboxMenuItemSansSerif.setState(true);
		menuFont.add(checkboxMenuItemSansSerif);
		checkboxMenuItemMonospaced = new java.awt.CheckboxMenuItem("Monospaced");
		checkboxMenuItemMonospaced.setState(false);
		menuFont.add(checkboxMenuItemMonospaced);
		mainMenuBar.add(menuFont);
		menuStyle = new java.awt.Menu("Style");
		checkboxMenuItemPlain = new java.awt.CheckboxMenuItem("Plain");
		checkboxMenuItemPlain.setState(true);
		menuStyle.add(checkboxMenuItemPlain);
		checkboxMenuItemBold = new java.awt.CheckboxMenuItem("Bold");
		checkboxMenuItemBold.setState(false);
		menuStyle.add(checkboxMenuItemBold);
		checkboxMenuItemItalic = new java.awt.CheckboxMenuItem("Italic");
		checkboxMenuItemItalic.setState(false);
		menuStyle.add(checkboxMenuItemItalic);
		mainMenuBar.add(menuStyle);
		menuSize = new java.awt.Menu("Size");
		checkboxMenuItemS6 = new java.awt.CheckboxMenuItem("6");
		checkboxMenuItemS6.setState(false);
		menuSize.add(checkboxMenuItemS6);
		checkboxMenuItemS7 = new java.awt.CheckboxMenuItem("7");
		checkboxMenuItemS7.setState(false);
		menuSize.add(checkboxMenuItemS7);
		checkboxMenuItemS8 = new java.awt.CheckboxMenuItem("8");
		checkboxMenuItemS8.setState(false);
		menuSize.add(checkboxMenuItemS8);
		checkboxMenuItemS9 = new java.awt.CheckboxMenuItem("9");
		checkboxMenuItemS9.setState(false);
		menuSize.add(checkboxMenuItemS9);
		checkboxMenuItemS10 = new java.awt.CheckboxMenuItem("10");
		checkboxMenuItemS10.setState(true);
		menuSize.add(checkboxMenuItemS10);
		checkboxMenuItemS12 = new java.awt.CheckboxMenuItem("12");
		checkboxMenuItemS12.setState(false);
		menuSize.add(checkboxMenuItemS12);
		checkboxMenuItemS14 = new java.awt.CheckboxMenuItem("14");
		checkboxMenuItemS14.setState(false);
		menuSize.add(checkboxMenuItemS14);
		checkboxMenuItemS18 = new java.awt.CheckboxMenuItem("18");
		checkboxMenuItemS18.setState(false);
		menuSize.add(checkboxMenuItemS18);
		checkboxMenuItemS24 = new java.awt.CheckboxMenuItem("24");
		checkboxMenuItemS24.setState(false);
		menuSize.add(checkboxMenuItemS24);
		checkboxMenuItemS30 = new java.awt.CheckboxMenuItem("30");
		checkboxMenuItemS30.setState(false);
		menuSize.add(checkboxMenuItemS30);
		checkboxMenuItemS36 = new java.awt.CheckboxMenuItem("36");
		checkboxMenuItemS36.setState(false);
		menuSize.add(checkboxMenuItemS36);
		mainMenuBar.add(menuSize);
		menuAbout = new java.awt.Menu("About");
		mainMenuBar.setHelpMenu(menuAbout);
		miAbout = new java.awt.MenuItem("About PrintTextFile...");
		menuAbout.add(miAbout);
		mainMenuBar.add(menuAbout);
		setMenuBar(mainMenuBar);
		//$$ mainMenuBar.move(0,290);
		//}}

		//{{REGISTER_LISTENERS
		SymWindow aSymWindow = new SymWindow();
		this.addWindowListener(aSymWindow);
		SymAction lSymAction = new SymAction();
		miOpen.addActionListener(lSymAction);
		miAbout.addActionListener(lSymAction);
		miExit.addActionListener(lSymAction);
		miPrint.addActionListener(lSymAction);
		SymItem lSymItem = new SymItem();
		checkboxMenuItemSerif.addItemListener(lSymItem);
		checkboxMenuItemPlain.addItemListener(lSymItem);
		checkboxMenuItemS6.addItemListener(lSymItem);
		checkboxMenuItemSansSerif.addItemListener(lSymItem);
		checkboxMenuItemMonospaced.addItemListener(lSymItem);
		checkboxMenuItemBold.addItemListener(lSymItem);
		checkboxMenuItemItalic.addItemListener(lSymItem);
		checkboxMenuItemS7.addItemListener(lSymItem);
		checkboxMenuItemS8.addItemListener(lSymItem);
		checkboxMenuItemS9.addItemListener(lSymItem);
		checkboxMenuItemS10.addItemListener(lSymItem);
		checkboxMenuItemS12.addItemListener(lSymItem);
		checkboxMenuItemS14.addItemListener(lSymItem);
		checkboxMenuItemS18.addItemListener(lSymItem);
		checkboxMenuItemS24.addItemListener(lSymItem);
		checkboxMenuItemS30.addItemListener(lSymItem);
		checkboxMenuItemS36.addItemListener(lSymItem);
		menuItemPageSetup.addActionListener(lSymAction);
		//}}
	}

	public PrintTextFile(String title)
	{
		this();
		setTitle(title);
	}

	public synchronized void show()
	{
		setLocation(50, 50);
		super.show();
	}

	static public void main(String args[])
	{
		(new PrintTextFile("PrintTextFile")).show();
	}

	public void addNotify()
	{
	    // Record the size of the window prior to calling parents addNotify.
	    Dimension d = getSize();
	    
		super.addNotify();

		if (fComponentsAdjusted)
			return;

		// Adjust components according to the insets
		setSize(getInsets().left + getInsets().right + d.width, getInsets().top + getInsets().bottom + d.height);
		Component components[] = getComponents();
		for (int i = 0; i < components.length; i++)
		{
			Point p = components[i].getLocation();
			p.translate(getInsets().left, getInsets().top);
			components[i].setLocation(p);
		}
		fComponentsAdjusted = true;
	}

    // Used for addNotify check.
	boolean fComponentsAdjusted = false;

	//{{DECLARE_CONTROLS
	java.awt.FileDialog openFileDialog1;
	java.awt.TextArea textAreaConv;
	java.awt.Label labelFileName;
	//}}

	TextPrinter printer;
    
	//{{DECLARE_MENUS
	java.awt.MenuBar mainMenuBar;
	java.awt.Menu menu1;
	java.awt.MenuItem miOpen;
	java.awt.MenuItem menuItemPageSetup;
	java.awt.MenuItem miPrint;
	java.awt.MenuItem miExit;
	java.awt.Menu menuFont;
	java.awt.CheckboxMenuItem checkboxMenuItemSerif;
	java.awt.CheckboxMenuItem checkboxMenuItemSansSerif;
	java.awt.CheckboxMenuItem checkboxMenuItemMonospaced;
	java.awt.Menu menuStyle;
	java.awt.CheckboxMenuItem checkboxMenuItemPlain;
	java.awt.CheckboxMenuItem checkboxMenuItemBold;
	java.awt.CheckboxMenuItem checkboxMenuItemItalic;
	java.awt.Menu menuSize;
	java.awt.CheckboxMenuItem checkboxMenuItemS6;
	java.awt.CheckboxMenuItem checkboxMenuItemS7;
	java.awt.CheckboxMenuItem checkboxMenuItemS8;
	java.awt.CheckboxMenuItem checkboxMenuItemS9;
	java.awt.CheckboxMenuItem checkboxMenuItemS10;
	java.awt.CheckboxMenuItem checkboxMenuItemS12;
	java.awt.CheckboxMenuItem checkboxMenuItemS14;
	java.awt.CheckboxMenuItem checkboxMenuItemS18;
	java.awt.CheckboxMenuItem checkboxMenuItemS24;
	java.awt.CheckboxMenuItem checkboxMenuItemS30;
	java.awt.CheckboxMenuItem checkboxMenuItemS36;
	java.awt.Menu menuAbout;
	java.awt.MenuItem miAbout;
	//}}
	
	String font="SansSerif";
	int style=Font.PLAIN;
	int size=10;
	String inputFileName;
	PageSetupDialog psd=null;
	
	class SymWindow extends java.awt.event.WindowAdapter
	{
		public void windowClosing(java.awt.event.WindowEvent event)
		{
			Object object = event.getSource();
			if (object == PrintTextFile.this)
				Frame1_WindowClosing(event);
		}
	}

	void Frame1_WindowClosing(java.awt.event.WindowEvent event)
	{
		hide();		    // hide the Frame
		dispose();	    // free the system resources
		System.exit(0); // close the application
	}

	class SymAction implements java.awt.event.ActionListener
	{
		public void actionPerformed(java.awt.event.ActionEvent event)
		{
			Object object = event.getSource();
			if (object == miOpen)
				miOpen_Action(event);
			else if (object == miAbout)
				miAbout_Action(event);
			else if (object == miExit)
				miExit_Action(event);
			else if (object == miPrint)
				miPrint_Action(event);
			else if (object == menuItemPageSetup)
				menuItemPageSetup_Action(event);
		}
	}
	
	void miAbout_Action(java.awt.event.ActionEvent event)
	{
		//{{CONNECTION
		// Action from About Create and show as modal
		(new AboutDialog(this, true)).show();
		//}}
	}

	void miExit_Action(java.awt.event.ActionEvent event)
	{
		//{{CONNECTION
		// Action from Exit Create and show as modal
		// (new QuitDialog(this, true)).show(); - MP skip confirmation dialog, just exit
		hide();		     // hide the Frame
		dispose();	     // free the system resources
		System.exit(0);  // close the application
		//}}
	}

	void miOpen_Action(java.awt.event.ActionEvent event)
	{
		//{{CONNECTION
		// Action from Open... Show the OpenFileDialog
		openFileDialog1.show();
        inputFileName = openFileDialog1.getDirectory() + openFileDialog1.getFile();
        if (inputFileName.compareTo("nullnull") != 0) {
            processFile(inputFileName);
            labelFileName.setText("   File " + inputFileName);
    	}
        this.repaint();
		//}}
	}
	
    void processFile(String inName)
    {
        String inLine;
        StringBuffer outBuf = new StringBuffer();
	    String lineSeparator = System.getProperty("line.separator");
	    

        try {
            BufferedReader inData  = new BufferedReader(new FileReader(inName));
            while ((inLine = inData.readLine()) != null) {
                outBuf.append(inLine);
                outBuf.append(lineSeparator);
            }
            textAreaConv.replaceRange("", 0, textAreaConv.getText().length() );
            textAreaConv.append(outBuf.toString());
            textAreaConv.setCaretPosition(0);
            inData.close();
        }
        catch (IOException e) { System.out.println("IO Error:" + e.getMessage()); }
        repaint();
    }
    
	void miPrint_Action(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
	    printer.print(textAreaConv.getText());
	}

	class SymItem implements java.awt.event.ItemListener
	{
		public void itemStateChanged(java.awt.event.ItemEvent event)
		{
			Object object = event.getSource();
			if (object == checkboxMenuItemSerif)
				checkboxMenuItemSerif_ItemStateChanged(event);
			else if (object == checkboxMenuItemPlain)
				checkboxMenuItemPlain_ItemStateChanged(event);
			else if (object == checkboxMenuItemS6)
				checkboxMenuItemS6_ItemStateChanged(event);
			else if (object == checkboxMenuItemSansSerif)
				checkboxMenuItemSansSerif_ItemStateChanged(event);
			else if (object == checkboxMenuItemMonospaced)
				checkboxMenuItemMonospaced_ItemStateChanged(event);
			else if (object == checkboxMenuItemBold)
				checkboxMenuItemBold_ItemStateChanged(event);
			else if (object == checkboxMenuItemItalic)
				checkboxMenuItemItalic_ItemStateChanged(event);
			else if (object == checkboxMenuItemS7)
				checkboxMenuItemS7_ItemStateChanged(event);
			else if (object == checkboxMenuItemS8)
				checkboxMenuItemS8_ItemStateChanged(event);
			else if (object == checkboxMenuItemS9)
				checkboxMenuItemS9_ItemStateChanged(event);
			else if (object == checkboxMenuItemS10)
				checkboxMenuItemS10_ItemStateChanged(event);
			else if (object == checkboxMenuItemS12)
				checkboxMenuItemS12_ItemStateChanged(event);
			else if (object == checkboxMenuItemS14)
				checkboxMenuItemS14_ItemStateChanged(event);
			else if (object == checkboxMenuItemS18)
				checkboxMenuItemS18_ItemStateChanged(event);
			else if (object == checkboxMenuItemS24)
				checkboxMenuItemS24_ItemStateChanged(event);
			else if (object == checkboxMenuItemS30)
				checkboxMenuItemS30_ItemStateChanged(event);
			else if (object == checkboxMenuItemS36)
				checkboxMenuItemS36_ItemStateChanged(event);
		}
	}
	
    // utility method to check the selected menu item uncheck all the other menu items
    private void checkMeUncheckRest(java.awt.event.ItemEvent e, Menu m) {
        String thisItem = e.getItem().toString();
        for (int i=0; i<m.getItemCount(); i++) {
            if (thisItem == m.getItem(i).getLabel())
                ((CheckboxMenuItem) m.getItem(i)).setState(true);
            else
                ((CheckboxMenuItem) m.getItem(i)).setState(false);
        }
    }

	void checkboxMenuItemSerif_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		//{{CONNECTION
		// Check the CheckboxMenuItem
		checkboxMenuItemSerif.setState(true);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemSansSerif.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemMonospaced.setState(false);
		//}}
	    font="Serif";
        textAreaConv.setFont(new Font(font, style, size)); 
	    printer.setPrinterFont(new Font(font, style, size));
        this.repaint();
	}

	void checkboxMenuItemSansSerif_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
			 
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemSerif.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemSansSerif.setState(true);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemMonospaced.setState(false);
		//}}
	    font="SansSerif";
        textAreaConv.setFont(new Font(font, style, size)); 
	    printer.setPrinterFont(new Font(font, style, size));
        this.repaint();
	}
	
	void checkboxMenuItemMonospaced_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
			 
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemSerif.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemSansSerif.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemMonospaced.setState(true);
		//}}
	    font="Monospaced";
        textAreaConv.setFont(new Font(font, style, size)); 
        this.repaint();
	}
	
	void checkboxMenuItemPlain_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
			 
		//{{CONNECTION
		// Check the CheckboxMenuItem
		checkboxMenuItemPlain.setState(true);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemBold.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemItalic.setState(false);
		//}}
	    style=Font.PLAIN;
        textAreaConv.setFont(new Font(font, style, size)); 
	    printer.setPrinterFont(new Font(font, style, size));
        this.repaint();
	}


	void checkboxMenuItemBold_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
			 
		//{{CONNECTION
		// Check the CheckboxMenuItem
		checkboxMenuItemPlain.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemBold.setState(true);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemItalic.setState(false);
		//}}
	    style=Font.BOLD;
        textAreaConv.setFont(new Font(font, style, size)); 
	    printer.setPrinterFont(new Font(font, style, size));
        this.repaint();
    }
    
	void checkboxMenuItemItalic_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
			 
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemPlain.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemBold.setState(false);
		//}}
		//{{CONNECTION
		// Uncheck the CheckboxMenuItem
		checkboxMenuItemItalic.setState(true);
		//}}
	    style=Font.ITALIC;	
        textAreaConv.setFont(new Font(font, style, size)); 
	    printer.setPrinterFont(new Font(font, style, size));
        this.repaint();
	}

	void checkboxMenuItemS6_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(6);
	}


	void checkboxMenuItemS7_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(7);
	}

	void checkboxMenuItemS8_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(8);
	}

	void checkboxMenuItemS9_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(9);
	}

	void checkboxMenuItemS10_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(10);
	}

	void checkboxMenuItemS12_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(12);
	}

	void checkboxMenuItemS14_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(14);
	}

	void checkboxMenuItemS18_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(18);
	}

	void checkboxMenuItemS24_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(24);
	}

	void checkboxMenuItemS30_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(30);
	}

	void checkboxMenuItemS36_ItemStateChanged(java.awt.event.ItemEvent event)
	{
		// to do: code goes here.
		checkMeUncheckRest(event, menuSize);
	    changeSize(36);
    }
    
    private void changeSize(int newsize) {
	    size=newsize;
        textAreaConv.setFont(new Font(font, style, size)); 
	    printer.setPrinterFont(new Font(font, style, size));
        this.repaint();
    }
    

	void menuItemPageSetup_Action(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		//{{CONNECTION
		// Create with title, show as modal... Get Frame title
		
		if (psd==null) psd = new PageSetupDialog(this, "Page Setup", true);
		(psd.checkboxWrap).setState(printer.getWrap());
		(psd.checkboxAbsoluteTabs).setState(printer.getAbsoluteTabs());
		(psd.textFieldPageRange).setText(printer.getPageRange());
		(psd.textFieldPrintJobName).setText(printer.getPrintJobName());
		(psd.textFieldLeftHeader).setText(printer.getLeftHeader());
		(psd.textFieldCenterHeader).setText(printer.getCenterHeader());
		(psd.textFieldRightHeader).setText(printer.getRightHeader());
		(psd.textFieldLeftFooter).setText(printer.getLeftFooter());
		(psd.textFieldCenterFooter).setText(printer.getCenterFooter());
		(psd.textFieldRightFooter).setText(printer.getRightFooter());
		(psd.textFieldInchesPerTab).setText(Double.toString(printer.getInchesPerTab()));
		(psd.textFieldLineSpacing).setText(Double.toString(printer.getLineSpacing()));
		(psd.textFieldLeftMargin).setText(Double.toString(printer.getLeftMargin()));
		(psd.textFieldRightMargin).setText(Double.toString(printer.getRightMargin()));
		(psd.textFieldTopMargin).setText(Double.toString(printer.getTopMargin()));
		(psd.textFieldBottomMargin).setText(Double.toString(printer.getBottomMargin()));
		(psd.textFieldGapBelowHeader).setText(Double.toString(printer.getGapBelowHeader()));
		(psd.textFieldGapAboveFooter).setText(Double.toString(printer.getGapAboveFooter()));
		(psd.textFieldPrinterFont).setText(font2String(printer.getPrinterFont()));
		(psd.textFieldHeaderFooterFont).setText(font2String(printer.getHeaderFooterFont()));
		psd.show();
		//}}
	}
	
	private String font2String(Font f) {
	    int style = f.getStyle();
	    String styleName = "PLAIN";
		if (style==Font.BOLD) styleName = "BOLD";
		if (style==Font.ITALIC) styleName = "ITALIC";		
		return f.getFamily() + "," + styleName + "," + f.getSize();
	}
	   
	   
    /* defaultMargin method

    Sample code to calculate default margins for TextPrinter
    Useful because:
    1) special values are needed to work around bugs in Windows JDK releases prior to 1.1.7 and 1.2beta4
    2) Solaris reports physical page dimensions, as does Windows beginning with 1.1.7 and 1.2beta4,
    whereas Mac and older JDKs for Windows report printable page dimensions
    3) right margin usually needs extra room because of cummulative font metric rounding errors

    Operating systems and Java releases supported:
    Windows 95, 98, and NT: 1.1.4 and earlier, 1.1.5 and 1.1.6, 1.1.7, 1.1.8, 1.2beta3, 1.2beta4, 1.2, 1.2.2
    Solaris: 1.1.x and 1.2
    Macintosh: 1.1.x
        
    */

    private double defaultMargin(String which) {  // which = "LEFT", "RIGHT", "TOP", or "BOTTOM"
        double lm=0.0, rm=0.0, tm=0.0, bm=0.0;
        String osName = System.getProperty("os.name");
        String javaVersion = System.getProperty("java.version");

        if (osName.equals("Windows 95") | osName.equals("Windows 98") | osName.equals("Windows NT")) {
            if (javaVersion.startsWith("1.1")) {            // printing support began with JDK 1.1
                try {
                    int lastDigit = Integer.valueOf(javaVersion.substring(4,5)).intValue();
                    if (lastDigit <= 4) {                       // "2/3 page" bug in 1.1.4 and earlier
                        lm = 0.0; rm = -1.875; tm = 0.0; bm = -2.7; }
                    else if (lastDigit == 5 | lastDigit == 6) { // Sun's attempted fix in 1.1.5 and 1.1.6
                        lm = 0.0; rm = 0.56; tm = 0.0; bm = 0.7; }
                    else {                                      // Sun's fix in 1.1.7
                        lm = 0.28; rm = 0.48; tm = 0.28; bm = 0.65; }
                }
                catch (Exception e) { lm = 0.28; rm = 0.56; tm = 0.28; bm = 0.7; } // e.g. MS IE/jview
            }
            else if (javaVersion.startsWith("1.2")) {
                if (javaVersion.endsWith("beta3")) {        // 1.2beta3 reverted to 1.1.4 bug
                    lm = 0.0; rm = -1.875; tm = 0.0; bm = -2.7; }
                else {                                      // 1.2beta4 and 1.2fcs same as 1.1.7
                    lm = 0.28; rm = 0.48; tm = 0.28; bm = 0.65; }
            }
            else { lm = 0.28; rm = 0.56; tm = 0.28; bm = 0.7; }
        }

        else if (osName.equals("SunOS") | osName.equals("Solaris")) { // fix physical vs printable page problem
            lm = 0.28; rm = 0.28;  tm = 0.28; bm = 0.28; }

        else if (osName.equals("Macintosh")) {      // Mac takes care of margins
            lm = 0.0; rm = 0.0; tm = 0.0; bm = 0.0; }

        else {  // all other releases, assume conservative values, users: please notify us at products@wildcrest.com for any others you find!
            lm = 0.28; rm = 0.56; tm = 0.28; bm = 0.7; }

        if (which.toUpperCase().equals("LEFT")) return lm;
        if (which.toUpperCase().equals("RIGHT")) return rm;
        if (which.toUpperCase().equals("TOP")) return tm;
        if (which.toUpperCase().equals("BOTTOM")) return bm;
        return 0.0;     // return 0.0 if any other
    }

}
