]> git.mxchange.org Git - addressbook-lib.git/blobdiff - Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
Moved a lot classes and interfaces (generalized) to new jcore project + added a few...
[addressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / gui / AddressbookFrame.java
index 35d94965e7b1452405a54f7135bc5a5a76b832ee..8dcddcbeb3937a2c3c140dee09e55d156270d082 100644 (file)
@@ -17,6 +17,7 @@
 package org.mxchange.addressbook.client.gui;
 
 import java.awt.BorderLayout;
+import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
@@ -26,376 +27,960 @@ import java.awt.event.WindowEvent;
 import java.text.MessageFormat;
 import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JFormattedTextField;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 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.exceptions.FrameAlreadyInitializedException;
-import org.mxchange.addressbook.model.address.AddressTableModel;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.contact.Gender;
+import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
+import org.mxchange.addressbook.model.contact.ContactTableModel;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
 
 /**
  *
  * @author Roland Haeder
  */
-public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {
-
-    /**
-     * Own instance
-     */
-    private static ClientFrame self;
-
-    /**
-     * Singelton getter for this frame instance.
-     *
-     * @param client Client instance
-     * @return Returns a singelton instance of this frame
-     */
-    public static final ClientFrame getSelfInstance (final Client client) {
-       // Is it set?
-       if (!(self instanceof ClientFrame)) {
-           // Create new instance
-           self = new AddressbookFrame(client);
+public class AddressbookFrame extends BaseAddressbookSystem implements ClientFrame {
+
+       /**
+        * Own instance
+        */
+       private static ClientFrame self;
+
+       /**
+        * Singelton getter for this frame instance.
+        *
+        * @param client Client instance
+        * @return Returns a singelton instance of this frame
+        */
+       public static final ClientFrame getSelfInstance (final Client client) {
+               // Is it set?
+               if (!(self instanceof ClientFrame)) {
+                       // Create new instance
+                       self = new AddressbookFrame(client);
+               }
+
+               // Return instance
+               return self;
        }
-       
-       // Return instance
-       return self;
-    }
-    /**
-     * Frame instance for "add own data"
-     */
-    private JMenuItem addOwnItem;
-
-    /**
-     * Instance to table model
-     */
-    private TableModel dataModel;
-
-    /**
-     * Table instance
-     */
-    private JTable dataTable;
-
-    /**
-     * Frame instance for "edit own data"
-     */
-    private JMenuItem editOwnItem;
-
-    /**
-     * Frame instance
-     */
-    private final JFrame frame;
-
-    /**
-     * Whether this frame has been initialized
-     */
-    private boolean isInitialized;
-
-    /**
-     * Status label needs to be updated
-     */
-    private JLabel statusLabel;
-
-    /**
-     * Creates an instance of this frame with a client instance
-     * 
-     * @param client
-     */
-    private AddressbookFrame (final Client client) {
-       // Debug line
-       this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
-
-       // Set frame instance
-       this.frame = new JFrame(AddressbookApplication.printableTitle());
-
-       // Set client here
-       this.setClient(client);
-    }
-
-    /**
-     * Shutdown this frame
-     */
-    @Override
-    public void doShutdown () {
-       // First only show shutdown status
-       this.updateStatus("shutdown");
-    }
-
-    /**
-     * Setups the frame, do not set isInitialized here
-     * 
-     * @param client Client instance
-     */
-    @Override
-    public void setupFrame (final Client client) {
-       // Debug line
-       this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
-
-       // Has the user entered own data?
-       if (this.getClient().getContactManager().isOwnContactAdded()) {
-           // Debug message
-           this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");
-
-           // Not entered yet, so disable "add" menu
-           this.addOwnItem.setEnabled(false);
-       } else {
-           // Disable "edit"
-           this.editOwnItem.setEnabled(false);
+
+       /**
+        * Dialog box "add contact"
+        */
+       private JDialog addContact;
+
+       /**
+        * Frame instance for "add own data"
+        */
+       private JMenuItem addOwnItem;
+
+       /**
+        * Instance to table model
+        */
+       private TableModel dataModel;
+
+       /**
+        * Table instance
+        */
+       private JTable dataTable;
+
+       /**
+        * Frame instance for "edit own data"
+        */
+       private JMenuItem editOwnItem;
+
+       /**
+        * Frame instance
+        */
+       private final JFrame frame;
+
+       /**
+        * Whether this frame has been initialized
+        */
+       private boolean initialized;
+
+       /**
+        * Status label needs to be updated
+        */
+       private JLabel statusLabel;
+
+       /**
+        * Creates an instance of this frame with a client instance
+        *
+        * @param client
+        */
+       private AddressbookFrame (final Client client) {
+               // Debug line
+               this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
+
+               // Set frame instance
+               this.frame = new JFrame();
+               this.frame.setTitle(this.generateFrameTitle("main")); //NOI18N
+
+               // 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;
+       }
+
+       /**
+        * Shutdown this frame
+        */
+       @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
+       }
+
+       /**
+        * Setups the frame, do not set isInitialized here
+        *
+        * @param client Client instance
+        */
+       @Override
+       public void setupFrame (final Client client) {
+               // Debug line
+               this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
+
+               // Get and cast manager instance
+               ManageableContact manager = (ManageableContact) this.getClient().getManager();
+
+               // Has the user entered own data?
+               if (manager.isOwnContactAdded()) {
+                       // Debug message
+                       this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
+
+                       // Not entered yet, so disable "add" menu
+                       this.addOwnItem.setEnabled(false);
+               } else {
+                       // Disable "edit"
+                       this.editOwnItem.setEnabled(false);
+               }
+
+               // Make the frame visible
+               this.frame.setVisible(true);
+
+               // All done here
+               this.updateStatus("done"); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Initalizes this frame. Having initComponents() exposed (publicly
+        * accessible) means that any other object can initialize components which
+        * you may not want.
+        *
+        * @throws
+        * org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException If
+        * this method has been called twice
+        */
+       @Override
+       public void init () throws FrameAlreadyInitializedException {
+               // Debug line
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Has this frame been initialized?
+               if (this.isInitialized()) {
+                       // Throw exception
+                       throw new FrameAlreadyInitializedException();
+               }
+
+               // Init components
+               this.initComponents();
+
+               // Set flag
+               this.initialized = true;
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Returns field isInitialized. This flag indicates whether this frame has
+        * been initialized or not.
+        *
+        * @return Field isInitialized
+        */
+       @Override
+       public final boolean isInitialized () {
+               return this.initialized;
+       }
+
+       /**
+        * Shuts down the application.
+        */
+       @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;
+               }
+
+               // Call shutdown method
+               this.getClient().getApplication().doShutdown();
+
+               // 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
+       }
+
+       /**
+        * Generates a title for borders
+        *
+        * @param key Key part to look for
+        * @return Human-readable title
+        */
+       private String generateBorderTitle (final String key) {
+               // Call bundle instance
+               return this.getBundle().getString(String.format("AddressbookFrame.border.%s.title.text", key)); //NOI18N
+       }
+
+       /**
+        * Generates a title for all frames based on given sub title key. If null is
+        * given, the sub title is not generated.
+        *
+        * @param subKey Key for sub title resource
+        * @return A full application title
+        */
+       private String generateFrameTitle (final String subKey) {
+               // Base title
+               String title = AddressbookApplication.printableTitle();
+
+               // Is key given?
+               if (subKey != null) {
+                       // Add sub title
+                       title = String.format("%s - %s", title, this.getBundle().getString(String.format("AddressbookFrame.%s.title.text", subKey))); //NOI18N
+               }
+
+               // Return it
+               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
+
+               // Set layout
+               this.addContact.setLayout(new GridLayout(0, 1, 2, 2));
+
+               // Only hide it on close and make it appear in middle of screen
+               this.addContact.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+               this.addContact.setLocationRelativeTo(this.frame);
+
+               // Set always on top and auto-focus
+               this.addContact.setAlwaysOnTop(true);
+               this.addContact.setAutoRequestFocus(true);
+
+               // 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(this.addContact);
+
+               // 2) "address" panel
+               initAddressDataPanel(this.addContact);
+
+               // 3) "other" panel
+               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);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Initializes address panel
+        *
+        * @param dialog A JDialog instance to this components to
+        */
+       private void initAddressDataPanel (final JDialog dialog) {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Panel "address" input boxes
+               JPanel addressPanel = new JPanel();
+               addressPanel.setLayout(new GridLayout(0, 4, 3, 3));
+
+               // Set border to titled version
+               addressPanel.setBorder(new TitledBorder(this.generateBorderTitle("address"))); //NOI18N
+
+               // 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
+               JFormattedTextField number = new JFormattedTextField();
+               number.setToolTipText(this.getBundle().getString("AddressbookFrame.number.toolTipText"));
+
+               // Add both to street panel
+               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
+               JFormattedTextField zip = new JFormattedTextField();
+               zip.setToolTipText(this.getBundle().getString("AddressbookFrame.zip.toolTipText"));
+
+               // Add both to street panel
+               addressPanel.add(zipLabel);
+               addressPanel.add(zip);
+
+               // Add text field for city name
+               this.addTextFieldWithLabelToPanel(addressPanel, "city", 20); //NOI18N
+
+               // Add panel to dialog
+               dialog.add(addressPanel);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Initialize components
+        */
+       private void initComponents () {
+               // Debug line
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Set default close operation
+               this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+               // Register shutdown listener
+               this.frame.addWindowListener(new WindowAdapter() {
+                       /**
+                        * Invoked when a window has been closed.
+                        */
+                       @Override
+                       public void windowClosed (final WindowEvent e) {
+                               // Shutdown application cleanly
+                               self.shutdownApplication();
+                       }
+
+                       /**
+                        * 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) {
+                               // Also shutdown cleanly here
+                               self.shutdownApplication();
+                       }
+               });
+
+               // Setup layout manager
+               this.frame.setLayout(new BorderLayout(2, 2));
+
+               // Set window size
+               this.frame.setSize(700, 400);
+
+               // Center window in middle of screen, instead of top-left corner
+               this.frame.setLocationRelativeTo(null);
+
+               // Init menu system
+               initMenuSystem();
+
+               // Init table
+               initTable();
+
+               // Init status panel
+               initStatusPanel();
+
+               // 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;
+               JMenuItem item;
+
+               // Init some menus:
+               // 1) File menu
+               menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
+
+               // Add menu items:
+               // 1.x) Exit program (should be last)
+               this.addMenuItem(menu, "exitProgram", 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) {
+                               self.shutdownApplication();
+                       }
+               });
+
+               // Add menu -> menu bar
+               menuBar.add(menu);
+
+               // Init some menus:
+               // 2) Addressbook menu
+               menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
+
+               // 2.1) Add own data
+               this.addOwnItem = this.initMenuItemWithTooltip("addOwnData"); //NOI18N
+
+               // Add listener to exit menu
+               this.addOwnItem.addActionListener(new ActionListener() {
+                       /**
+                        * If the user has performed this action
+                        *
+                        * @param e An instance of an ActionEvent class
+                        */
+                       @Override
+                       public void actionPerformed (final ActionEvent e) {
+                               try {
+                                       ManageableContact manager = (ManageableContact) self.getClient().getManager();
+                                       manager.doEnterOwnData();
+                               } catch (final ContactAlreadyAddedException ex) {
+                                       // Already added, log away
+                                       // @TODO maybe output message here?
+                                       self.logException(ex);
+                               }
+                       }
+               });
+
+               // Add item -> menu
+               menu.add(this.addOwnItem);
+
+               // 2.2) Edit own data
+               this.editOwnItem = this.initMenuItemWithTooltip("editOwnData"); //NOI18N
+
+               // Add listener to exit menu
+               this.editOwnItem.addActionListener(new ActionListener() {
+                       /**
+                        * If the user has performed this action
+                        *
+                        * @param e An instance of an ActionEvent class
+                        */
+                       @Override
+                       public void actionPerformed (final ActionEvent e) {
+                               ManageableContact manager = (ManageableContact) 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) {
+                               ManageableContact manager = (ManageableContact) 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
+       }
+
+       /**
+        * 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
+       }
+
+       /**
+        * Initializes name panel
+        *
+        * @param dialog A JDialog instance to this components to
+        */
+       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 GridLayout(0, 2, 3, 3));
+
+               // Set border to titled version
+               namePanel.setBorder(new TitledBorder(this.generateBorderTitle("name"))); //NOI18N
+
+               // Gender text field
+               JLabel gLabel = new JLabel(this.getBundle().getString("AddressbookFrame.gender.text"));
+
+               // Get all genders
+               Gender[] genders = Gender.values();
+
+               // Init gender combo box with tool tip
+               JComboBox<Gender> gender = new JComboBox<>(new DefaultComboBoxModel<>(genders));
+               gender.setToolTipText(this.getBundle().getString("AddressbookFrame.gender.toolTipText"));
+
+               // Add both to gender panel
+               namePanel.add(gLabel);
+               namePanel.add(gender);
+
+               // Add text field for surname
+               this.addTextFieldWithLabelToPanel(namePanel, "surname", 20); //NOI18N
+
+               // Add text field for family name
+               this.addTextFieldWithLabelToPanel(namePanel, "familyName", 20); //NOI18N
+
+               // Finally add panel to dialog
+               dialog.add(namePanel);
+
+               // 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
+
+               // 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 text field for email address
+               this.addTextFieldWithLabelToPanel(otherPanel, "emailAddress", 20); //NOI18N
+
+               // Add text field for phone number
+               this.addTextFieldWithLabelToPanel(otherPanel, "phoneNumber", 20); //NOI18N
+
+               // Add text field for cellphone number
+               this.addTextFieldWithLabelToPanel(otherPanel, "cellphoneNumber", 20); //NOI18N
+
+               // Add text field for fax number
+               this.addTextFieldWithLabelToPanel(otherPanel, "faxNumber", 20); //NOI18N
+
+               // Init label
+               JLabel commentLabel = new JLabel(this.getBundle().getString("AddressbookFrame.comment.text"));
+
+               // 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
+               dialog.add(otherPanel);
+
+               // 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
+
+               // Init status bar in south
+               JPanel panel = new JPanel();
+               panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
+               panel.add(this.statusLabel);
+               panel.setBorder(BorderFactory.createEtchedBorder());
+
+               // 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());
+
+               // Instance table
+               this.dataTable = new JTable(this.dataModel);
+
+               // Add mouse listener
+               this.dataTable.addMouseListener(new MouseAdapter() {
+                       /**
+                        * If the user peformed a click on a cell
+                        *
+                        * @param e Mouse event instance
+                        */
+                       @Override
+                       public void mouseClicked (final MouseEvent e) {
+                               throw new UnsupportedOperationException("Unfinished."); //NOI18N
+                       }
+               });
+
+               // Instance scroll pane
+               JScrollPane scroller = new JScrollPane();
+
+               // Add table to scroll pane
+               scroller.setViewportView(this.dataTable);
+               scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+               scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+
+               // Add pane to frame
+               this.frame.add(scroller, BorderLayout.CENTER);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Updates status to given type
+        *
+        * @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
        }
 
-       // Make the frame visible
-       this.frame.setVisible(true);
-
-       // All done here
-       this.updateStatus("done");
-    }
-
-    /**
-     * Initalizes this frame. Having initComponents() exposed (publicly
-     * accessible) means that any other object can initialize components which
-     * you may not want.
-     * 
-     * @throws org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException If this method has been called twice
-     */
-    @Override
-    public void init () throws FrameAlreadyInitializedException {
-       // Debug line
-       this.getLogger().trace("CALLED!");
-
-       // Has this frame been initialized?
-       if (this.isInitialized()) {
-           // Throw exception
-           throw new FrameAlreadyInitializedException();
+       /**
+        * 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.
+               }
        }
 
-       // Init components
-       this.initComponents();
-
-       // Set flag
-       this.isInitialized = true;
-    }
-
-    /**
-     * Returns field isInitialized. This flag indicates whether this frame has been initialized or not.
-     * 
-     * @return Field isInitialized
-     */
-    @Override
-    public final boolean isInitialized () {
-       return this.isInitialized;
-    }
-
-    /**
-     * Shuts down the application.
-     */
-    @Override
-    public void shutdownApplication () {
-       // 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.");
-           return;
+       /**
+        * 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.
+               }
        }
-       this.getClient().getApplication().doShutdown();
-    }
-
-    /**
-     * Initialize components
-     */
-    private void initComponents () {
-       // Debug line
-       this.getLogger().trace("CALLED!");
-
-       // Set default close operation
-       this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
-       // Register shutdown listener
-       this.frame.addWindowListener(new WindowAdapter() {
-           /**
-            * Invoked when a window has been closed.
-            */
-           @Override
-           public void windowClosed(final WindowEvent e) {
-               // Shutdown application cleanly
-               self.shutdownApplication();
-           }
-
-           /**
-            * 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) {
-               // Also shutdown cleanly here
-               self.shutdownApplication();
-           }
-       });
-
-       // Setup layout manager
-       this.frame.setLayout(new BorderLayout(2, 2));
-
-       // Set window size
-       this.frame.setSize(700, 400);
-
-       // Center window in middle of screen, instead of top-left corner
-       this.frame.setLocationRelativeTo(null);
-
-       // Init menu system
-       initMenuSystem();
-
-       // Init table
-       initTable();
-
-       // Init status panel
-       initStatusPanel();
-    }
-
-    /**
-     * Initializes the menu system
-     */
-    private void initMenuSystem () {
-       // Init menu bar, menu and item instances
-       JMenuBar menuBar = new JMenuBar();
-       JMenu menu;
-       JMenuItem item;
-
-       // Init some menus:
-       // 1) File menu
-       menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
-
-       // 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() {
-           /**
-            * If the user has performed this action
-            *
-            * @param e An instance of an ActionEvent class
-            */
-           @Override
-           public void actionPerformed (final ActionEvent e) {
-               self.shutdownApplication();
-           }
-       });
-
-       // Add item -> menu
-       menu.add(item);
-
-       // Add menu -> menu bar
-       menuBar.add(menu);
-
-       // Init some menus:
-       // 2) Addressbook menu
-       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"));
-
-       // Add listener to exit menu
-       this.addOwnItem.addActionListener(new ActionListener() {
-           /**
-            * If the user has performed this action
-            *
-            * @param e An instance of an ActionEvent class
-            */
-           @Override
-           public void actionPerformed (final ActionEvent e) {
-               self.getClient().getContactManager().doEnterOwnData();
-           }
-       });
-
-       // Add item -> menu
-       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"));
-
-       // Add listener to exit menu
-       this.editOwnItem.addActionListener(new ActionListener() {
-           /**
-            * If the user has performed this action
-            *
-            * @param e An instance of an ActionEvent class
-            */
-           @Override
-           public void actionPerformed (final ActionEvent e) {
-               self.getClient().getContactManager().doChangeOwnData();
-           }
-       });
-
-       // Add item -> menu
-       menu.add(this.editOwnItem);
-
-       // Add menu -> menu bar
-       menuBar.add(menu);
-
-       // Add menu bar -> frame
-       this.frame.add(menuBar, BorderLayout.NORTH);
-    }
-
-    /**
-     * Initializes status panel
-     */
-    private void initStatusPanel () {
-       // Init status label (which needs to be updated
-       this.statusLabel = new JLabel();
-       this.updateStatus("initializing");
-
-       // Init status bar in south
-       JPanel panel = new JPanel();
-       panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
-       panel.add(this.statusLabel);
-       panel.setBorder(BorderFactory.createEtchedBorder());
-       
-       // Add panel to frame
-       this.frame.add(panel, BorderLayout.SOUTH);
-    }
-
-    /**
-     * Initializes the table which will show all contacts
-     */
-    private void initTable () {
-       // Instance table model
-       this.dataModel = new AddressTableModel(this.getClient());
-
-       // Instance table
-       this.dataTable = new JTable(this.dataModel);
-
-       // Add mouse listener
-       this.dataTable.addMouseListener(new MouseAdapter() {
-           /**
-            * If the user peformed a click on a cell
-            * 
-            * @param e Mouse event instance
-            */
-           @Override
-           public void mouseClicked(final MouseEvent e) {
-               throw new UnsupportedOperationException("Unfinished.");
-           }
-       });
-
-       // Add table to frame
-       this.frame.add(this.dataTable, BorderLayout.CENTER);
-    }
-
-    /**
-     * Updates status to given type
-     * 
-     * @param type Status type
-     */
-    private void updateStatus (final String type) {
-       // Set status message
-       this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel." + type + ".text"));
-    }
 }