]> 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 fe9d47b09ad23b721d4a1717c8bb3a2fc4669f12..b403bf745dad36d6a09a342143a84101210a031f 100644 (file)
-/*\r
- * Copyright (C) 2015 Roland Haeder\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation, either version 3 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
- */\r
-package org.mxchange.addressbook.client.gui;\r
-\r
-import java.text.MessageFormat;\r
-import javax.swing.JFrame;\r
-import org.mxchange.addressbook.BaseFrameworkSystem;\r
-import org.mxchange.addressbook.FrameAlreadyInitializedException;\r
-import org.mxchange.addressbook.application.AddressbookApplication;\r
-import org.mxchange.addressbook.client.Client;\r
-\r
-/**\r
- *\r
- * @author Roland Haeder\r
- */\r
-public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {\r
-\r
-    /**\r
-     * Own instance\r
-     */\r
-    private static ClientFrame self;\r
-\r
-    /**\r
-     * Singelton getter for this frame instance.\r
-     *\r
-     * @param client Client instance\r
-     * @return Returns a singelton instance of this frame\r
-     */\r
-    public static final ClientFrame getSelfInstance (final Client client) {\r
-       // Is it set?\r
-       if (!(self instanceof ClientFrame)) {\r
-           // Create new instance\r
-           self = new AddressbookFrame(client);\r
-       }\r
-       \r
-       // Return instance\r
-       return self;\r
-    }\r
-\r
-    /**\r
-     * Frame instance\r
-     */\r
-    private final JFrame frame;\r
-\r
-    /**\r
-     * Whether this frame has been initialized\r
-     */\r
-    private boolean isInitialized;\r
-\r
-    /**\r
-     * Creates an instance of this frame with a client instance\r
-     * \r
-     * @param client\r
-     */\r
-    private AddressbookFrame (final Client client) {\r
-       // Debug line\r
-       this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));\r
-\r
-       // Set frame instance\r
-       this.frame = new JFrame(AddressbookApplication.printableTitle());\r
-\r
-       // Set client here\r
-       this.setClient(client);\r
-    }\r
-\r
-    /**\r
-     * Setups the frame, do not set isInitialized here\r
-     * \r
-     * @param client Client instance\r
-     */\r
-    @Override\r
-    public void setupFrame (final Client client) {\r
-       // Debug line\r
-       this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));\r
-\r
-       // Has the user entered own data?\r
-       if (this.getClient().getContactManager().isOwnContactAdded()) {\r
-           // Debug message\r
-           this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");\r
-\r
-           // Not entered yet, so enable menu\r
-           //addOwnData.setEnabled(false);\r
-       }\r
-\r
-       // All done here\r
-       //statusLabel.setText(bundle.getString("AddressbookFrame.status.done.text"));\r
-    }\r
-\r
-    /**\r
-     * Initalizes this frame. Having initComponents() exposed (publicly\r
-     * accessible) means that any other object can initialize components which\r
-     * you may not want.\r
-     * \r
-     * @throws org.mxchange.addressbook.FrameAlreadyInitializedException If this method has been called twice\r
-     */\r
-    @Override\r
-    public void initFrame () throws FrameAlreadyInitializedException {\r
-       // Debug line\r
-       this.getLogger().trace("CALLED!");\r
-\r
-       // Has this frame been initialized?\r
-       if (this.isInitialized()) {\r
-           // Throw exception\r
-           throw new FrameAlreadyInitializedException();\r
-       }\r
-\r
-       // Init components\r
-       this.initComponents();\r
-\r
-       // Set flag\r
-       this.isInitialized = true;\r
-    }\r
-\r
-    /**\r
-     * Returns field isInitialized. This flag indicates whether this frame has been initialized or not.\r
-     * \r
-     * @return Field isInitialized\r
-     */\r
-    @Override\r
-    public final boolean isInitialized () {\r
-       return this.isInitialized;\r
-    }\r
-\r
-    /**\r
-     * Initialize components\r
-     */\r
-    private void initComponents () {\r
-       // Debug line\r
-       this.getLogger().trace("CALLED!");\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.client.gui;
+
+import java.awt.BorderLayout;
+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.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.table.TableModel;
+import org.mxchange.addressbook.BaseFrameworkSystem;
+import org.mxchange.addressbook.application.AddressbookApplication;
+import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
+import org.mxchange.addressbook.model.address.AddressTableModel;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {
+
+    /**
+     * Own instance
+     */
+    private static ClientFrame self;
+
+    /**
+     * Singelton getter for this frame instance.
+     *
+     * @param client Client instance
+     * @return Returns a singelton instance of this frame
+     */
+    public static final ClientFrame getSelfInstance (final Client client) {
+       // Is it set?
+       if (!(self instanceof ClientFrame)) {
+           // Create new instance
+           self = new AddressbookFrame(client);
+       }
+       
+       // Return instance
+       return self;
+    }
+    /**
+     * 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(AddressbookApplication.printableTitle());
+
+       // 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();
+    }
+
+    /**
+     * 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();
+    }
+
+    /**
+     * 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 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 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);
+    }
+
+    /**
+     * 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"));
+    }
+}