]> git.mxchange.org Git - addressbook-lib.git/blobdiff - Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
Introduced initTable()
[addressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / gui / AddressbookFrame.java
index 451d52503e4e22f30bfca99fd27b6639897dc03d..b403bf745dad36d6a09a342143a84101210a031f 100644 (file)
  */
 package org.mxchange.addressbook.client.gui;
 
-import java.awt.Color;
-import java.awt.Cursor;
+import java.awt.BorderLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
-import java.util.ResourceBundle;
+import java.text.MessageFormat;
 import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
-import javax.swing.GroupLayout;
+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.JToolBar;
-import javax.swing.KeyStroke;
-import javax.swing.LayoutStyle;
-import javax.swing.ListSelectionModel;
-import javax.swing.SwingConstants;
-import javax.swing.UIManager;
-import javax.swing.WindowConstants;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import javax.swing.table.TableModel;
+import org.mxchange.addressbook.BaseFrameworkSystem;
 import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.application.Application;
 import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.manager.contact.ManageableContact;
+import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
 import org.mxchange.addressbook.model.address.AddressTableModel;
 
 /**
  *
  * @author Roland Haeder
  */
-public class AddressbookFrame extends javax.swing.JFrame implements ClientFrame {
+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;
+    }
     /**
-     * Class' logger
+     * Frame instance for "add own data"
      */
-    private final Logger LOG;
+    private JMenuItem addOwnItem;
 
     /**
-     * Client instance
+     * Instance to table model
      */
-    private final Client client;
+    private TableModel dataModel;
 
     /**
-     * Own instance
+     * Table instance
      */
-    private static ClientFrame self;
+    private JTable dataTable;
 
     /**
-     * Bundle instance
+     * Frame instance for "edit own data"
      */
-    private final ResourceBundle bundle;
+    private JMenuItem editOwnItem;
 
     /**
-     * Initialize object
+     * Frame instance
      */
-    {
-       LOG = LogManager.getLogger(this);
-       bundle = ResourceBundle.getBundle("org/mxchange/addressbook/localization/bundle"); // NOI18N
-    }
+    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 
+     * 
+     * @param client
      */
     private AddressbookFrame (final Client client) {
        // Debug line
-       this.getLogger().debug("Initializing Swing frame ...");
+       this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
+
+       // Set frame instance
+       this.frame = new JFrame(AddressbookApplication.printableTitle());
 
        // Set client here
-       this.client = client;
+       this.setClient(client);
     }
 
+    /**
+     * Shutdown this frame
+     */
     @Override
-    public Application getApplication () {
-       throw new UnsupportedOperationException("Not implemented.");
+    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 final Client getClient () {
-       return this.client;
-    }
+    public void setupFrame (final Client client) {
+       // Debug line
+       this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
 
-    @Override
-    public ManageableContact getContactManager () {
-       throw new UnsupportedOperationException("Not implemented.");
+       // 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 initFrame () {
+    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;
     }
 
     /**
-     * This method is called from within the constructor to initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is always
-     * regenerated by the Form Editor.
+     * Returns field isInitialized. This flag indicates whether this frame has been initialized or not.
+     * 
+     * @return Field isInitialized
      */
-    @SuppressWarnings ("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        statusPanel = new JPanel();
-        statusLabel = new JLabel();
-        listAddressesPanel = new JScrollPane();
-        addressesTable = new JTable();
-        toolBar = new JToolBar();
-        menuBar = new JMenuBar();
-        mainMenu = new JMenu();
-        exitProgram = new JMenuItem();
-        addressbookMenu = new JMenu();
-        addOwnData = new JMenuItem();
-
-        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
-        setTitle(AddressbookApplication.printableTitle());
-        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
-        setName("main"); // NOI18N
-        addWindowListener(new WindowAdapter() {
-            public void windowClosed(WindowEvent evt) {
-                exitProgram(evt);
-            }
-            public void windowClosing(WindowEvent evt) {
-                AddressbookFrame.this.windowClosing(evt);
-            }
-        });
-
-        statusPanel.setBorder(BorderFactory.createEtchedBorder(Color.lightGray, new Color(153, 153, 153)));
-        statusPanel.setAutoscrolls(true);
-        statusPanel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
-        statusPanel.setFocusable(false);
-        statusPanel.setName("status"); // NOI18N
-        statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS));
-
-        ResourceBundle bundle = ResourceBundle.getBundle("org/mxchange/addressbook/localization/bundle"); // NOI18N
-        statusLabel.setText(bundle.getString("AddressbookFrame.statusLabel.text_1")); // NOI18N
-        statusLabel.setHorizontalTextPosition(SwingConstants.LEFT);
-        statusLabel.setName("statusLabel"); // NOI18N
-        statusPanel.add(statusLabel);
-
-        listAddressesPanel.setName("listAddressesPanel"); // NOI18N
-
-        addressesTable.setModel(new AddressTableModel(this.getClient()));
-        addressesTable.setColumnSelectionAllowed(true);
-        addressesTable.setFillsViewportHeight(true);
-        addressesTable.setFocusable(false);
-        addressesTable.setName("addressesTable"); // NOI18N
-        listAddressesPanel.setViewportView(addressesTable);
-        addressesTable.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
-
-        toolBar.setFloatable(false);
-        toolBar.setRollover(true);
-        toolBar.setName("toolBar"); // NOI18N
-
-        menuBar.setName("menuBar"); // NOI18N
-
-        ResourceBundle bundle1 = ResourceBundle.getBundle("org/mxchange/addressbook/client/gui/Bundle"); // NOI18N
-        mainMenu.setText(bundle1.getString("AddressbookFrame.text")); // NOI18N
-        mainMenu.setFocusable(false);
-        mainMenu.setName(""); // NOI18N
-
-        exitProgram.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK));
-        exitProgram.setText(bundle.getString("AddressbookFrame.exitProgram.text_1")); // NOI18N
-        exitProgram.setName("exitProgram"); // NOI18N
-        exitProgram.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent evt) {
-                exitProgramActionPerformed(evt);
-            }
-        });
-        mainMenu.add(exitProgram);
-
-        menuBar.add(mainMenu);
-
-        addressbookMenu.setText(bundle.getString("AddressbookFrame.addressbookMenu.text_1")); // NOI18N
-        addressbookMenu.setName("addressbookMenu"); // NOI18N
-
-        addOwnData.setText(bundle1.getString("AddressbookFrame.addOwn.text")); // NOI18N
-        addOwnData.setName("addOwn"); // NOI18N
-        addOwnData.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent evt) {
-                addOwnDataActionPerformed(evt);
-            }
-        });
-        addressbookMenu.add(addOwnData);
-        addOwnData.getAccessibleContext().setAccessibleName(bundle.getString("AddressbookFrame.addOwnData.AccessibleContext.accessibleName_1")); // NOI18N
-
-        menuBar.add(addressbookMenu);
-
-        setJMenuBar(menuBar);
-
-        GroupLayout layout = new GroupLayout(getContentPane());
-        getContentPane().setLayout(layout);
-        layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
-            .addComponent(statusPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-            .addComponent(listAddressesPanel, GroupLayout.DEFAULT_SIZE, 700, Short.MAX_VALUE)
-            .addComponent(toolBar, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-        );
-        layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
-            .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
-                .addComponent(toolBar, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)
-                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(listAddressesPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
-                .addGap(1, 1, 1)
-                .addComponent(statusPanel, GroupLayout.PREFERRED_SIZE, 23, GroupLayout.PREFERRED_SIZE))
-        );
-
-        statusPanel.getAccessibleContext().setAccessibleName(bundle1.getString("AddressbookFrame.status.AccessibleContext.accessibleName")); // NOI18N
-        statusPanel.getAccessibleContext().setAccessibleDescription(bundle1.getString("AddressbookFrame.status.AccessibleContext.accessibleDescription")); // NOI18N
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-    private void exitProgramActionPerformed(ActionEvent evt) {//GEN-FIRST:event_exitProgramActionPerformed
-        // Close application instance
-       dispose();
-    }//GEN-LAST:event_exitProgramActionPerformed
-
-    private void addOwnDataActionPerformed(ActionEvent evt) {//GEN-FIRST:event_addOwnDataActionPerformed
-        // Asks the user to enter own data
-       this.getClient().getContactManager().doEnterOwnData();
-    }//GEN-LAST:event_addOwnDataActionPerformed
-
-    private void windowClosing(WindowEvent evt) {//GEN-FIRST:event_windowClosing
-        // TODO add your handling code here:
-       dispose();
-    }//GEN-LAST:event_windowClosing
-
-    private void exitProgram(WindowEvent evt) {//GEN-FIRST:event_exitProgram
-        // TODO add your handling code here:
-       this.getClient().getApplication().doShutdown();
-    }//GEN-LAST:event_exitProgram
+    @Override
+    public final boolean isInitialized () {
+       return this.isInitialized;
+    }
 
     /**
-     * Setups the frame
-     * 
-     * @param client Client instance
+     * Shuts down the application.
      */
     @Override
-    public void setupFrame (final Client 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);
+    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();
+    }
 
-       /*
-        * Set the Nimbus look and feel
-        */
-       //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
-       /*
-        * If Nimbus (introduced in Java SE 6) is not available, stay with the
-        * default look and feel. For details see
-        * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
-        */
-       try {
-           for (UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
-               if ("Nimbus".equals(info.getName())) {
-                   UIManager.setLookAndFeel(info.getClassName());
-                   break;
-               }
+    /**
+     * 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();
            }
-       } catch (final ClassNotFoundException ex) {
-           this.getLogger().catching(ex);
-       } catch (final InstantiationException ex) {
-           this.getLogger().catching(ex);
-       } catch (final IllegalAccessException ex) {
-           this.getLogger().catching(ex);
-       } catch (final javax.swing.UnsupportedLookAndFeelException ex) {
-           this.getLogger().catching(ex);
-       }
-        //</editor-fold>
 
-       // All done here
-       statusLabel.setText(bundle.getString("AddressbookFrame.status.done.text"));
+           /**
+            * 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();
+           }
+       });
 
-       // Debug line
-       this.getLogger().debug("Displaying form ...");
+       // 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();
+    }
+
+    /**
+     * 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);
 
-       /*
-        * Create and display the form
-        */
-       java.awt.EventQueue.invokeLater(new Runnable() {
+       // 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 run () {
-               AddressbookFrame.getSelfInstance(client).setVisible(true);
+           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);
     }
 
     /**
-     * Singelton getter for this frame instance.
-     * 
-     * @param client Client instance
-     * @return Returns a singelton instance of this frame
+     * Initializes status panel
      */
-    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;
+    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);
     }
 
     /**
-     * Getter for logger
-     *
-     * @return Logger
+     * Initializes the table which will show all contacts
      */
-    protected final Logger getLogger () {
-       return this.LOG;
+    private void initTable () {
+       // Instance table model
+       this.dataModel = new AddressTableModel(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) {
+           }
+       });
+
+       // Add table to frame
+       this.frame.add(this.dataTable);
     }
 
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private JMenuItem addOwnData;
-    private JMenu addressbookMenu;
-    private JTable addressesTable;
-    private JMenuItem exitProgram;
-    private JScrollPane listAddressesPanel;
-    private JMenu mainMenu;
-    private JMenuBar menuBar;
-    private JLabel statusLabel;
-    private JPanel statusPanel;
-    private JToolBar toolBar;
-    // End of variables declaration//GEN-END:variables
+    /**
+     * Updates status to given type
+     * 
+     * @param type Status type
+     */
+    private void updateStatus (final String type) {
+       // Set status message
+       this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel." + type + ".text"));
+    }
 }