package com.marinilli.b2.c7.launcher;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.event.*;
import java.util.ArrayList;

/**
 * Chapter 7 - The Dialog for customizing the installation
 *
 * @author Mauro Marinilli
 * @version 1.0
 */
public class CustomInstallDialog extends InstallerDialog {
  private final static String TITLE = "Choose Application Components";
  private String[] availableResources;
  private String[] availableResourcesDesc;
  private String[] chosenResources;

  //GUI stuff
  JPanel checkBoxPanel;
  JCheckBox[] checkBoxResources;
  JPanel panel1;
  JPanel jPanel1;
  JButton okButton;
  JButton closeButton;

  /**
   *  Constructor
   */
  public CustomInstallDialog(CDLauncher frame) {
    super(frame, TITLE);
    pack();
  }

  /**
   *  GUI initialization
   */
  void graphInit() {
    availableResources = installer.getFullInstallationFiles();
    availableResourcesDesc = installer.getFullInstallationDesc();
    panel1 = new JPanel();
    jPanel1 = new JPanel();
    okButton = new JButton();
    closeButton = new JButton();
    fillUpCheckBoxPanel();
    panel1.setLayout( new BorderLayout());
    okButton.setText("OK");
    okButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        processOk();
      }
    });
    closeButton.setText("cancel");
    closeButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        chosenResources = null;
        dispose();
      }
    });
    jPanel1.setLayout(new BorderLayout());
    jPanel1.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
    getContentPane().add(panel1);
    panel1.add(jPanel1, BorderLayout.SOUTH);
    jPanel1.add(closeButton, BorderLayout.WEST);
    jPanel1.add(okButton, BorderLayout.EAST);
    panel1.add(new JScrollPane(checkBoxPanel), BorderLayout.CENTER);
  }

  /**
   *  fills up the dialog with check boxes
   */
  private void fillUpCheckBoxPanel(){
    // fragile: no prior check on arrays
    checkBoxPanel = new JPanel();
    checkBoxPanel.setPreferredSize(new Dimension(220,200));

    checkBoxResources = new JCheckBox[availableResources.length];
    for (int i = 0; i < availableResources.length; i++) {
      checkBoxResources[i] = new JCheckBox(availableResourcesDesc[i]);
      checkBoxResources[i].setMinimumSize(new Dimension(200,16));
      checkBoxResources[i].setMaximumSize(new Dimension(200,16));
      checkBoxResources[i].setPreferredSize(new Dimension(200,16));
      checkBoxResources[i].setSelected(true);
      checkBoxPanel.add(checkBoxResources[i]);
    }
    checkBoxResources[0].setEnabled(false);//the first resource is hard-wired
  }

  /**
   *  process the OK button hit
   */
  private void processOk(){
    // creates the chosenResources result array
    ArrayList chosen = new ArrayList();
    for (int i = 0; i < availableResources.length; i++) {
      if (checkBoxResources[i].isSelected())
        chosen.add(availableResources[i]);
    }
    chosenResources = new String[chosen.size()];
    chosen.toArray(chosenResources);
    dispose();
  }

  public String[] getChosenResources(){
    return chosenResources;
  }

}