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