001 package market.stdform; 002 003 import java.awt.Dimension; 004 import java.awt.GridBagConstraints; 005 import java.awt.GridBagLayout; 006 import java.awt.GridLayout; 007 008 import javax.swing.BoxLayout; 009 import javax.swing.JComboBox; 010 import javax.swing.JLabel; 011 import javax.swing.JPanel; 012 import javax.swing.JPasswordField; 013 import javax.swing.JTextField; 014 015 import market.Conversions; 016 import market.UCustomer; 017 import market.UPerson; 018 import market.UStaffer; 019 import market.VCDummy; 020 import market.VCPositiveDouble; 021 import market.VCPositiveInteger; 022 import market.swing.ComponentFactory; 023 import market.swing.JTFCheckable; 024 import sale.FormSheet; 025 import sale.FormSheetContentCreator; 026 027 /** 028 * This FormSheet class is used in multiple cases, for both editing customers and employees. 029 * The look of the FormSheet varies slightly depending on the type of person to be edited. 030 * Customers have a field with their company and their discount, employees have a field with 031 * their special occupation and their salary. 032 * The types of usage for this FormSheet are: 033 * <ul> 034 * <li>For new customers to sign up: all fields but discount are editable.</li> 035 * <li>For customers to edit their data: all fields but login and discount are enabled</li> 036 * <li>For the manager to edit customers: only the password fields are enabled</li> 037 * <li>For the manager to employ new workers: all fields are enabled.</li> 038 * <li>For the manager to edit employees: all fields but login are enabled</li> 039 * </ul> 040 */ 041 public class FSEditPersonData extends FormSheet{ 042 043 public static final int JTFC_FIRSTNAME = 0; 044 public static final int JTFC_NAME = 1; 045 public static final int JTFC_TELEPHONE = 2; 046 public static final int JTFC_STREET = 3; 047 public static final int JTFC_POSTCODE = 4; 048 public static final int JTFC_CITY = 5; 049 public static final int JTFC_LOGIN = 6; 050 public static final int JTFC_COMPANY = 7; 051 public static final int JTFC_SALARY = 8; 052 public static final int JTFC_SECTION = 9; 053 public static final int JTFC_DISCOUNT = 10; 054 private static final int WIDTH = 15; 055 private UPerson person; 056 private JComboBox jcb_salutation; 057 private JComboBox jcb_qualification; 058 private JTFCheckable jtfc_firstName = new JTFCheckable(JTFC_FIRSTNAME, new VCDummy("Vorname"), WIDTH); 059 private JTFCheckable jtfc_name = new JTFCheckable(JTFC_NAME, new VCDummy("Nachname"), WIDTH); 060 private JTFCheckable jtfc_telephone = new JTFCheckable(JTFC_TELEPHONE, 061 new VCDummy("Telefon", true), WIDTH); 062 private JTFCheckable jtfc_street = new JTFCheckable(JTFC_STREET, new VCDummy("Straße"), WIDTH); 063 private JTFCheckable jtfc_postcode = new JTFCheckable(JTFC_POSTCODE, 064 new VCPositiveInteger("Postleitzahl"), WIDTH); 065 private JTFCheckable jtfc_city = new JTFCheckable(JTFC_CITY, new VCDummy("Stadt"), WIDTH); 066 private JTFCheckable jtfc_login = new JTFCheckable(JTFC_LOGIN, new VCDummy("Login"), WIDTH); 067 private JTFCheckable jtfc_company = new JTFCheckable(JTFC_COMPANY, new VCDummy("Firma"), 10); 068 private JTFCheckable jtfc_discount = new JTFCheckable(JTFC_DISCOUNT, new VCDummy("Rabatt"), 10); 069 private JTFCheckable jtfc_salary = new JTFCheckable(JTFC_SALARY, new VCPositiveDouble("Gehalt"), WIDTH); 070 private JPasswordField jpf_password = new JPasswordField(WIDTH); 071 private JPasswordField jpf_confirm = new JPasswordField(WIDTH); 072 private JTextField jtf_Date = new JTextField(WIDTH); 073 074 /** 075 * Creates a new FSEditPersonData FormSheet 076 * 077 * @param up the user to be edited, if <code>null</code> the fields stay empty. 078 * @param option an option to specify the special look of the FormSheet. 079 * <ul> 080 * <li>0 customer edits his profile</li> 081 * <li>1 manager edits customer profile</li> 082 * <li>2 manager edits worker profile</li> 083 * </ul> 084 */ 085 public FSEditPersonData(UPerson up, final int option){ 086 super("Personendaten", null); 087 this.person = up; 088 this.addContentCreator(new FormSheetContentCreator(){ 089 protected void createFormSheetContent(FormSheet fs) { 090 fs.removeAllButtons(); 091 JPanel jp_m = new JPanel(); 092 JPanel jp_main = new JPanel(); 093 JPanel jp_person = new JPanel(); 094 JPanel jp_address = new JPanel(); 095 JPanel jp_login = new JPanel(); 096 jcb_salutation = new JComboBox(new Object[] {UPerson.FRAU, UPerson.HERR}); 097 jcb_qualification = new JComboBox(new Object[] 098 {UStaffer.SELLER, UStaffer.WAREHOUSE_WORKER, UStaffer.MANAGER}); 099 jcb_qualification.setPreferredSize(new Dimension(15,10)); 100 jcb_salutation.setPreferredSize(new Dimension(15,10)); 101 GridBagLayout gridbag = new GridBagLayout(); 102 GridBagConstraints c = new GridBagConstraints(); 103 jp_m.setLayout(gridbag); 104 c.weighty = 1; 105 c.anchor = GridBagConstraints.CENTER; 106 gridbag.setConstraints(jp_main, c); 107 jp_m.add(jp_main); 108 jp_main.setLayout(new BoxLayout(jp_main, BoxLayout.Y_AXIS)); 109 jp_person.setLayout(new GridLayout(4, 2)); 110 jp_person.setBorder(ComponentFactory.createInsetBorder("Personendaten")); 111 jp_address.setLayout(new GridLayout(3, 2)); 112 jp_address.setBorder(ComponentFactory.createInsetBorder("Adressdaten")); 113 jp_login.setLayout(new GridLayout(3, 2)); 114 jp_login.setBorder(ComponentFactory.createInsetBorder("Login")); 115 jp_person.add(new JLabel("Anrede:")); jp_person.add(jcb_salutation); 116 jp_person.add(new JLabel("Vorname:")); jp_person.add(jtfc_firstName); 117 jp_person.add(new JLabel("Nachname:")); jp_person.add(jtfc_name); 118 jp_person.add(new JLabel("Telefon:")); jp_person.add(jtfc_telephone); 119 jp_address.add(new JLabel("Straße:")); jp_address.add(jtfc_street); 120 jp_address.add(new JLabel("Postleitzahl:")); jp_address.add(jtfc_postcode); 121 jp_address.add(new JLabel("Stadt:")); jp_address.add(jtfc_city); 122 jp_login.add(new JLabel("Login:")); jp_login.add(jtfc_login); 123 jp_login.add(new JLabel("Passwort:")); jp_login.add(jpf_password); 124 jp_login.add(new JLabel("Passwort-Wiederholung:")); jp_login.add(jpf_confirm); 125 jtfc_discount.setEditable(false); 126 jp_main.add(jp_person); 127 jp_main.add(jp_address); 128 jp_main.add(jp_login); 129 if (option == 0 || option == 1) { 130 jp_main.add(getCompanyPanel()); 131 } 132 if (option == 2) { 133 jp_main.add(getQualificationPanel()); 134 } 135 fs.addButton("OK", ButtonIDs.BTN_ACCEPT, null); 136 fs.addButton("Zurück", ButtonIDs.BTN_BACK, null); 137 fs.setComponent(jp_m); 138 } 139 }); 140 // if a person was referred, the textfields are filled with the person's data 141 if (person != null) { 142 jcb_salutation.setSelectedItem(person.getSalutation()); 143 jtfc_firstName.setText(person.getFirstName()); 144 jtfc_name.setText(person.getSurname()); 145 jtfc_telephone.setText(person.getTelephone()); 146 jtfc_street.setText(person.getStreet()); 147 jtfc_postcode.setText(String.valueOf(person.getPostcode())); 148 jtfc_city.setText(person.getCity()); 149 jtfc_login.setText(person.getName()); 150 jtfc_login.setEditable(false); //login can never be changed 151 if (person instanceof UCustomer) { 152 UCustomer p = (UCustomer)person; 153 jtfc_company.setText(p.getCompany()); 154 jtfc_discount.setText(Conversions.fixedDecimal(100 * p.getDiscount(), 3) + " %"); 155 } 156 if (person instanceof UStaffer) { 157 UStaffer p = (UStaffer)person; 158 jcb_qualification.setSelectedItem(p.getQualification()); 159 jtfc_salary.setText(Conversions.valueToCurrency(p.getSalary())); 160 } 161 jtf_Date.setText(person.getDayOfRegistration().toString()); 162 } 163 if (option == 1) { //if manager view customer's data... 164 jcb_salutation.setEnabled(false); //disable all but password 165 jtfc_name.setEditable(false); 166 jtfc_firstName.setEditable(false); 167 jtfc_telephone.setEditable(false); 168 jtfc_street.setEditable(false); 169 jtfc_postcode.setEditable(false); 170 jtfc_city.setEditable(false); 171 jtfc_login.setEditable(false); 172 jtfc_company.setEditable(false); 173 } 174 } 175 176 /** 177 * @return the panel with textfields which are used for customers only. 178 */ 179 private JPanel getCompanyPanel(){ 180 JPanel jp_company = new JPanel(); 181 jp_company.setLayout(new GridLayout(3,2)); 182 jp_company.setBorder(ComponentFactory.createInsetBorder("Sonstiges")); 183 jp_company.add(new JLabel("Firma: ")); 184 jp_company.add(jtfc_company); 185 jp_company.add(new JLabel("Rabatt: ")); 186 jtfc_discount.setText(Conversions.fixedDecimal(0, 3)); 187 jp_company.add(jtfc_discount); 188 jp_company.add(new JLabel("Mitglied seit: ")); 189 jp_company.add(jtf_Date); 190 jtf_Date.setEditable(false); 191 return jp_company; 192 } 193 194 /** 195 * @return the panel with textfields which are used for employees only. 196 */ 197 private JPanel getQualificationPanel(){ 198 JPanel jp_qualification = new JPanel(); 199 jp_qualification.setLayout(new GridLayout(3,2)); 200 jp_qualification.setBorder(ComponentFactory.createInsetBorder("Beschäftigung")); 201 jp_qualification.add(new JLabel("Beschäftigung: ")); 202 jp_qualification.add(jcb_qualification); 203 jp_qualification.add(new JLabel("Gehalt: ")); 204 jp_qualification.add(jtfc_salary); 205 jp_qualification.add(new JLabel("Angestellt seit: ")); 206 jp_qualification.add(jtf_Date); 207 jtf_Date.setEditable(false); 208 return jp_qualification; 209 } 210 211 /** 212 * Checks if password and confirmation match. 213 * @return <code>true</code> if password and confirmation match, otherwise <code>false</code>. 214 */ 215 public boolean passwordsEqual(){ 216 String s1 = String.valueOf(jpf_password.getPassword()); 217 String s2 = String.valueOf(jpf_confirm.getPassword()); 218 return s1.compareTo(s2) == 0; 219 } 220 221 /** 222 * @return the password typed into the password field. 223 */ 224 public char[] getPassword(){ 225 if(passwordsEqual() && (jpf_password.getPassword().length > 0)) { 226 return jpf_password.getPassword(); 227 } 228 else return null; 229 } 230 231 /** 232 * Checks if a password has been set. 233 * @return <code>true</code> if a password has been set, otherwise <code>false</code>. 234 */ 235 public boolean isPasswordSet() { 236 return jpf_password.getPassword().length > 0 && jpf_confirm.getPassword().length > 0; 237 } 238 239 /** 240 * @return value of the salutation ComboBox. 241 */ 242 public String getSalutation(){ 243 return (String)jcb_salutation.getSelectedItem(); 244 } 245 246 /** 247 * @return the value of the occupation ComboBox. 248 */ 249 public String getQualification(){ 250 return (String)jcb_qualification.getSelectedItem(); 251 } 252 253 /** 254 * Creation method for this FormSheet if it is to be used by customers. 255 * @param customer the customer to be displayed with the FormSheet. 256 * @return the FormSheet as {@link FSCheckable}. 257 */ 258 public static FSCheckable getCustomerProfileForCustomer(UCustomer customer) { 259 FormSheet fs = new FSEditPersonData(customer, 0); 260 return new FSCheckable(fs); 261 } 262 263 /** 264 * Creation method for this FormSheet if it is to be used by the manger to view customers' data. 265 * @param customer the customer to be displayed with the FormSheet. 266 * @return the FormSheet as {@link FSCheckable}. 267 */ 268 public static FSCheckable getCustomerProfileForManager(UCustomer customer){ 269 FormSheet fs = new FSEditPersonData(customer, 1); 270 return new FSCheckable(fs); 271 } 272 273 /** 274 * Creation method for this FormSheet if it is to be used by the manger to view employees' data. 275 * @param staffer the employee to be displayed with the FormSheet. 276 * @return the FormSheet as {@link FSCheckable}. 277 */ 278 public static FSCheckable getStafferProfile(UStaffer staffer){ 279 FormSheet fs = new FSEditPersonData(staffer, 2); 280 return new FSCheckable(fs); 281 } 282 }