]> git.mxchange.org Git - jaddressbook-lib.git/blobdiff - Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
Added more thrown exceptions or catch them.
[jaddressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / gui / AddressbookFrame.java
index 92e8dfe375646bba016972fa4d2fc863ae1ce076..8661516a33c291bb518c748640fc96a2fb212853 100644 (file)
@@ -24,14 +24,16 @@ import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.sql.SQLException;
 import java.text.MessageFormat;
 import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
 import javax.swing.DefaultComboBoxModel;
-import javax.swing.InputVerifier;
+import javax.swing.JButton;
 import javax.swing.JComboBox;
-import javax.swing.JComponent;
 import javax.swing.JDialog;
+import javax.swing.JFormattedTextField;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenu;
@@ -40,21 +42,26 @@ import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
+import javax.swing.JTextArea;
 import javax.swing.JTextField;
 import javax.swing.border.TitledBorder;
 import javax.swing.table.TableModel;
-import org.mxchange.addressbook.BaseFrameworkSystem;
+import org.mxchange.addressbook.BaseAddressbookSystem;
 import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.contact.Gender;
-import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
-import org.mxchange.addressbook.model.contact.ContactTableModel;
+import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
+import org.mxchange.addressbook.manager.contact.ManageableAddressbookContact;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.client.gui.ClientFrame;
+import org.mxchange.jcore.contact.Contact;
+import org.mxchange.jcore.contact.Gender;
+import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
+import org.mxchange.jcore.model.swing.contact.ContactTableModel;
 
 /**
  *
  * @author Roland Haeder
  */
-public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {
+public class AddressbookFrame extends BaseAddressbookSystem implements ClientFrame {
 
        /**
         * Own instance
@@ -111,12 +118,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
        /**
         * Whether this frame has been initialized
         */
-       private boolean isInitialized;
-
-       /**
-        * Layout instance
-        */
-       private GridLayout layout;
+       private boolean initialized;
 
        /**
         * Status label needs to be updated
@@ -138,6 +140,33 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Set client here
                this.setClient(client);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       @Override
+       public Contact doEnterOwnData () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Is the "add contact" window visible?
+               if (this.addContact.isVisible()) {
+                       // Something bad happened
+                       throw new IllegalStateException("Window addContact is already visible."); //NOI18N
+               }
+
+               // Disable main window
+               this.frame.setEnabled(false);
+
+               // Make other window visible
+               this.addContact.setVisible(true);
+
+               // Trace message
+               this.getLogger().trace("Returning null : EXIT!"); //NOI18N
+
+               // Return value is not supported
+               return null;
        }
 
        /**
@@ -145,8 +174,33 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         */
        @Override
        public void doShutdown () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // First only show shutdown status
                this.updateStatus("shutdown"); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+
+       /**
+        * Enables main window (frame)
+        */
+       @Override
+       public void enableMainWindow () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Enable it again
+               this.frame.setEnabled(true);
+
+               // Request focus for this window
+               this.frame.requestFocus();
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -159,8 +213,11 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                // Debug line
                this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
 
+               // Get and cast manager instance
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getClient().getManager();
+
                // Has the user entered own data?
-               if (this.getClient().getContactManager().isOwnContactAdded()) {
+               if (manager.isOwnContactAdded()) {
                        // Debug message
                        this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
 
@@ -176,6 +233,9 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // All done here
                this.updateStatus("done"); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -184,7 +244,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         * you may not want.
         *
         * @throws
-        * org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException If
+        * org.mxchange.jcore.exceptions.FrameAlreadyInitializedException If
         * this method has been called twice
         */
        @Override
@@ -202,7 +262,10 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                this.initComponents();
 
                // Set flag
-               this.isInitialized = true;
+               this.initialized = true;
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -213,7 +276,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         */
        @Override
        public final boolean isInitialized () {
-               return this.isInitialized;
+               return this.initialized;
        }
 
        /**
@@ -221,13 +284,76 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         */
        @Override
        public void shutdownApplication () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // To do this, the frame must be initialized
                if (!this.isInitialized()) {
                        // Not initalized, so bad call
                        this.getLogger().fatal("Bad call of shutdownApplication(). Please report this."); //NOI18N
                        return;
                }
-               this.getClient().getApplication().doShutdown();
+
+               // Call shutdown method
+               try {
+                       this.getClient().getApplication().doShutdown();
+               } catch (final SQLException | IOException ex) {
+                       // Abort here
+                       this.abortProgramWithException(ex);
+               }
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Adds a new menu item with given key to menu instance
+        *
+        * @param menu Menu instance to add item to
+        * @param key Message key part
+        * @param listener Listener instance
+        */
+       private void addMenuItem (final JMenu menu, final String key, final ActionListener listener) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("menu={0},key={1},listener={2} - CALLED!", menu, key, listener)); //NOI18N
+               
+               // New instance
+               JMenuItem item = this.initMenuItemWithTooltip(key);
+               
+               // Add listener
+               item.addActionListener(listener);
+               
+               // Add item -> menu
+               menu.add(item);
+               
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Adds a JTextField with label and tool tip to given panel
+        *
+        * @param panel Panel instance to add text field
+        * @param key Part of message key from resource bundle
+        * @param fieldLength Length of text field
+        */
+       private void addTextFieldWithLabelToPanel (final JPanel panel, final String key, final int fieldLength) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("panel={0},key={1},fieldLength={2} - CALLED!", panel, key, fieldLength)); //NOI18N
+               
+               // Init label for given key
+               JLabel label = new JLabel(this.getBundle().getString(String.format("AddressbookFrame.%s.text", key))); //NOI18N
+               
+               // And input box wih tool tip
+               JTextField field = new JTextField(fieldLength);
+               field.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.%s.toolTipText", key))); //NOI18N
+               
+               // Add both to panel
+               panel.add(label);
+               panel.add(field);
+               
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -262,10 +388,49 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                return title;
        }
 
+       /**
+        * Initializes "add" and "cancel" buttons
+        */
+       private void initAddCancelButtons () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Init panel
+               JPanel panel = new JPanel();
+               panel.setLayout(new GridLayout(1, 2, 10, 10));
+
+               // Generate "add" button
+               JButton addButton = new JButton(this.getBundle().getString("AddressbookFrame.button.addAddress.text"));
+
+               // Add listener
+               addButton.addActionListener(new AddActionListener(this.addContact, this));
+
+               // Add button to panel
+               panel.add(addButton);
+
+               // Generate "cancel" button
+               JButton cancelButton = new JButton(this.getBundle().getString("AddressbookFrame.button.cancel.text"));
+
+               // Add listener
+               cancelButton.addActionListener(new CancelActionListener(this.addContact, this));
+
+               // Add button to panel
+               panel.add(cancelButton);
+
+               // Add panel to main panel
+               this.addContact.add(panel);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
        /**
         * Initializes "add contact" dialog
         */
        private void initAddContactDialog () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Instance dialog and set title
                this.addContact = new JDialog();
                this.addContact.setTitle(this.generateFrameTitle("dialog.addContact")); //NOI18N
@@ -275,7 +440,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Only hide it on close and make it appear in middle of screen
                this.addContact.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
-               this.addContact.setLocationRelativeTo(null);
+               this.addContact.setLocationRelativeTo(this.frame);
 
                // Set always on top and auto-focus
                this.addContact.setAlwaysOnTop(true);
@@ -284,160 +449,104 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                // Initial dimension
                this.addContact.setSize(500, 500);
 
+               // And it is not resizeable
+               this.addContact.setResizable(false);
+
                /*
                 * Add listener which asks for confirmation, if data has been entered
                 * but not saved yet. The user may appriciate this ... ;-)
                 *
                 * @TODO Unfinished
                 */
+               this.addContact.addWindowListener(new WindowAdapter() {
+                       /**
+                        * Invoked when a window has been closed.
+                        */
+                       @Override
+                       public void windowClosed (final WindowEvent e) {
+                               // Enable main window again
+                               AddressbookFrame.getSelfInstance(null).enableMainWindow();
+                       }
+
+                       /**
+                        * Invoked when a window is in the process of being closed. The
+                        * close operation can be overridden at this point.
+                        */
+                       @Override
+                       public void windowClosing (final WindowEvent e) {
+                               e.getWindow().dispose();
+                       }
+               });
+
                // Init 3 panels:
                // 1) "name" panel
-               initNameDataPanel();
+               initNameDataPanel(this.addContact);
 
                // 2) "address" panel
-               initAddressDataPanel();
+               initAddressDataPanel(this.addContact);
 
                // 3) "other" panel
-               initOtherDataPanel();
+               initOtherDataPanel(this.addContact);
+
+               // 4) "Add" and "Cancel" buttons, combined they are unique for this dialog
+               initAddCancelButtons();
 
                // x)Only for developing:
-               /*
-                * DEBUG:
-                */ this.addContact.setVisible(true);
+               /* DEBUG: */ this.addContact.setVisible(true);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
         * Initializes address panel
+        *
+        * @param dialog A JDialog instance to this components to
         */
-       private void initAddressDataPanel () {
+       private void initAddressDataPanel (final JDialog dialog) {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Panel "address" input boxes
                JPanel addressPanel = new JPanel();
-               addressPanel.setLayout(new BoxLayout(addressPanel, BoxLayout.Y_AXIS));
+               addressPanel.setLayout(new GridLayout(0, 4, 3, 3));
 
                // Set border to titled version
                addressPanel.setBorder(new TitledBorder(this.generateBorderTitle("address"))); //NOI18N
 
-               // Init all elements:
-               // 1) Street and number together
-               JPanel streetNumberPanel = new JPanel();
-               streetNumberPanel.setLayout(new GridLayout(1, 4, 5, 5));
-
-               // Label for street
-               JLabel streetLabel = new JLabel(this.getBundle().getString("AddressbookFrame.street.text"));
-
-               // Init text field with label
-               JTextField street = new JTextField(20);
-               street.setToolTipText(this.getBundle().getString("AddressbookFrame.street.tooltipText"));
-
-               // Add both to street panel
-               streetNumberPanel.add(streetLabel);
-               streetNumberPanel.add(street);
+               // Add text field for street
+               this.addTextFieldWithLabelToPanel(addressPanel, "street", 20); //NOI18N
 
                // Number label
                JLabel numberLabel = new JLabel(this.getBundle().getString("AddressbookFrame.number.text"));
 
                // And text field, but only accept numbers
-               JTextField number = new JTextField(4);
-               number.setToolTipText(this.getBundle().getString("AddressbookFrame.number.tooltipText"));
-
-               // Add number verifier
-               number.setInputVerifier(new InputVerifier() {
-
-                       /**
-                        * Method to verify that the entered data is a number.
-                        *
-                        * @param input Input to verify
-                        * @return Whether the data is a number
-                        */
-                       @Override
-                       public boolean verify (final JComponent input) {
-                               // Cast on text field
-                               JTextField text = (JTextField) input;
-
-                               // Default is passed
-                               boolean isValid = true;
-
-                               // Try to convert input text to a number
-                               try {
-                                       int num = Integer.valueOf(text.getText());
-                               } catch (final NumberFormatException ex) {
-                                       // Didn't work
-                                       isValid = false;
-                               }
-
-                               // Return status
-                               return isValid;
-                       }
-               });
+               JFormattedTextField number = new JFormattedTextField();
+               number.setToolTipText(this.getBundle().getString("AddressbookFrame.number.toolTipText"));
 
                // Add both to street panel
-               streetNumberPanel.add(numberLabel);
-               streetNumberPanel.add(number);
-
-               // Add panel to address panel
-               addressPanel.add(streetNumberPanel);
-
-               // 2) ZIP code and ccity name
-               JPanel zipCityPanel = new JPanel();
-               zipCityPanel.setLayout(new GridLayout(1, 4, 5, 5));
+               addressPanel.add(numberLabel);
+               addressPanel.add(number);
 
                // Label for ZIP code, again numbers only
                JLabel zipLabel = new JLabel(this.getBundle().getString("AddressbookFrame.zip.text"));
 
                // Init text field with label
-               JTextField zip = new JTextField(20);
-               zip.setToolTipText(this.getBundle().getString("AddressbookFrame.zip.tooltipText"));
-
-               // Add number verifier
-               zip.setInputVerifier(new InputVerifier() {
-
-                       /**
-                        * Method to verify that the entered data is a number.
-                        *
-                        * @param input Input to verify
-                        * @return Whether the data is a number
-                        */
-                       @Override
-                       public boolean verify (final JComponent input) {
-                               // Cast on text field
-                               JTextField text = (JTextField) input;
-
-                               // Default is passed
-                               boolean isValid = true;
-
-                               // Try to convert input text to a number
-                               try {
-                                       int num = Integer.valueOf(text.getText());
-                               } catch (final NumberFormatException ex) {
-                                       // Didn't work
-                                       isValid = false;
-                               }
-
-                               // Return status
-                               return isValid;
-                       }
-               });
+               JFormattedTextField zip = new JFormattedTextField();
+               zip.setToolTipText(this.getBundle().getString("AddressbookFrame.zip.toolTipText"));
 
                // Add both to street panel
-               zipCityPanel.add(zipLabel);
-               zipCityPanel.add(zip);
+               addressPanel.add(zipLabel);
+               addressPanel.add(zip);
 
-               // Label for street
-               JLabel cityLabel = new JLabel(this.getBundle().getString("AddressbookFrame.city.text"));
-
-               // Init text field with label
-               JTextField city = new JTextField(20);
-               city.setToolTipText(this.getBundle().getString("AddressbookFrame.city.tooltipText"));
-
-               // Add both to street panel
-               zipCityPanel.add(cityLabel);
-               zipCityPanel.add(city);
-
-               // Add panel to address panel
-               addressPanel.add(zipCityPanel);
+               // Add text field for city name
+               this.addTextFieldWithLabelToPanel(addressPanel, "city", 20); //NOI18N
 
                // Add panel to dialog
-               this.addContact.add(addressPanel);
+               dialog.add(addressPanel);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -492,12 +601,38 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Init other windows
                initOtherDialogs();
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Initializes a menu item instance with tool tip
+        * 
+        * @param key Message key part
+        * @return A finished JMenuItem instance
+        */
+       private JMenuItem initMenuItemWithTooltip (final String key) {
+               // Debug line
+               this.getLogger().trace(MessageFormat.format("key={0} - CALLED!", key)); //NOI18N
+
+               JMenuItem item = new JMenuItem(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.text", key))); //NOI18N
+               item.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.toolTipText", key))); //NOI18N
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("item={0} - EXIT!", item)); //NOI18N
+
+               // Return it
+               return item;
        }
 
        /**
         * Initializes the menu system
         */
        private void initMenuSystem () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Init menu bar, menu and item instances
                JMenuBar menuBar = new JMenuBar();
                JMenu menu;
@@ -509,11 +644,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Add menu items:
                // 1.x) Exit program (should be last)
-               item = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.text"));
-               item.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.toolTipText"));
-
-               // Add listener to exit menu
-               item.addActionListener(new ActionListener() {
+               this.addMenuItem(menu, "exitProgram", new ActionListener() { //NOI18N
                        /**
                         * If the user has performed this action
                         *
@@ -525,9 +656,6 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                        }
                });
 
-               // Add item -> menu
-               menu.add(item);
-
                // Add menu -> menu bar
                menuBar.add(menu);
 
@@ -536,8 +664,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
 
                // 2.1) Add own data
-               this.addOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.text"));
-               this.addOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.toolTipText"));
+               this.addOwnItem = this.initMenuItemWithTooltip("addOwnData"); //NOI18N
 
                // Add listener to exit menu
                this.addOwnItem.addActionListener(new ActionListener() {
@@ -548,7 +675,14 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                         */
                        @Override
                        public void actionPerformed (final ActionEvent e) {
-                               self.getClient().getContactManager().doEnterOwnData();
+                               try {
+                                       ManageableAddressbookContact manager = (ManageableAddressbookContact) self.getClient().getManager();
+                                       manager.doEnterOwnData();
+                               } catch (final ContactAlreadyAddedException ex) {
+                                       // Already added, log away
+                                       // @TODO maybe output message here?
+                                       self.logException(ex);
+                               }
                        }
                });
 
@@ -556,8 +690,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                menu.add(this.addOwnItem);
 
                // 2.2) Edit own data
-               this.editOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.text"));
-               this.editOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.toolTipText"));
+               this.editOwnItem = this.initMenuItemWithTooltip("editOwnData"); //NOI18N
 
                // Add listener to exit menu
                this.editOwnItem.addActionListener(new ActionListener() {
@@ -568,35 +701,55 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                         */
                        @Override
                        public void actionPerformed (final ActionEvent e) {
-                               self.getClient().getContactManager().doChangeOwnData();
+                               ManageableAddressbookContact manager = (ManageableAddressbookContact) self.getClient().getManager();
+                               manager.doChangeOwnData();
                        }
                });
 
                // Add item -> menu
                menu.add(this.editOwnItem);
 
+               // Init more menus:
+               // 1) Add new contact
+               this.addMenuItem(menu, "addNewContact", new ActionListener() { //NOI18N
+                       /**
+                        * If the user has performed this action
+                        *
+                        * @param e An instance of an ActionEvent class
+                        */
+                       @Override
+                       public void actionPerformed (final ActionEvent e) {
+                               ManageableAddressbookContact manager = (ManageableAddressbookContact) self.getClient().getManager();
+                               manager.doAddOtherAddress();
+                       }
+               });
+
                // Add menu -> menu bar
                menuBar.add(menu);
 
                // Add menu bar -> frame
                this.frame.add(menuBar, BorderLayout.NORTH);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
         * Initializes name panel
+        *
+        * @param dialog A JDialog instance to this components to
         */
-       private void initNameDataPanel () {
+       private void initNameDataPanel (final JDialog dialog) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N
+
                // Panel "name" input boxes
                JPanel namePanel = new JPanel();
-               namePanel.setLayout(new BoxLayout(namePanel, BoxLayout.Y_AXIS));
+               namePanel.setLayout(new GridLayout(0, 2, 3, 3));
 
                // Set border to titled version
                namePanel.setBorder(new TitledBorder(this.generateBorderTitle("name"))); //NOI18N
 
-               // Panel for gender
-               JPanel gPanel = new JPanel();
-               gPanel.setLayout(new GridLayout(1, 2, 5, 5));
-
                // Gender text field
                JLabel gLabel = new JLabel(this.getBundle().getString("AddressbookFrame.gender.text"));
 
@@ -605,74 +758,92 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Init gender combo box with tool tip
                JComboBox<Gender> gender = new JComboBox<>(new DefaultComboBoxModel<>(genders));
-               gender.setToolTipText(this.getBundle().getString("AddressbookFrame.gender.tooltipText"));
+               gender.setToolTipText(this.getBundle().getString("AddressbookFrame.gender.toolTipText"));
 
                // Add both to gender panel
-               gPanel.add(gLabel);
-               gPanel.add(gender);
+               namePanel.add(gLabel);
+               namePanel.add(gender);
 
-               // Add gender panel to "name" panel
-               namePanel.add(gPanel);
+               // Add text field for surname
+               this.addTextFieldWithLabelToPanel(namePanel, "surname", 20); //NOI18N
 
-               // Panel for surname
-               JPanel sPanel = new JPanel();
-               sPanel.setLayout(new GridLayout(1, 2, 5, 5));
+               // Add text field for family name
+               this.addTextFieldWithLabelToPanel(namePanel, "familyName", 20); //NOI18N
 
-               // New label for surname is not needed
-               JLabel sLabel = new JLabel(this.getBundle().getString("AddressbookFrame.surname.text"));
+               // Finally add panel to dialog
+               dialog.add(namePanel);
 
-               // And input box wih tool tip
-               JTextField surname = new JTextField(20);
-               surname.setToolTipText(this.getBundle().getString("AddressbookFrame.surname.tooltipText"));
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Initializes "other" data panel
+        *
+        * @param dialog A JDialog instance to this components to
+        * @todo Fill this with life
+        */
+       private void initOtherDataPanel (final JDialog dialog) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N
 
-               // Add both to surname panel
-               sPanel.add(sLabel);
-               sPanel.add(surname);
+               // Panel "other" input boxes
+               JPanel otherPanel = new JPanel();
+               otherPanel.setLayout(new GridLayout(0, 2, 3, 3));
+               otherPanel.setBorder(new TitledBorder(this.generateBorderTitle("other"))); //NOI18N
 
-               // Add surname panel to "name" panel
-               namePanel.add(sPanel);
+               // Add text field for email address
+               this.addTextFieldWithLabelToPanel(otherPanel, "emailAddress", 20); //NOI18N
 
-               // Panel for surname
-               JPanel fPanel = new JPanel();
-               fPanel.setLayout(new GridLayout(1, 2));
+               // Add text field for phone number
+               this.addTextFieldWithLabelToPanel(otherPanel, "phoneNumber", 20); //NOI18N
 
-               // New label for surname is not needed
-               JLabel fLabel = new JLabel(this.getBundle().getString("AddressbookFrame.familyName.text"));
+               // Add text field for cellphone number
+               this.addTextFieldWithLabelToPanel(otherPanel, "cellphoneNumber", 20); //NOI18N
 
-               // And input box wih tool tip
-               JTextField familyName = new JTextField(20);
-               familyName.setToolTipText(this.getBundle().getString("AddressbookFrame.familyName.tooltipText"));
+               // Add text field for fax number
+               this.addTextFieldWithLabelToPanel(otherPanel, "faxNumber", 20); //NOI18N
 
-               // Add both to surname panel
-               fPanel.add(fLabel);
-               fPanel.add(familyName);
+               // Init label
+               JLabel commentLabel = new JLabel(this.getBundle().getString("AddressbookFrame.comment.text"));
 
-               // Add family namepanel to "name" panel
-               namePanel.add(fPanel);
+               // Init text area with tool tip
+               JTextArea comment = new JTextArea(5, 20);
+               comment.setToolTipText(this.getBundle().getString("AddressbookFrame.comment.toolTipText"));
+
+               // Add both to panel
+               otherPanel.add(commentLabel);
+               otherPanel.add(comment);
 
                // Finally add panel to dialog
-               this.addContact.add(namePanel);
-       }
+               dialog.add(otherPanel);
 
-       /**
-        * Initializes "other" data panel
-        */
-       private void initOtherDataPanel () {
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
         * Initialize other dialogs (e.g. "Add contact")
         */
        private void initOtherDialogs () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Init other windows:
                // 1) Add contact
                initAddContactDialog();
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
         * Initializes status panel
         */
        private void initStatusPanel () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Init status label (which needs to be updated
                this.statusLabel = new JLabel();
                this.updateStatus("initializing"); //NOI18N
@@ -685,12 +856,18 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Add panel to frame
                this.frame.add(panel, BorderLayout.SOUTH);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
         * Initializes the table which will show all contacts
         */
        private void initTable () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Instance table model
                this.dataModel = new ContactTableModel(this.getClient());
 
@@ -720,6 +897,9 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Add pane to frame
                this.frame.add(scroller, BorderLayout.CENTER);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -728,7 +908,87 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         * @param type Status type
         */
        private void updateStatus (final String type) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("type={0} - CALLED!", type)); //NOI18N
+
                // Set status message
                this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type))); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Class for "add address" button
+        */
+       private static class AddActionListener extends BaseAddressbookSystem implements ActionListener {
+               /**
+                * Dialog instance
+                */
+               private final JDialog dialog;
+
+               /**
+                * Frame (not JFrame) instance
+                */
+               private final ClientFrame frame;
+
+               /**
+                * Constructor for action listener
+                * 
+                * @param dialog Dialog instance to call back
+                * @param frame Frame instance (not JFrame)
+                */
+               protected AddActionListener (final JDialog dialog, final ClientFrame frame) {
+                       // Set dialog and frame here
+                       this.dialog = dialog;
+                       this.frame = frame;
+               }
+
+               /**
+                * If the action has been performed
+                *
+                * @param e The performed action event
+                */
+               @Override
+               public void actionPerformed (final ActionEvent e) {
+                       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+               }
+       }
+
+       /**
+        * Class for "cancel address" button
+        */
+       private static class CancelActionListener extends BaseAddressbookSystem implements ActionListener {
+               /**
+                * Dialog instance
+                */
+               private final JDialog dialog;
+
+               /**
+                * Frame (not JFrame) instance
+                */
+               private final ClientFrame frame;
+
+               /**
+                * Constructor for action listener
+                * 
+                * @param dialog Dialog instance to call back
+                * @param frame Frame instance (not JFrame)
+                */
+               protected CancelActionListener (final JDialog dialog, final ClientFrame frame) {
+                       // Set dialog and frame here
+                       this.dialog = dialog;
+                       this.frame = frame;
+               }
+
+               /**
+                * If the action has been performed
+                *
+                * @param e The performed action event
+                */
+               @Override
+               public void actionPerformed (final ActionEvent e) {
+                       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+               }
        }
 }