package espial.demo.phoneapp;

import espial.awt.*;
import java.awt.*;
import espial.awt.borders.*;
import espial.awt.layout.*;
import java.awt.event.*;
import espial.awt.item.*;
import espial.image.*;
import espial.application.*;

import espial.datasource.list.*;
import espial.datasource.selection.*;

/**
 * THis is the Phone Directory Application UI.
 * It uses a <code>PhoneDirListDataSource</code> as the backend for the
 * directory data storage. <p>
 * Most of the UI code was generated using Kalos Architect which currently
 * supports version 2.2 of Kalos Espresso.  This UI is built using
 * version 3.0 of Kalos Espresso which introduces many more features.
 */
public class PhoneDirApp extends EPanel
	implements ActionListener, ItemListener {
	private final static String VIEWDIR = "view";
	private final static String EDITDIR = "edit";
	
	
  EButton m_addToDir;
  EButton m_editToDir;
  EButton m_delFromDir;
  EButton m_dialPhone;
  EButton m_sendEmail;
  EPanel m_readOnlyDir;
  ELabel m_dirName;
  ELabel m_dirPhone;
  ELabel m_dirEmail;
  ELabel m_dirAddress;
  EPanel m_editableDir;
  EButton m_edDirSave;
  ETextField m_edDirName;
  ETextField m_edDirPhone;
  ETextField m_edDirEmail;
  ETextField m_edDirAddress;
	EListBox m_dirList;
	
	CardLayout m_viewCard;
	EPanel m_viewCardPanel;
	
	MutableListDataSource m_phoneDirData;
	
	boolean m_dontSwitch = false;
	String m_currentCard = null;
	
	AppContext m_appcontext;
	
	/** 
	 * The UI is built here because we need the AppContext to load
	 * and run images. 
	 */
	public void init (AppContext appc) {
		m_appcontext = appc;
    buildUI ();
    userInitialization ();
    eventRegistration ();
	}
	
	/**
	 * This method is used to switch between the cards in the card layout.
	 */
	private void switchCard (String card) {
		if (card != m_currentCard) {
			m_viewCard.show (m_viewCardPanel, (m_currentCard = card));
			m_viewCardPanel.invalidate ();
			m_viewCardPanel.validate ();
		}
		else {
			m_viewCardPanel.repaint ();
		}
	}
	
  ///// kaBeginUserMethod: m_dirList_itemStateChanged
	/**
	 * Called when an item in the list is de/selected
	 */
  void m_dirList_itemStateChanged (ItemEvent e) {
    int evState = e.getStateChange ();
		
    if (evState == ItemEvent.SELECTED) {
			Object it = e.getItem ();
			if (it instanceof PhoneDirRecord) {
				PhoneDirRecord rec = (PhoneDirRecord) it;
				m_dirName.setLabel (rec.name);
				m_dirPhone.setLabel (rec.phoneNum);
				m_dirEmail.setLabel (rec.emailAddr);
				m_dirAddress.setLabel (rec.homeAddr);
				
				if (m_dontSwitch) {
					m_edDirName.setText (rec.name);
					m_edDirPhone.setText (rec.phoneNum);
					m_edDirEmail.setText (rec.emailAddr);
					m_edDirAddress.setText (rec.homeAddr);
					m_viewCardPanel.repaint ();
					m_dontSwitch = false;
				}
				else {
					switchCard (VIEWDIR);
				}
			}
    }
		else {
			m_dirName.setLabel ("No Entry Selected");
			m_dirPhone.setLabel ("");
			m_dirEmail.setLabel ("");
			m_dirAddress.setLabel ("");
			m_viewCardPanel.repaint ();
		}
  }
  ///// kaEndUserMethod: m_dirList_itemStateChanged
	
  ///// kaBeginUserMethod: m_dialPhone_actionPerformed
	/**
	 * This method is called when the user wishes to dial a number.
	 * <p>TBD: Implementation with hooks into the telephony API.
	 */
  void m_dialPhone_actionPerformed (ActionEvent e) {
    String cmd = e.getActionCommand ();
		
  }
  ///// kaEndUserMethod: m_dialPhone_actionPerformed
	
  ///// kaBeginUserMethod: m_edDirSave_actionPerformed
	/**
	 * This method is called when the user wishes save changes to a record.
	 */
  void m_edDirSave_actionPerformed (ActionEvent e) {
		switchCard (VIEWDIR);
		PhoneDirRecord rec;
		int ix;
		
		m_dontSwitch = true;
		m_phoneDirData.writeBegin (); {
			SelectionState ss = m_dirList.getSelectionState ();
			rec = (PhoneDirRecord) ss.getSelectedObject ();
			if (rec != null) {
				ix = m_phoneDirData.indexOf (rec);
				m_phoneDirData.removeData (ix);
				rec.name = m_edDirName.getText ();
				rec.phoneNum = m_edDirPhone.getText ();
				rec.emailAddr = m_edDirEmail.getText ();
				rec.homeAddr = m_edDirAddress.getText ();
				m_phoneDirData.addData (rec, ix);
				m_dirList.selectRow (ix);
			}
			m_phoneDirData.writeFinish ();
		}
		m_dontSwitch = false;
		
  }
  ///// kaEndUserMethod: m_edDirSave_actionPerformed
	
  ///// kaBeginUserMethod: m_editToDir_actionPerformed
	/**
	 * This method is called when the user wishes to edit a record in the list.
	 */
  void m_editToDir_actionPerformed (ActionEvent e) {
		switchCard (EDITDIR);
		PhoneDirRecord rec = null;;
		int ix;
		
		m_dontSwitch = true;
		m_phoneDirData.readBegin (); {
			SelectionState ss = m_dirList.getSelectionState ();
			rec = (PhoneDirRecord) ss.getSelectedObject ();
			m_phoneDirData.readFinish ();
		}
		if (rec != null) {
			m_edDirName.setText (rec.name);
			m_edDirPhone.setText (rec.phoneNum);
			m_edDirEmail.setText (rec.emailAddr);
			m_edDirAddress.setText (rec.homeAddr);
			m_viewCardPanel.repaint ();
		}
		m_dontSwitch = false;
  }
  ///// kaEndUserMethod: m_editToDir_actionPerformed
	
  ///// kaBeginUserMethod: userInitialization
  void userInitialization () {
    // TODO: Please initialize the members here.
    //       Do not modify the buildUI() method.
    //       Event listeners are registered after this method is called.
		switchCard (VIEWDIR);
		
		m_phoneDirData.writeBegin (); {
			m_phoneDirData.addData (new PhoneDirRecord ("Joe Shmoe", "1234567", "jshmoe@netscape.net", ""));
			m_phoneDirData.writeFinish ();
		}
		
  }
  ///// kaEndUserMethod: userInitialization
	
  ///// kaBeginUserMethod: m_addToDir_actionPerformed
	/**
	 * This method is called when the user wishes to add a new record.
	 */
  void m_addToDir_actionPerformed (ActionEvent e) {
		switchCard (EDITDIR);
		m_dontSwitch = true;
		// add a blank entry
		m_phoneDirData.writeBegin (); {
			m_phoneDirData.addData (new PhoneDirRecord ());
			m_dirList.selectRow (m_phoneDirData.getDataCount() - 1);
			m_phoneDirData.writeFinish ();
		}
		m_dontSwitch = false;
  }
  ///// kaEndUserMethod: m_addToDir_actionPerformed
	
  ///// kaBeginUserMethod: m_sendEmail_actionPerformed
	/**
	 * This method is called when the user wishes to send an email.
	 * <p>TBD: Implementation with hooks into the mail API.
	 */
  void m_sendEmail_actionPerformed (ActionEvent e) {
		
  }
  ///// kaEndUserMethod: m_sendEmail_actionPerformed
	
  ///// kaBeginUserMethod: m_delFromDir_actionPerformed
	/**
	 * This method is called when the user wishes to delete a record.
	 */
  void m_delFromDir_actionPerformed (ActionEvent e) {
		switchCard (VIEWDIR);
		int ix;
		PhoneDirRecord rec;
		m_dontSwitch = true;
		
		m_phoneDirData.writeBegin (); {
			SelectionState ss = m_dirList.getSelectionState ();
			rec = (PhoneDirRecord) ss.getSelectedObject ();
			if (rec != null) {
				ix = m_phoneDirData.indexOf (rec);
				m_phoneDirData.removeData (ix);
			}
			m_phoneDirData.writeFinish ();
		}
		m_dontSwitch = false;
		
  }
  ///// kaEndUserMethod: m_delFromDir_actionPerformed
	
  ///// kaBeginMethod: eventRegistration
  void eventRegistration () {
    m_addToDir.addActionListener (this);
    m_editToDir.addActionListener (this);
    m_delFromDir.addActionListener (this);
    m_dirList.addItemListener (this);
    m_dialPhone.addActionListener (this);
    m_sendEmail.addActionListener (this);
    m_edDirSave.addActionListener (this);
  }
  ///// kaEndMethod: eventRegistration
	
  ///// kaBeginMethod: buildUI
  void buildUI () {
		
    // setting up BorderLayout
    BorderLayout layout_this;
    layout_this = new BorderLayout (0, 0);
    this.setLayout (layout_this);
    setFont (new Font ("Sans Serif", 1, 14));
		
    // setting up Container
    EPanel container_1;
    container_1 = new EPanel ();
		
    // setting up BaseBorder
    BaseBorder border_container_1;
    border_container_1 = new BaseBorder (new Color (135,191,155));
    border_container_1.setInnerInsets (0, 0, 0, 0);
    border_container_1.setOuterInsets (0, 0, 0, 0);
    container_1.setBorder (border_container_1);
		
    // setting up BorderLayout
    BorderLayout layout_container_1;
    layout_container_1 = new BorderLayout (0, 0);
    container_1.setLayout (layout_container_1);
		
    // setting up Container
    EPanel container_2;
    container_2 = new EPanel ();
		
    // setting up VFlowLayout
    VFlowLayout layout_container_2;
    layout_container_2 = new VFlowLayout (0, 5, 5);
    container_2.setLayout (layout_container_2);
		
    // setting up Button
    m_addToDir = new EButton ();
    m_addToDir.setImagePosition (EButton.TOP);
    m_addToDir.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_add.gif"));
    // ending setup of m_addToDir
		
    container_2.add (m_addToDir);
		
    // setting up Button
    m_editToDir = new EButton ();
    m_editToDir.setImagePosition (EButton.TOP);
    m_editToDir.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_edit.gif"));
    // ending setup of m_editToDir
		
    container_2.add (m_editToDir);
		
    // setting up Button
    m_delFromDir = new EButton ();
    m_delFromDir.setImagePosition (EButton.TOP);
    m_delFromDir.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_del.gif"));
    // ending setup of m_delFromDir
		
    container_2.add (m_delFromDir);
    // ending setup of container_2
		
    container_1.add (container_2, BorderLayout.WEST);
		
    // setting up Container
    EPanel container_3;
    container_3 = new EPanel ();
		
    // setting up BaseBorder
    BaseBorder border_container_3;
    border_container_3 = new BaseBorder ();
    border_container_3.setInnerInsets (5, 0, 5, 5);
    border_container_3.setOuterInsets (0, 0, 0, 0);
    container_3.setBorder (border_container_3);
		
    // setting up GridLayout
    GridLayout layout_container_3;
    layout_container_3 = new GridLayout (1, 1, 0, 0);
    container_3.setLayout (layout_container_3);
		
    // setting up List
		ImageBundle icon = m_appcontext.getImageBundledResource (PhoneDirListDataSource.class, "i_person.gif");
		m_phoneDirData = new PhoneDirListDataSource (icon);
    m_dirList = new EListBox (m_phoneDirData);
    // setting up wrapper for EList
    EPanel tmp_0 = new EPanel ();
    BaseBorder tmp_1;
    tmp_0.setLayout (new BorderLayout ());
		EScrollingSupportPanel sp_0 = new EScrollingSupportPanel (m_dirList);
    tmp_0.add (sp_0, BorderLayout.CENTER);
    tmp_0.setBorder (tmp_1 = new BevelBorder (new Color (89,165,118), false));
    EScrollbar tmp_2 = new EScrollbar (EScrollbar.VERTICAL);
    tmp_0.add (tmp_2, BorderLayout.EAST);
    sp_0.setVerticalScrollbar (tmp_2);
    // ending setup of tmp_0
		
    container_3.add (tmp_0);
    // ending setup of container_3
		
    container_1.add (container_3, BorderLayout.CENTER);
    // ending setup of container_1
		
    this.add (container_1, BorderLayout.CENTER);
		
    // setting up Container
    EPanel container_5;
    container_5 = new EPanel ();
    container_5.setFont (new Font ("Sans Serif", 1, 14));
		
    // setting up GroupBorder
    GroupBorder border_container_5;
    border_container_5 = new GroupBorder (new Color (166,206,159), null);
    border_container_5.setInnerInsets (3, 5, 5, 5);
    border_container_5.setOuterInsets (0, 0, 0, 0);
    border_container_5.setSides (true, false, false, false);
    container_5.setBorder (border_container_5);
		
    // setting up BorderLayout
    BorderLayout layout_container_5;
    layout_container_5 = new BorderLayout (3, 0);
    container_5.setLayout (layout_container_5);
		
    // setting up Container
    EPanel container_6;
    container_6 = new EPanel ();
		
    // setting up GridLayout
    GridLayout layout_container_6;
    layout_container_6 = new GridLayout (4, 1, 0, 1);
    container_6.setLayout (layout_container_6);
		
    // setting up Label
    ELabel elabel_0;
    elabel_0 = new ELabel ();
    elabel_0.setImagePosition (ELabel.LEFT);
    elabel_0.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_person.gif"));
    // ending setup of elabel_0
		
    container_6.add (elabel_0);
		
    // setting up Button
    m_dialPhone = new EButton ();
    m_dialPhone.setImagePosition (EButton.TOP);
    m_dialPhone.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_phone.gif"));
    // ending setup of m_dialPhone
		
    container_6.add (m_dialPhone);
		
    // setting up Button
    m_sendEmail = new EButton ();
    m_sendEmail.setImagePosition (EButton.TOP);
    m_sendEmail.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_email.gif"));
    // ending setup of m_sendEmail
		
    container_6.add (m_sendEmail);
		
    // setting up Label
    ELabel elabel_1;
    elabel_1 = new ELabel ();
    elabel_1.setImagePosition (ELabel.LEFT);
    elabel_1.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_house.gif"));
    // ending setup of elabel_1
		
    container_6.add (elabel_1);
    // ending setup of container_6
		
    container_5.add (container_6, BorderLayout.WEST);
		
    // setting up Container
    m_viewCardPanel = new EPanel ();
		
    // setting up LayeredLayout
    m_viewCard = new CardLayout ();
    m_viewCardPanel.setLayout (m_viewCard);
		
    // setting up Container
    m_readOnlyDir = new EPanel ();
		
    // setting up GridLayout
    GridLayout layout_m_readOnlyDir;
    layout_m_readOnlyDir = new GridLayout (4, 1, 0, 1);
    m_readOnlyDir.setLayout (layout_m_readOnlyDir);
		
    // setting up Label
    m_dirName = new ELabel ("No Entry Selected");
    m_dirName.setImagePosition (ELabel.LEFT);
    m_dirName.setCentered (false);
    m_dirName.setForeground (Color.black);
    // ending setup of m_dirName
		
    m_readOnlyDir.add (m_dirName);
		
    // setting up Container
    EPanel container_10;
    container_10 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_10;
    border_container_10 = new LineBorder (new Color (89,165,118));
    border_container_10.setInnerInsets (2, 2, 2, 2);
    border_container_10.setOuterInsets (0, 0, 0, 0);
    border_container_10.setSides (true, true, true, true);
    container_10.setBorder (border_container_10);
		
    // setting up GridLayout
    GridLayout layout_container_10;
    layout_container_10 = new GridLayout (1, 1, 0, 0);
    container_10.setLayout (layout_container_10);
		
    // setting up Label
    m_dirPhone = new ELabel ("");
    m_dirPhone.setImagePosition (ELabel.LEFT);
    m_dirPhone.setCentered (false);
    // ending setup of m_dirPhone
		
    container_10.add (m_dirPhone);
    // ending setup of container_10
		
    m_readOnlyDir.add (container_10);
		
    // setting up Container
    EPanel container_11;
    container_11 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_11;
    border_container_11 = new LineBorder (new Color (89,165,118));
    border_container_11.setInnerInsets (2, 2, 2, 2);
    border_container_11.setOuterInsets (0, 0, 0, 0);
    border_container_11.setSides (true, true, true, true);
    container_11.setBorder (border_container_11);
		
    // setting up GridLayout
    GridLayout layout_container_11;
    layout_container_11 = new GridLayout (1, 1, 0, 0);
    container_11.setLayout (layout_container_11);
		
    // setting up Label
    m_dirEmail = new ELabel ("");
    m_dirEmail.setImagePosition (ELabel.LEFT);
    m_dirEmail.setCentered (false);
    // ending setup of m_dirEmail
		
    container_11.add (m_dirEmail);
    // ending setup of container_11
		
    m_readOnlyDir.add (container_11);
		
    // setting up Container
    EPanel container_12;
    container_12 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_12;
    border_container_12 = new LineBorder (new Color (89,165,118));
    border_container_12.setInnerInsets (2, 2, 2, 2);
    border_container_12.setOuterInsets (0, 0, 0, 0);
    border_container_12.setSides (true, true, true, true);
    container_12.setBorder (border_container_12);
		
    // setting up GridLayout
    GridLayout layout_container_12;
    layout_container_12 = new GridLayout (1, 1, 0, 0);
    container_12.setLayout (layout_container_12);
		
    // setting up Label
    m_dirAddress = new ELabel ("");
    m_dirAddress.setImagePosition (ELabel.LEFT);
    m_dirAddress.setCentered (false);
    // ending setup of m_dirAddress
		
    container_12.add (m_dirAddress);
    // ending setup of container_12
		
    m_readOnlyDir.add (container_12);
    // ending setup of m_readOnlyDir
		
    m_viewCardPanel.add (m_readOnlyDir, VIEWDIR);
		
    // setting up Container
    m_editableDir = new EPanel ();
    m_editableDir.setVisible (false);
		
    // setting up GridLayout
    GridLayout layout_m_editableDir;
    layout_m_editableDir = new GridLayout (4, 1, 0, 1);
    m_editableDir.setLayout (layout_m_editableDir);
		
    // setting up Container
    EPanel container_13;
    container_13 = new EPanel ();
		
    // setting up BorderLayout
    BorderLayout layout_container_13;
    layout_container_13 = new BorderLayout (3, 0);
    container_13.setLayout (layout_container_13);
		
    // setting up Button
    m_edDirSave = new EButton ();
    m_edDirSave.setImagePosition (EButton.TOP);
    m_edDirSave.setImageBundle (m_appcontext.getImageBundledResource (getClass(), "i_edit.gif"));
    // ending setup of m_edDirSave
		
    container_13.add (m_edDirSave, BorderLayout.EAST);
		
    // setting up Container
    EPanel container_14;
    container_14 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_14;
    border_container_14 = new LineBorder (Color.white);
    border_container_14.setInnerInsets (0, 0, 0, 0);
    border_container_14.setOuterInsets (0, 0, 0, 0);
    border_container_14.setSides (true, true, true, true);
    container_14.setBorder (border_container_14);
		
    // setting up GridLayout
    GridLayout layout_container_14;
    layout_container_14 = new GridLayout (1, 1, 0, 0);
    container_14.setLayout (layout_container_14);
		
    // setting up Text Field
    m_edDirName = new ETextField (32);
    // ending setup of m_edDirName
		
    container_14.add (m_edDirName);
    // ending setup of container_14
		
    container_13.add (container_14, BorderLayout.CENTER);
    // ending setup of container_13
		
    m_editableDir.add (container_13);
		
    // setting up Container
    EPanel container_15;
    container_15 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_15;
    border_container_15 = new LineBorder (Color.white);
    border_container_15.setInnerInsets (0, 0, 0, 0);
    border_container_15.setOuterInsets (0, 0, 0, 0);
    border_container_15.setSides (true, true, true, true);
    container_15.setBorder (border_container_15);
		
    // setting up GridLayout
    GridLayout layout_container_15;
    layout_container_15 = new GridLayout (1, 1, 0, 0);
    container_15.setLayout (layout_container_15);
		
    // setting up Text Field
    m_edDirPhone = new ETextField (32);
    // ending setup of m_edDirPhone
		
    container_15.add (m_edDirPhone);
    // ending setup of container_15
		
    m_editableDir.add (container_15);
		
    // setting up Container
    EPanel container_16;
    container_16 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_16;
    border_container_16 = new LineBorder (Color.white);
    border_container_16.setInnerInsets (0, 0, 0, 0);
    border_container_16.setOuterInsets (0, 0, 0, 0);
    border_container_16.setSides (true, true, true, true);
    container_16.setBorder (border_container_16);
		
    // setting up GridLayout
    GridLayout layout_container_16;
    layout_container_16 = new GridLayout (1, 1, 0, 0);
    container_16.setLayout (layout_container_16);
		
    // setting up Text Field
    m_edDirEmail = new ETextField (32);
    // ending setup of m_edDirEmail
		
    container_16.add (m_edDirEmail);
    // ending setup of container_16
		
    m_editableDir.add (container_16);
		
    // setting up Container
    EPanel container_17;
    container_17 = new EPanel ();
		
    // setting up LineBorder
    LineBorder border_container_17;
    border_container_17 = new LineBorder (Color.white);
    border_container_17.setInnerInsets (0, 0, 0, 0);
    border_container_17.setOuterInsets (0, 0, 0, 0);
    border_container_17.setSides (true, true, true, true);
    container_17.setBorder (border_container_17);
		
    // setting up GridLayout
    GridLayout layout_container_17;
    layout_container_17 = new GridLayout (1, 1, 0, 0);
    container_17.setLayout (layout_container_17);
		
    // setting up Text Field
    m_edDirAddress = new ETextField (256);
    // ending setup of m_edDirAddress
		
    container_17.add (m_edDirAddress);
    // ending setup of container_17
		
    m_editableDir.add (container_17);
    // ending setup of m_editableDir
		
    m_viewCardPanel.add (m_editableDir, EDITDIR);
    // ending setup of m_viewCardPanel
		
    container_5.add (m_viewCardPanel, BorderLayout.CENTER);
    // ending setup of container_5
		
    this.add (container_5, BorderLayout.SOUTH);
  }
  ///// kaEndMethod: buildUI
	
  ///// kaBeginMethod: actionPerformed
  public void actionPerformed (ActionEvent e) {
    Object src = e.getSource();
		
    // Button
    if (src == m_dialPhone) {
      m_dialPhone_actionPerformed (e);
    }
    // Button
    else if (src == m_addToDir) {
      m_addToDir_actionPerformed (e);
    }
    // Button
    else if (src == m_delFromDir) {
      m_delFromDir_actionPerformed (e);
    }
    // Button
    else if (src == m_edDirSave) {
      m_edDirSave_actionPerformed (e);
    }
    // Button
    else if (src == m_editToDir) {
      m_editToDir_actionPerformed (e);
    }
    // Button
    else if (src == m_sendEmail) {
      m_sendEmail_actionPerformed (e);
    }
  }
  ///// kaEndMethod: actionPerformed
	
  ///// kaBeginMethod: getPreferredSize
  public Dimension getPreferredSize () {
    return new Dimension (310, 220);
  }
  ///// kaEndMethod: getPreferredSize
	
  ///// kaBeginMethod: itemStateChanged
  public void itemStateChanged (ItemEvent e) {
    Object src = e.getSource();
		
    // List
    if (src == m_dirList) {
      m_dirList_itemStateChanged (e);
    }
  }
  ///// kaEndMethod: itemStateChanged
	
  ///// kaBeginMethod: PhoneDirApp
  public PhoneDirApp() {
  }
  ///// kaEndMethod: PhoneDirApp
	
}
