-/*\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;\r
-\r
-import org.mxchange.addressbook.FrameworkInterface;\r
-import org.mxchange.addressbook.UnhandledUserChoiceException;\r
-import org.mxchange.addressbook.contact.Contact;\r
-import org.mxchange.addressbook.menu.item.SelectableMenuItem;\r
-\r
-/**\r
- * An interface for application clients\r
- * \r
- * @author Roland Haeder\r
- */\r
-public interface Client extends FrameworkInterface {\r
-\r
- /**\r
- * Displays a "box" for the address\r
- *\r
- * @param contact Contact to show address from\r
- */\r
- public void displayAddressBox (final Contact contact);\r
-\r
- /**\r
- * The user changes own name data\r
- * @param contact \r
- */\r
- public void doChangeOwnNameData (final Contact contact);\r
-\r
- /**\r
- * The user changes own address data\r
- *\r
- * @param contact Contact instance to change\r
- */\r
- public void doChangeOwnAddressData (final Contact contact);\r
-\r
- /**\r
- * The user changes own other data\r
- * \r
- * @param contact Constact instance to change\r
- */\r
- public void doChangeOwnOtherData (final Contact contact);\r
-\r
- /**\r
- * Allows the user to enter own data\r
- * \r
- * @return Finished Contact instance\r
- */\r
- public Contact doEnterOwnData ();\r
-\r
- /**\r
- * Shuts down the client and therefore whole application\r
- */\r
- public void doShutdown ();\r
-\r
- /**\r
- * Displays a message to the user\r
- *\r
- * @param message Message to show to the user\r
- */\r
- public void outputMessage (final String message);\r
-\r
- /**\r
- * Displays a "box" for the name\r
- *\r
- * @param contact Contact to show name from\r
- */\r
- public void displayNameBox (final Contact contact);\r
-\r
- /**\r
- * Displays a "box" for other data\r
- *\r
- * @param contact Contact to show other data from\r
- */\r
- public void displayOtherDataBox (final Contact contact);\r
-\r
- /**\r
- * Let the user choose what to change on the address: [n]ame, [a]ddress,\r
- * [o]ther\r
- * \r
- * @param contact Contact instance to let the user change data\r
- * @throws UnhandledUserChoiceException If choice is not supported\r
- */\r
- public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException;\r
-\r
- /**\r
- * Asks the user for a choice and proceeds accordingly\r
- * \r
- * @throws UnhandledUserChoiceException If choice is not supported\r
- */\r
- public void doUserMenuChoice () throws UnhandledUserChoiceException ;\r
-\r
- /**\r
- * Enables isRunning attribute which singals that the client is running\r
- */\r
- public void enableIsRunning();\r
-\r
- /**\r
- * Asks the the user to enter a single character which must match validChars\r
- * \r
- * @param validChars Valid chars that are accepted\r
- * @param message Message to user\r
- * @return Allowed character\r
- */\r
- public char enterChar (final char[] validChars, final String message);\r
-\r
- /**\r
- * Reads a string of minimum and maximum length from the user. An empty\r
- * string should be generally not allowed, but might be okay for e.g.\r
- * company name.\r
- * \r
- * @param minLength Minimum length of the string to read\r
- * @param maxLength Maximum length of the string to read\r
- * @param message Message to user\r
- * @param allowEmpty Whether empty strings are allowed\r
- * @return Entered string by user or null if empty string is allowed\r
- */\r
- public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty);\r
-\r
- /**\r
- * Reads an integer (int) from the user\r
- * \r
- * @param minimum Minimum allowed number\r
- * @param maximum Maximum allowed number\r
- * @param message Message to user\r
- * @return Entered string by user or null if empty string is allowed\r
- */\r
- public int enterInt (final int minimum, final int maximum, final String message);\r
-\r
- /**\r
- * Setter for current menu choice\r
- * \r
- * @param currentMenu Current menu choice\r
- */\r
- public void setCurrentMenu (final String currentMenu);\r
-\r
- /**\r
- * Some "Getter" for menu item\r
- * \r
- * @param accessKey Key to press to access this menu\r
- * @param text Text to show to user\r
- * @return \r
- */\r
- public SelectableMenuItem getMenuItem (final char accessKey, final String text);\r
-\r
- /**\r
- * Determines whether the client is still active by checking some\r
- * conditions\r
- * \r
- * @return Whether the client is still active\r
- */\r
- public boolean isRunning();\r
-\r
- /**\r
- * Shows given menu entry in client\r
- * \r
- * @param item Menu item to show\r
- */\r
- public void showEntry (final SelectableMenuItem item);\r
-\r
- /**\r
- * Shows introduction to user\r
- */\r
- public void showWelcome();\r
-\r
- /**\r
- * Shows current menu selection to the user\r
- */\r
- public void showCurrentMenu();\r
-\r
- /**\r
- * Inizializes this client\r
- */\r
- public void initClient ();\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;
+
+import org.mxchange.addressbook.FrameworkInterface;
+import org.mxchange.addressbook.UnhandledUserChoiceException;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+
+/**
+ * An interface for application clients
+ *
+ * @author Roland Haeder
+ */
+public interface Client extends FrameworkInterface {
+
+ /**
+ * Displays a "box" for the address
+ *
+ * @param contact Contact to show address from
+ */
+ public void displayAddressBox (final Contact contact);
+
+ /**
+ * The user changes own name data
+ * @param contact
+ */
+ public void doChangeOwnNameData (final Contact contact);
+
+ /**
+ * The user changes own address data
+ *
+ * @param contact Contact instance to change
+ */
+ public void doChangeOwnAddressData (final Contact contact);
+
+ /**
+ * The user changes own other data
+ *
+ * @param contact Constact instance to change
+ */
+ public void doChangeOwnOtherData (final Contact contact);
+
+ /**
+ * Allows the user to enter own data
+ *
+ * @return Finished Contact instance
+ */
+ public Contact doEnterOwnData ();
+
+ /**
+ * Shuts down the client and therefore whole application
+ */
+ public void doShutdown ();
+
+ /**
+ * Displays a message to the user
+ *
+ * @param message Message to show to the user
+ */
+ public void outputMessage (final String message);
+
+ /**
+ * Displays a "box" for the name
+ *
+ * @param contact Contact to show name from
+ */
+ public void displayNameBox (final Contact contact);
+
+ /**
+ * Displays a "box" for other data
+ *
+ * @param contact Contact to show other data from
+ */
+ public void displayOtherDataBox (final Contact contact);
+
+ /**
+ * Let the user choose what to change on the address: [n]ame, [a]ddress,
+ * [o]ther
+ *
+ * @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;
+
+ /**
+ * Asks the user for a choice and proceeds accordingly
+ *
+ * @throws UnhandledUserChoiceException If choice is not supported
+ */
+ public void doUserMenuChoice () throws UnhandledUserChoiceException ;
+
+ /**
+ * Enables isRunning attribute which singals that the client is running
+ */
+ public void enableIsRunning();
+
+ /**
+ * Asks the the user to enter a single character which must match validChars
+ *
+ * @param validChars Valid chars that are accepted
+ * @param message Message to user
+ * @return Allowed character
+ */
+ public char enterChar (final char[] validChars, 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.
+ *
+ * @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);
+
+ /**
+ * Reads an integer (int) from the user
+ *
+ * @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);
+
+ /**
+ * Setter for current menu choice
+ *
+ * @param currentMenu Current menu choice
+ */
+ public void setCurrentMenu (final String currentMenu);
+
+ /**
+ * Some "Getter" for menu item
+ *
+ * @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);
+
+ /**
+ * Determines whether the client is still active by checking some
+ * conditions
+ *
+ * @return Whether the client is still active
+ */
+ public boolean isRunning();
+
+ /**
+ * Shows given menu entry in client
+ *
+ * @param item Menu item to show
+ */
+ public void showEntry (final SelectableMenuItem item);
+
+ /**
+ * Shows introduction to user
+ */
+ public void showWelcome();
+
+ /**
+ * Shows current menu selection to the user
+ */
+ public void showCurrentMenu();
+
+ /**
+ * Inizializes this client
+ */
+ public void init ();
+}
-/*\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.console;\r
-\r
-import java.text.MessageFormat;\r
-import java.util.Arrays;\r
-import java.util.Scanner;\r
-import org.mxchange.addressbook.UnhandledUserChoiceException;\r
-import org.mxchange.addressbook.application.AddressbookApplication;\r
-import org.mxchange.addressbook.application.Application;\r
-import org.mxchange.addressbook.client.BaseClient;\r
-import org.mxchange.addressbook.client.Client;\r
-import org.mxchange.addressbook.contact.Contact;\r
-import org.mxchange.addressbook.contact.user.UserContact;\r
-import org.mxchange.addressbook.menu.Menu;\r
-import org.mxchange.addressbook.menu.MenuTools;\r
-import org.mxchange.addressbook.menu.console.ConsoleMenu;\r
-import org.mxchange.addressbook.menu.item.SelectableMenuItem;\r
-import org.mxchange.addressbook.menu.item.console.ConsoleMenuItem;\r
-\r
-/**\r
- * A client for the console\r
- *\r
- * @author Roland Haeder\r
- */\r
-public class ConsoleClient extends BaseClient implements Client {\r
- /**\r
- * Scanner instance for reading data from console input\r
- */\r
- private final Scanner scanner;\r
-\r
- /**\r
- * Parameterless constructor\r
- * @param application An instance of an Application class\r
- */\r
- public ConsoleClient (final Application application) {\r
- super();\r
-\r
- // Set application instance\r
- this.setApplication(application);\r
-\r
- // Init scanner instance\r
- this.scanner = new Scanner(System.in);\r
- }\r
-\r
- /**\r
- * Displays a textual address "box" of given contact\r
- *\r
- * @param contact Contact to show address for\r
- */\r
- @Override\r
- public void displayAddressBox (final Contact contact) {\r
- // Simple display ...\r
- this.outputMessage(MessageFormat.format("Strasse, PLZ Ort, Land: {0}\n{1} {2}\n{3}", contact.getStreet(), contact.getZipCode(), contact.getCity(), contact.getCountryCode()));\r
- }\r
-\r
- /**\r
- * Displays a textual name "box" of given contact\r
- *\r
- * @param contact Contact to show name for\r
- */\r
- @Override\r
- public void displayNameBox (final Contact contact) {\r
- // Get translated gender as the user may want to see "Mr.", "Mrs."\r
- String gender = contact.getTranslatedGender();\r
-\r
- // Get company name\r
- String companyName = contact.getCompanyName();\r
-\r
- // If it is empty/null, then assume private contact\r
- if ((companyName == null) || (companyName.isEmpty())) {\r
- // Now put all together: gender, surname, family name\r
- // @todo Use mask\r
- this.outputMessage(MessageFormat.format("Anrede, Vorname, Name: {0} {1} {2}", gender, contact.getSurname(), contact.getFamilyName()));\r
- } else {\r
- // Company contact\r
- this.outputMessage(MessageFormat.format("Firma: {0}\nAnsprechpartner: {1} {2} {3}", companyName, gender, contact.getSurname(), contact.getFamilyName()));\r
- }\r
- }\r
-\r
- /**\r
- * Displays a textual other data "box" of given contact\r
- *\r
- * @param contact Contact to show other data for\r
- */\r
- @Override\r
- public void displayOtherDataBox (final Contact contact) {\r
- // Cellphone and such ...\r
- this.outputMessage(MessageFormat.format("Telefonnumer: {0}\nFaxnummer: {1}\nHandy: {2}\nKommentar:\n{3}", contact.getPhoneNumber(), contact.getFaxNumber(), contact.getCellphoneNumber(), contact.getComment()));\r
- }\r
-\r
- @Override\r
- public void doChangeOwnAddressData (final Contact contact) {\r
- // Make sure it is own contact\r
- if (!contact.isOwnContact()) {\r
- // Not own contact\r
- throw new IllegalArgumentException("Contact is not own data.");\r
- }\r
-\r
- // Own address data\r
- String street = this.getContactManager().enterOwnStreet();\r
-\r
- // Get zip code\r
- int zipCode = this.getContactManager().enterOwnZipCode();\r
-\r
- // Get city name\r
- String city = this.getContactManager().enterOwnCity();\r
-\r
- // Get country code\r
- String countryCode = this.getContactManager().enterOwnCountryCode();\r
-\r
- // Update address data\r
- contact.updateAddressData(street, zipCode, city, countryCode);\r
- }\r
-\r
- @Override\r
- public void doChangeOwnNameData (final Contact contact) {\r
- // Make sure it is own contact\r
- if (!contact.isOwnContact()) {\r
- // Not own contact\r
- throw new IllegalArgumentException("Contact is not own data.");\r
- }\r
-\r
- // Gender:\r
- char gender = this.getContactManager().enterOwnGender();\r
-\r
- // Surname\r
- String surname = this.getContactManager().enterOwnSurname();\r
-\r
- // Family name\r
- String familyName = this.getContactManager().enterOwnFamilyName();\r
-\r
- // And company\r
- String companyName = this.getContactManager().enterOwnCompanyName();\r
-\r
- // Update contact instance\r
- contact.updateNameData(gender, surname, familyName, companyName);\r
- }\r
-\r
- @Override\r
- public void doChangeOwnOtherData (final Contact contact) {\r
- // Make sure it is own contact\r
- if (!contact.isOwnContact()) {\r
- // Not own contact\r
- throw new IllegalArgumentException("Contact is not own data.");\r
- }\r
-\r
- // Phone number\r
- String phoneNumber = this.getContactManager().enterOwnPhoneNumber();\r
-\r
- // Phone number\r
- String cellNumber = this.getContactManager().enterOwnCellNumber();\r
-\r
- // Fax number\r
- String faxNumber = this.getContactManager().enterOwnFaxNumber();\r
-\r
- // Email address\r
- String email = this.getContactManager().enterOwnEmailAddress();\r
-\r
- // Comment\r
- String comment = this.getContactManager().enterOwnComment();\r
-\r
- // Update contact instance\r
- contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);\r
- }\r
-\r
- @Override\r
- public Contact doEnterOwnData () {\r
- // First ask for gender\r
- char gender = this.getContactManager().enterOwnGender();\r
-\r
- // 2nd for surname\r
- String surname = this.getContactManager().enterOwnSurname();\r
- \r
- // And 3rd for family name\r
- String familyName = this.getContactManager().enterOwnFamilyName();\r
-\r
- // Company name ...\r
- String companyName = this.getContactManager().enterOwnCompanyName();\r
-\r
- // Construct UserContact instance\r
- Contact contact = new UserContact(gender, surname, familyName, companyName);\r
-\r
- // And return object\r
- return contact;\r
- }\r
-\r
- /**\r
- * Shutdown this client\r
- */\r
- @Override\r
- public void doShutdown () {\r
- // Parent call\r
- super.doShutdown();\r
-\r
- // @TODO Add other shutdown stuff\r
- }\r
-\r
- @Override\r
- public void doUserMenuChoice () throws UnhandledUserChoiceException {\r
- // Get all access keys from menu\r
- char[] accessKeys = MenuTools.getAccessKeysFromMenuMap(this.getMenus(), this.getCurrentMenu());\r
-\r
- // Output textural message and ask for a char as input\r
- char choice = this.enterChar(accessKeys, "Bitte Auswahl eingeben (0=Programm beenden): ");\r
-\r
- // @TODO Rewrite this ugly switch() block\r
- switch (choice) {\r
- case '1': // Enter/add own data\r
- this.getContactManager().doEnterOwnData();\r
- break;\r
- \r
- case '2': // Change own data\r
- this.getContactManager().changeOwnData();\r
- break;\r
- \r
- case '3': // Add new addess\r
- this.getContactManager().addOtherAddress();\r
- break;\r
- \r
- case '4': // List contacts\r
- this.getContactManager().listContacts();\r
- break;\r
- \r
- case '5': // Search addresses\r
- this.getContactManager().searchContacts();\r
- break;\r
-\r
- case '6': // Change other addess\r
- this.getContactManager().changeOtherAddress();\r
- break;\r
- \r
- case '7': // Delete other address\r
- this.getContactManager().deleteOtherAddress();\r
- break;\r
-\r
- case '0': // Program exit\r
- this.getApplication().doShutdown();\r
- break;\r
- \r
- default:\r
- // @TODO throw own exception\r
- throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));\r
- }\r
- }\r
-\r
- /**\r
- * Asks the the user to enter a single character which must match validChars\r
- * @param validChars Valid chars that are accepted\r
- * @param message Message to user\r
- * @return Allowed character\r
- */\r
- @Override\r
- public char enterChar (final char[] validChars, final String message) {\r
- char input = 0;\r
-\r
- // Sort array, else binarySearch() won't work\r
- Arrays.sort(validChars);\r
-\r
- // Keep asking until valid char has been entered\r
- while (Arrays.binarySearch(validChars, input) < 0) {\r
- // Output message\r
- System.out.print(message);\r
-\r
- // Read char\r
- input = this.readChar();\r
- }\r
-\r
- // Return read char\r
- return input;\r
- }\r
-\r
- /**\r
- * Reads an integer (int) with a textural message from the user\r
- * \r
- * @param minimum Minimum allowed number\r
- * @param maximum Maximum allowed number\r
- * @param message Messager to display in console\r
- * @return \r
- */\r
- @Override\r
- public int enterInt (final int minimum, final int maximum, final String message) {\r
- // Minimum should not be below zero\r
- assert(minimum >= 0);\r
- assert(maximum > minimum);\r
-\r
- // Init input\r
- int input = -1;\r
-\r
- while ((input < minimum) || (input > maximum)) {\r
- // Output message\r
- System.out.print(message);\r
-\r
- // Read integer from user\r
- input = this.readInt();\r
- }\r
-\r
- // Return it\r
- return input;\r
- }\r
-\r
- /**\r
- * Reads a string of minimum and maximum length from the user\r
- * \r
- * @param minLength Minimum length of the string to read\r
- * @param maxLength Maximum length of the string to read\r
- * @param message Message to user\r
- * @param allowEmpty Whether to allow empty string\r
- * @return Entered string by user or null for empty strings\r
- */\r
- @Override\r
- public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) {\r
- // Check on length, e.g. country codes are excactly 2 chars long\r
- assert(maxLength >= minLength);\r
-\r
- // Init input\r
- String input = null;\r
-\r
- // Check if it is to short or to long\r
- while (((input == null) || ((input.length() < minLength) && (!allowEmpty))) || ((input.length() > 0) && (input.length() < minLength) && (allowEmpty)) || ((input instanceof String) && (input.length() > maxLength))) {\r
- // Output message\r
- System.out.print(message);\r
-\r
- // Read line\r
- input = this.readString();\r
- }\r
-\r
- // Return it\r
- return input;\r
- }\r
-\r
- /**\r
- * Returns a console menu item\r
- * \r
- * @param accessKey Key to access the menu\r
- * @param text Text to show to user\r
- * @return A SelectableMenuItem\r
- * @todo Make sure the access key is unique\r
- */\r
- @Override\r
- public SelectableMenuItem getMenuItem (final char accessKey, final String text) {\r
- // Return a new console menu item\r
- return new ConsoleMenuItem(accessKey,text);\r
- }\r
-\r
- /**\r
- * Inizializes this client\r
- */\r
- @Override\r
- public void initClient () {\r
- // Init contact manager here\r
- this.initContactManager();\r
-\r
- // Fill menu map\r
- this.fillMenuMap();\r
- }\r
-\r
- /**\r
- * Displays textural message to the user\r
- * @param message\r
- */\r
- @Override\r
- public void outputMessage (final String message) {\r
- System.out.println(message);\r
- }\r
-\r
- /**\r
- * Shows textural menu on console\r
- */\r
- @Override\r
- public void showCurrentMenu () {\r
- this.showMenu(this.getCurrentMenu());\r
- }\r
-\r
- /**\r
- * Shows given menu entry to user\r
- * \r
- * @param item Menu entry\r
- */\r
- @Override\r
- public void showEntry (final SelectableMenuItem item) {\r
- // Access key then text\r
- this.outputMessage("[" + item.getAccessKey() + "] " + item.getText());\r
- }\r
-\r
- /**\r
- * Shows a textural message to the user\r
- */\r
- @Override\r
- public void showWelcome () {\r
- this.outputMessage(MessageFormat.format("Welcome to {0}", AddressbookApplication.printableTitle()));\r
- this.outputMessage("");\r
- this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software");\r
- \r
- // Debug message\r
- this.getLogger().debug("Intro shown to user");\r
- }\r
-\r
- @Override\r
- public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException {\r
- // Ask the user for editing [name], [a]ddress or [other] data\r
- char choice = this.enterChar(new char[]{'n', 'a', 'o', 'x'}, "Welchen Daten möchten Sie ändern? (n=Namensdaten, a=Anschriftsdaten, o=Andere, x=Zurück zur Hauptauswahl) ");\r
-\r
- // @TODO Get rid of this ugly switch block, too\r
- switch (choice) {\r
- case 'n': // Name data\r
- this.getContactManager().doChangeNameData(contact, this);\r
- break;\r
-\r
- case 'a': // Address data\r
- this.getContactManager().doChangeAddressData(contact, this);\r
- break;\r
-\r
- case 'o': // Other data\r
- this.getContactManager().doChangeOtherData(contact, this);\r
- break;\r
-\r
- case 'x': // Exit this menu\r
- // Ignored as it should go back\r
- break;\r
-\r
- default:\r
- // @TODO throw own exception\r
- throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));\r
- }\r
- }\r
-\r
- /**\r
- * Reads one character\r
- * \r
- * @return A single character\r
- */\r
- private char readChar () {\r
- // Read line\r
- String input = this.scanner.nextLine();\r
-\r
- // This must be only one character\r
- if (input.length() != 1) {\r
- // Return zero\r
- return 0;\r
- }\r
-\r
- // Get char from first (and only) position\r
- return input.charAt(0);\r
- }\r
-\r
- /**\r
- * Reads an integer (int) from user\r
- * \r
- * @return An integer number\r
- */\r
- private int readInt () {\r
- // First read a string\r
- String input = this.readString();\r
-\r
- // Init number with invalid value\r
- int num = -1;\r
-\r
- // Parse number, this can be risky\r
- try {\r
- num = Integer.parseInt(input);\r
- } catch (final NumberFormatException e) {\r
- this.outputMessage("Bitte geben Sie nur Zahlen ein!");\r
- this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage()));\r
- }\r
-\r
- // Return read number\r
- return num;\r
- }\r
-\r
- /**\r
- * Reads a string from a scanner until RETURN is pressed\r
- * \r
- * @return Read string from scanner\r
- */\r
- private String readString () {\r
- return this.scanner.nextLine();\r
- }\r
-\r
- /**\r
- * Fills menu map with menu entries\r
- */\r
- @Override\r
- protected final void fillMenuMap () {\r
- // Initialize first (main) menu\r
- Menu menu = new ConsoleMenu("main", this);\r
- \r
- // Add it\r
- this.getMenus().put("main", menu);\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.console;
+
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Scanner;
+import org.mxchange.addressbook.UnhandledUserChoiceException;
+import org.mxchange.addressbook.application.AddressbookApplication;
+import org.mxchange.addressbook.application.Application;
+import org.mxchange.addressbook.client.BaseClient;
+import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.contact.user.UserContact;
+import org.mxchange.addressbook.menu.Menu;
+import org.mxchange.addressbook.menu.MenuTools;
+import org.mxchange.addressbook.menu.console.ConsoleMenu;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.addressbook.menu.item.console.ConsoleMenuItem;
+
+/**
+ * A client for the console
+ *
+ * @author Roland Haeder
+ */
+public class ConsoleClient extends BaseClient implements Client {
+ /**
+ * Scanner instance for reading data from console input
+ */
+ private final Scanner scanner;
+
+ /**
+ * Parameterless constructor
+ * @param application An instance of an Application class
+ */
+ public ConsoleClient (final Application application) {
+ super();
+
+ // Set application instance
+ this.setApplication(application);
+
+ // Init scanner instance
+ this.scanner = new Scanner(System.in);
+ }
+
+ /**
+ * Displays a textual address "box" of given contact
+ *
+ * @param contact Contact to show address for
+ */
+ @Override
+ public void displayAddressBox (final Contact contact) {
+ // Simple display ...
+ this.outputMessage(MessageFormat.format("Strasse, PLZ Ort, Land: {0}\n{1} {2}\n{3}", contact.getStreet(), contact.getZipCode(), contact.getCity(), contact.getCountryCode()));
+ }
+
+ /**
+ * Displays a textual name "box" of given contact
+ *
+ * @param contact Contact to show name for
+ */
+ @Override
+ public void displayNameBox (final Contact contact) {
+ // Get translated gender as the user may want to see "Mr.", "Mrs."
+ String gender = contact.getTranslatedGender();
+
+ // Get company name
+ String companyName = contact.getCompanyName();
+
+ // If it is empty/null, then assume private contact
+ if ((companyName == null) || (companyName.isEmpty())) {
+ // Now put all together: gender, surname, family name
+ // @todo Use mask
+ this.outputMessage(MessageFormat.format("Anrede, Vorname, Name: {0} {1} {2}", gender, contact.getSurname(), contact.getFamilyName()));
+ } else {
+ // Company contact
+ this.outputMessage(MessageFormat.format("Firma: {0}\nAnsprechpartner: {1} {2} {3}", companyName, gender, contact.getSurname(), contact.getFamilyName()));
+ }
+ }
+
+ /**
+ * Displays a textual other data "box" of given contact
+ *
+ * @param contact Contact to show other data for
+ */
+ @Override
+ public void displayOtherDataBox (final Contact contact) {
+ // Cellphone and such ...
+ this.outputMessage(MessageFormat.format("Telefonnumer: {0}\nFaxnummer: {1}\nHandy: {2}\nKommentar:\n{3}", contact.getPhoneNumber(), contact.getFaxNumber(), contact.getCellphoneNumber(), contact.getComment()));
+ }
+
+ @Override
+ public void doChangeOwnAddressData (final Contact contact) {
+ // Make sure it is own contact
+ if (!contact.isOwnContact()) {
+ // Not own contact
+ throw new IllegalArgumentException("Contact is not own data.");
+ }
+
+ // Own address data
+ String street = this.getContactManager().enterOwnStreet();
+
+ // Get zip code
+ int zipCode = this.getContactManager().enterOwnZipCode();
+
+ // Get city name
+ String city = this.getContactManager().enterOwnCity();
+
+ // Get country code
+ String countryCode = this.getContactManager().enterOwnCountryCode();
+
+ // Update address data
+ contact.updateAddressData(street, zipCode, city, countryCode);
+ }
+
+ @Override
+ public void doChangeOwnNameData (final Contact contact) {
+ // Make sure it is own contact
+ if (!contact.isOwnContact()) {
+ // Not own contact
+ throw new IllegalArgumentException("Contact is not own data.");
+ }
+
+ // Gender:
+ char gender = this.getContactManager().enterOwnGender();
+
+ // Surname
+ String surname = this.getContactManager().enterOwnSurname();
+
+ // Family name
+ String familyName = this.getContactManager().enterOwnFamilyName();
+
+ // And company
+ String companyName = this.getContactManager().enterOwnCompanyName();
+
+ // Update contact instance
+ contact.updateNameData(gender, surname, familyName, companyName);
+ }
+
+ @Override
+ public void doChangeOwnOtherData (final Contact contact) {
+ // Make sure it is own contact
+ if (!contact.isOwnContact()) {
+ // Not own contact
+ throw new IllegalArgumentException("Contact is not own data.");
+ }
+
+ // Phone number
+ String phoneNumber = this.getContactManager().enterOwnPhoneNumber();
+
+ // Phone number
+ String cellNumber = this.getContactManager().enterOwnCellNumber();
+
+ // Fax number
+ String faxNumber = this.getContactManager().enterOwnFaxNumber();
+
+ // Email address
+ String email = this.getContactManager().enterOwnEmailAddress();
+
+ // Comment
+ String comment = this.getContactManager().enterOwnComment();
+
+ // Update contact instance
+ contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);
+ }
+
+ @Override
+ public Contact doEnterOwnData () {
+ // First ask for gender
+ char gender = this.getContactManager().enterOwnGender();
+
+ // 2nd for surname
+ String surname = this.getContactManager().enterOwnSurname();
+
+ // And 3rd for family name
+ String familyName = this.getContactManager().enterOwnFamilyName();
+
+ // Company name ...
+ String companyName = this.getContactManager().enterOwnCompanyName();
+
+ // Construct UserContact instance
+ Contact contact = new UserContact(gender, surname, familyName, companyName);
+
+ // And return object
+ return contact;
+ }
+
+ /**
+ * Shutdown this client
+ */
+ @Override
+ public void doShutdown () {
+ // Parent call
+ super.doShutdown();
+
+ // @TODO Add other shutdown stuff
+ }
+
+ @Override
+ public void doUserMenuChoice () throws UnhandledUserChoiceException {
+ // Get all access keys from menu
+ char[] accessKeys = MenuTools.getAccessKeysFromMenuMap(this.getMenus(), this.getCurrentMenu());
+
+ // Output textural message and ask for a char as input
+ char choice = this.enterChar(accessKeys, "Bitte Auswahl eingeben (0=Programm beenden): ");
+
+ // @TODO Rewrite this ugly switch() block
+ switch (choice) {
+ case '1': // Enter/add own data
+ this.getContactManager().doEnterOwnData();
+ break;
+
+ case '2': // Change own data
+ this.getContactManager().doChangeOwnData();
+ break;
+
+ case '3': // Add new addess
+ this.getContactManager().doAddOtherAddress();
+ break;
+
+ case '4': // List contacts
+ this.getContactManager().doListContacts();
+ break;
+
+ case '5': // Search addresses
+ this.getContactManager().doSearchContacts();
+ break;
+
+ case '6': // Change other addess
+ this.getContactManager().doChangeOtherAddress();
+ break;
+
+ case '7': // Delete other address
+ this.getContactManager().doDeleteOtherAddress();
+ break;
+
+ case '0': // Program exit
+ this.getApplication().doShutdown();
+ break;
+
+ default:
+ // @TODO throw own exception
+ throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));
+ }
+ }
+
+ /**
+ * Asks the the user to enter a single character which must match validChars
+ * @param validChars Valid chars that are accepted
+ * @param message Message to user
+ * @return Allowed character
+ */
+ @Override
+ public char enterChar (final char[] validChars, final String message) {
+ char input = 0;
+
+ // Sort array, else binarySearch() won't work
+ Arrays.sort(validChars);
+
+ // Keep asking until valid char has been entered
+ while (Arrays.binarySearch(validChars, input) < 0) {
+ // Output message
+ System.out.print(message);
+
+ // Read char
+ input = this.readChar();
+ }
+
+ // Return read char
+ return input;
+ }
+
+ /**
+ * Reads an integer (int) with a textural message from the user
+ *
+ * @param minimum Minimum allowed number
+ * @param maximum Maximum allowed number
+ * @param message Messager to display in console
+ * @return
+ */
+ @Override
+ public int enterInt (final int minimum, final int maximum, final String message) {
+ // Minimum should not be below zero
+ assert(minimum >= 0);
+ assert(maximum > minimum);
+
+ // Init input
+ int input = -1;
+
+ while ((input < minimum) || (input > maximum)) {
+ // Output message
+ System.out.print(message);
+
+ // Read integer from user
+ input = this.readInt();
+ }
+
+ // Return it
+ return input;
+ }
+
+ /**
+ * Reads a string of minimum and maximum length from the user
+ *
+ * @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 to allow empty string
+ * @return Entered string by user or null for empty strings
+ */
+ @Override
+ public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) {
+ // Check on length, e.g. country codes are excactly 2 chars long
+ assert(maxLength >= minLength);
+
+ // Init input
+ String input = null;
+
+ // Check if it is to short or to long
+ while (((input == null) || ((input.length() < minLength) && (!allowEmpty))) || ((input.length() > 0) && (input.length() < minLength) && (allowEmpty)) || ((input instanceof String) && (input.length() > maxLength))) {
+ // Output message
+ System.out.print(message);
+
+ // Read line
+ input = this.readString();
+ }
+
+ // Return it
+ return input;
+ }
+
+ /**
+ * Returns a console menu item
+ *
+ * @param accessKey Key to access the menu
+ * @param text Text to show to user
+ * @return A SelectableMenuItem
+ * @todo Make sure the access key is unique
+ */
+ @Override
+ public SelectableMenuItem getMenuItem (final char accessKey, final String text) {
+ // Return a new console menu item
+ return new ConsoleMenuItem(accessKey,text);
+ }
+
+ /**
+ * Inizializes this client
+ */
+ @Override
+ public void init () {
+ // Init contact manager here
+ this.initContactManager();
+
+ // Fill menu map
+ this.fillMenuMap();
+ }
+
+ /**
+ * Displays textural message to the user
+ * @param message
+ */
+ @Override
+ public void outputMessage (final String message) {
+ System.out.println(message);
+ }
+
+ /**
+ * Shows textural menu on console
+ */
+ @Override
+ public void showCurrentMenu () {
+ this.showMenu(this.getCurrentMenu());
+ }
+
+ /**
+ * Shows given menu entry to user
+ *
+ * @param item Menu entry
+ */
+ @Override
+ public void showEntry (final SelectableMenuItem item) {
+ // Access key then text
+ this.outputMessage("[" + item.getAccessKey() + "] " + item.getText());
+ }
+
+ /**
+ * Shows a textural message to the user
+ */
+ @Override
+ public void showWelcome () {
+ this.outputMessage(MessageFormat.format("Welcome to {0}", AddressbookApplication.printableTitle()));
+ this.outputMessage("");
+ this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software");
+
+ // Debug message
+ this.getLogger().debug("Intro shown to user");
+ }
+
+ @Override
+ public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException {
+ // Ask the user for editing [name], [a]ddress or [other] data
+ char choice = this.enterChar(new char[]{'n', 'a', 'o', 'x'}, "Welchen Daten möchten Sie ändern? (n=Namensdaten, a=Anschriftsdaten, o=Andere, x=Zurück zur Hauptauswahl) ");
+
+ // @TODO Get rid of this ugly switch block, too
+ switch (choice) {
+ case 'n': // Name data
+ this.getContactManager().doChangeNameData(contact, this);
+ break;
+
+ case 'a': // Address data
+ this.getContactManager().doChangeAddressData(contact, this);
+ break;
+
+ case 'o': // Other data
+ this.getContactManager().doChangeOtherData(contact, this);
+ break;
+
+ case 'x': // Exit this menu
+ // Ignored as it should go back
+ break;
+
+ default:
+ // @TODO throw own exception
+ throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));
+ }
+ }
+
+ /**
+ * Reads one character
+ *
+ * @return A single character
+ */
+ private char readChar () {
+ // Read line
+ String input = this.scanner.nextLine();
+
+ // This must be only one character
+ if (input.length() != 1) {
+ // Return zero
+ return 0;
+ }
+
+ // Get char from first (and only) position
+ return input.charAt(0);
+ }
+
+ /**
+ * Reads an integer (int) from user
+ *
+ * @return An integer number
+ */
+ private int readInt () {
+ // First read a string
+ String input = this.readString();
+
+ // Init number with invalid value
+ int num = -1;
+
+ // Parse number, this can be risky
+ try {
+ num = Integer.parseInt(input);
+ } catch (final NumberFormatException e) {
+ this.outputMessage("Bitte geben Sie nur Zahlen ein!");
+ this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage()));
+ }
+
+ // Return read number
+ return num;
+ }
+
+ /**
+ * Reads a string from a scanner until RETURN is pressed
+ *
+ * @return Read string from scanner
+ */
+ private String readString () {
+ return this.scanner.nextLine();
+ }
+
+ /**
+ * Fills menu map with menu entries
+ */
+ @Override
+ protected final void fillMenuMap () {
+ // Initialize first (main) menu
+ Menu menu = new ConsoleMenu("main", this);
+
+ // Add it
+ this.getMenus().put("main", menu);
+ }
+}
-/*\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.manager.contact;\r
-\r
-import java.util.List;\r
-import org.mxchange.addressbook.client.Client;\r
-import org.mxchange.addressbook.contact.Contact;\r
-import org.mxchange.addressbook.manager.Manageable;\r
-\r
-/**\r
- *\r
- * @author Roland Haeder\r
- */\r
-public interface ManageableContact extends Manageable {\r
-\r
- /**\r
- * Shuts down this contact manager\r
- */\r
- public void doShutdown ();\r
-\r
- /**\r
- * Allows the user to enter own cellphone number.\r
- * \r
- * @return Cellphone number\r
- */\r
- public String enterOwnCellNumber ();\r
-\r
- /**\r
- * Allows the user to enter own city name.\r
- * \r
- * @return City name\r
- */\r
- public String enterOwnCity ();\r
-\r
- /**\r
- * Allows the user to enter comment for own entry.\r
- * \r
- * @return Comment\r
- */\r
- public String enterOwnComment ();\r
-\r
- /**\r
- * Allows the user to enter own company name.\r
- * \r
- * @return Company name\r
- */\r
- public String enterOwnCompanyName ();\r
-\r
- /**\r
- * Allows the user to enter own country code.\r
- * \r
- * @return Country code\r
- */\r
- public String enterOwnCountryCode ();\r
-\r
- /**\r
- * Allows the user to enter own email address.\r
- * \r
- * @return Email address\r
- */\r
- public String enterOwnEmailAddress ();\r
-\r
- /**\r
- * Allows the user to enter own family name.\r
- * \r
- * @return Family name\r
- */\r
- public String enterOwnFamilyName ();\r
-\r
- /**\r
- * Allows the user to enter own fax number.\r
- * \r
- * @return Fax number\r
- */\r
- public String enterOwnFaxNumber ();\r
-\r
- /**\r
- * Allows the user to enter own gender.\r
- * \r
- * @return Gender\r
- */\r
- public char enterOwnGender ();\r
-\r
- /**\r
- * Allows the user to enter own phone number.\r
- * \r
- * @return Phone number\r
- */\r
- public String enterOwnPhoneNumber ();\r
-\r
- /**\r
- * Allows the user to enter own street and house number.\r
- * \r
- * @return Street and house number\r
- */\r
- public String enterOwnStreet ();\r
-\r
- /**\r
- * Allows the user to enter own surname.\r
- * \r
- * @return Surname\r
- */\r
- public String enterOwnSurname ();\r
-\r
- /**\r
- * Allows the user to enter own ZIP code.\r
- * \r
- * @return ZIP code\r
- */\r
- public int enterOwnZipCode ();\r
-\r
- /**\r
- * Getter for column count\r
- * \r
- * @return Column count\r
- */\r
- public int getColumnCount ();\r
-\r
- /**\r
- * List all contacts\r
- */\r
- public void listContacts ();\r
-\r
- /**\r
- * Adds given contact to address book\r
- *\r
- * @param contact Contact being added\r
- * @todo Add check for book size\r
- */\r
- public void registerContact (final Contact contact);\r
-\r
- /**\r
- * Adds given Contact instance to list\r
- * \r
- * @param contact Contact instance to add\r
- */\r
- public void addContact (final Contact contact);\r
-\r
- /**\r
- * Let the user add a new other address\r
- */\r
- public void addOtherAddress();\r
-\r
- /**\r
- * The user can change address data, like street, ZIP code, city and country\r
- * of given Contact instance.\r
- * \r
- * @param contact Instance to change data\r
- * @param client Client instance to call back\r
- */\r
- public void doChangeAddressData (final Contact contact, final Client client);\r
-\r
- /**\r
- * The user can change name data, like gender, surname, family name and\r
- * company name (if business contact).\r
- * \r
- * @param contact Instance to change data\r
- * @param client Client instance to call back\r
- */\r
- public void doChangeNameData (final Contact contact, final Client client);\r
-\r
- /**\r
- * Let the user change other address\r
- */\r
- public void changeOtherAddress();\r
-\r
- /**\r
- * The user can change other data, like phone numbers or comments.\r
- * \r
- * @param contact Instance to change data\r
- * @param client Client instance to call back\r
- */\r
- public void doChangeOtherData (final Contact contact, final Client client);\r
-\r
- /**\r
- * Let the user change own data\r
- */\r
- public void changeOwnData();\r
-\r
- /**\r
- * Let the user delete other address\r
- */\r
- public void deleteOtherAddress();\r
-\r
- /**\r
- * Asks user for own data\r
- */\r
- public void doEnterOwnData();\r
-\r
- /**\r
- * Getter for whole list\r
- * @return List of all contacts\r
- */\r
- public List<Contact> getList ();\r
-\r
- /**\r
- * Searches address book for a contact\r
- */\r
- public void searchContacts ();\r
-\r
- /**\r
- * Checks whether own contact is already added by checking all entries for\r
- * isOwnContact flag\r
- * \r
- * @return Whether own contact is already added\r
- */\r
- public boolean isOwnContactAdded ();\r
-\r
- /**\r
- * Getter for size\r
- *\r
- * @return size of contact "book"\r
- */\r
- public int size();\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.manager.contact;
+
+import java.util.List;
+import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.manager.Manageable;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public interface ManageableContact extends Manageable {
+
+ /**
+ * Shuts down this contact manager
+ */
+ public void doShutdown ();
+
+ /**
+ * Allows the user to enter own cellphone number.
+ *
+ * @return Cellphone number
+ */
+ public String enterOwnCellNumber ();
+
+ /**
+ * Allows the user to enter own city name.
+ *
+ * @return City name
+ */
+ public String enterOwnCity ();
+
+ /**
+ * Allows the user to enter comment for own entry.
+ *
+ * @return Comment
+ */
+ public String enterOwnComment ();
+
+ /**
+ * Allows the user to enter own company name.
+ *
+ * @return Company name
+ */
+ public String enterOwnCompanyName ();
+
+ /**
+ * Allows the user to enter own country code.
+ *
+ * @return Country code
+ */
+ public String enterOwnCountryCode ();
+
+ /**
+ * Allows the user to enter own email address.
+ *
+ * @return Email address
+ */
+ public String enterOwnEmailAddress ();
+
+ /**
+ * Allows the user to enter own family name.
+ *
+ * @return Family name
+ */
+ public String enterOwnFamilyName ();
+
+ /**
+ * Allows the user to enter own fax number.
+ *
+ * @return Fax number
+ */
+ public String enterOwnFaxNumber ();
+
+ /**
+ * Allows the user to enter own gender.
+ *
+ * @return Gender
+ */
+ public char enterOwnGender ();
+
+ /**
+ * Allows the user to enter own phone number.
+ *
+ * @return Phone number
+ */
+ public String enterOwnPhoneNumber ();
+
+ /**
+ * Allows the user to enter own street and house number.
+ *
+ * @return Street and house number
+ */
+ public String enterOwnStreet ();
+
+ /**
+ * Allows the user to enter own surname.
+ *
+ * @return Surname
+ */
+ public String enterOwnSurname ();
+
+ /**
+ * Allows the user to enter own ZIP code.
+ *
+ * @return ZIP code
+ */
+ public int enterOwnZipCode ();
+
+ /**
+ * Getter for column count
+ *
+ * @return Column count
+ */
+ public int getColumnCount ();
+
+ /**
+ * List all contacts
+ */
+ public void doListContacts ();
+
+ /**
+ * Adds given contact to address book
+ *
+ * @param contact Contact being added
+ * @todo Add check for book size
+ */
+ public void registerContact (final Contact contact);
+
+ /**
+ * Adds given Contact instance to list
+ *
+ * @param contact Contact instance to add
+ */
+ public void addContact (final Contact contact);
+
+ /**
+ * 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.
+ *
+ * @param contact Instance to change data
+ * @param client Client instance to call back
+ */
+ public void doChangeAddressData (final Contact contact, final Client client);
+
+ /**
+ * The user can change name data, like gender, surname, family name and
+ * company name (if business contact).
+ *
+ * @param contact Instance to change data
+ * @param client Client instance to call back
+ */
+ public void doChangeNameData (final Contact contact, final Client client);
+
+ /**
+ * Let the user change other address
+ */
+ public void doChangeOtherAddress();
+
+ /**
+ * The user can change other data, like phone numbers or comments.
+ *
+ * @param contact Instance to change data
+ * @param client Client instance to call back
+ */
+ public void doChangeOtherData (final Contact contact, final Client client);
+
+ /**
+ * Let the user change own data
+ */
+ public void doChangeOwnData();
+
+ /**
+ * Let the user delete other address
+ */
+ public void doDeleteOtherAddress();
+
+ /**
+ * Asks user for own data
+ */
+ public void doEnterOwnData();
+
+ /**
+ * Getter for whole list
+ * @return List of all contacts
+ */
+ public List<Contact> getList ();
+
+ /**
+ * Searches address book for a contact
+ */
+ public void doSearchContacts ();
+
+ /**
+ * Checks whether own contact is already added by checking all entries for
+ * isOwnContact flag
+ *
+ * @return Whether own contact is already added
+ */
+ public boolean isOwnContactAdded ();
+
+ /**
+ * Getter for size
+ *
+ * @return size of contact "book"
+ */
+ public int size();
+}