]> git.mxchange.org Git - jaddressbook-lib.git/blob - Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
8661516a33c291bb518c748640fc96a2fb212853
[jaddressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / gui / AddressbookFrame.java
1 /*
2  * Copyright (C) 2015 Roland Haeder
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.addressbook.client.gui;
18
19 import java.awt.BorderLayout;
20 import java.awt.GridLayout;
21 import java.awt.event.ActionEvent;
22 import java.awt.event.ActionListener;
23 import java.awt.event.MouseAdapter;
24 import java.awt.event.MouseEvent;
25 import java.awt.event.WindowAdapter;
26 import java.awt.event.WindowEvent;
27 import java.io.IOException;
28 import java.sql.SQLException;
29 import java.text.MessageFormat;
30 import javax.swing.BorderFactory;
31 import javax.swing.BoxLayout;
32 import javax.swing.DefaultComboBoxModel;
33 import javax.swing.JButton;
34 import javax.swing.JComboBox;
35 import javax.swing.JDialog;
36 import javax.swing.JFormattedTextField;
37 import javax.swing.JFrame;
38 import javax.swing.JLabel;
39 import javax.swing.JMenu;
40 import javax.swing.JMenuBar;
41 import javax.swing.JMenuItem;
42 import javax.swing.JPanel;
43 import javax.swing.JScrollPane;
44 import javax.swing.JTable;
45 import javax.swing.JTextArea;
46 import javax.swing.JTextField;
47 import javax.swing.border.TitledBorder;
48 import javax.swing.table.TableModel;
49 import org.mxchange.addressbook.BaseAddressbookSystem;
50 import org.mxchange.addressbook.application.AddressbookApplication;
51 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
52 import org.mxchange.addressbook.manager.contact.ManageableAddressbookContact;
53 import org.mxchange.jcore.client.Client;
54 import org.mxchange.jcore.client.gui.ClientFrame;
55 import org.mxchange.jcore.contact.Contact;
56 import org.mxchange.jcore.contact.Gender;
57 import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
58 import org.mxchange.jcore.model.swing.contact.ContactTableModel;
59
60 /**
61  *
62  * @author Roland Haeder
63  */
64 public class AddressbookFrame extends BaseAddressbookSystem implements ClientFrame {
65
66         /**
67          * Own instance
68          */
69         private static ClientFrame self;
70
71         /**
72          * Singelton getter for this frame instance.
73          *
74          * @param client Client instance
75          * @return Returns a singelton instance of this frame
76          */
77         public static final ClientFrame getSelfInstance (final Client client) {
78                 // Is it set?
79                 if (!(self instanceof ClientFrame)) {
80                         // Create new instance
81                         self = new AddressbookFrame(client);
82                 }
83
84                 // Return instance
85                 return self;
86         }
87
88         /**
89          * Dialog box "add contact"
90          */
91         private JDialog addContact;
92
93         /**
94          * Frame instance for "add own data"
95          */
96         private JMenuItem addOwnItem;
97
98         /**
99          * Instance to table model
100          */
101         private TableModel dataModel;
102
103         /**
104          * Table instance
105          */
106         private JTable dataTable;
107
108         /**
109          * Frame instance for "edit own data"
110          */
111         private JMenuItem editOwnItem;
112
113         /**
114          * Frame instance
115          */
116         private final JFrame frame;
117
118         /**
119          * Whether this frame has been initialized
120          */
121         private boolean initialized;
122
123         /**
124          * Status label needs to be updated
125          */
126         private JLabel statusLabel;
127
128         /**
129          * Creates an instance of this frame with a client instance
130          *
131          * @param client
132          */
133         private AddressbookFrame (final Client client) {
134                 // Debug line
135                 this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
136
137                 // Set frame instance
138                 this.frame = new JFrame();
139                 this.frame.setTitle(this.generateFrameTitle("main")); //NOI18N
140
141                 // Set client here
142                 this.setClient(client);
143
144                 // Trace message
145                 this.getLogger().trace("EXIT!"); //NOI18N
146         }
147
148         @Override
149         public Contact doEnterOwnData () {
150                 // Trace message
151                 this.getLogger().trace("CALLED!"); //NOI18N
152
153                 // Is the "add contact" window visible?
154                 if (this.addContact.isVisible()) {
155                         // Something bad happened
156                         throw new IllegalStateException("Window addContact is already visible."); //NOI18N
157                 }
158
159                 // Disable main window
160                 this.frame.setEnabled(false);
161
162                 // Make other window visible
163                 this.addContact.setVisible(true);
164
165                 // Trace message
166                 this.getLogger().trace("Returning null : EXIT!"); //NOI18N
167
168                 // Return value is not supported
169                 return null;
170         }
171
172         /**
173          * Shutdown this frame
174          */
175         @Override
176         public void doShutdown () {
177                 // Trace message
178                 this.getLogger().trace("CALLED!"); //NOI18N
179
180                 // First only show shutdown status
181                 this.updateStatus("shutdown"); //NOI18N
182
183                 // Trace message
184                 this.getLogger().trace("EXIT!"); //NOI18N
185         }
186
187
188         /**
189          * Enables main window (frame)
190          */
191         @Override
192         public void enableMainWindow () {
193                 // Trace message
194                 this.getLogger().trace("CALLED!"); //NOI18N
195
196                 // Enable it again
197                 this.frame.setEnabled(true);
198
199                 // Request focus for this window
200                 this.frame.requestFocus();
201
202                 // Trace message
203                 this.getLogger().trace("EXIT!"); //NOI18N
204         }
205
206         /**
207          * Setups the frame, do not set isInitialized here
208          *
209          * @param client Client instance
210          */
211         @Override
212         public void setupFrame (final Client client) {
213                 // Debug line
214                 this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
215
216                 // Get and cast manager instance
217                 ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getClient().getManager();
218
219                 // Has the user entered own data?
220                 if (manager.isOwnContactAdded()) {
221                         // Debug message
222                         this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
223
224                         // Not entered yet, so disable "add" menu
225                         this.addOwnItem.setEnabled(false);
226                 } else {
227                         // Disable "edit"
228                         this.editOwnItem.setEnabled(false);
229                 }
230
231                 // Make the frame visible
232                 this.frame.setVisible(true);
233
234                 // All done here
235                 this.updateStatus("done"); //NOI18N
236
237                 // Trace message
238                 this.getLogger().trace("EXIT!"); //NOI18N
239         }
240
241         /**
242          * Initalizes this frame. Having initComponents() exposed (publicly
243          * accessible) means that any other object can initialize components which
244          * you may not want.
245          *
246          * @throws
247          * org.mxchange.jcore.exceptions.FrameAlreadyInitializedException If
248          * this method has been called twice
249          */
250         @Override
251         public void init () throws FrameAlreadyInitializedException {
252                 // Debug line
253                 this.getLogger().trace("CALLED!"); //NOI18N
254
255                 // Has this frame been initialized?
256                 if (this.isInitialized()) {
257                         // Throw exception
258                         throw new FrameAlreadyInitializedException();
259                 }
260
261                 // Init components
262                 this.initComponents();
263
264                 // Set flag
265                 this.initialized = true;
266
267                 // Trace message
268                 this.getLogger().trace("EXIT!"); //NOI18N
269         }
270
271         /**
272          * Returns field isInitialized. This flag indicates whether this frame has
273          * been initialized or not.
274          *
275          * @return Field isInitialized
276          */
277         @Override
278         public final boolean isInitialized () {
279                 return this.initialized;
280         }
281
282         /**
283          * Shuts down the application.
284          */
285         @Override
286         public void shutdownApplication () {
287                 // Trace message
288                 this.getLogger().trace("CALLED!"); //NOI18N
289
290                 // To do this, the frame must be initialized
291                 if (!this.isInitialized()) {
292                         // Not initalized, so bad call
293                         this.getLogger().fatal("Bad call of shutdownApplication(). Please report this."); //NOI18N
294                         return;
295                 }
296
297                 // Call shutdown method
298                 try {
299                         this.getClient().getApplication().doShutdown();
300                 } catch (final SQLException | IOException ex) {
301                         // Abort here
302                         this.abortProgramWithException(ex);
303                 }
304
305                 // Trace message
306                 this.getLogger().trace("EXIT!"); //NOI18N
307         }
308
309         /**
310          * Adds a new menu item with given key to menu instance
311          *
312          * @param menu Menu instance to add item to
313          * @param key Message key part
314          * @param listener Listener instance
315          */
316         private void addMenuItem (final JMenu menu, final String key, final ActionListener listener) {
317                 // Trace message
318                 this.getLogger().trace(MessageFormat.format("menu={0},key={1},listener={2} - CALLED!", menu, key, listener)); //NOI18N
319                 
320                 // New instance
321                 JMenuItem item = this.initMenuItemWithTooltip(key);
322                 
323                 // Add listener
324                 item.addActionListener(listener);
325                 
326                 // Add item -> menu
327                 menu.add(item);
328                 
329                 // Trace message
330                 this.getLogger().trace("EXIT!"); //NOI18N
331         }
332
333         /**
334          * Adds a JTextField with label and tool tip to given panel
335          *
336          * @param panel Panel instance to add text field
337          * @param key Part of message key from resource bundle
338          * @param fieldLength Length of text field
339          */
340         private void addTextFieldWithLabelToPanel (final JPanel panel, final String key, final int fieldLength) {
341                 // Trace message
342                 this.getLogger().trace(MessageFormat.format("panel={0},key={1},fieldLength={2} - CALLED!", panel, key, fieldLength)); //NOI18N
343                 
344                 // Init label for given key
345                 JLabel label = new JLabel(this.getBundle().getString(String.format("AddressbookFrame.%s.text", key))); //NOI18N
346                 
347                 // And input box wih tool tip
348                 JTextField field = new JTextField(fieldLength);
349                 field.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.%s.toolTipText", key))); //NOI18N
350                 
351                 // Add both to panel
352                 panel.add(label);
353                 panel.add(field);
354                 
355                 // Trace message
356                 this.getLogger().trace("EXIT!"); //NOI18N
357         }
358
359         /**
360          * Generates a title for borders
361          *
362          * @param key Key part to look for
363          * @return Human-readable title
364          */
365         private String generateBorderTitle (final String key) {
366                 // Call bundle instance
367                 return this.getBundle().getString(String.format("AddressbookFrame.border.%s.title.text", key)); //NOI18N
368         }
369
370         /**
371          * Generates a title for all frames based on given sub title key. If null is
372          * given, the sub title is not generated.
373          *
374          * @param subKey Key for sub title resource
375          * @return A full application title
376          */
377         private String generateFrameTitle (final String subKey) {
378                 // Base title
379                 String title = AddressbookApplication.printableTitle();
380
381                 // Is key given?
382                 if (subKey != null) {
383                         // Add sub title
384                         title = String.format("%s - %s", title, this.getBundle().getString(String.format("AddressbookFrame.%s.title.text", subKey))); //NOI18N
385                 }
386
387                 // Return it
388                 return title;
389         }
390
391         /**
392          * Initializes "add" and "cancel" buttons
393          */
394         private void initAddCancelButtons () {
395                 // Trace message
396                 this.getLogger().trace("CALLED!"); //NOI18N
397
398                 // Init panel
399                 JPanel panel = new JPanel();
400                 panel.setLayout(new GridLayout(1, 2, 10, 10));
401
402                 // Generate "add" button
403                 JButton addButton = new JButton(this.getBundle().getString("AddressbookFrame.button.addAddress.text"));
404
405                 // Add listener
406                 addButton.addActionListener(new AddActionListener(this.addContact, this));
407
408                 // Add button to panel
409                 panel.add(addButton);
410
411                 // Generate "cancel" button
412                 JButton cancelButton = new JButton(this.getBundle().getString("AddressbookFrame.button.cancel.text"));
413
414                 // Add listener
415                 cancelButton.addActionListener(new CancelActionListener(this.addContact, this));
416
417                 // Add button to panel
418                 panel.add(cancelButton);
419
420                 // Add panel to main panel
421                 this.addContact.add(panel);
422
423                 // Trace message
424                 this.getLogger().trace("EXIT!"); //NOI18N
425         }
426
427         /**
428          * Initializes "add contact" dialog
429          */
430         private void initAddContactDialog () {
431                 // Trace message
432                 this.getLogger().trace("CALLED!"); //NOI18N
433
434                 // Instance dialog and set title
435                 this.addContact = new JDialog();
436                 this.addContact.setTitle(this.generateFrameTitle("dialog.addContact")); //NOI18N
437
438                 // Set layout
439                 this.addContact.setLayout(new GridLayout(0, 1, 2, 2));
440
441                 // Only hide it on close and make it appear in middle of screen
442                 this.addContact.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
443                 this.addContact.setLocationRelativeTo(this.frame);
444
445                 // Set always on top and auto-focus
446                 this.addContact.setAlwaysOnTop(true);
447                 this.addContact.setAutoRequestFocus(true);
448
449                 // Initial dimension
450                 this.addContact.setSize(500, 500);
451
452                 // And it is not resizeable
453                 this.addContact.setResizable(false);
454
455                 /*
456                  * Add listener which asks for confirmation, if data has been entered
457                  * but not saved yet. The user may appriciate this ... ;-)
458                  *
459                  * @TODO Unfinished
460                  */
461                 this.addContact.addWindowListener(new WindowAdapter() {
462                         /**
463                          * Invoked when a window has been closed.
464                          */
465                         @Override
466                         public void windowClosed (final WindowEvent e) {
467                                 // Enable main window again
468                                 AddressbookFrame.getSelfInstance(null).enableMainWindow();
469                         }
470
471                         /**
472                          * Invoked when a window is in the process of being closed. The
473                          * close operation can be overridden at this point.
474                          */
475                         @Override
476                         public void windowClosing (final WindowEvent e) {
477                                 e.getWindow().dispose();
478                         }
479                 });
480
481                 // Init 3 panels:
482                 // 1) "name" panel
483                 initNameDataPanel(this.addContact);
484
485                 // 2) "address" panel
486                 initAddressDataPanel(this.addContact);
487
488                 // 3) "other" panel
489                 initOtherDataPanel(this.addContact);
490
491                 // 4) "Add" and "Cancel" buttons, combined they are unique for this dialog
492                 initAddCancelButtons();
493
494                 // x)Only for developing:
495                 /* DEBUG: */ this.addContact.setVisible(true);
496
497                 // Trace message
498                 this.getLogger().trace("EXIT!"); //NOI18N
499         }
500
501         /**
502          * Initializes address panel
503          *
504          * @param dialog A JDialog instance to this components to
505          */
506         private void initAddressDataPanel (final JDialog dialog) {
507                 // Trace message
508                 this.getLogger().trace("CALLED!"); //NOI18N
509
510                 // Panel "address" input boxes
511                 JPanel addressPanel = new JPanel();
512                 addressPanel.setLayout(new GridLayout(0, 4, 3, 3));
513
514                 // Set border to titled version
515                 addressPanel.setBorder(new TitledBorder(this.generateBorderTitle("address"))); //NOI18N
516
517                 // Add text field for street
518                 this.addTextFieldWithLabelToPanel(addressPanel, "street", 20); //NOI18N
519
520                 // Number label
521                 JLabel numberLabel = new JLabel(this.getBundle().getString("AddressbookFrame.number.text"));
522
523                 // And text field, but only accept numbers
524                 JFormattedTextField number = new JFormattedTextField();
525                 number.setToolTipText(this.getBundle().getString("AddressbookFrame.number.toolTipText"));
526
527                 // Add both to street panel
528                 addressPanel.add(numberLabel);
529                 addressPanel.add(number);
530
531                 // Label for ZIP code, again numbers only
532                 JLabel zipLabel = new JLabel(this.getBundle().getString("AddressbookFrame.zip.text"));
533
534                 // Init text field with label
535                 JFormattedTextField zip = new JFormattedTextField();
536                 zip.setToolTipText(this.getBundle().getString("AddressbookFrame.zip.toolTipText"));
537
538                 // Add both to street panel
539                 addressPanel.add(zipLabel);
540                 addressPanel.add(zip);
541
542                 // Add text field for city name
543                 this.addTextFieldWithLabelToPanel(addressPanel, "city", 20); //NOI18N
544
545                 // Add panel to dialog
546                 dialog.add(addressPanel);
547
548                 // Trace message
549                 this.getLogger().trace("EXIT!"); //NOI18N
550         }
551
552         /**
553          * Initialize components
554          */
555         private void initComponents () {
556                 // Debug line
557                 this.getLogger().trace("CALLED!"); //NOI18N
558
559                 // Set default close operation
560                 this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
561
562                 // Register shutdown listener
563                 this.frame.addWindowListener(new WindowAdapter() {
564                         /**
565                          * Invoked when a window has been closed.
566                          */
567                         @Override
568                         public void windowClosed (final WindowEvent e) {
569                                 // Shutdown application cleanly
570                                 self.shutdownApplication();
571                         }
572
573                         /**
574                          * Invoked when a window is in the process of being closed. The
575                          * close operation can be overridden at this point.
576                          */
577                         @Override
578                         public void windowClosing (final WindowEvent e) {
579                                 // Also shutdown cleanly here
580                                 self.shutdownApplication();
581                         }
582                 });
583
584                 // Setup layout manager
585                 this.frame.setLayout(new BorderLayout(2, 2));
586
587                 // Set window size
588                 this.frame.setSize(700, 400);
589
590                 // Center window in middle of screen, instead of top-left corner
591                 this.frame.setLocationRelativeTo(null);
592
593                 // Init menu system
594                 initMenuSystem();
595
596                 // Init table
597                 initTable();
598
599                 // Init status panel
600                 initStatusPanel();
601
602                 // Init other windows
603                 initOtherDialogs();
604
605                 // Trace message
606                 this.getLogger().trace("EXIT!"); //NOI18N
607         }
608
609         /**
610          * Initializes a menu item instance with tool tip
611          * 
612          * @param key Message key part
613          * @return A finished JMenuItem instance
614          */
615         private JMenuItem initMenuItemWithTooltip (final String key) {
616                 // Debug line
617                 this.getLogger().trace(MessageFormat.format("key={0} - CALLED!", key)); //NOI18N
618
619                 JMenuItem item = new JMenuItem(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.text", key))); //NOI18N
620                 item.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.toolTipText", key))); //NOI18N
621
622                 // Trace message
623                 this.getLogger().trace(MessageFormat.format("item={0} - EXIT!", item)); //NOI18N
624
625                 // Return it
626                 return item;
627         }
628
629         /**
630          * Initializes the menu system
631          */
632         private void initMenuSystem () {
633                 // Trace message
634                 this.getLogger().trace("CALLED!"); //NOI18N
635
636                 // Init menu bar, menu and item instances
637                 JMenuBar menuBar = new JMenuBar();
638                 JMenu menu;
639                 JMenuItem item;
640
641                 // Init some menus:
642                 // 1) File menu
643                 menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
644
645                 // Add menu items:
646                 // 1.x) Exit program (should be last)
647                 this.addMenuItem(menu, "exitProgram", new ActionListener() { //NOI18N
648                         /**
649                          * If the user has performed this action
650                          *
651                          * @param e An instance of an ActionEvent class
652                          */
653                         @Override
654                         public void actionPerformed (final ActionEvent e) {
655                                 self.shutdownApplication();
656                         }
657                 });
658
659                 // Add menu -> menu bar
660                 menuBar.add(menu);
661
662                 // Init some menus:
663                 // 2) Addressbook menu
664                 menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
665
666                 // 2.1) Add own data
667                 this.addOwnItem = this.initMenuItemWithTooltip("addOwnData"); //NOI18N
668
669                 // Add listener to exit menu
670                 this.addOwnItem.addActionListener(new ActionListener() {
671                         /**
672                          * If the user has performed this action
673                          *
674                          * @param e An instance of an ActionEvent class
675                          */
676                         @Override
677                         public void actionPerformed (final ActionEvent e) {
678                                 try {
679                                         ManageableAddressbookContact manager = (ManageableAddressbookContact) self.getClient().getManager();
680                                         manager.doEnterOwnData();
681                                 } catch (final ContactAlreadyAddedException ex) {
682                                         // Already added, log away
683                                         // @TODO maybe output message here?
684                                         self.logException(ex);
685                                 }
686                         }
687                 });
688
689                 // Add item -> menu
690                 menu.add(this.addOwnItem);
691
692                 // 2.2) Edit own data
693                 this.editOwnItem = this.initMenuItemWithTooltip("editOwnData"); //NOI18N
694
695                 // Add listener to exit menu
696                 this.editOwnItem.addActionListener(new ActionListener() {
697                         /**
698                          * If the user has performed this action
699                          *
700                          * @param e An instance of an ActionEvent class
701                          */
702                         @Override
703                         public void actionPerformed (final ActionEvent e) {
704                                 ManageableAddressbookContact manager = (ManageableAddressbookContact) self.getClient().getManager();
705                                 manager.doChangeOwnData();
706                         }
707                 });
708
709                 // Add item -> menu
710                 menu.add(this.editOwnItem);
711
712                 // Init more menus:
713                 // 1) Add new contact
714                 this.addMenuItem(menu, "addNewContact", new ActionListener() { //NOI18N
715                         /**
716                          * If the user has performed this action
717                          *
718                          * @param e An instance of an ActionEvent class
719                          */
720                         @Override
721                         public void actionPerformed (final ActionEvent e) {
722                                 ManageableAddressbookContact manager = (ManageableAddressbookContact) self.getClient().getManager();
723                                 manager.doAddOtherAddress();
724                         }
725                 });
726
727                 // Add menu -> menu bar
728                 menuBar.add(menu);
729
730                 // Add menu bar -> frame
731                 this.frame.add(menuBar, BorderLayout.NORTH);
732
733                 // Trace message
734                 this.getLogger().trace("EXIT!"); //NOI18N
735         }
736
737         /**
738          * Initializes name panel
739          *
740          * @param dialog A JDialog instance to this components to
741          */
742         private void initNameDataPanel (final JDialog dialog) {
743                 // Trace message
744                 this.getLogger().trace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N
745
746                 // Panel "name" input boxes
747                 JPanel namePanel = new JPanel();
748                 namePanel.setLayout(new GridLayout(0, 2, 3, 3));
749
750                 // Set border to titled version
751                 namePanel.setBorder(new TitledBorder(this.generateBorderTitle("name"))); //NOI18N
752
753                 // Gender text field
754                 JLabel gLabel = new JLabel(this.getBundle().getString("AddressbookFrame.gender.text"));
755
756                 // Get all genders
757                 Gender[] genders = Gender.values();
758
759                 // Init gender combo box with tool tip
760                 JComboBox<Gender> gender = new JComboBox<>(new DefaultComboBoxModel<>(genders));
761                 gender.setToolTipText(this.getBundle().getString("AddressbookFrame.gender.toolTipText"));
762
763                 // Add both to gender panel
764                 namePanel.add(gLabel);
765                 namePanel.add(gender);
766
767                 // Add text field for surname
768                 this.addTextFieldWithLabelToPanel(namePanel, "surname", 20); //NOI18N
769
770                 // Add text field for family name
771                 this.addTextFieldWithLabelToPanel(namePanel, "familyName", 20); //NOI18N
772
773                 // Finally add panel to dialog
774                 dialog.add(namePanel);
775
776                 // Trace message
777                 this.getLogger().trace("EXIT!"); //NOI18N
778         }
779
780         /**
781          * Initializes "other" data panel
782          *
783          * @param dialog A JDialog instance to this components to
784          * @todo Fill this with life
785          */
786         private void initOtherDataPanel (final JDialog dialog) {
787                 // Trace message
788                 this.getLogger().trace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N
789
790                 // Panel "other" input boxes
791                 JPanel otherPanel = new JPanel();
792                 otherPanel.setLayout(new GridLayout(0, 2, 3, 3));
793                 otherPanel.setBorder(new TitledBorder(this.generateBorderTitle("other"))); //NOI18N
794
795                 // Add text field for email address
796                 this.addTextFieldWithLabelToPanel(otherPanel, "emailAddress", 20); //NOI18N
797
798                 // Add text field for phone number
799                 this.addTextFieldWithLabelToPanel(otherPanel, "phoneNumber", 20); //NOI18N
800
801                 // Add text field for cellphone number
802                 this.addTextFieldWithLabelToPanel(otherPanel, "cellphoneNumber", 20); //NOI18N
803
804                 // Add text field for fax number
805                 this.addTextFieldWithLabelToPanel(otherPanel, "faxNumber", 20); //NOI18N
806
807                 // Init label
808                 JLabel commentLabel = new JLabel(this.getBundle().getString("AddressbookFrame.comment.text"));
809
810                 // Init text area with tool tip
811                 JTextArea comment = new JTextArea(5, 20);
812                 comment.setToolTipText(this.getBundle().getString("AddressbookFrame.comment.toolTipText"));
813
814                 // Add both to panel
815                 otherPanel.add(commentLabel);
816                 otherPanel.add(comment);
817
818                 // Finally add panel to dialog
819                 dialog.add(otherPanel);
820
821                 // Trace message
822                 this.getLogger().trace("EXIT!"); //NOI18N
823         }
824
825         /**
826          * Initialize other dialogs (e.g. "Add contact")
827          */
828         private void initOtherDialogs () {
829                 // Trace message
830                 this.getLogger().trace("CALLED!"); //NOI18N
831
832                 // Init other windows:
833                 // 1) Add contact
834                 initAddContactDialog();
835
836                 // Trace message
837                 this.getLogger().trace("EXIT!"); //NOI18N
838         }
839
840         /**
841          * Initializes status panel
842          */
843         private void initStatusPanel () {
844                 // Trace message
845                 this.getLogger().trace("CALLED!"); //NOI18N
846
847                 // Init status label (which needs to be updated
848                 this.statusLabel = new JLabel();
849                 this.updateStatus("initializing"); //NOI18N
850
851                 // Init status bar in south
852                 JPanel panel = new JPanel();
853                 panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
854                 panel.add(this.statusLabel);
855                 panel.setBorder(BorderFactory.createEtchedBorder());
856
857                 // Add panel to frame
858                 this.frame.add(panel, BorderLayout.SOUTH);
859
860                 // Trace message
861                 this.getLogger().trace("EXIT!"); //NOI18N
862         }
863
864         /**
865          * Initializes the table which will show all contacts
866          */
867         private void initTable () {
868                 // Trace message
869                 this.getLogger().trace("CALLED!"); //NOI18N
870
871                 // Instance table model
872                 this.dataModel = new ContactTableModel(this.getClient());
873
874                 // Instance table
875                 this.dataTable = new JTable(this.dataModel);
876
877                 // Add mouse listener
878                 this.dataTable.addMouseListener(new MouseAdapter() {
879                         /**
880                          * If the user peformed a click on a cell
881                          *
882                          * @param e Mouse event instance
883                          */
884                         @Override
885                         public void mouseClicked (final MouseEvent e) {
886                                 throw new UnsupportedOperationException("Unfinished."); //NOI18N
887                         }
888                 });
889
890                 // Instance scroll pane
891                 JScrollPane scroller = new JScrollPane();
892
893                 // Add table to scroll pane
894                 scroller.setViewportView(this.dataTable);
895                 scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
896                 scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
897
898                 // Add pane to frame
899                 this.frame.add(scroller, BorderLayout.CENTER);
900
901                 // Trace message
902                 this.getLogger().trace("EXIT!"); //NOI18N
903         }
904
905         /**
906          * Updates status to given type
907          *
908          * @param type Status type
909          */
910         private void updateStatus (final String type) {
911                 // Trace message
912                 this.getLogger().trace(MessageFormat.format("type={0} - CALLED!", type)); //NOI18N
913
914                 // Set status message
915                 this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type))); //NOI18N
916
917                 // Trace message
918                 this.getLogger().trace("EXIT!"); //NOI18N
919         }
920
921         /**
922          * Class for "add address" button
923          */
924         private static class AddActionListener extends BaseAddressbookSystem implements ActionListener {
925                 /**
926                  * Dialog instance
927                  */
928                 private final JDialog dialog;
929
930                 /**
931                  * Frame (not JFrame) instance
932                  */
933                 private final ClientFrame frame;
934
935                 /**
936                  * Constructor for action listener
937                  * 
938                  * @param dialog Dialog instance to call back
939                  * @param frame Frame instance (not JFrame)
940                  */
941                 protected AddActionListener (final JDialog dialog, final ClientFrame frame) {
942                         // Set dialog and frame here
943                         this.dialog = dialog;
944                         this.frame = frame;
945                 }
946
947                 /**
948                  * If the action has been performed
949                  *
950                  * @param e The performed action event
951                  */
952                 @Override
953                 public void actionPerformed (final ActionEvent e) {
954                         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
955                 }
956         }
957
958         /**
959          * Class for "cancel address" button
960          */
961         private static class CancelActionListener extends BaseAddressbookSystem implements ActionListener {
962                 /**
963                  * Dialog instance
964                  */
965                 private final JDialog dialog;
966
967                 /**
968                  * Frame (not JFrame) instance
969                  */
970                 private final ClientFrame frame;
971
972                 /**
973                  * Constructor for action listener
974                  * 
975                  * @param dialog Dialog instance to call back
976                  * @param frame Frame instance (not JFrame)
977                  */
978                 protected CancelActionListener (final JDialog dialog, final ClientFrame frame) {
979                         // Set dialog and frame here
980                         this.dialog = dialog;
981                         this.frame = frame;
982                 }
983
984                 /**
985                  * If the action has been performed
986                  *
987                  * @param e The performed action event
988                  */
989                 @Override
990                 public void actionPerformed (final ActionEvent e) {
991                         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
992                 }
993         }
994 }