SlideWriter Application


Classes:

Thumbnail.java Browsefilter.java Slide.java SlideTray.java


Feel free to contact me if you wish to have a zip file sent to you of the entire application.
/**
 * SlideWriter by Steve Borga and Cory Goldfuss 3-20-1
 * Program allows the creation and viewing of slide trays.  A tray consists
 * of several individual slides.  A slide is then composed of an image, a title, 
 * and a short descriptive text about the slide.  This program enables the user to
 * create slides, add them to a tray and ultimately create a tray by adding several slides.
 * In order to view the slide show, the user must save the current tray by selecting Save HTML File.
 * This will write a HTML file to the selected directory which consists of an applet and several parameter
 * tags which the applet uses.  For more information about the other program, see the documentation of 
 * SlidePresenter.java
 */

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.border.*;
import java.util.*;
import javax.swing.event.*;


 
public class SlideWriter extends JApplet implements ActionListener 
{
    // make an application - Standard method for most applets
    public static void main(String s[]){
        JFrame frame = new JFrame("SlideWriter");
        frame.setResizable(false);
        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        
        SlideWriter appletObject = new SlideWriter();
        appletObject.init();
        appletObject.start();
        frame.getContentPane().add(appletObject);
        
        int w = frame.getWidth();
        int h = frame.getHeight();
        
        int width = appletObject.getWidth() + 10;
        int height = appletObject.getHeight() + 20;
        frame.setSize(width, height);
        
        frame.show();
    }
    
    private Font titleFont;
    private Slide mySlide = new Slide();
    private SlideTray myTray = new SlideTray();
    private TitledBorder imageBorder;
    private LineBorder myBorder = new LineBorder( Color.black, 3 );
    private File myImage, thisSlide, thisTray, thisHTML; 
    private ImageIcon selectedImage;
    private String imageName;
    private String fileName;
    private String title;  // title of slide
    private String description; // description of slide
    private String slideName;
    private String trayName;
    private String HTMLName;
    private String shortSlideName;  // stores slide names only, not the absolute path
    private String shortTrayName;   // stores tray names only, not the absolute path
    private Color color = Color.black;  // background color of slide
    private Thumbnail tNail = new Thumbnail();
    private java.util.List trayList = new ArrayList();  // stores the image names in a list
    private java.util.List trayList2 = new ArrayList(); // stores entire paths in a list
    private DefaultListModel listModel = new DefaultListModel(); // used for Lists
    private PrintWriter fout;  // file out for HTML code
    
    // Declare menu items
    private JMenuBar ourMenu = new JMenuBar();
    private JMenu fileMenu = new JMenu("File");
    private JMenu helpMenu = new JMenu("Help");
    private JMenuItem aboutProg = new JMenuItem("About");
    private JMenu newMenu = new JMenu("New");
    private JMenuItem newSlide = new JMenuItem("Slide");
    private JMenuItem newTray = new JMenuItem("Tray");
    private JMenu saveMenu = new JMenu("Save");
    private JMenuItem saveSlide = new JMenuItem("Slide");
    private JMenuItem saveSlideTray = new JMenuItem("Slide Tray");
    private JMenuItem saveHTML = new JMenuItem("HTML file");
    private JMenu openMenu = new JMenu("Open");
    private JMenuItem openSlide = new JMenuItem("Slide");
    private JMenuItem slideFromTray = new JMenuItem("Slide from tray");
    private JMenuItem openImage = new JMenuItem("Image");
    private JMenuItem openSlideTray = new JMenuItem("Slide Tray");
    private JMenuItem exitProg = new JMenuItem("Exit");    
    
	public void init()
	{
		// This line prevents the "Swing: checked access to system event queue" message seen in some browsers.
		getRootPane().putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
		
		// 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.
		//{{INIT_CONTROLS
		getContentPane().setLayout(null);
		getContentPane().setBackground(java.awt.Color.black);
		setSize(700,430);
		previewPanel.setLayout(null);
		getContentPane().add(previewPanel);
		previewPanel.setBackground(java.awt.Color.magenta);
		previewPanel.setBounds(20,5,640,380);
		previewPanel.setVisible(false);
		textPrevArea.setLineWrap(true);
		textPrevArea.setWrapStyleWord(true);
		textPrevArea.setDisabledTextColor(java.awt.Color.black);
		textPrevArea.setEditable(false);
		textPrevArea.setEnabled(false);
		previewPanel.add(textPrevArea);
		textPrevArea.setForeground(java.awt.Color.black);
		textPrevArea.setFont(new Font("Dialog", Font.BOLD, 10));
		textPrevArea.setBounds(348,67,240,180);
		textPrevArea.setVisible(false);
		exitButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		exitButton.setText("Exit Preview");
		exitButton.setActionCommand("Exit Preview");
		previewPanel.add(exitButton);
		exitButton.setBounds(480,7,132,24);
		exitButton.setVisible(false);
		picturePrevPanel.setLayout(new GridLayout(1,1,0,0));
		previewPanel.add(picturePrevPanel);
		picturePrevPanel.setBounds(60,67,240,200);
		picturePrevPanel.setVisible(false);
		previousButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		previousButton.setText("Previous");
		previousButton.setActionCommand("Previous");
		previousButton.setMnemonic((int)'P');
		previousButton.setEnabled(false);
		previewPanel.add(previousButton);
		previousButton.setFont(new Font("Dialog", Font.BOLD, 10));
		previousButton.setBounds(180,283,100,30);
		previousButton.setVisible(false);
		nextButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		nextButton.setText("Next");
		nextButton.setActionCommand("Next");
		nextButton.setMnemonic((int)'N');
		nextButton.setEnabled(false);
		previewPanel.add(nextButton);
		nextButton.setFont(new Font("Dialog", Font.BOLD, 10));
		nextButton.setBounds(312,283,100,30);
		nextButton.setVisible(false);
		picturePanel.setLayout(new GridLayout(1,1,0,0));
		getContentPane().add(picturePanel);
		picturePanel.setBackground(java.awt.Color.white);
		picturePanel.setBounds(50,20,240,180);
		previewButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		previewButton.setText("Preview");
		previewButton.setActionCommand("Preview");
		getContentPane().add(previewButton);
		previewButton.setBounds(48,300,132,36);
		colorButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		colorButton.setText("Change Color");
		colorButton.setActionCommand("Change Color");
		getContentPane().add(colorButton);
		colorButton.setBounds(48,240,132,40);
		titleLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		titleLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		titleLabel.setText("Title:");
		getContentPane().add(titleLabel);
		titleLabel.setBounds(360,20,48,40);
		textLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		textLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		textLabel.setText("Text:");
		getContentPane().add(textLabel);
		textLabel.setBounds(360,90,48,40);
		descriptionScroll.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.TEXT_CURSOR));
		getContentPane().add(descriptionScroll);
		descriptionScroll.setBounds(408,90,240,102);
		descriptionArea.setLineWrap(true);
		descriptionArea.setWrapStyleWord(true);
		descriptionArea.setDisabledTextColor(java.awt.Color.black);
		descriptionScroll.add(descriptionArea);
		descriptionArea.setFont(new Font("Dialog", Font.PLAIN, 11));
		descriptionArea.setBounds(408,90,220,102);
		getContentPane().add(titleField);
		titleField.setFont(new Font("Serif", Font.PLAIN, 24));
		titleField.setBounds(408,20,240,40);
		addToTrayButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		addToTrayButton.setText("Add Slide");
		addToTrayButton.setActionCommand("Add to Tray");
		addToTrayButton.setAlignmentY(0.0F);
		getContentPane().add(addToTrayButton);
		addToTrayButton.setBounds(276,264,115,36);
		removeButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		removeButton.setText("Remove Slide");
		removeButton.setActionCommand("Remove Slide");
		removeButton.setAlignmentY(0.0F);
		getContentPane().add(removeButton);
		removeButton.setBounds(276,312,115,36);
		getContentPane().add(listPane);
		listPane.setBounds(408,228,240,156);
		trayListIndex.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
		listPane.add(trayListIndex);
		trayListIndex.setBounds(408,228,240,156);
		trayLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
		trayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		trayLabel.setText("Tray:");
		getContentPane().add(trayLabel);
		trayLabel.setBounds(360,228,48,40);
		//}}
		
		// setup our menu
		setJMenuBar( ourMenu );
		ourMenu.add(fileMenu);
		ourMenu.add(helpMenu);
		helpMenu.add( aboutProg );
		fileMenu.add(newMenu);
		newMenu.add(newSlide);
		newMenu.add(newTray);
		fileMenu.add(new JSeparator());
		fileMenu.add(openMenu);
		openMenu.add(openSlide);
		openMenu.add(slideFromTray);
		openMenu.add(openSlideTray);
		openMenu.add(openImage);
		fileMenu.add(new JSeparator());
		fileMenu.add(saveMenu);
		saveMenu.add(saveSlide);
		saveMenu.add(saveSlideTray);
		saveMenu.add(saveHTML);
		fileMenu.add(new JSeparator());
		fileMenu.add(exitProg);
		
		// add the Thumbnail panel to our image panel
		picturePanel.add(tNail);
		
		// create borders
		createBorder( previewPanel, "" );
		createBorder( picturePanel, "" );
		createBorder( descriptionArea, "" );
		
		// add listeners
		openImage.addActionListener(this);
		colorButton.addActionListener(this);
		previewButton.addActionListener(this);
		exitButton.addActionListener(this);
		saveSlide.addActionListener(this);
		openSlide.addActionListener(this);
		newSlide.addActionListener(this);
		exitProg.addActionListener(this);
		aboutProg.addActionListener( this );
		addToTrayButton.addActionListener(this);
		saveSlideTray.addActionListener(this);
		openSlideTray.addActionListener(this);
		newTray.addActionListener(this);
		slideFromTray.addActionListener(this);
		removeButton.addActionListener(this);
		saveHTML.addActionListener(this);
		
		

	}

	//{{DECLARE_CONTROLS
	javax.swing.JPanel previewPanel = new javax.swing.JPanel();
	javax.swing.JTextArea textPrevArea = new javax.swing.JTextArea();
	javax.swing.JButton exitButton = new javax.swing.JButton();
	javax.swing.JPanel picturePrevPanel = new javax.swing.JPanel();
	javax.swing.JButton previousButton = new javax.swing.JButton();
	javax.swing.JButton nextButton = new javax.swing.JButton();
	javax.swing.JPanel picturePanel = new javax.swing.JPanel();
	javax.swing.JButton previewButton = new javax.swing.JButton();
	javax.swing.JButton colorButton = new javax.swing.JButton();
	javax.swing.JLabel titleLabel = new javax.swing.JLabel();
	javax.swing.JLabel textLabel = new javax.swing.JLabel();
	java.awt.ScrollPane descriptionScroll = new java.awt.ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
	javax.swing.JTextArea descriptionArea = new javax.swing.JTextArea();
	javax.swing.JTextField titleField = new javax.swing.JTextField();
	javax.swing.JButton addToTrayButton = new javax.swing.JButton();
	javax.swing.JButton removeButton = new javax.swing.JButton();
	java.awt.ScrollPane listPane = new java.awt.ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
	javax.swing.JList trayListIndex = new javax.swing.JList(listModel);
	javax.swing.JLabel trayLabel = new javax.swing.JLabel();
	//}}
	
    public void actionPerformed(ActionEvent ae){
        
        if (ae.getSource() == newSlide){
            
            // test to see if anything changed so user does not destroy current slide
            if( mySlide.getColor() != color ||
                mySlide.getText().compareTo(descriptionArea.getText().trim()) != 0 ||
                mySlide.getTitle().compareTo(titleField.getText().trim()) != 0 ||
                selectedImage != mySlide.getPhoto()
                )
                
                saveSlide();
            
            reset();
        }
        
        if (ae.getSource() == previewButton){
            // switch to preview
            previewPanel.setVisible(true);
            textPrevArea.setVisible(true);
            exitButton.setVisible(true);
            picturePrevPanel.setVisible(true);
            previousButton.setVisible(true);
            nextButton.setVisible(true);
            previewButton.setVisible(false);
            colorButton.setVisible(false);
            descriptionArea.setVisible(false);
            titleField.setVisible(false);
            addToTrayButton.setVisible( false );
            removeButton.setVisible( false );
            trayListIndex.setVisible( false );
            descriptionScroll.setVisible( false );
            listPane.setVisible( false );
            
            // move the image to the other panel
		    picturePrevPanel.add(tNail);
                        
            createBorder(picturePrevPanel, titleField.getText().trim());
            textPrevArea.setText(descriptionArea.getText().trim());
        }
        
        if (ae.getSource() == saveSlide){
            saveSlide();
        }        
        
        if (ae.getSource() == colorButton){
            // using the premade color chooser dialog
            Color c = JColorChooser.showDialog( previewPanel, "Choose new background color", Color.black );
	        if ( c != null ){
	            color = c;
	            previewPanel.setBackground( color );
	            colorButton.setBackground( color );
	            textPrevArea.setBackground( color );
	            picturePrevPanel.setBackground( color );
	            tNail.setBackground( color );
	            
	        }
	        return;
	    }
	    
	    if (ae.getSource() == openImage){
	        JFileChooser fileChooser = new JFileChooser();
	        
	        //only allow files
	        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	        
	        // set filter to just .jpg, .jpge, and .gif
	        BrowseFilter jpgFilter = new BrowseFilter(".jpg", "JPG files (*.jpg)");
	        BrowseFilter jpegFilter = new BrowseFilter(".jpeg", "JPEG files (*.jpeg)");
	        BrowseFilter gifFilter = new BrowseFilter(".gif", "Compuserve GIF (*.gif)");
	        fileChooser.addChoosableFileFilter( gifFilter );
	        fileChooser.addChoosableFileFilter( jpegFilter );
	        fileChooser.addChoosableFileFilter( jpgFilter );
	        fileChooser.setFileFilter( jpgFilter );
	    
            // handle results
	        int result = fileChooser.showOpenDialog( this );
	        if (result >= 0 ){
	        myImage = fileChooser.getSelectedFile();
	        
	        try{
	            imageName = myImage.getAbsolutePath();    // get full path to file
	        }
	        catch ( NullPointerException npe ){
	            System.out.println( npe );
	        }
	        
	        selectedImage = new ImageIcon( imageName );
	        tNail.setImage( selectedImage );
	        fileName = myImage.getName();
	        tNail.displayImage();
        }
        }
        
        if (ae.getSource() == openSlide){
            
            // passing an empty string to bring up FileChooser
            openThisSlide("");
            
            setSlide();
        }
        
        if (ae.getSource() == exitButton){
            // exit preview mode
            
            previewPanel.setVisible(false);
            textPrevArea.setVisible(false);
            exitButton.setVisible(false);
            picturePrevPanel.setVisible(false);
            previousButton.setVisible(false);
            nextButton.setVisible(false);
            previewButton.setVisible(true);
            colorButton.setVisible(true);
            descriptionArea.setVisible(true);
            titleField.setVisible(true);
            addToTrayButton.setVisible( true );
            removeButton.setVisible( true );
            trayListIndex.setVisible( true );
            descriptionScroll.setVisible( true );
            listPane.setVisible( true );
		    picturePanel.add(tNail);
            
        }
        
        if (ae.getSource() == exitProg){
            System.exit(0);     //this is pretty self explanatory
        }
        
        if (ae.getSource() == removeButton){
            
            // remove selected slide from tray
            int i = trayListIndex.getSelectedIndex();
            trayList.remove(i);
            trayList2.remove(i);
            listModel.remove(i);
        }
            
            
        if (ae.getSource() == addToTrayButton){
            
            // test if the slide has changed
            if( mySlide.getColor() != color ||
                mySlide.getText().compareTo(descriptionArea.getText().trim()) != 0 ||
                mySlide.getTitle().compareTo(titleField.getText().trim()) != 0  ||
                selectedImage != mySlide.getPhoto()
                ){
                
                if (!saveSlide())   //if they won't save the slide 
                    return;         //we won't put it in the tray
                }
             
            // add slide before currently selected slide  
            int n = trayListIndex.getSelectedIndex();
            if( n >= 0 && n < trayList.size()){
                trayList.add(n, shortSlideName);
                trayList2.add(n, slideName);
                listModel.add(n, shortSlideName);
                }
            // unless nothing is selected then just add to end of list
            else{
                trayList.add(shortSlideName);
                trayList2.add(slideName);
                listModel.addElement(shortSlideName);
            }                
        }
        
        if( ae.getSource() == saveSlideTray){
            
            myTray.setNames(trayList);
            myTray.setPaths(trayList2);
            saveTray();
        }
        
        if( ae.getSource() == openSlideTray){
            
            openThisTray();
            
            trayList.clear();
            trayList2.clear();
            listModel.clear();
            
            // get individual slide information and show it in the list
            trayList = myTray.getNames();
            trayList2 = myTray.getPaths();
            
            for(int i = 0; i < trayList.size(); i++){
                listModel.addElement(trayList.get(i));
            }
            
            // open up first slide from tray automatically upon load
            openThisSlide( (String)trayList2.get(0) );
            
            shortSlideName = (String) trayList.get(0);
            titleField.setText(mySlide.getTitle());
            descriptionArea.setText(mySlide.getText());
            selectedImage = mySlide.getPhoto();
            fileName = mySlide.getPhotoName();
        
            color = mySlide.getColor();
	        previewPanel.setBackground( color );
	        colorButton.setBackground( color );
	        textPrevArea.setBackground( color );
	        picturePrevPanel.setBackground( color );
    	    
	        tNail.setImage( selectedImage );
	        tNail.displayImage();
	        tNail.setBackground( color );
            
        }

        if( ae.getSource() == newTray){
            
            trayList.clear();
            trayList2.clear();
            listModel.clear();
            myTray = new SlideTray();
            reset();
        }
        
        if (ae.getSource() == slideFromTray){
            
            // open slide that is currently selected in the List
            int n = trayListIndex.getSelectedIndex();
            if( n >= 0 && n < trayList.size())
                openThisSlide((String) trayList2.get(n));
            // if nothing selected then open up first slide
            else
                openThisSlide((String) trayList2.get(0));
            
            setSlide();
            shortSlideName = (String) trayList.get(n);
        }
        if ( ae.getSource() == aboutProg ){
            // give us credit - We hope this is a good thing to do
            JOptionPane.showMessageDialog( this, "SlideWriter 1.0b\n" + "Copyright 2001 Borfuss Inc.", "SlideWriter 1.0b", JOptionPane.INFORMATION_MESSAGE);
        }
        
        if ( ae.getSource() == saveHTML){
            
            // prepare tray for viewing as a presentation by saving the HTML file
            // with parameters - See SlidePresenter.java for more information.
	        JFileChooser HTMLChooser = new JFileChooser();
	        HTMLChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	        BrowseFilter HTMLFilter = new BrowseFilter(".html", "HTML files");
	        HTMLChooser.addChoosableFileFilter( HTMLFilter );

	        HTMLChooser.setFileFilter( HTMLFilter );
	        
	        int result = HTMLChooser.showSaveDialog( this );
	        thisHTML = HTMLChooser.getSelectedFile();
	        
	        try{
	            HTMLName = thisHTML.getAbsolutePath();    // get full path to file
	        }
	        catch ( NullPointerException npe ){
	            System.out.println( npe );
	            JOptionPane.showMessageDialog( this, "Please choose an HTML.", "No HTML Selected", JOptionPane.INFORMATION_MESSAGE);
	        }
	        
	        if (!HTMLName.endsWith(".html"))
	            HTMLName = HTMLName + ".html";
            
            try{
                fout = new PrintWriter(new BufferedWriter(new FileWriter(HTMLName)));
            }
            
            catch( FileNotFoundException e ){}
            catch( IOException e ){}
            
            // write HTML file
		Code removed becasue I didn't want to go through and make it work in a web browser.
		This section writes the HTML file.
    }
    
    // used to make borders around JPanels on the fly
	public void createBorder( JPanel c, String name ){
	    
	    if (name != ""){
	        titleFont = new Font("Dialog", Font.PLAIN, 10);
	        imageBorder = new TitledBorder( myBorder, " " + name + " ");
	        imageBorder.setTitleFont( titleFont );
	        imageBorder.setTitleColor( Color.black );
	        c.setBorder( imageBorder );
	    }
	    else
	        c.setBorder( new TitledBorder( myBorder, ""));
	   
	}
	
	// polymorphism with the createBorder method, in order to use the same call for a JTextArea
	public void createBorder( JTextArea c, String name ){
	    
	    if (name != ""){
	        imageBorder = new TitledBorder( myBorder, " " + name + " ");
	        
	        c.setBorder( imageBorder );
	    }
	    else
	        c.setBorder( new TitledBorder( myBorder, ""));
	   
	}

    /*  Save current slide */
    public boolean saveSlide(){
            mySlide.setColor(color);
            mySlide.setText(descriptionArea.getText().trim());
            mySlide.setTitle(titleField.getText().trim());
            mySlide.setPhotoName(fileName);
            mySlide.setPhoto(selectedImage);
            
	        JFileChooser slideChooser = new JFileChooser();
	        slideChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	        BrowseFilter sldFilter = new BrowseFilter(".sld", "Slide files (*.sld)");
	        BrowseFilter slideFilter = new BrowseFilter(".slide", "Slide files (*.slide)");
	        slideChooser.addChoosableFileFilter( sldFilter );
	        slideChooser.addChoosableFileFilter( slideFilter );

	        slideChooser.setFileFilter( sldFilter );
	        
	        int result = slideChooser.showSaveDialog( this );
	        // safegaurd to prevent adding of blank slides to tray
	        // unless the slide's title is Easter Egg
	        if (result == slideChooser.CANCEL_OPTION ||
	            result == -1){
	            mySlide.setTitle("Easter Egg");
	            return false;
	        }
	        thisSlide = slideChooser.getSelectedFile();
	        shortSlideName = thisSlide.getName();
	        
	        if (!shortSlideName.endsWith(".sld"))
	            shortSlideName = shortSlideName + ".sld";

	        try{
	            slideName = thisSlide.getAbsolutePath();    // get full path to file
	        }
	        catch ( NullPointerException npe ){
	            System.out.println( npe );
	            JOptionPane.showMessageDialog( this, "Please choose a slide.", "No Slide Selected", JOptionPane.INFORMATION_MESSAGE);
	        }
	        
	        if (!slideName.endsWith(".sld"))
	            slideName = slideName + ".sld";
                
            try{
            ObjectOutputStream objectOut =
                new ObjectOutputStream(
                new BufferedOutputStream(
                new FileOutputStream(slideName)));
                                      
            objectOut.writeObject( mySlide );
            objectOut.close();
        }
        
        // catch errors and do nothing with them
        catch(NotSerializableException e){}
        catch(InvalidClassException e){}
        catch(IOException e){}
        
        return true;
    }
    
    /* Open a slide */
    public void openThisSlide(String s){
        
            slideName = s;
            // if no name is passed use FileChooser, else use slideName
            if(s == ""){
	        JFileChooser slideChooser = new JFileChooser();
	        slideChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	        BrowseFilter sldFilter = new BrowseFilter(".sld", "Slide files (*.sld)");
	        BrowseFilter slideFilter = new BrowseFilter(".slide", "Slide files (*.slide)");
	        slideChooser.addChoosableFileFilter( sldFilter );
	        slideChooser.addChoosableFileFilter( slideFilter );

	        slideChooser.setFileFilter( sldFilter );
	        
	        int result = slideChooser.showOpenDialog( this );
	        thisSlide = slideChooser.getSelectedFile();
	        shortSlideName = thisSlide.getName();
	        
	        try{
	            slideName = thisSlide.getAbsolutePath();    // get full path to file
	        }
	        catch ( NullPointerException npe ){
	            System.out.println( npe );
	            JOptionPane.showMessageDialog( this, "Please choose a slide.", "No Slide Selected", JOptionPane.INFORMATION_MESSAGE);
	        }
	        }
	        
            try{
            ObjectInputStream objectIn =
                new ObjectInputStream(
                new BufferedInputStream(
                new FileInputStream(slideName)));
                                      
            mySlide = (Slide) objectIn.readObject();
            objectIn.close();
        }
        
        catch(IOException e){}
        catch(ClassNotFoundException e){}
    }
    
    /* Save Tray */
    public boolean saveTray(){

	        JFileChooser trayChooser = new JFileChooser();
	        trayChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	        BrowseFilter tryFilter = new BrowseFilter(".try", "Tray files (*.try)");
	        BrowseFilter trayFilter = new BrowseFilter(".tray", "Tray files (*.tray)");
	        trayChooser.addChoosableFileFilter( tryFilter );
	        trayChooser.addChoosableFileFilter( trayFilter );

	        trayChooser.setFileFilter( tryFilter );
	        
	        int result = trayChooser.showSaveDialog( this );
	        if (result == trayChooser.CANCEL_OPTION)
	            return false;
	        thisTray = trayChooser.getSelectedFile();
	        
	        shortTrayName = thisTray.getName();
	        
	        if (!shortTrayName.endsWith(".try"))
	            shortTrayName = shortTrayName + ".try";

	        try{
	            trayName = thisTray.getAbsolutePath();    // get full path to file
	        }
	        catch ( NullPointerException npe ){
	            System.out.println( npe );
	            JOptionPane.showMessageDialog( this, "Please choose a tray.", "No Tray Selected", JOptionPane.INFORMATION_MESSAGE);
	        }
	        
	        if (!trayName.endsWith(".try"))
	            trayName = trayName + ".try";
                
            try{
            ObjectOutputStream objectOut =
                new ObjectOutputStream(
                new BufferedOutputStream(
                new FileOutputStream(trayName)));
                                      
            objectOut.writeObject( myTray );
            objectOut.close();
        }
        
        catch(NotSerializableException e){}
        catch(InvalidClassException e){}
        catch(IOException e){}
        return true;
    }
    
    /* Open Tray */
    public void openThisTray(){
	        JFileChooser trayChooser = new JFileChooser();
	        trayChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	        BrowseFilter tryFilter = new BrowseFilter(".try", "Tray files (*.try)");
	        BrowseFilter trayFilter = new BrowseFilter(".tray", "Tray files (*.tray)");
	        trayChooser.addChoosableFileFilter( tryFilter );
	        trayChooser.addChoosableFileFilter( trayFilter );

	        trayChooser.setFileFilter( tryFilter );
	        
	        int result = trayChooser.showOpenDialog( this );
	        thisTray = trayChooser.getSelectedFile();
	        shortTrayName = thisTray.getName();
	        
	        try{
	            trayName = thisTray.getAbsolutePath();    // get full path to file
	        }
	        catch ( NullPointerException npe ){
	            System.out.println( npe );
	            JOptionPane.showMessageDialog( this, "Please choose a tray.", "No Tray Selected", JOptionPane.INFORMATION_MESSAGE);
	        }
	        
	        
	        
            try{
            ObjectInputStream objectIn =
                new ObjectInputStream(
                new BufferedInputStream(
                new FileInputStream(trayName)));
                                      
            myTray = (SlideTray) objectIn.readObject();
            objectIn.close();
        }
        
        catch(IOException e){}
        catch(ClassNotFoundException e){}
    }
    
    // used for quick changing of GUI
    private void reset(){
            previewPanel.setVisible(false);
            textPrevArea.setVisible(false);
            exitButton.setVisible(false);
            picturePrevPanel.setVisible(false);
            previousButton.setVisible(false);
            nextButton.setVisible(false);
            previewButton.setVisible(true);
            colorButton.setVisible(true);
            descriptionArea.setVisible(true);
            titleField.setVisible(true);
            trayListIndex.setVisible( true );
            addToTrayButton.setVisible( true );
            removeButton.setVisible( true );
            descriptionScroll.setVisible( true );
            listPane.setVisible( true );
            
            
            titleField.setText("");
            descriptionArea.setText("");
            picturePanel.remove(tNail);
            tNail = new Thumbnail();
            picturePanel.add(tNail);
            picturePanel.setVisible(false);
            picturePanel.setVisible(true);
    }
    
    // using current slide, setup the GUI accordingly 
    private void setSlide(){
        titleField.setText(mySlide.getTitle());
        descriptionArea.setText(mySlide.getText());
        selectedImage = mySlide.getPhoto();
        fileName = mySlide.getPhotoName();
        
        color = mySlide.getColor();
	    previewPanel.setBackground( color );
	    colorButton.setBackground( color );
	    textPrevArea.setBackground( color );
	    picturePrevPanel.setBackground( color );
    	   
	    tNail.setImage( selectedImage );
	    tNail.displayImage();
	    tNail.setBackground( color );
    }
    
}