package installer;

/*
 * InstallWizard.java
 *
 * Created on 04 July 2002, 15:09
 */

/**
 *
 * @author  mike
 */

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

public class InstallWizard extends javax.swing.JFrame implements ActionListener {
/*
    private static class ShutdownHook extends Thread {
        public void run()
	{
            if (InstallWizard.isInstallStarted())
            {
                // Check for and backup any config.xml files
                // Check for and backup any StarBasic macro files
                // Check for and backup ProtocolHandler
                
                if (!InstallWizard.isPatchedTypes())
		{
                    File backup = new File(InstUtil.getTmpDir(), "TypeDetection.xml");
                    File destination = new File(InstallWizard.getTypesPath());
                    InstUtil.copy(backup, destination); //Restore typedetection.xml
		}
		if (!InstallWizard.isPatchedJava())
		{
                    File backup = new File(InstUtil.getTmpDir(), "Java.xml");
                    File destination = new File(InstallWizard.getJavaPath());
                    InstUtil.copy(backup, destination); //Restore typedetection.xml
		}
		if (!InstallWizard.isPatchedRDB())
		{
                    File backup = new File(InstUtil.getTmpDir(), "applicat.rdb");
                    File destination = new File(InstallWizard.getJavaPath());
                    //InstUtil.copy(backup, destination); //Restore typedetection.xml
		}
                 
                System.out.println( "ShutdownHook" );
            }

            InstUtil.removeTmpDir();
	}
    }// class ShutdownHook
	
    static {
    	Runtime rt=Runtime.getRuntime();
    	rt.addShutdownHook(new ShutdownHook());
    }
*/	
    /** Creates new form InstallWizard */
    public InstallWizard() {
        super("Office Scripting Framework Installer - Early Developer Release");
	
 	try {
 		System.out.print("All diagnostic output is being redirected to SFrameworkInstall.log\n");
 		System.out.print("Location: "+  System.getProperty( "user.dir" ) + 
 			File.separator + "SFrameworkInstall.log\n");
 
 		LogStream log = new LogStream( "SFrameworkInstall.log" );
                 System.setErr(log);
 		
                 System.setOut(log);
 	}
 	catch( FileNotFoundException fnfe ) {
 		System.err.println("Office Scripting Framework Installer - Error: ");
 		System.err.println("Unable to create log file for installation.");
 		exitForm(null);
 	}

	//setBackground(Color.WHITE);
	setBackground(new Color(0,0,0));
	locations = new ArrayList();
	//Point center = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
	Point center = new Point( 400, 400 );
	int windowWidth=200;
	int windowHeight=300;
	setSize(windowWidth,windowHeight);
	setBounds((center.x-windowWidth/2)-115,(center.y-windowWidth/2)-100, windowWidth,windowHeight);
	initComponents();
	setResizable(false);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     */
    private void initComponents() {
        navigation = new javax.swing.JPanel();
        navBack = new javax.swing.JButton();
        navNext = new javax.swing.JButton();
        navCancel = new javax.swing.JButton();
        screens = new javax.swing.JPanel();
        
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
        
        navigation.setLayout(new java.awt.GridBagLayout());
        java.awt.GridBagConstraints gridBagConstraints1;
        
        navBack.setText("<< Back");
        gridBagConstraints1 = new java.awt.GridBagConstraints();
        gridBagConstraints1.insets = new java.awt.Insets(1, 1, 1, 1);
        
        navNext.setText("Next >>");
        gridBagConstraints1 = new java.awt.GridBagConstraints();
        gridBagConstraints1.gridx = 2;
        gridBagConstraints1.gridy = 0;
        
        navCancel.setText("Cancel");
        gridBagConstraints1 = new java.awt.GridBagConstraints();
        gridBagConstraints1.gridx = 6;
        gridBagConstraints1.gridy = 0;
        //navigation.add(navNext, gridBagConstraints1);
        //navigation.add(navBack, gridBagConstraints1);
        //navigation.add(navCancel, gridBagConstraints1);
	
        getContentPane().add(navigation, java.awt.BorderLayout.SOUTH);
        screens.setLayout(new java.awt.CardLayout());
        screens.add(WELCOME, new Welcome(this));
        version = new Version(this);
        screens.add(VERSIONS, version);
	_final = new Final(this);
        screens.add(FINAL, _final);
	
	//boolean hasIDEInstallation = (InstUtil.hasNetbeansInstallation() || InstUtil.hasJeditInstallation()) ;
	boolean hasIDEInstallation = ( InstUtil.hasNetbeansInstallation() ) ;
	
	if( hasIDEInstallation )
	{
		idewelcome = new IdeWelcome(this);
		screens.add(IDEWELCOME, idewelcome);
		ideversion = new IdeVersion(this);
		screens.add(IDEVERSIONS, ideversion);
		idefinal = new IdeFinal(this);
		screens.add(IDEFINAL, idefinal);
	}
        getContentPane().add(screens, java.awt.BorderLayout.CENTER);

	navNext.addActionListener(this);
	navNext.addActionListener(version);
	navNext.addActionListener(_final);
	
	if( hasIDEInstallation )
	{
		navNext.addActionListener(ideversion);
		navNext.addActionListener(idefinal);
	}
	
	navCancel.addActionListener(this);
	navBack.addActionListener(this);
	

	URL url = this.getClass().getResource("sidebar.jpg");
	JLabel sideBar = new JLabel();
	sideBar.setIcon(new ImageIcon(url));
	getContentPane().add (sideBar, java.awt.BorderLayout.WEST);		        
        pack();
    }// initComponents

    /** Exit the Application */
    public void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }


    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == navNext)
	{
            ((CardLayout)screens.getLayout()).next(screens);
	}

	if (e.getSource() == navCancel)
	{
            exitForm(null);
	}

	if (e.getSource() == navBack)
	{
            ((CardLayout)screens.getLayout()).previous(screens);
	}
    }// actionPerformed

	public static void storeLocation(String path)
	{
		locations.add(path);
	}

	public static ArrayList getLocations()
	{
		return locations;
	}

	public static void clearLocations()
	{
		locations.clear();
	}

	public void show(String cardName)
	{
		((CardLayout)screens.getLayout()).show(screens, cardName);
	}

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        String officePath = null;
        String netbeansPath = null;
        //String jeditPath = null;
        int i = 0;

        while (i < args.length) {
            if (args[i].equals("-help")) {
                printUsage();
                System.exit(0);
            }
            if (args[i].equals("-office"))
                officePath = args[++i];
            if (args[i].equals("-netbeans"))
                netbeansPath = args[++i];
            if (args[i].equals("-net"))
                bNetworkInstall = true;
            if (args[i].equals("-bindings"))
                bBindingsInstall = true;
            //if (args[i].equals("-jedit"))
            //    jeditPath = args[++i];
            i++;
        }

        //if (officePath == null && netbeansPath == null && jeditPath == null)
        if (officePath == null && netbeansPath == null)
            new InstallWizard().show();

        JLabel label = new JLabel();
        JProgressBar progressbar = new JProgressBar();

        try {
            System.out.println("Log file is: " +
                System.getProperty("user.dir") +
                File.separator + "SFrameworkInstall.log");
 
            LogStream log = new LogStream( "SFrameworkInstall.log" );
            System.setErr(log);
            System.setOut(log);
        }
        catch( FileNotFoundException fnfe ) {
            System.err.println("Error: Unable to create log file: "
                + fnfe.getMessage());
            System.exit(-1);
        }

        if (officePath != null) {
            XmlUpdater xud = new XmlUpdater(officePath, label, progressbar, bNetworkInstall, bBindingsInstall );
            xud.run();
        }

        if (netbeansPath != null) {
            IdeUpdater ideup = new IdeUpdater(netbeansPath, label, progressbar);
            ideup.run();
        }

        //if (jeditPath != null) {
        //    IdeUpdater ideup = new IdeUpdater(jeditPath, label, progressbar);
        //    ideup.run();
        //}
    }

    private static void printUsage() {
        System.err.println("java -jar SFrameworkInstall.jar");
        System.err.println("\t[-office <path_to_office_installation]");
        System.err.println("\t[-netbeans <path_to_netbeans_installation]");
        System.err.println("\t[-net]");
        System.err.println("\t[-bindings]");
        System.err.println("\n\n-net indicates that this is the network part of a network install.");
        System.err.println("-bindings will only install the menu & key bindings in user/config/soffice.cfg.");
        //System.err.println("\t[-jedit <path_to_jedit_installation]");
    }

	public static synchronized boolean isPatchedTypes()
	{
		return bPatchedTypes;
	}

	public static synchronized boolean isPatchedJava()
	{
		return bPatchedJava;
	}

	public static synchronized boolean isPatchedRDB()
	{
		return bPatchedRDB;
	}
	
	public static synchronized boolean isInstallStarted()
	{
		return bInstallStarted;
	}
	
	public static synchronized void setPatchedTypes(boolean value)
	{
		bPatchedTypes = value;
	}
	
	public static synchronized void setPatchedJava(boolean value)
	{
		bPatchedJava = value;
	}

	public static synchronized void setPatchedRDB(boolean value)
	{
		bPatchedRDB = value;
	}
	
	public static synchronized void setInstallStarted(boolean value)
	{
		bInstallStarted = value;
	}	

	public static synchronized void setTypesPath(String path)
	{
		typesPath = path;
	}
	
	public static synchronized void setJavaPath(String path)
	{
		javaPath = path;
	}

	public static synchronized String getTypesPath()
	{
		return typesPath;
	}
	
	public static synchronized String getJavaPath()
	{
		return javaPath;
	}
	
    private javax.swing.JPanel  navigation;
    private javax.swing.JButton navBack;
    private javax.swing.JButton navNext;
    private javax.swing.JButton navCancel;
    private javax.swing.JPanel  screens;

    private Version version = null;
    private Final _final  = null;
    private IdeVersion ideversion = null;
    private IdeFinal idefinal = null;
    private IdeWelcome idewelcome = null;
    private static ArrayList locations = null;

    public static String VERSIONS = "VERSIONS";
    public static String WELCOME  = "WELCOME";
    public static String FINAL    = "FINAL";
    public static String IDEVERSIONS = "IDEVERSIONS";
    public static String IDEWELCOME  = "IDEWELCOME";
    public static String IDEFINAL    = "IDEFINAL";
	
    public static int DEFWIDTH     = 480;
    public static int DEFHEIGHT    = 240;

    private static String typesPath = null;
    private static String javaPath  = null;

    public static boolean bNetworkInstall   = false;
    public static boolean bBindingsInstall   = false;

    private static boolean bPatchedTypes     = false;
    private static boolean bPatchedJava      = false;
    private static boolean bPatchedRDB       = false;
    private static boolean bInstallStarted   = false;

}// InstallWizard
