/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

package installer;

/*
 * Welcome.java
 *
 * Created on 04 July 2002, 15:43
 */

/**
 *
 * @author  mike
 */

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

public class Final extends javax.swing.JPanel implements ActionListener, InstallListener {

    /** Creates new form Welcome */
    public Final(InstallWizard wizard) {
        this.wizard = wizard;
        setBackground(java.awt.Color.white);
		xud = null;
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        statusPanel = new javax.swing.JPanel();
		statusPanel.setBackground(java.awt.Color.white);
        statusLine = new javax.swing.JLabel("Ready", javax.swing.JLabel.CENTER);

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

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

        statusLine.setText("Waiting to install. \n All Office processes must be terminated.");
        statusPanel.add(statusLine, java.awt.BorderLayout.CENTER);

        add(statusPanel, java.awt.BorderLayout.CENTER);
		nav = new NavPanel(wizard, true, true, true, InstallWizard.VERSIONS, "");
		nav.setNextListener(this);
		nav.removeCancelListener(nav);
		nav.setCancelListener(this);
		nav.navNext.setText("Install");
		add(nav, java.awt.BorderLayout.SOUTH);



    }//GEN-END:initComponents

    public java.awt.Dimension getPreferredSize() {
        return new java.awt.Dimension(InstallWizard.DEFWIDTH, InstallWizard.DEFHEIGHT);
    }

    public void actionPerformed(ActionEvent e) {
	// navNext is "Install"
        if (e.getSource() == nav.navNext)
	{
            JProgressBar progressBar=new JProgressBar();
            progressBar.setMaximum(10);
            progressBar.setValue(0);
            statusPanel.add(progressBar, java.awt.BorderLayout.SOUTH);
            nav.enableNext(false);
            nav.enableBack(false);
            nav.enableCancel(false);
            ArrayList locations = wizard.getLocations();
            //System.out.println("here "+locations.size());
            // Returned 1
            String progpath=null;
            String path=null;
            String classespath=null;
            for (int i =0;i<locations.size();i++){
                path= (String)locations.get(i);
	        //InstallWizard.currentPath = path;
	        xud = new XmlUpdater(path, statusLine,progressBar,InstallWizard.bNetworkInstall,InstallWizard.bBindingsInstall);
		xud.addInstallListener(this);
		InstallWizard.setInstallStarted(true);
		InstallWizard.setPatchedTypes(false);
		InstallWizard.setPatchedJava(false);
		InstallWizard.setPatchedRDB(false);
		xud.start();
            }
        }

	// set to "Exit" at end of installation process
	if (e.getSource() == nav.navCancel) {
		int answer = JOptionPane.showConfirmDialog(wizard, "Are you sure you want to exit?");
		if (answer == JOptionPane.YES_OPTION)
		{
			wizard.exitForm(null);
		}
		else
		{
			return;
		}
	}
    }// actionPerformed


    public void installationComplete(InstallationEvent ev) {
        //System.out.println("Detected installation complete");
	if( InstUtil.hasNetbeansInstallation() ) {
		//System.out.println("Detected installation complete (IDE(s) detected)");
		nav.removeCancelListener(this);
		nav.setCancelListener(nav);
		nav.navCancel.setText("Finish");
		nav.enableIDE(true);
		nav.enableCancel(true);
		xud = null;
	}
	else {
		//System.out.println("Detected installation complete (No IDE(s) detected)");
		nav.removeCancelListener(this);
		nav.setCancelListener(nav);
		nav.navCancel.setText("Finish");
		nav.enableCancel(true);
		xud = null;
	}
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel statusPanel;
    private javax.swing.JLabel statusLine;
    private InstallWizard wizard;
    private NavPanel nav;
    private XmlUpdater xud;
    // End of variables declaration//GEN-END:variables

}
