/**************************************************************
 *
 * 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 IdeFinal extends javax.swing.JPanel implements ActionListener, InstallListener {

    /** Creates new form Welcome */
    public IdeFinal(InstallWizard wizard) {
        this.wizard = wizard;
        setBackground(java.awt.Color.white);
	ideupdater = 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 IDE support.");
        statusPanel.add(statusLine, java.awt.BorderLayout.CENTER);

        add(statusPanel, java.awt.BorderLayout.CENTER);
	nav = new NavPanel(wizard, true, true, true, InstallWizard.IDEVERSIONS, "");
	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;
	        ideupdater = new IdeUpdater( path, statusLine, progressBar );
		ideupdater.addInstallListener(this);
		InstallWizard.setInstallStarted(true);
		//InstallWizard.setPatchedTypes(false);
		//InstallWizard.setPatchedJava(false);
		//InstallWizard.setPatchedRDB(false);
		ideupdater.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() || InstUtil.hasJeditInstallation() ) {
		//System.out.println("Detected installation complete (IDE(s) detected)");
		nav.removeCancelListener(this);
		nav.setCancelListener(nav);
		nav.navCancel.setText("Finish");
		nav.enableCancel(true);
		ideupdater = 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;
    private IdeUpdater ideupdater;
    // End of variables declaration//GEN-END:variables

}
