/**
* Copyright 2009 Roland Foerther, Carl-Eric-Menzel, Olaf Siefart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.senacor.wbs.web.user;
import java.util.Arrays;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidationError;
import org.apache.wicket.validation.ValidationError;
import org.apache.wicket.validation.validator.PatternValidator;
import com.senacor.domain.user.Address;
import com.senacor.domain.user.Country;
import com.senacor.wbs.web.border.ContentLayout;
import com.senacor.wbs.web.border.LayoutColumn;
import com.senacor.wbs.web.border.ToggleBorder;
import com.senacor.wbs.web.border.LayoutColumn.ColumnType;
import com.senacor.wbs.web.border.LayoutColumn.Position;
import com.senacor.wbs.web.core.EnumChoiceRenderer;
/**
* @author Olaf Siefart
*/
public class EditAddressPanel extends Panel {
public EditAddressPanel(final String id, final Address address) {
super(id);
setDefaultModel(new CompoundPropertyModel<Address>(address));
final ToggleBorder border = new ToggleBorder("addressBorder", new Model("Adressdaten"));
final Form addressForm = new Form("addressForm");
final ContentLayout mainLayout = new ContentLayout("mainLayout");
addressForm.add(mainLayout);
final LayoutColumn mainLeft = new LayoutColumn("colMainLeft", ColumnType.c50l, Position.LEFT);
mainLayout.add(mainLeft);
final ContentLayout inputLayout1l = new ContentLayout("inputLayout1");
mainLeft.add(inputLayout1l);
final LayoutColumn colLabel1l = new LayoutColumn("colLabel", ColumnType.c33l, Position.LEFT);
inputLayout1l.add(colLabel1l);
final LayoutColumn colField1l = new LayoutColumn("colField", ColumnType.c66r, Position.RIGHT);
inputLayout1l.add(colField1l);
colField1l.add(new TextField("street"));
final ContentLayout inputLayout2l = new ContentLayout("inputLayout2");
mainLeft.add(inputLayout2l);
final LayoutColumn colLabel2l = new LayoutColumn("colLabel", ColumnType.c33l, Position.LEFT);
inputLayout2l.add(colLabel2l);
final LayoutColumn colField2l = new LayoutColumn("colField", ColumnType.c66r, Position.RIGHT);
inputLayout2l.add(colField2l);
final TextField zipCode = new TextField("zipcode");
colField2l.add(zipCode);
final ContentLayout inputLayout3l = new ContentLayout("inputLayout3");
mainLeft.add(inputLayout3l);
final LayoutColumn colLabel3l = new LayoutColumn("colLabel", ColumnType.c33l, Position.LEFT);
inputLayout3l.add(colLabel3l);
final LayoutColumn colField3l = new LayoutColumn("colField", ColumnType.c66r, Position.RIGHT);
inputLayout3l.add(colField3l);
final DropDownChoice country = new DropDownChoice("country", Arrays.asList(Country.values()), new EnumChoiceRenderer());
colField3l.add(country);
final LayoutColumn mainRight = new LayoutColumn("colMainRight", ColumnType.c50r, Position.RIGHT);
mainLayout.add(mainRight);
final ContentLayout inputLayout1r = new ContentLayout("inputLayout1");
mainRight.add(inputLayout1r);
final LayoutColumn colLabel1r = new LayoutColumn("colLabel", ColumnType.c33l, Position.LEFT);
inputLayout1r.add(colLabel1r);
final LayoutColumn colField1r = new LayoutColumn("colField", ColumnType.c66r, Position.RIGHT);
inputLayout1r.add(colField1r);
colField1r.add(new TextField("houseNr"));
final ContentLayout inputLayout2r = new ContentLayout("inputLayout2");
mainRight.add(inputLayout2r);
final LayoutColumn colLabel2r = new LayoutColumn("colLabel", ColumnType.c33l, Position.LEFT);
inputLayout2r.add(colLabel2r);
final LayoutColumn colField2r = new LayoutColumn("colField", ColumnType.c66r, Position.RIGHT);
inputLayout2r.add(colField2r);
colField2r.add(new TextField("town"));
addressForm.add(new ZipCodeValidator(zipCode, country));
border.add(addressForm);
add(border);
}
/**
* Validierung der Postleitzahl in Abhängigkeit des Lands. Ist das Land
* Deutschland, so muss die Postleitzahl numerisch und 5-stellig sein.
*
* @author fmito045
*/
private class ZipCodeValidator extends AbstractFormValidator {
private final DropDownChoice countryFC;
private final TextField zipCodeFC;
private ZipCodeValidator(final TextField zipCode, final DropDownChoice country) {
this.zipCodeFC = zipCode;
this.countryFC = country;
}
public FormComponent[] getDependentFormComponents() {
return new FormComponent[] { zipCodeFC, countryFC };
}
public void validate(final Form form) {
final Country country = (Country) countryFC.getConvertedInput();
if (Country.Germany.equals(country)) {
final IValidatable validatable = new ValidatableAdapter(zipCodeFC);
if (validatable.getValue() == null) {
validatable.error(new ValidationError().addMessageKey("Required"));
} else {
new PatternValidator("[1-9][0-9][0-9][0-9][0-9]").validate(validatable);
}
}
}
}
}
class ValidatableAdapter implements IValidatable {
private final FormComponent formComponent;
public ValidatableAdapter(final FormComponent formComponent) {
this.formComponent = formComponent;
}
public void error(final IValidationError error) {
formComponent.error(error);
}
public Object getValue() {
return formComponent.getConvertedInput();
}
public boolean isValid() {
return formComponent.isValid();
}
}