X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=Addressbook%2Fsrc%2Forg%2Fmxchange%2Faddressbook%2Fclient%2Fgui%2FAddressbookFrame.java;h=8dcddcbeb3937a2c3c140dee09e55d156270d082;hb=16289838616dbf25d96a20f82164415d40181e46;hp=c0f132fc73134c745269e4533221519bb99f29bb;hpb=53f82048c662991034ded4ace8b4f13d2fe7cbed;p=addressbook-lib.git diff --git a/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java b/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java index c0f132f..8dcddcb 100644 --- a/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java +++ b/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java @@ -17,315 +17,970 @@ 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; +import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; 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 org.mxchange.addressbook.BaseFrameworkSystem; -import org.mxchange.addressbook.FrameAlreadyInitializedException; +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.BaseAddressbookSystem; 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.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; - - /** - * 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.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel.shutdown.text")); - } - - /** - * 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 } - // Make the frame visible - this.frame.setVisible(true); - - // All done here - this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel.done.text")); - } - - /** - * 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.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(); + /** + * 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; } - // 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; - } - - /** - * 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.getClient().getApplication().doShutdown(); - } - - /** - * 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.getClient().getApplication().doShutdown(); - } - }); - - // 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 status label (which needs to be updated - this.statusLabel = new JLabel(this.getBundle().getString("AddressbookFrame.statusLabel.initializing.text")); - - // 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.getClient().getApplication().doShutdown(); - } - }); - - // 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 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 "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 = 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 + } + + /** + * 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. + } + } }