]> git.mxchange.org Git - addressbook-lib.git/blobdiff - Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
Introduced more methods + added first dialog call (yes, it is still visible by startu...
[addressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / gui / AddressbookFrame.java
index 8f8cee6d1795935fd7a8789188676fa8aa760e47..ea74026336507034521e9e9ae1c67eebd33d29b8 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,17 +27,27 @@ import java.awt.event.WindowEvent;
 import java.text.MessageFormat;
 import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.InputVerifier;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
 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.JTextField;
+import javax.swing.border.TitledBorder;
 import javax.swing.table.TableModel;
 import org.mxchange.addressbook.BaseFrameworkSystem;
 import org.mxchange.addressbook.application.AddressbookApplication;
 import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
 import org.mxchange.addressbook.model.contact.ContactTableModel;
 
@@ -67,6 +78,12 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                // Return instance
                return self;
        }
+
+       /**
+        * Dialog box "add contact"
+        */
+       private JDialog addContact;
+
        /**
         * Frame instance for "add own data"
         */
@@ -97,6 +114,11 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         */
        private boolean isInitialized;
 
+       /**
+        * Layout instance
+        */
+       private GridLayout layout;
+
        /**
         * Status label needs to be updated
         */
@@ -109,22 +131,54 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         */
        private AddressbookFrame (final Client client) {
                // Debug line
-               this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
+               this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
 
                // Set frame instance
-               this.frame = new JFrame(AddressbookApplication.printableTitle());
+               this.frame = new JFrame();
+               this.frame.setTitle(this.generateFrameTitle("main")); //NOI18N
 
                // Set client here
                this.setClient(client);
        }
 
+       @Override
+       public Contact doEnterOwnData () {
+               // Is the "add contact" window visible?
+               if (this.addContact.isVisible()) {
+                       // Something bad happened
+                       throw new IllegalStateException("Window addContact is already visible.");
+               }
+
+               // Disable main window
+               this.frame.setEnabled(false);
+
+               // Make other window visible
+               this.addContact.setVisible(true);
+
+               // Return value is not supported
+               return null;
+       }
+
        /**
         * Shutdown this frame
         */
        @Override
        public void doShutdown () {
                // First only show shutdown status
-               this.updateStatus("shutdown");
+               this.updateStatus("shutdown"); //NOI18N
+       }
+
+
+       /**
+        * Enables main window (frame)
+        */
+       @Override
+       public void enableMainWindow () {
+               // Enable it again
+               this.frame.setEnabled(true);
+
+               // Request focus for this window
+               this.frame.requestFocus();
        }
 
        /**
@@ -135,12 +189,12 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
        @Override
        public void setupFrame (final Client client) {
                // Debug line
-               this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
+               this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
 
                // Has the user entered own data?
                if (this.getClient().getContactManager().isOwnContactAdded()) {
                        // Debug message
-                       this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");
+                       this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
 
                        // Not entered yet, so disable "add" menu
                        this.addOwnItem.setEnabled(false);
@@ -153,7 +207,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                this.frame.setVisible(true);
 
                // All done here
-               this.updateStatus("done");
+               this.updateStatus("done"); //NOI18N
        }
 
        /**
@@ -168,7 +222,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
        @Override
        public void init () throws FrameAlreadyInitializedException {
                // Debug line
-               this.getLogger().trace("CALLED!");
+               this.getLogger().trace("CALLED!"); //NOI18N
 
                // Has this frame been initialized?
                if (this.isInitialized()) {
@@ -202,18 +256,260 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                // 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.");
+                       this.getLogger().fatal("Bad call of shutdownApplication(). Please report this."); //NOI18N
                        return;
                }
                this.getClient().getApplication().doShutdown();
        }
 
+       /**
+        * 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 () {
+       }
+
+       /**
+        * Initializes "add contact" dialog
+        */
+       private void initAddContactDialog () {
+               // 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(null);
+
+               // 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
+               initAddCancelButtons();
+
+               // x)Only for developing:
+               /* DEBUG: */ this.addContact.setVisible(true);
+       }
+
+       /**
+        * Initializes address panel
+        *
+        * @param dialog A JDialog instance to this components to
+        */
+       private void initAddressDataPanel (final JDialog dialog) {
+               // Panel "address" input boxes
+               JPanel addressPanel = new JPanel();
+               addressPanel.setLayout(new BoxLayout(addressPanel, BoxLayout.Y_AXIS));
+
+               // 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);
+
+               // 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;
+                       }
+               });
+
+               // 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));
+
+               // 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;
+                       }
+               });
+
+               // Add both to street panel
+               zipCityPanel.add(zipLabel);
+               zipCityPanel.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 panel to dialog
+               dialog.add(addressPanel);
+       }
+
        /**
         * Initialize components
         */
        private void initComponents () {
                // Debug line
-               this.getLogger().trace("CALLED!");
+               this.getLogger().trace("CALLED!"); //NOI18N
 
                // Set default close operation
                this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@@ -257,6 +553,9 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 
                // Init status panel
                initStatusPanel();
+
+               // Init other windows
+               initOtherDialogs();
        }
 
        /**
@@ -268,11 +567,11 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                JMenu menu;
                JMenuItem item;
 
-       // Init some menus:
+               // Init some menus:
                // 1) File menu
                menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
 
-       // Add menu items:
+               // 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"));
@@ -296,7 +595,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                // Add menu -> menu bar
                menuBar.add(menu);
 
-       // Init some menus:
+               // Init some menus:
                // 2) Addressbook menu
                menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
 
@@ -347,13 +646,114 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                this.frame.add(menuBar, BorderLayout.NORTH);
        }
 
+       /**
+        * Initializes name panel
+        *
+        * @param dialog A JDialog instance to this components to
+        */
+       private void initNameDataPanel (final JDialog dialog) {
+               // Panel "name" input boxes
+               JPanel namePanel = new JPanel();
+               namePanel.setLayout(new BoxLayout(namePanel, BoxLayout.Y_AXIS));
+
+               // 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"));
+
+               // 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
+               gPanel.add(gLabel);
+               gPanel.add(gender);
+
+               // Add gender panel to "name" panel
+               namePanel.add(gPanel);
+
+               // Panel for surname
+               JPanel sPanel = new JPanel();
+               sPanel.setLayout(new GridLayout(1, 2, 5, 5));
+
+               // New label for surname is not needed
+               JLabel sLabel = new JLabel(this.getBundle().getString("AddressbookFrame.surname.text"));
+
+               // And input box wih tool tip
+               JTextField surname = new JTextField(20);
+               surname.setToolTipText(this.getBundle().getString("AddressbookFrame.surname.tooltipText"));
+
+               // Add both to surname panel
+               sPanel.add(sLabel);
+               sPanel.add(surname);
+
+               // Add surname panel to "name" panel
+               namePanel.add(sPanel);
+
+               // Panel for surname
+               JPanel fPanel = new JPanel();
+               fPanel.setLayout(new GridLayout(1, 2));
+
+               // New label for surname is not needed
+               JLabel fLabel = new JLabel(this.getBundle().getString("AddressbookFrame.familyName.text"));
+
+               // And input box wih tool tip
+               JTextField familyName = new JTextField(20);
+               familyName.setToolTipText(this.getBundle().getString("AddressbookFrame.familyName.tooltipText"));
+
+               // Add both to surname panel
+               fPanel.add(fLabel);
+               fPanel.add(familyName);
+
+               // Add family namepanel to "name" panel
+               namePanel.add(fPanel);
+
+               // Finally add panel to dialog
+               dialog.add(namePanel);
+       }
+
+       /**
+        * Initializes "other" data panel
+        *
+        * @param dialog A JDialog instance to this components to
+        * @todo Fill this with life
+        */
+       private void initOtherDataPanel (final JDialog dialog) {
+               // Panel "other" input boxes
+               JPanel otherPanel = new JPanel();
+               otherPanel.setLayout(new BoxLayout(otherPanel, BoxLayout.Y_AXIS));
+
+               // Set border to titled version
+               otherPanel.setBorder(new TitledBorder(this.generateBorderTitle("other"))); //NOI18N
+
+               // Finally add panel to dialog
+               dialog.add(otherPanel);
+       }
+
+       /**
+        * Initialize other dialogs (e.g. "Add contact")
+        */
+       private void initOtherDialogs () {
+               // Init other windows:
+               // 1) Add contact
+               initAddContactDialog();
+       }
+
        /**
         * Initializes status panel
         */
        private void initStatusPanel () {
                // Init status label (which needs to be updated
                this.statusLabel = new JLabel();
-               this.updateStatus("initializing");
+               this.updateStatus("initializing"); //NOI18N
 
                // Init status bar in south
                JPanel panel = new JPanel();
@@ -384,12 +784,20 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
                         */
                        @Override
                        public void mouseClicked (final MouseEvent e) {
-                               throw new UnsupportedOperationException("Unfinished.");
+                               throw new UnsupportedOperationException("Unfinished."); //NOI18N
                        }
                });
 
-               // Add table to frame
-               this.frame.add(this.dataTable, BorderLayout.CENTER);
+               // 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);
        }
 
        /**
@@ -399,6 +807,6 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
         */
        private void updateStatus (final String type) {
                // Set status message
-               this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel." + type + ".text"));
+               this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type))); //NOI18N
        }
 }