--- /dev/null
+/*
+ * 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;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import org.mxchange.jcore.BaseFrameworkSystem;
+import org.mxchange.jcoreeelogger.beans.local.logger.Log;
+import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal;
+
+/**
+ * A general addressbook class
+ * <p>
+ * @author Roland Haeder
+ */
+public abstract class BaseAddressbookSystem extends BaseFrameworkSystem {
+
+ /**
+ * Logger instance
+ */
+ @Log
+ private LoggerBeanLocal logger;
+
+ /**
+ * Protected constructor
+ */
+ protected BaseAddressbookSystem () {
+ try {
+ // Get initial context
+ Context context = new InitialContext();
+
+ // Lookup logger
+ this.logger = (LoggerBeanLocal) context.lookup("java:global/jcore-logger-ejb/logger!org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal"); //NOI18N
+ } catch (final NamingException ex) {
+ // Continue to throw
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * Log exception and abort program.
+ * <p>
+ * @param throwable Throwable
+ */
+ protected void abortProgramWithException (final Throwable throwable) {
+ // Log exception
+ this.logException(throwable);
+
+ // Abort here
+ System.exit(1);
+ }
+
+ /**
+ * Getter for logger instance
+ * <p>
+ * @return Logger instance
+ */
+ protected LoggerBeanLocal getLogger () {
+ return this.logger;
+ }
+
+ /**
+ * Logs given exception
+ * <p>
+ * @param exception Throwable
+ */
+ protected void logException (final Throwable exception) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+}
--- /dev/null
+/*
+ * 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;
+
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcontacts.contact.Contact;
+import org.mxchange.jcontacts.contact.gender.Gender;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.MenuInitializationException;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
+
+/**
+ * A special client interface for addressbook applications.
+ * <p>
+ * @author Roland Haeder
+ */
+public interface AddressbookClient extends Client {
+
+ /**
+ * Displays a "box" for the address
+ * <p>
+ * @param contact Contact to show address from
+ */
+ public void displayAddressBox (final Contact contact);
+
+ /**
+ * Displays a "box" for the name
+ * <p>
+ * @param contact Contact to show name from
+ */
+ public void displayNameBox (final Contact contact);
+
+ /**
+ * Displays a "box" for other data
+ * <p>
+ * @param contact Contact to show other data from
+ */
+ public void displayOtherDataBox (final Contact contact);
+
+ /**
+ * Shows given contact instamce
+ *
+ * @param contact Contact instance
+ */
+ public void show (final Contact contact);
+
+ /**
+ * The user changes own address data
+ * <p>
+ * @param contact Contact instance to change
+ */
+ public void doChangeOwnAddressData (final Contact contact);
+
+ /**
+ * The user changes own name data
+ * <p>
+ * @param contact
+ */
+ public void doChangeOwnNameData (final Contact contact);
+
+ /**
+ * The user changes own other data
+ * <p>
+ * @param contact Constact instance to change
+ */
+ public void doChangeOwnOtherData (final Contact contact);
+
+ /**
+ * Allows the user to enter own data
+ * <p>
+ * @return Finished Contact instance
+ */
+ public Contact doEnterOwnData ();
+
+ /**
+ * Asks the user for a choice and proceeds accordingly
+ * <p>
+ * @throws UnhandledUserChoiceException If choice is not supported
+ * @throws org.mxchange.jcore.exceptions.MenuInitializationException If the menu cannot be initialized
+ */
+ public void doUserMenuChoice () throws UnhandledUserChoiceException, MenuInitializationException;
+
+ /**
+ * Asks the the user to enter a single character which must match validChars
+ * <p>
+ * @param validChars Valid chars that are accepted
+ * @param message Message to user
+ * @return Allowed character
+ */
+ public char enterChar (final char[] validChars, final String message);
+
+ /**
+ * Asks the user to enter his/her gender (M=Male, F=Female, C=Company)
+ * <p>
+ * @param message Message to output
+ * @return Gender enum
+ */
+ public Gender enterGender (final String message);
+
+ /**
+ * Reads an integer (int) from the user
+ * <p>
+ * @param minimum Minimum allowed number
+ * @param maximum Maximum allowed number
+ * @param message Message to user
+ * @return Entered string by user or null if empty string is allowed
+ */
+ public int enterInt (final int minimum, final int maximum, final String message);
+
+ /**
+ * Reads a string of minimum and maximum length from the user. An empty
+ * string should be generally not allowed, but might be okay for e.g.
+ * company name.
+ * <p>
+ * @param minLength Minimum length of the string to read
+ * @param maxLength Maximum length of the string to read
+ * @param message Message to user
+ * @param allowEmpty Whether empty strings are allowed
+ * @return Entered string by user or null if empty string is allowed
+ */
+ public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty);
+
+ /**
+ * Setter for current menu choice
+ * <p>
+ * @param currentMenu Current menu choice
+ */
+ public void setCurrentMenu (final String currentMenu);
+
+ /**
+ * Some "Getter" for menu item
+ * <p>
+ * @param accessKey Key to press to access this menu
+ * @param text Text to show to user
+ * @return
+ */
+ public SelectableMenuItem getMenuItem (final char accessKey, final String text);
+
+ /**
+ * Shows current menu selection to the user
+ */
+ public void showCurrentMenu ();
+
+ /**
+ * Shows given menu entry in client
+ * <p>
+ * @param item Menu item to show
+ */
+ public void showEntry (final SelectableMenuItem item);
+
+ /**
+ * Let the user choose what to change on the address: [n]ame, [a]ddress,
+ * [o]ther
+ * <p>
+ * @param contact Contact instance to let the user change data
+ * @throws UnhandledUserChoiceException If choice is not supported
+ */
+ public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException;
+}
--- /dev/null
+/*
+ * 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;
+
+import java.sql.SQLException;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import org.mxchange.addressbook.facade.contact.AddressbookContactFacade;
+import org.mxchange.addressbook.facade.contact.ContactFacade;
+import org.mxchange.addressbook.menu.Menu;
+import org.mxchange.jcore.client.BaseClient;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcoreeelogger.beans.local.logger.Log;
+import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal;
+
+/**
+ * A general addressbook client
+ * <p>
+ * @author Roland Haeder TODO: Find better name
+ */
+public abstract class BaseAddressbookClient extends BaseClient implements AddressbookClient {
+
+ /**
+ * Current menu choice
+ */
+ private String currentMenu;
+
+ /**
+ * Logger instance
+ */
+ @Log
+ private LoggerBeanLocal logger;
+
+ /**
+ * Menu system
+ */
+ private final Map<String, Menu> menus;
+
+ /**
+ * No instances can be created of this class
+ */
+ protected BaseAddressbookClient () {
+ // Init menu map
+ this.menus = new HashMap<>(10);
+
+ // Try it
+ try {
+ // Get context
+ Context context = new InitialContext();
+
+ // Lookup logger
+ this.logger = (LoggerBeanLocal) context.lookup("java:global/jcore-logger-ejb/logger!org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal"); //NOI18N
+ } catch (final NamingException ex) {
+ // Continue to throw
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * Current menu choice
+ * <p>
+ * @return the currentMenu
+ */
+ public final String getCurrentMenu () {
+ return this.currentMenu;
+ }
+
+ @Override
+ public final void setCurrentMenu (final String currentMenu) {
+ this.currentMenu = currentMenu;
+ }
+
+ /**
+ * "Getter" for given menu type
+ * <p>
+ * @param menuType Menu type instance to return
+ * @return Menu or null if not found
+ */
+ private Menu getMenu (final String menuType) {
+ // Default is not found
+ Menu menu = null;
+
+ // Check array
+ if (this.getMenus().containsKey(menuType)) {
+ // Found!
+ menu = this.getMenus().get(menuType);
+ }
+
+ // Return it
+ return menu;
+ }
+
+ /**
+ * Logs exception and exits program
+ * <p>
+ * @param throwable Throwable
+ */
+ protected void abortProgramWithException (final Throwable throwable) {
+ // Log exception
+ this.logException(throwable);
+
+ // Abort here
+ System.exit(1);
+ }
+
+ /**
+ * Fills menu map with swing menus
+ */
+ protected abstract void fillMenuMap ();
+
+ /**
+ * Getter for logger instance
+ * <p>
+ * @return Logger instance
+ */
+ protected LoggerBeanLocal getLogger () {
+ return this.logger;
+ }
+
+ /**
+ * Getter for menus map
+ * <p>
+ * @return Map of all menus
+ */
+ protected final Map<String, Menu> getMenus () {
+ return this.menus;
+ }
+
+ /**
+ * Initializes contact manager
+ * <p>
+ * @throws java.sql.SQLException If any SQL error occurs
+ */
+ protected void initContactManager () throws SQLException {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Debug message
+ this.getLogger().logDebug("Initializing contact manager ..."); //NOI18N
+
+ // Init contact facade with console client
+ // TODO Static initial amount of contacts
+ ContactFacade facade = new AddressbookContactFacade((Client) this);
+
+ // Set it here
+ this.setFacade(facade);
+
+ // Debug message
+ this.getLogger().logDebug("Contact manager has been initialized."); //NOI18N
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ /**
+ * Logs an exception
+ * <p>
+ * @param throwable Throwable
+ */
+ protected void logException (final Throwable throwable) {
+ // Deligate to logger
+ this.getLogger().logException(throwable);
+ }
+
+ /**
+ * Shows given menu
+ * <p>
+ * @param menuType Given menu to show
+ */
+ protected void showMenu (final String menuType) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("menuType={0} - CALLED!", menuType)); //NOI18N
+
+ // Get menu from type
+ Menu menu = this.getMenu(menuType);
+
+ // Is the menu set?
+ if (!(menu instanceof Menu)) {
+ // Not found
+ // TODO Own exception?
+ throw new NullPointerException(MessageFormat.format("Menu '{0}' not found.", menuType)); //NOI18N
+ }
+
+ // Show menu
+ menu.show(this);
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+}
--- /dev/null
+/*
+ * 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.facade.contact;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.mxchange.addressbook.client.AddressbookClient;
+import org.mxchange.jcontacts.contact.Contact;
+import org.mxchange.jcontacts.contact.gender.Gender;
+import org.mxchange.jcontacts.exceptions.ContactAlreadyAddedException;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
+import org.mxchange.jcore.facade.BaseFacade;
+import org.mxchange.jcoreeelogger.beans.local.logger.Log;
+import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal;
+
+/**
+ * A facade for contacts.
+ * <p>
+ * @author Roland Haeder
+ * @version 0.0
+ */
+public class AddressbookContactFacade extends BaseFacade implements ContactFacade {
+
+ /**
+ * Column name list
+ */
+ private final List<String> columnNames;
+
+ /**
+ * Entity manager
+ */
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ /**
+ * Logger instance
+ */
+ @Log
+ private LoggerBeanLocal logger;
+
+ /**
+ * Translated column name list
+ */
+ private final List<String> translatedColumnNames;
+
+ /**
+ * Constructor which accepts maxContacts for maximum (initial) contacts and
+ * a client instance.
+ * <p>
+ * @param client Client instance to use
+ * @throws java.sql.SQLException If an SQL error occurs
+ */
+ public AddressbookContactFacade (final Client client) throws SQLException {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("client={1} - CALLED!", client)); //NOI18N
+
+ // Make sure all parameters are set correctly
+ if (null == client) {
+ // Abort here
+ throw new NullPointerException("client is null"); //NOI18N
+ }
+
+ // Set client instance
+ this.setClient(client);
+
+ // Initialize list
+ this.columnNames = new ArrayList<>(15);
+ this.translatedColumnNames = new ArrayList<>(15);
+
+ // And fill it
+ this.fillColumnNamesFromBundle();
+
+ // Debug message
+ //* NOISY-DEBUG: */ this.getLogger().logDebug("client=" + client);
+ }
+
+ @Override
+ public void addContact (final Contact contact) throws ContactAlreadyAddedException {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+ // Contact instance must not be null
+ if (null == contact) {
+ // Abort here
+ throw new NullPointerException("contact is null"); //NOI18N
+ }
+
+ // Add it
+ this.entityManager.persist(contact);
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public void doAddOtherAddress () {
+ throw new UnsupportedOperationException("Not supported yet."); //NOI18N
+ }
+
+ @Override
+ public void doChangeAddressData (final Contact contact) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N
+
+ // Contact must not be null
+ if (null == contact) {
+ // Abort here
+ throw new NullPointerException("contact is null"); //NOI18N
+ }
+ if (!(this.getClient() instanceof AddressbookClient)) {
+ // Cannot cast
+ throw new IllegalArgumentException(MessageFormat.format("this.getClient()={0} does not implement AddressbookClient", this.getClient())); //NOI18N
+ }
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ // First display it again
+ client.displayAddressBox(contact);
+
+ // Is it own data?
+ if (contact.isOwnContact()) {
+ // Deligate to client
+ client.doChangeOwnAddressData(contact);
+ } else {
+ // Other contact's address data to change
+ throw new UnsupportedOperationException("Changing contact entries not finished."); //NOI18N
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public void doChangeNameData (final Contact contact) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N
+
+ // Contact must not be null
+ if (null == contact) {
+ // Abort here
+ throw new NullPointerException("contact is null"); //NOI18N
+ }
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ // First display them again
+ client.displayNameBox(contact);
+
+ // Is this own data?
+ if (contact.isOwnContact()) {
+ // Re-ask own data
+ client.doChangeOwnNameData(contact);
+ } else {
+ // Then re-ask them ...
+ throw new UnsupportedOperationException("Changing contact entries not finished."); //NOI18N
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public void doChangeOtherAddress () {
+ throw new UnsupportedOperationException("Not supported yet."); //NOI18N
+ }
+
+ @Override
+ public void doChangeOtherData (final Contact contact) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N
+
+ // Contact must not be null
+ if (null == contact) {
+ // Abort here
+ throw new NullPointerException("contact is null"); //NOI18N
+ }
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ // First display them again
+ client.displayOtherDataBox(contact);
+
+ // Is this own data?
+ if (contact.isOwnContact()) {
+ // Re-ask own data
+ client.doChangeOwnOtherData(contact);
+ } else {
+ // Then re-ask them ...
+ throw new UnsupportedOperationException("Changing contact entries not finished."); //NOI18N
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public void doChangeOwnData () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ /*
+ * First check if the user has registered own contact, before that
+ * nothing can be changed.
+ */
+ if (!this.isOwnContactAdded()) {
+ // Not added
+ this.getClient().outputMessage("Sie haben noch nicht Ihre Daten eingegeben."); //NOI18N
+
+ // Skip any below code
+ return;
+ }
+
+ // Instance
+ Contact contact = this.getOwnContact();
+
+ // It must be found
+ assert (contact instanceof Contact) : ": contact is not implementing Contact: " + contact;
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ // Display contact
+ client.show(contact);
+
+ try {
+ // Ask user what to change
+ client.userChooseChangeContactData(contact);
+ } catch (final UnhandledUserChoiceException ex) {
+ this.getLogger().logException(ex);
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public void doDeleteOtherAddress () {
+ throw new UnsupportedOperationException("Not supported yet."); //NOI18N
+ }
+
+ @Override
+ public void doEnterOwnData () throws ContactAlreadyAddedException {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Is own contact already added?
+ if (this.isOwnContactAdded()) {
+ // Don't continue here
+ throw new ContactAlreadyAddedException();
+ }
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ // Deligate this call to the client
+ Contact contact = client.doEnterOwnData();
+
+ // Is it set?
+ if (contact instanceof Contact) {
+ // Add it to contact "book"
+ this.registerContact(contact);
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public void doListContacts () {
+ throw new UnsupportedOperationException("Not supported yet."); //NOI18N
+ }
+
+ @Override
+ public void doSearchContacts () {
+ throw new UnsupportedOperationException("Not supported yet."); //NOI18N
+ }
+
+ @Override
+ public void doShutdown () throws SQLException, IOException {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Shut down the database layer
+ this.entityManager.close();
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ @Override
+ public String enterOwnCellNumber () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);
+ }
+
+ @Override
+ public String enterOwnCity () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(3, 50, "Bitte geben Sie Ihren Wohnort ein: ", false);
+ }
+
+ @Override
+ public String enterOwnComment () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);
+ }
+
+ @Override
+ public String enterOwnCompanyName () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);
+ }
+
+ @Override
+ public String enterOwnCountryCode () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();
+ }
+
+ @Override
+ public String enterOwnEmailAddress () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);
+ }
+
+ @Override
+ public String enterOwnFamilyName () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);
+ }
+
+ @Override
+ public String enterOwnFaxNumber () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);
+ }
+
+ @Override
+ public String enterOwnFirstName () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);
+ }
+
+ @Override
+ public Gender enterOwnGender () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterGender("Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");
+ }
+
+ @Override
+ public String enterOwnPhoneNumber () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);
+ }
+
+ @Override
+ public String enterOwnStreet () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);
+ }
+
+ @Override
+ public int enterOwnZipCode () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Get and cast client instance
+ AddressbookClient client = (AddressbookClient) this.getClient();
+
+ return client.enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");
+ }
+
+ @Override
+ public final int getColumnCount () {
+ assert (this.columnNames instanceof List) : "this.columnNames is not initialized"; //NOI18N
+
+ return this.columnNames.size();
+ }
+
+ @Override
+ public String getColumnName (final int columnIndex) {
+ assert (this.columnNames instanceof List) : "this.columnNames is not initialized"; //NOI18N
+
+ // Get column name at index
+ return this.columnNames.get(columnIndex);
+ }
+
+ @Override
+ public String getTranslatedColumnName (final int columnIndex) {
+ assert (this.translatedColumnNames instanceof List) : "this.translatedColumnNames is not initialized"; //NOI18N
+
+ // Get column name at index
+ return this.translatedColumnNames.get(columnIndex);
+ }
+
+ @Override
+ public Object getValueFromRowColumn (final int rowIndex, final int columnIndex) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("rowIndex={0},columnIndex={1} CALLED!", rowIndex, columnIndex)); //NOI18N
+
+ // Convert column index -> name
+ String columnName = this.getColumnName(columnIndex);
+
+ // Debug message
+ this.getLogger().logDebug(MessageFormat.format("columnName={0}", columnName)); //NOI18N
+
+ // Init value
+ Object value = null;
+
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("value={0} - EXIT!", value)); //NOI18N
+
+ // Return it
+ return value;
+ }
+
+ @Override
+ public boolean isOwnContactAdded () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Init variable
+ boolean isAdded = false;
+
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("isAdded={0} : EXIT!", isAdded)); //NOI18N
+
+ // Return result
+ return isAdded;
+ }
+
+ @Override
+ public void registerContact (final Contact contact) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N
+
+ // Sanity check
+ if (null == contact) {
+ // Abort here
+ throw new NullPointerException("contact is null"); //NOI18N
+ }
+ try {
+ // Check if contact is found
+ if (this.entityManager.contains(contact)) {
+ // Contact already added
+ // TODO Do something here
+ } else if ((contact.isOwnContact()) && (this.isOwnContactAdded())) {
+ // Own contact already added
+ // TODO Do something
+ }
+
+ // Add contact to internal list
+ this.addContact(contact);
+ } catch (final ContactAlreadyAddedException ex) {
+ // Abort here
+ this.abortProgramWithException(ex);
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ /**
+ * Logs given exception and exits program
+ * <p>
+ * @param throwable Throwable
+ */
+ private void abortProgramWithException (Throwable throwable) {
+ // Log exception
+ this.logException(throwable);
+
+ // Abort here
+ System.exit(1);
+ }
+
+ /**
+ * Fills the column names array with strings from bundle
+ */
+ private void fillColumnNamesFromBundle () {
+ assert (this.columnNames instanceof List) : "this.columnNames is not initialized"; //NOI18N
+ assert (this.translatedColumnNames instanceof List) : "this.translatedColumnNames is not initialized"; //NOI18N
+
+ // Debug message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // First get an iterator from key set to iterate over
+ Iterator<String> iterator = this.getBundle().keySet().iterator();
+
+ // Then iterate over all
+ while (iterator.hasNext()) {
+ // Get next element
+ String key = iterator.next().toLowerCase();
+
+ // Does the key start with AddressbookContactFacade.columnName ?
+ if (key.startsWith("ContactManager.columnName")) { //NOI18N
+ // This is the wanted entry.
+ this.getLogger().logDebug(MessageFormat.format("key={0}", key)); //NOI18N
+
+ // Convert string to array based on delimiter '.'
+ String[] tokens = this.getArrayFromString(key, "."); //NOI18N
+
+ // Token array must contain 4 elements (AddressbookContactFacade.columnName.foo.text)
+ assert (tokens.length == 4) : MessageFormat.format("Array tokens contains not 4 elements: {0}", Arrays.toString(tokens)); //NOI18N
+
+ // Get pre-last element
+ String columnName = tokens[tokens.length - 2];
+
+ // Debug message
+ this.getLogger().logDebug(MessageFormat.format("columnName={0} - adding ...", columnName)); //NOI18N
+
+ // So add it
+ this.columnNames.add(columnName);
+ this.translatedColumnNames.add(this.getBundle().getString(key));
+ }
+ }
+
+ // Debug message
+ this.getLogger().logTrace(MessageFormat.format("getColumnCount()={0}: EXIT!", this.getColumnCount())); //NOI18N
+ }
+
+ /**
+ * Getter for logger instance
+ * <p>
+ * @return Logger instance
+ */
+ private LoggerBeanLocal getLogger () {
+ return this.logger;
+ }
+
+ /**
+ * "Getter" for own contact instance or null if not found
+ * <p>
+ * @return Contact instance or null
+ */
+ private Contact getOwnContact () {
+ // Trace message
+ this.getLogger().logTrace("CALLED!"); //NOI18N
+
+ // Deligate this call to database frontend
+ Contact contact = null;
+ //Contact contact = ((AddressbookContactFrontend) this.getFrontend()).getOwnContact();
+
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N
+
+ // Return instance or null
+ return contact;
+ }
+
+ /**
+ * Logs given exception
+ * <p>
+ * @param exception Throwable
+ */
+ protected void logException (final Throwable exception) {
+ this.getLogger().logException(exception);
+ }
+}
--- /dev/null
+/*
+ * 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.facade.contact;
+
+import java.io.IOException;
+import org.mxchange.jcontacts.contact.Contact;
+import org.mxchange.jcontacts.contact.gender.Gender;
+import org.mxchange.jcontacts.exceptions.ContactAlreadyAddedException;
+import org.mxchange.jcore.facade.Facade;
+
+/**
+ * An interface for addressbook contact manager
+ * <p>
+ * @author Roland Haeder
+ */
+public interface ContactFacade extends Facade {
+
+ /**
+ * Adds given Contact instance to list
+ * <p>
+ * @param contact Contact instance to add
+ * @throws org.mxchange.jcontacts.exceptions.ContactAlreadyAddedException If the contact is already added
+ */
+ public void addContact (final Contact contact) throws ContactAlreadyAddedException;
+
+ /**
+ * Let the user add a new other address
+ */
+ public void doAddOtherAddress ();
+
+ /**
+ * The user can change address data, like street, ZIP code, city and country
+ * of given Contact instance.
+ * <p>
+ * @param contact Instance to change data
+ */
+ public void doChangeAddressData (final Contact contact);
+
+ /**
+ * The user can change name data, like gender, surname, family name and
+ * company name (if business contact).
+ * <p>
+ * @param contact Instance to change data
+ */
+ public void doChangeNameData (final Contact contact);
+
+ /**
+ * Let the user change other address
+ */
+ public void doChangeOtherAddress ();
+
+ /**
+ * The user can change other data, like phone numbers or comments.
+ * <p>
+ * @param contact Instance to change data
+ */
+ public void doChangeOtherData (final Contact contact);
+
+ /**
+ * Let the user change own data
+ * <p>
+ */
+ public void doChangeOwnData ();
+
+ /**
+ * Let the user delete other address
+ */
+ public void doDeleteOtherAddress ();
+
+ /**
+ * Asks user for own data
+ * <p>
+ * @throws org.mxchange.jcontacts.exceptions.ContactAlreadyAddedException If own contact is already added
+ * @throws java.io.IOException If an IO error was found
+ */
+ public void doEnterOwnData () throws ContactAlreadyAddedException;
+
+ /**
+ * List all contacts
+ */
+ public void doListContacts ();
+
+ /**
+ * Searches address book for a contact
+ */
+ public void doSearchContacts ();
+
+ /**
+ * Allows the user to enter own cellphone number.
+ * <p>
+ * @return Cellphone number
+ */
+ public String enterOwnCellNumber ();
+
+ /**
+ * Allows the user to enter own city name.
+ * <p>
+ * @return City name
+ */
+ public String enterOwnCity ();
+
+ /**
+ * Allows the user to enter comment for own entry.
+ * <p>
+ * @return Comment
+ */
+ public String enterOwnComment ();
+
+ /**
+ * Allows the user to enter own company name.
+ * <p>
+ * @return Company name
+ */
+ public String enterOwnCompanyName ();
+
+ /**
+ * Allows the user to enter own country code.
+ * <p>
+ * @return Country code
+ */
+ public String enterOwnCountryCode ();
+
+ /**
+ * Allows the user to enter own email address.
+ * <p>
+ * @return Email address
+ */
+ public String enterOwnEmailAddress ();
+
+ /**
+ * Allows the user to enter own family name.
+ * <p>
+ * @return Family name
+ */
+ public String enterOwnFamilyName ();
+
+ /**
+ * Allows the user to enter own fax number.
+ * <p>
+ * @return Fax number
+ */
+ public String enterOwnFaxNumber ();
+
+ /**
+ * Allows the user to enter own surname.
+ * <p>
+ * @return Surname
+ */
+ public String enterOwnFirstName ();
+
+ /**
+ * Allows the user to enter own gender.
+ * <p>
+ * @return Gender
+ */
+ public Gender enterOwnGender ();
+
+ /**
+ * Allows the user to enter own phone number.
+ * <p>
+ * @return Phone number
+ */
+ public String enterOwnPhoneNumber ();
+
+ /**
+ * Allows the user to enter own street and house number.
+ * <p>
+ * @return Street and house number
+ */
+ public String enterOwnStreet ();
+
+ /**
+ * Allows the user to enter own ZIP code.
+ * <p>
+ * @return ZIP code
+ */
+ public int enterOwnZipCode ();
+
+ /**
+ * Getter for column count
+ * <p>
+ * @return Column count TODO: This is needed for TableModel in Swing
+ */
+ public int getColumnCount ();
+
+ /**
+ * Getter for column name at given index.
+ * <p>
+ * @param columnIndex Column index
+ * @return Database column name TODO: This is needed for TableModel in Swing
+ */
+ public String getColumnName (final int columnIndex);
+
+ /**
+ * Getter for translated column name at given index.
+ * <p>
+ * @param columnIndex Column index
+ * @return Human-readable column name TODO: This is needed for TableModel in
+ * Swing
+ */
+ public String getTranslatedColumnName (final int columnIndex);
+
+ /**
+ * Somewhat "getter" for value from given row and column index
+ * <p>
+ * @param rowIndex Row index
+ * @param columnIndex Column index
+ * @return Value from given row/column
+ */
+ public Object getValueFromRowColumn (final int rowIndex, final int columnIndex);
+
+ /**
+ * Checks whether own contact is already added by checking all entries for
+ * isOwnContact flag
+ * <p>
+ * @return Whether own contact is already added
+ * @throws java.io.IOException If an IO error occurs
+ */
+ public boolean isOwnContactAdded () throws IOException;
+
+ /**
+ * Adds given contact to address book
+ * <p>
+ * @param contact Contact being added TODO Add check for book size
+ */
+ public void registerContact (final Contact contact);
+}
--- /dev/null
+/*
+ * 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.menu;
+
+import java.text.MessageFormat;
+import java.util.List;
+import org.mxchange.addressbook.client.AddressbookClient;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
+
+/**
+ * Utility class for menu structure
+ * <p>
+ * @author Roland Haeder
+ */
+public class AddressbookMenu extends BaseMenu {
+
+ /**
+ * Copies entries for given type into the menu list
+ * <p>
+ * @param menuList Menu list for later showing
+ * @param menuType Type of menu
+ * @param client Client instance to call back
+ */
+ public static void addItemsToList (final List<SelectableMenuItem> menuList, final String menuType, final Client client) {
+ // Some instances must be set
+ if (null == menuList) {
+ // Abort here
+ throw new NullPointerException("menuList is null"); //NOI18N
+ } else if (null == client) {
+ // Abort here
+ throw new NullPointerException("contact is null"); //NOI18N
+ } else if (!(client instanceof AddressbookClient)) {
+ // Not correct instance
+ throw new IllegalArgumentException(MessageFormat.format("client{0} must implement AddressbookClient", client));
+ }
+
+ // Cast client to proper interface
+ AddressbookClient c = (AddressbookClient) client;
+
+ // Get list size
+ int size = menuList.size();
+
+ // Depends on type
+ switch (menuType) {
+ case "main": // Main menu //NOI18N
+ // Enter own data
+ menuList.add(c.getMenuItem('1', "Eigene Adresse anlegen"));
+
+ // Change own data
+ menuList.add(c.getMenuItem('2', "Eigene Adresse ändern"));
+
+ // Add new addess
+ menuList.add(c.getMenuItem('3', "Neue Adresse hinzufügen"));
+
+ // List entries
+ menuList.add(c.getMenuItem('4', "Adressbuch anzeigen"));
+
+ // Address search
+ menuList.add(c.getMenuItem('5', "Adresse suchen"));
+
+ // Change other address
+ menuList.add(c.getMenuItem('6', "Adresse ändern"));
+
+ // Delete other address
+ menuList.add(c.getMenuItem('7', "Adresse löschen"));
+
+ // Always last line: Exit program
+ menuList.add(c.getMenuItem('0', "Programm verlassen"));
+ break;
+
+ default: // Not supported
+ System.err.println(MessageFormat.format("Menu type '{0}' ont supported", menuType)); //NOI18N
+ System.exit(1);
+ }
+
+ // Size must have changed to more entries than before
+ assert (menuList.size() > size);
+ }
+
+}
--- /dev/null
+/*
+ * 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.menu;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.mxchange.addressbook.BaseAddressbookSystem;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
+
+/**
+ * A general menu class
+ * <p>
+ * @author Roland Haeder
+ */
+public abstract class BaseMenu extends BaseAddressbookSystem implements Menu {
+
+ /**
+ * Menu list
+ */
+ private List<SelectableMenuItem> menuList;
+
+ /**
+ * No instance from this object
+ */
+ protected BaseMenu () {
+ }
+
+ @Override
+ public int getMenuItemsCount () {
+ return this.menuList.size();
+ }
+
+ @Override
+ public Iterator<SelectableMenuItem> getMenuItemsIterator () {
+ return this.menuList.iterator();
+ }
+
+ @Override
+ public void show (final Client client) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("client={0} CALLED!", client)); //NOI18N
+
+ // Client must not be null
+ if (null == client) {
+ // Abort here
+ throw new NullPointerException("client is null"); //NOI18N
+ }
+
+ // Get values
+ Iterator<SelectableMenuItem> iterator = this.menuList.iterator();
+
+ // Debug message
+ this.getLogger().logDebug("Showing menu with '" + this.menuList.size() + "' entries.");
+
+ // Output all menus
+ while (iterator.hasNext()) {
+ // Get item
+ SelectableMenuItem item = iterator.next();
+
+ // Show this item
+ item.show(client);
+ }
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+
+ /**
+ * Getter for menu list
+ * <p>
+ * @return menuList List of menu entries
+ */
+ protected final List<SelectableMenuItem> getMenuList () {
+ return this.menuList;
+ }
+
+ /**
+ * Initializes menu
+ * <p>
+ * @param menuType Menu type to initialize
+ * @param client CLient to call back
+ */
+ protected void initMenu (final String menuType, final Client client) {
+ // Trace message
+ this.getLogger().logTrace(MessageFormat.format("menuType={0},client={1} - CALLED!", menuType, client)); //NOI18N
+
+ // Init menu list
+ this.menuList = new ArrayList<>(5);
+
+ // Trace message
+ this.getLogger().logTrace("EXIT!"); //NOI18N
+ }
+}
--- /dev/null
+/*
+ * 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.menu;
+
+import java.util.Iterator;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
+
+/**
+ * An interface for menus
+ * <p>
+ * @author Roland Haeder TODO find better name
+ */
+public interface Menu {
+
+ /**
+ * Size of all menu items
+ * <p>
+ * @return
+ */
+ public int getMenuItemsCount ();
+
+ /**
+ * "Getter" for an iterator on all menu items of the current menu
+ * <p>
+ * @return Iterator on all menu items
+ */
+ public Iterator<SelectableMenuItem> getMenuItemsIterator ();
+
+ /**
+ * Shows this menu
+ * <p>
+ * @param client Client instance
+ */
+ public void show (final Client client);
+}
--- /dev/null
+/*
+ * 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.menu;
+
+import java.util.Iterator;
+import java.util.Map;
+import org.mxchange.addressbook.BaseAddressbookSystem;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.exceptions.MenuInitializationException;
+
+/**
+ * Menu utilities
+ * <p>
+ * @author Roland Haeder
+ */
+public class MenuTools extends BaseAddressbookSystem {
+
+ /**
+ * Gets an array with all available access keys back from given menu map.
+ * This can later be handle to the client's enterChar() method.
+ * <p>
+ * @param menus A Map with all menus and their entries
+ * @param menuType Menu type
+ * @return An array with available access chars
+ * @throws org.mxchange.jcore.exceptions.MenuInitializationException If the menu cannot be initialized
+ */
+ public static char[] getAccessKeysFromMenuMap (final Map<String, Menu> menus, final String menuType) throws MenuInitializationException {
+ // First search for the proper menu class
+ Menu menu = menus.get(menuType);
+
+ // Is it there?
+ if (!(menu instanceof Menu)) {
+ // Not found
+ throw new MenuInitializationException(menu, menuType);
+ }
+
+ // Get iterator
+ Iterator<SelectableMenuItem> iterator = menu.getMenuItemsIterator();
+
+ // Init return array and counter 'i'
+ char[] accessKeys = new char[menu.getMenuItemsCount()];
+ int i = 0;
+
+ // Now "walk" through all menu entries
+ while (iterator.hasNext()) {
+ // Get item
+ SelectableMenuItem item = iterator.next();
+ //* NOISY-DEBUG: */ logger.logDebug("item=" + item);
+
+ // Get access key from item and add it to the array
+ accessKeys[i] = item.getAccessKey();
+ //* NOISY-DEBUG: */ logger.logDebug("accessKeys[" + i + "]=" + accessKeys[i]);
+
+ // Increment counter
+ i++;
+ }
+
+ // Return finished array
+ return accessKeys;
+ }
+}
--- /dev/null
+/*
+ * 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.menu.item;
+
+import org.mxchange.addressbook.BaseAddressbookSystem;
+
+/**
+ * A general menu item class
+ * <p>
+ * @author Roland Haeder
+ */
+public abstract class BaseMenuItem extends BaseAddressbookSystem {
+
+}
--- /dev/null
+/*
+ * 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.menu.item;
+
+import org.mxchange.jcore.FrameworkInterface;
+import org.mxchange.jcore.client.Client;
+
+/**
+ * A selectable menu item intereface
+ * <p>
+ * @author Roland Haeder
+ */
+public interface SelectableMenuItem extends FrameworkInterface {
+
+ /**
+ * Access key
+ * <p>
+ * @return the accessKey
+ */
+ public char getAccessKey ();
+
+ /**
+ * Text to user
+ * <p>
+ * @return the text
+ */
+ public String getText ();
+
+ /**
+ * Shows this menu item
+ * <p>
+ * @param client Client instance
+ */
+ public void show (final Client client);
+}