*/
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"));
+ }
}