- // 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> 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.
+ }
+ }