*/
package org.mxchange.addressbook.client.gui;
-import org.mxchange.addressbook.model.gender.GenderComboBoxModel;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
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.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.application.AddressbookApplication;
import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.contact.Gender;
import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
import org.mxchange.addressbook.model.contact.ContactTableModel;
*/
private boolean isInitialized;
+ /**
+ * Layout instance
+ */
+ private GridLayout layout;
+
/**
* Status label needs to be updated
*/
*/
private AddressbookFrame (final Client client) {
// Debug line
- this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
+ this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
// Set frame instance
this.frame = new JFrame();
- this.frame.setTitle(this.generateFrameTitle("main"));
+ this.frame.setTitle(this.generateFrameTitle("main")); //NOI18N
// Set client here
this.setClient(client);
}
+ @Override
+ public Contact doEnterOwnData () {
+ // Is the "add contact" window visible?
+ if (this.addContact.isVisible()) {
+ // Something bad happened
+ throw new IllegalStateException("Window addContact is already visible.");
+ }
+
+ // Disable main window
+ this.frame.setEnabled(false);
+
+ // Make other window visible
+ this.addContact.setVisible(true);
+
+ // Return value is not supported
+ return null;
+ }
+
/**
* Shutdown this frame
*/
@Override
public void doShutdown () {
// First only show shutdown status
- this.updateStatus("shutdown");
+ this.updateStatus("shutdown"); //NOI18N
+ }
+
+
+ /**
+ * Enables main window (frame)
+ */
+ @Override
+ public void enableMainWindow () {
+ // Enable it again
+ this.frame.setEnabled(true);
+
+ // Request focus for this window
+ this.frame.requestFocus();
}
/**
@Override
public void setupFrame (final Client client) {
// Debug line
- this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
+ this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
// Has the user entered own data?
if (this.getClient().getContactManager().isOwnContactAdded()) {
// Debug message
- this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");
+ this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
// Not entered yet, so disable "add" menu
this.addOwnItem.setEnabled(false);
this.frame.setVisible(true);
// All done here
- this.updateStatus("done");
+ this.updateStatus("done"); //NOI18N
}
/**
@Override
public void init () throws FrameAlreadyInitializedException {
// Debug line
- this.getLogger().trace("CALLED!");
+ this.getLogger().trace("CALLED!"); //NOI18N
// Has this frame been initialized?
if (this.isInitialized()) {
// 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.");
+ this.getLogger().fatal("Bad call of shutdownApplication(). Please report this."); //NOI18N
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));
+ return this.getBundle().getString(String.format("AddressbookFrame.border.%s.title.text", key)); //NOI18N
}
/**
* 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
*/
// 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)));
+ title = String.format("%s - %s", title, this.getBundle().getString(String.format("AddressbookFrame.%s.title.text", subKey))); //NOI18N
}
// Return it
return title;
}
+ /**
+ * Initializes "add" and "cancel" buttons
+ */
+ private void initAddCancelButtons () {
+ }
+
/**
* 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));
-
+ this.addContact.setTitle(this.generateFrameTitle("dialog.addContact")); //NOI18N
+
+ // Set layout
+ this.addContact.setLayout(new GridLayout(0, 1, 2, 2));
+
// 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(400, 300);
-
+ this.addContact.setSize(500, 500);
+
+ // And it is not resizeable
+ this.addContact.setResizable(false);
+
/*
* Add listener which asks for confirmation, if data has been entered
* but not saved yet. The user may appriciate this ... ;-)
*
* @TODO Unfinished
*/
-
+ this.addContact.addWindowListener(new WindowAdapter() {
+ /**
+ * Invoked when a window has been closed.
+ */
+ @Override
+ public void windowClosed (final WindowEvent e) {
+ // Enable main window again
+ AddressbookFrame.getSelfInstance(null).enableMainWindow();
+ }
+
+ /**
+ * 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) {
+ e.getWindow().dispose();
+ }
+ });
+
// Init 3 panels:
- // 1) Panel "name" input boxes
- JPanel panel = new JPanel();
- panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-
- // Set border to titled version
- panel.setBorder(new TitledBorder(this.generateBorderTitle("name")));
+ // 1) "name" panel
+ initNameDataPanel(this.addContact);
- // Add some input boxes for "name" panel
- JComboBox<String> gender = new JComboBox<>(new GenderComboBoxModel(this.getClient()));
+ // 2) "address" panel
+ initAddressDataPanel(this.addContact);
- // Finally add panel to dialog
- this.addContact.add(panel);
-
- // Only for developing:
+ // 3) "other" panel
+ initOtherDataPanel(this.addContact);
+
+ // 4) "Add" and "Cancel" buttons
+ initAddCancelButtons();
+
+ // x)Only for developing:
/* DEBUG: */ this.addContact.setVisible(true);
}
+ /**
+ * Initializes address panel
+ *
+ * @param dialog A JDialog instance to this components to
+ */
+ private void initAddressDataPanel (final JDialog dialog) {
+ // 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"))); //NOI18N
+
+ // Init all elements:
+ // 1) Street and number together
+ JPanel streetNumberPanel = new JPanel();
+ streetNumberPanel.setLayout(new GridLayout(1, 4, 5, 5));
+
+ // 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, 5, 5));
+
+ // 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
+ dialog.add(addressPanel);
+ }
+
/**
* Initialize components
*/
private void initComponents () {
// Debug line
- this.getLogger().trace("CALLED!");
+ this.getLogger().trace("CALLED!"); //NOI18N
// Set default close operation
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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"));
// Add menu -> menu bar
menuBar.add(menu);
-
+
// Init some menus:
// 2) Addressbook menu
menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
this.frame.add(menuBar, BorderLayout.NORTH);
}
+ /**
+ * Initializes name panel
+ *
+ * @param dialog A JDialog instance to this components to
+ */
+ private void initNameDataPanel (final JDialog dialog) {
+ // 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"))); //NOI18N
+
+ // Panel for gender
+ JPanel gPanel = new JPanel();
+ gPanel.setLayout(new GridLayout(1, 2, 5, 5));
+
+ // 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, 5, 5));
+
+ // 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
+ dialog.add(namePanel);
+ }
+
+ /**
+ * Initializes "other" data panel
+ *
+ * @param dialog A JDialog instance to this components to
+ * @todo Fill this with life
+ */
+ private void initOtherDataPanel (final JDialog dialog) {
+ // Panel "other" input boxes
+ JPanel otherPanel = new JPanel();
+ otherPanel.setLayout(new BoxLayout(otherPanel, BoxLayout.Y_AXIS));
+
+ // Set border to titled version
+ otherPanel.setBorder(new TitledBorder(this.generateBorderTitle("other"))); //NOI18N
+
+ // Finally add panel to dialog
+ dialog.add(otherPanel);
+ }
+
/**
* Initialize other dialogs (e.g. "Add contact")
*/
private void initStatusPanel () {
// Init status label (which needs to be updated
this.statusLabel = new JLabel();
- this.updateStatus("initializing");
+ this.updateStatus("initializing"); //NOI18N
// Init status bar in south
JPanel panel = new JPanel();
*/
@Override
public void mouseClicked (final MouseEvent e) {
- throw new UnsupportedOperationException("Unfinished.");
+ throw new UnsupportedOperationException("Unfinished."); //NOI18N
}
});
*/
private void updateStatus (final String type) {
// Set status message
- this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type)));
+ this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type))); //NOI18N
}
}