/*************************************************************************
 *
 *  The Contents of this file are made available subject to the terms of
 *  the BSD license.
 *  
 *  Copyright 2000, 2010 Oracle and/or its affiliates.
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *  3. Neither the name of Sun Microsystems, Inc. nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *     
 *************************************************************************/

package com.sun.star.comp.beans;

import javax.swing.filechooser.*;
import javax.swing.*;
import java.io.*;

/** A simple Applet that contains the SimpleBean.
 *
 * This applet is a sample implementation of the 
 * OpenOffice.org bean. 
 * When initally loaded the applet has two buttons
 * one for opening an existant file and one to open 
 * a blank document of a given type supported by
 * OpenOffice.org eg. Writer, Calc, Impress, .....
 *
 */
 
public class OOoBeanViewer extends java.applet.Applet
{
   
   /**
    * Private variables declaration - GUI components
    */
   private java.awt.Panel rightPanel;
   private java.awt.Panel bottomPanel;
   private javax.swing.JButton closeButton;
   private javax.swing.JButton terminateButton;
   private javax.swing.JButton newDocumentButton;
   private javax.swing.JPopupMenu documentTypePopUp;
   private javax.swing.JCheckBox menuBarButton;
   private javax.swing.JCheckBox mainBarButton;
   private javax.swing.JCheckBox toolBarButton;
   private javax.swing.JCheckBox statusBarButton;
   private javax.swing.JButton storeDocumentButton;
   private javax.swing.JButton loadDocumentButton;
   private javax.swing.JButton syswinButton;
   private JTextField documentURLTextField;
   private JMenuItem item;
   private JFileChooser fileChooser;
   private byte buffer[];

   /**
    * Private variables declaration - SimpleBean variables
    */
   private OOoBean aBean;

   /**
    * Initialize the Appplet
    */
   public void init()
   {
		//The aBean needs to be initialized to add it to the applet
		aBean = new OOoBean(); 
       
        //Initialize GUI components
        rightPanel = new java.awt.Panel();
        bottomPanel = new java.awt.Panel();
        closeButton = new javax.swing.JButton("close");
        terminateButton = new javax.swing.JButton("terminate");
        newDocumentButton = new javax.swing.JButton("new document...");
        documentTypePopUp = new javax.swing.JPopupMenu();
        storeDocumentButton = new javax.swing.JButton("store to buffer");
        loadDocumentButton = new javax.swing.JButton("load from buffer");
        syswinButton = new javax.swing.JButton("release/aquire");

        menuBarButton = new javax.swing.JCheckBox("MenuBar");
		menuBarButton.setSelected( aBean.isMenuBarVisible() );
		
        mainBarButton = new javax.swing.JCheckBox("MainBar");
		mainBarButton.setSelected( aBean.isStandardBarVisible() );

        toolBarButton = new javax.swing.JCheckBox("ToolBar");
		toolBarButton.setSelected( aBean.isToolBarVisible() );

        statusBarButton = new javax.swing.JCheckBox("StatusBar");
		statusBarButton.setSelected( aBean.isStatusBarVisible() );

        documentURLTextField = new javax.swing.JTextField();
      
        //Set up the Popup Menu to create a blank document
        documentTypePopUp.setToolTipText("Create an empty document");
        
        item = documentTypePopUp.add("Text Document");
        item.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                createBlankDoc("private:factory/swriter", 
                    "New text document");
            }
        });

        item = documentTypePopUp.add("Presentation Document");
        item.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                createBlankDoc("private:factory/simpress", 
                    "New presentation document");
            }
        });

        item = documentTypePopUp.add("Drawing Document");
        item.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                createBlankDoc("private:factory/sdraw", 
                   "New drawing document");
            }
        });

        item = documentTypePopUp.add("Formula Document");
        item.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                createBlankDoc("private:factory/smath", 
                    "New formula document");
            }
        });

        item = documentTypePopUp.add("Spreadsheet Document");
        item.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                createBlankDoc("private:factory/scalc", 
                    "New spreadsheet document");
            }
        });

        syswinButton.addActionListener(
				new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				try 
				{
					aBean.releaseSystemWindow();
					aBean.aquireSystemWindow();
				}
				catch ( com.sun.star.comp.beans.NoConnectionException aExc )
				{}
				catch ( com.sun.star.comp.beans.SystemWindowException aExc )
				{}
			}
       });

        storeDocumentButton.addActionListener(
				new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				try 
				{
					buffer = aBean.storeToByteArray( null, null );
				}
				catch ( Throwable aExc )
				{ 
					System.err.println( "storeToBuffer failed: " + aExc ); 
					aExc.printStackTrace( System.err );
				}
			}
       });

        loadDocumentButton.addActionListener(
				new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				try 
				{
					aBean.loadFromByteArray( buffer, null );
				}
				catch ( Throwable aExc )
				{ 
					System.err.println( "loadFromBuffer failed: " + aExc ); 
					aExc.printStackTrace( System.err );
				}
			}
       });

       closeButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                close();
            }
       });

       terminateButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                terminate();
            }
       });

       newDocumentButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                documentTypePopUp.show((java.awt.Component)evt.getSource(), 0,0);
            }
       });

       menuBarButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				aBean.setMenuBarVisible( !aBean.isMenuBarVisible() );
            }
       });

       mainBarButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				aBean.setStandardBarVisible( !aBean.isStandardBarVisible() );
            }
       });

       toolBarButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				aBean.setToolBarVisible( !aBean.isToolBarVisible() );
            }
       });

       statusBarButton.addActionListener(new java.awt.event.ActionListener()
       {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
				aBean.setStatusBarVisible( !aBean.isStatusBarVisible() );
            }
       });

       documentURLTextField.setEditable(false);
       documentURLTextField.setPreferredSize(new java.awt.Dimension(200, 30));

       rightPanel.setLayout( new java.awt.GridLayout(10,1) );
       rightPanel.add(closeButton);
       rightPanel.add(terminateButton);
       rightPanel.add(newDocumentButton);
       rightPanel.add(storeDocumentButton);
       rightPanel.add(loadDocumentButton);
       rightPanel.add(syswinButton);
       rightPanel.add(menuBarButton);
       rightPanel.add(mainBarButton);
       rightPanel.add(toolBarButton);
       rightPanel.add(statusBarButton);

       //bottomPanel.setLayout( new java.awt.GridLayout(1,1) );
       bottomPanel.setLayout( new java.awt.BorderLayout() );
       bottomPanel.add(documentURLTextField);

       setLayout(new java.awt.BorderLayout());

       add(aBean, java.awt.BorderLayout.CENTER);
       add(rightPanel, java.awt.BorderLayout.EAST);
       add(bottomPanel, java.awt.BorderLayout.SOUTH);
   }

   /**
    * Create a blank document of type <code>desc</code>
    *
    * @param url The private internal URL of the OpenOffice.org
    *            document describing the document
    * @param desc A description of the document to be created
    */
   private void createBlankDoc(String url, String desc)
   {
		//Create a blank document
		try
		{
            documentURLTextField.setText(desc);
            //Get the office process to load the URL
            aBean.loadFromURL( url, null );

	   		aBean.aquireSystemWindow(); 
		}
		catch ( com.sun.star.comp.beans.SystemWindowException aExc )
      	{
			System.err.println( "OOoBeanViewer.1:" );
   			aExc.printStackTrace();
		}
		catch ( com.sun.star.comp.beans.NoConnectionException aExc )
		{
			System.err.println( "OOoBeanViewer.2:" );
			aExc.printStackTrace();
		}
		catch ( Exception aExc )
		{
			System.err.println( "OOoBeanViewer.3:" );
			aExc.printStackTrace();
			//return;
		}
    }

	/** closes the bean viewer, leaves OOo running.
	 */
   private void close()
   {
			setVisible(false);
			aBean.stopOOoConnection(); 
			stop();
			System.exit(0);
   }

	/** closes the bean viewer and tries to terminate OOo.
	 */
   private void terminate()
   {
			setVisible(false);
			com.sun.star.frame.XDesktop xDesktop = null;
			try {
				xDesktop = aBean.getOOoDesktop();
			}
			catch ( com.sun.star.comp.beans.NoConnectionException aExc ) {} // ignore
			aBean.stopOOoConnection(); 
			stop();
			if ( xDesktop != null )
				xDesktop.terminate();
			System.exit(0);
   }

   /**
    * An ExitListener listening for windowClosing events
    */
   private class ExitListener extends java.awt.event.WindowAdapter
   {
        /**
         * windowClosed
         * 
         * @param e A WindowEvent for a closed Window event
         */
        public void windowClosed( java.awt.event.WindowEvent e)
        {
			close();
        }

        /**
         * windowClosing for a closing window event
         *
         * @param e A WindowEvent for a closing window event
         */
        public void windowClosing( java.awt.event.WindowEvent e)
        {
            ((java.awt.Window)e.getSource()).dispose();
        }
   }

   public static void main(String args[])
   {
       java.awt.Frame frame = new java.awt.Frame("OpenOffice.org Demo");
       OOoBeanViewer aViewer = new OOoBeanViewer();

       frame.setLayout(new java.awt.BorderLayout());

       frame.addWindowListener( aViewer.new ExitListener() );

       aViewer.init();
       aViewer.start();

       frame.add(aViewer);
       frame.setLocation( 200, 200 );
       frame.setSize( 800, 480 );
       frame.show();
   }
}

