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.InputVerifier;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.border.TitledBorder;
+import javax.swing.table.TableModel;
import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.FrameAlreadyInitializedException;
import org.mxchange.addressbook.application.AddressbookApplication;
import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.contact.Gender;
+import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
+import org.mxchange.addressbook.model.contact.ContactTableModel;
/**
*
*/
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);
- }
-
- // Return instance
- return self;
- }
-
- /**
- * 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 default close operation
- this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
- // 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 enable menu
- //addOwnData.setEnabled(false);
- }
-
- // 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 initFrame () throws FrameAlreadyInitializedException {
- // Debug line
- this.getLogger().trace("CALLED!");
-
- // Has this frame been initialized?
- if (this.isInitialized()) {
- // Throw exception
- throw new FrameAlreadyInitializedException();
- }
-
- // 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!");
-
- // 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 bar in north
- JMenuBar menuBar = new JMenuBar();
-
- // Init some menus:
- // 1) File menu
- JMenu menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
-
- // Add menu items:
- // 1.x) Exit program (should be last)
- JMenuItem 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);
-
- // Add menu bar -> frame
- this.frame.add(menuBar, BorderLayout.NORTH);
-
- // Init status label (which needs to be updated
- this.statusLabel = new JLabel(this.getBundle().getString("AddressbookFrame.statusLabel.initializing.text"));
-
- // Init status bar in south
- JPanel statusPanel = new JPanel();
- statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS));
- statusPanel.add(this.statusLabel);
- statusPanel.setBorder(BorderFactory.createEtchedBorder());
-
- // Add panel to frame
- this.frame.add(statusPanel, BorderLayout.SOUTH);
- }
+ /**
+ * 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;
+ }
+
+ /**
+ * 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 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();
+ this.frame.setTitle(this.generateFrameTitle("main"));
+
+ // Set client here
+ this.setClient(client);
+ }
+
+ /**
+ * Shutdown this frame
+ */
+ @Override
+ public void doShutdown () {
+ // First only show shutdown status
+ this.updateStatus("shutdown");
+ }
+
+ /**
+ * Setups the frame, do not set isInitialized here
+ *
+ * @param client Client instance
+ */
+ @Override
+ public void setupFrame (final Client client) {
+ // Debug line
+ this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
+
+ // Has the user entered own data?
+ if (this.getClient().getContactManager().isOwnContactAdded()) {
+ // Debug message
+ this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");
+
+ // Not entered yet, so disable "add" menu
+ this.addOwnItem.setEnabled(false);
+ } else {
+ // Disable "edit"
+ this.editOwnItem.setEnabled(false);
+ }
+
+ // Make the frame visible
+ this.frame.setVisible(true);
+
+ // All done here
+ this.updateStatus("done");
+ }
+
+ /**
+ * Initalizes this frame. Having initComponents() exposed (publicly
+ * accessible) means that any other object can initialize components which
+ * you may not want.
+ *
+ * @throws
+ * org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException If
+ * this method has been called twice
+ */
+ @Override
+ public void init () throws FrameAlreadyInitializedException {
+ // Debug line
+ this.getLogger().trace("CALLED!");
+
+ // Has this frame been initialized?
+ if (this.isInitialized()) {
+ // Throw exception
+ throw new FrameAlreadyInitializedException();
+ }
+
+ // Init components
+ this.initComponents();
+
+ // Set flag
+ this.isInitialized = true;
+ }
+
+ /**
+ * Returns field isInitialized. This flag indicates whether this frame has
+ * been initialized or not.
+ *
+ * @return Field isInitialized
+ */
+ @Override
+ public final boolean isInitialized () {
+ return this.isInitialized;
+ }
+
+ /**
+ * Shuts down the application.
+ */
+ @Override
+ public void shutdownApplication () {
+ // To do this, the frame must be initialized
+ if (!this.isInitialized()) {
+ // Not initalized, so bad call
+ this.getLogger().fatal("Bad call of shutdownApplication(). Please report this.");
+ return;
+ }
+ this.getClient().getApplication().doShutdown();
+ }
+
+ /**
+ * Generates a title for borders
+ * @param key Key part to look for
+ * @return Human-readable title
+ */
+ private String generateBorderTitle (final String key) {
+ // Call bundle instance
+ return this.getBundle().getString(String.format("AddressbookFrame.border.%s.title.text", key));
+ }
+
+ /**
+ * 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)));
+ }
+
+ // Return it
+ return title;
+ }
+ /**
+ * Initializes "add contact" dialog
+ */
+ private void initAddContactDialog () {
+ // Instance dialog and set title
+ this.addContact = new JDialog();
+ this.addContact.setTitle(this.generateFrameTitle("dialog.addContact"));
+ this.addContact.setLayout(new GridLayout(4, 1));
+
+ // Only hide it on close and make it appear in middle of screen
+ this.addContact.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+ this.addContact.setLocationRelativeTo(null);
+
+ // Set always on top and auto-focus
+ this.addContact.setAlwaysOnTop(true);
+ this.addContact.setAutoRequestFocus(true);
+
+ // Initial dimension
+ this.addContact.setSize(500, 400);
+
+ /*
+ * Add listener which asks for confirmation, if data has been entered
+ * but not saved yet. The user may appriciate this ... ;-)
+ *
+ * @TODO Unfinished
+ */
+
+ // Init 3 panels:
+ // 1) "name" panel
+ initNamePanel();
+
+ // 2) "address" panel
+ initAddressPanel();
+
+ // x)Only for developing:
+ /* DEBUG: */ this.addContact.setVisible(true);
+ }
+
+ /**
+ * Initializes address panel
+ */
+ private void initAddressPanel () {
+ // Panel "address" input boxes
+ JPanel addressPanel = new JPanel();
+ addressPanel.setLayout(new BoxLayout(addressPanel, BoxLayout.Y_AXIS));
+
+ // Set border to titled version
+ addressPanel.setBorder(new TitledBorder(this.generateBorderTitle("address")));
+
+ // Init all elements:
+ // 1) Street and number together
+ JPanel streetNumberPanel = new JPanel();
+ streetNumberPanel.setLayout(new GridLayout(1, 4));
+
+ // Label for street
+ JLabel streetLabel = new JLabel(this.getBundle().getString("AddressbookFrame.street.text"));
+
+ // Init text field with label
+ JTextField street = new JTextField(20);
+ street.setToolTipText(this.getBundle().getString("AddressbookFrame.street.tooltipText"));
+
+ // Add both to street panel
+ streetNumberPanel.add(streetLabel);
+ streetNumberPanel.add(street);
+
+ // Number label
+ JLabel numberLabel = new JLabel(this.getBundle().getString("AddressbookFrame.number.text"));
+
+ // And text field, but only accept numbers
+ JTextField number = new JTextField(4);
+ number.setToolTipText(this.getBundle().getString("AddressbookFrame.number.tooltipText"));
+
+ // Add number verifier
+ number.setInputVerifier(new InputVerifier() {
+
+ /**
+ * Method to verify that the entered data is a number.
+ *
+ * @param input Input to verify
+ * @return Whether the data is a number
+ */
+ @Override
+ public boolean verify (final JComponent input) {
+ // Cast on text field
+ JTextField text = (JTextField) input;
+
+ // Default is passed
+ boolean isValid = true;
+
+ // Try to convert input text to a number
+ try {
+ int num = Integer.valueOf(text.getText());
+ } catch (final NumberFormatException ex) {
+ // Didn't work
+ isValid = false;
+ }
+
+ // Return status
+ return isValid;
+ }
+ });
+
+ // Add both to street panel
+ streetNumberPanel.add(numberLabel);
+ streetNumberPanel.add(number);
+
+ // Add panel to address panel
+ addressPanel.add(streetNumberPanel);
+
+ // 2) ZIP code and ccity name
+ JPanel zipCityPanel = new JPanel();
+ zipCityPanel.setLayout(new GridLayout(1, 4));
+
+ // Label for ZIP code, again numbers only
+ JLabel zipLabel = new JLabel(this.getBundle().getString("AddressbookFrame.zip.text"));
+
+ // Init text field with label
+ JTextField zip = new JTextField(20);
+ zip.setToolTipText(this.getBundle().getString("AddressbookFrame.zip.tooltipText"));
+
+ // Add number verifier
+ zip.setInputVerifier(new InputVerifier() {
+
+ /**
+ * Method to verify that the entered data is a number.
+ *
+ * @param input Input to verify
+ * @return Whether the data is a number
+ */
+ @Override
+ public boolean verify (final JComponent input) {
+ // Cast on text field
+ JTextField text = (JTextField) input;
+
+ // Default is passed
+ boolean isValid = true;
+
+ // Try to convert input text to a number
+ try {
+ int num = Integer.valueOf(text.getText());
+ } catch (final NumberFormatException ex) {
+ // Didn't work
+ isValid = false;
+ }
+
+ // Return status
+ return isValid;
+ }
+ });
+
+ // Add both to street panel
+ zipCityPanel.add(zipLabel);
+ zipCityPanel.add(zip);
+
+ // Label for street
+ JLabel cityLabel = new JLabel(this.getBundle().getString("AddressbookFrame.city.text"));
+
+ // Init text field with label
+ JTextField city = new JTextField(20);
+ city.setToolTipText(this.getBundle().getString("AddressbookFrame.city.tooltipText"));
+
+ // Add both to street panel
+ zipCityPanel.add(cityLabel);
+ zipCityPanel.add(city);
+
+ // Add panel to address panel
+ addressPanel.add(zipCityPanel);
+
+ // Add panel to dialog
+ this.addContact.add(addressPanel);
+ }
+
+ /**
+ * Initialize components
+ */
+ private void initComponents () {
+ // Debug line
+ this.getLogger().trace("CALLED!");
+
+ // Set default close operation
+ this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ // Register shutdown listener
+ this.frame.addWindowListener(new WindowAdapter() {
+ /**
+ * Invoked when a window has been closed.
+ */
+ @Override
+ public void windowClosed (final WindowEvent e) {
+ // Shutdown application cleanly
+ self.shutdownApplication();
+ }
+
+ /**
+ * Invoked when a window is in the process of being closed. The
+ * close operation can be overridden at this point.
+ */
+ @Override
+ public void windowClosing (final WindowEvent e) {
+ // Also shutdown cleanly here
+ self.shutdownApplication();
+ }
+ });
+
+ // Setup layout manager
+ this.frame.setLayout(new BorderLayout(2, 2));
+
+ // Set window size
+ this.frame.setSize(700, 400);
+
+ // Center window in middle of screen, instead of top-left corner
+ this.frame.setLocationRelativeTo(null);
+
+ // Init menu system
+ initMenuSystem();
+
+ // Init table
+ initTable();
+
+ // Init status panel
+ initStatusPanel();
+
+ // Init other windows
+ initOtherDialogs();
+ }
+
+ /**
+ * Initializes the menu system
+ */
+ private void initMenuSystem () {
+ // Init menu bar, menu and item instances
+ JMenuBar menuBar = new JMenuBar();
+ JMenu menu;
+ JMenuItem item;
+
+ // Init some menus:
+ // 1) File menu
+ menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
+
+ // Add menu items:
+ // 1.x) Exit program (should be last)
+ item = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.text"));
+ item.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.toolTipText"));
+
+ // Add listener to exit menu
+ item.addActionListener(new ActionListener() {
+ /**
+ * If the user has performed this action
+ *
+ * @param e An instance of an ActionEvent class
+ */
+ @Override
+ public void actionPerformed (final ActionEvent e) {
+ self.shutdownApplication();
+ }
+ });
+
+ // Add item -> menu
+ menu.add(item);
+
+ // Add menu -> menu bar
+ menuBar.add(menu);
+
+ // Init some menus:
+ // 2) Addressbook menu
+ menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
+
+ // 2.1) Add own data
+ this.addOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.text"));
+ this.addOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.toolTipText"));
+
+ // Add listener to exit menu
+ this.addOwnItem.addActionListener(new ActionListener() {
+ /**
+ * If the user has performed this action
+ *
+ * @param e An instance of an ActionEvent class
+ */
+ @Override
+ public void actionPerformed (final ActionEvent e) {
+ self.getClient().getContactManager().doEnterOwnData();
+ }
+ });
+
+ // Add item -> menu
+ menu.add(this.addOwnItem);
+
+ // 2.2) Edit own data
+ this.editOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.text"));
+ this.editOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.toolTipText"));
+
+ // Add listener to exit menu
+ this.editOwnItem.addActionListener(new ActionListener() {
+ /**
+ * If the user has performed this action
+ *
+ * @param e An instance of an ActionEvent class
+ */
+ @Override
+ public void actionPerformed (final ActionEvent e) {
+ self.getClient().getContactManager().doChangeOwnData();
+ }
+ });
+
+ // Add item -> menu
+ menu.add(this.editOwnItem);
+
+ // Add menu -> menu bar
+ menuBar.add(menu);
+
+ // Add menu bar -> frame
+ this.frame.add(menuBar, BorderLayout.NORTH);
+ }
+
+ /**
+ * Initializes name panel
+ */
+ private void initNamePanel () {
+ // Panel "name" input boxes
+ JPanel namePanel = new JPanel();
+ namePanel.setLayout(new BoxLayout(namePanel, BoxLayout.Y_AXIS));
+
+ // Set border to titled version
+ namePanel.setBorder(new TitledBorder(this.generateBorderTitle("name")));
+
+ // Panel for gender
+ JPanel gPanel = new JPanel();
+ gPanel.setLayout(new GridLayout(1, 2));
+
+ // Gender text field
+ JLabel gLabel = new JLabel(this.getBundle().getString("AddressbookFrame.gender.text"));
+
+ // Get all genders
+ Gender[] genders = Gender.values();
+
+ // Init gender combo box with tool tip
+ JComboBox<Gender> gender = new JComboBox<>(new DefaultComboBoxModel<>(genders));
+ gender.setToolTipText(this.getBundle().getString("AddressbookFrame.gender.tooltipText"));
+
+ // Add both to gender panel
+ gPanel.add(gLabel);
+ gPanel.add(gender);
+
+ // Add gender panel to "name" panel
+ namePanel.add(gPanel);
+
+ // Panel for surname
+ JPanel sPanel = new JPanel();
+ sPanel.setLayout(new GridLayout(1, 2));
+
+ // New label for surname is not needed
+ JLabel sLabel = new JLabel(this.getBundle().getString("AddressbookFrame.surname.text"));
+
+ // And input box wih tool tip
+ JTextField surname = new JTextField(20);
+ surname.setToolTipText(this.getBundle().getString("AddressbookFrame.surname.tooltipText"));
+
+ // Add both to surname panel
+ sPanel.add(sLabel);
+ sPanel.add(surname);
+
+ // Add surname panel to "name" panel
+ namePanel.add(sPanel);
+
+ // Panel for surname
+ JPanel fPanel = new JPanel();
+ fPanel.setLayout(new GridLayout(1, 2));
+
+ // New label for surname is not needed
+ JLabel fLabel = new JLabel(this.getBundle().getString("AddressbookFrame.familyName.text"));
+
+ // And input box wih tool tip
+ JTextField familyName = new JTextField(20);
+ familyName.setToolTipText(this.getBundle().getString("AddressbookFrame.familyName.tooltipText"));
+
+ // Add both to surname panel
+ fPanel.add(fLabel);
+ fPanel.add(familyName);
+
+ // Add family namepanel to "name" panel
+ namePanel.add(fPanel);
+
+ // Finally add panel to dialog
+ this.addContact.add(namePanel);
+ }
+
+ /**
+ * Initialize other dialogs (e.g. "Add contact")
+ */
+ private void initOtherDialogs () {
+ // Init other windows:
+ // 1) Add contact
+ initAddContactDialog();
+ }
+
+ /**
+ * Initializes status panel
+ */
+ private void initStatusPanel () {
+ // Init status label (which needs to be updated
+ this.statusLabel = new JLabel();
+ this.updateStatus("initializing");
+
+ // Init status bar in south
+ JPanel panel = new JPanel();
+ panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
+ panel.add(this.statusLabel);
+ panel.setBorder(BorderFactory.createEtchedBorder());
+
+ // Add panel to frame
+ this.frame.add(panel, BorderLayout.SOUTH);
+ }
+
+ /**
+ * Initializes the table which will show all contacts
+ */
+ private void initTable () {
+ // Instance table model
+ this.dataModel = new 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.");
+ }
+ });
+
+ // 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);
+ }
+
+ /**
+ * Updates status to given type
+ *
+ * @param type Status type
+ */
+ private void updateStatus (final String type) {
+ // Set status message
+ this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type)));
+ }
}