/*
 * LdapAddressBook.java
 *
 * Copyright 2011 John W Dawson
 *
 * This code is distributed under the terms of the GNU General Public License, version 3
 *
 * The main program
 */
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.logging.*;
import java.io.*;
public class LdapAddressBook
{

  private static Logger log = Logger.getLogger ("LdapAddressBook");
  private static ExtensionSelector extensionSelector;

  
  public static void main (String [] argss)
  {
    try 
    {
      // Set System L&F
      UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e)
    {
      // Just use default L&F if System L&F not available
    }

    try
    {

      // Create directory for configuration & log files if it does not exist    
      File configurationDir = new File (System.getProperty ("user.home") + System.getProperty ("file.separator") +
                                              ".LdapAddressBook");
      if (!configurationDir.exists())
      {
        configurationDir.mkdir ();
      }
      
      // Initialise logger
      FileHandler handler = new FileHandler (configurationDir.toString() + "/LdapAddressBook%g.log", 1000000, 10);
      handler.setFormatter (new SimpleFormatter ());
      log.addHandler (handler);
      
      // Load configuration file
      MessageLine messageLine = new MessageLine ("Initialising...");
      LdapConnection connection = new LdapConnection ();
      AddressBookConfiguration configuration = new AddressBookConfiguration (messageLine, connection);
      
      // Create panel to display search box and extension selector in a single row
      JPanel searchExtensionRow = new JPanel ();
      GroupLayout searchExtensionRowLayout = new GroupLayout(searchExtensionRow);
      searchExtensionRowLayout.setAutoCreateGaps(true);
      searchExtensionRow.setLayout(searchExtensionRowLayout);
      GroupLayout.SequentialGroup horizontalGroup = searchExtensionRowLayout.createSequentialGroup();
      searchExtensionRowLayout.setHorizontalGroup (horizontalGroup);
      GroupLayout.ParallelGroup verticalGroup = searchExtensionRowLayout.createParallelGroup(GroupLayout.Alignment.CENTER);
      searchExtensionRowLayout.setVerticalGroup (verticalGroup);
      
      // Add the search box and its label
      JLabel label = new JLabel ("Name:");
      horizontalGroup.addComponent (label);
      verticalGroup.addComponent (label);
      JTextField searchBox = new JTextField (10);
      horizontalGroup.addComponent (searchBox);
      verticalGroup.addComponent (searchBox);

      // Add a spacer to push extension selector to right edge
      horizontalGroup.addPreferredGap (LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
            
      // Add the extension selector box and its label
      label = new JLabel ("Extension:");
      horizontalGroup.addComponent (label);
      verticalGroup.addComponent (label);
      ExtensionSelector extensionSelector = new ExtensionSelector();
      horizontalGroup.addComponent (extensionSelector);
      verticalGroup.addComponent (extensionSelector);

      // Add row to main window
      MainWindow mainWindow = new MainWindow ("LDAP Address Book");      
      mainWindow.add (searchExtensionRow);
      
      // Create panel to display list of search results and buttons side by side
      JPanel listButtonPanel = new JPanel ();
      listButtonPanel.setLayout (new BoxLayout (listButtonPanel, BoxLayout.LINE_AXIS));
      LdapSearchList searchList = new LdapSearchList ();
      listButtonPanel.add (new JScrollPane (searchList));
      listButtonPanel.add (Box.createRigidArea (new Dimension(10, 0)));
      ControlPanel controlPanel = new ControlPanel ();
      listButtonPanel.add (controlPanel);
      mainWindow.add (listButtonPanel);
      
      // Create panel to display and edit entries 
      EditPanel editPanel = new EditPanel ();
      mainWindow.add (editPanel);
      
      // Add message line to panel
      mainWindow.add (messageLine);
              
      // Create menus      
      JMenuBar menuBar = new JMenuBar (); 
      FileMenu fileMenu = new FileMenu (); 
      menuBar.add (fileMenu);
      ConfigurationMenu configurationMenu = new ConfigurationMenu (); 
      menuBar.add (configurationMenu);
      HelpMenu helpMenu = new HelpMenu (); 
      menuBar.add (helpMenu);
      mainWindow.setJMenuBar (menuBar);
                  
      // Initialise menus and panels etc.
      fileMenu.initialise (configuration);
      configurationMenu.initialise (configuration, connection, mainWindow, extensionSelector);
      editPanel.initialise (searchBox,  extensionSelector, messageLine, searchList, controlPanel, connection, configuration);
      searchList.initialise (searchBox, messageLine, editPanel, connection, configuration);
      connection.initialise (searchBox, messageLine, editPanel, configuration);
      controlPanel.initialise (editPanel);
      mainWindow.initialise (configuration);
      
      // Search box is initially disabled (will be enabled on successful connection
      // to LDAP server)
      searchBox.setEnabled (false);
      
      mainWindow.pack ();
      mainWindow.setVisible (true);
      
      // Get password from user (if required) and connect to server
      configuration.initialise (mainWindow, editPanel, extensionSelector);
  
    }
    catch (Exception e)
    {
      System.out.println (e.getMessage());
      e.printStackTrace();
      System.err.flush();
      
    }
  }
  
}