/*
* Copyright 2002-2005 the original author or authors.
*
* 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 info.jtrac.wicket;
import info.jtrac.domain.Field;
import info.jtrac.domain.Item;
import info.jtrac.domain.Space;
import info.jtrac.domain.User;
import info.jtrac.wicket.yui.YuiCalendar;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.BoundCompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.convert.converters.DoubleConverter;
/**
* This class is responsible for the panel of custom fields that
* can be reused in the item-create/item-view forms.
*/
public class CustomFieldsFormPanel extends BasePanel {
/**
* Constructor
*
* @param id
* @param model
* @param space
*/
public CustomFieldsFormPanel(String id, BoundCompoundPropertyModel model, Space space) {
super(id);
List<Field> fields = space.getMetadata().getFieldList();
addComponents(model, fields, true);
}
/**
* Constructor
*
* @param id
* @param model
* @param item
* @param user
*/
public CustomFieldsFormPanel(String id, BoundCompoundPropertyModel model, Item item, User user) {
super(id);
List<Field> fields = item.getEditableFieldList(user);
addComponents(model, fields, false);
}
/**
* This method allows to add components (custom fields).
*
* @param model
* @param fields
* @param isEditMode
*/
private void addComponents(final BoundCompoundPropertyModel model, List<Field> fields, final boolean isEditMode) {
ListView listView = new ListView("fields", fields) {
protected void populateItem(ListItem listItem) {
final Field field = (Field) listItem.getModelObject();
boolean isRequired = isEditMode ? false : !field.isOptional();
listItem.add(new Label("label", field.getLabel()));
listItem.add(new Label("star", isRequired ? "*" : " ").setEscapeModelStrings(false));
if (field.isDropDownType()) {
Fragment f = new Fragment("field", "dropDown", CustomFieldsFormPanel.this);
final Map<String, String> options = field.getOptions();
List<String> keys; // bound value
if (options != null) {
keys = new ArrayList(options.keySet());
} else {
keys = new ArrayList<String>();
}
DropDownChoice choice = new DropDownChoice("field", keys, new IChoiceRenderer() {
public Object getDisplayValue(Object o) {
return options.get(o);
};
public String getIdValue(Object o, int i) {
return o.toString();
};
});
choice.setNullValid(true);
choice.setLabel(new Model(field.getLabel()));
choice.setRequired(isRequired);
WebMarkupContainer border = new WebMarkupContainer("border");
f.add(border);
border.add(new ErrorHighlighter(choice));
border.add(model.bind(choice, field.getName().getText()));
listItem.add(f);
} else if (field.isDatePickerType()) {
/*
* ======================================
* Date picker
* ======================================
*/
YuiCalendar calendar = new YuiCalendar("field",
new PropertyModel(model, field.getName().getText()), isRequired);
listItem.add(calendar);
calendar.setLabel(new Model(field.getLabel()));
} else {
/*
* ======================================
* Text field
* ======================================
*/
Fragment f = new Fragment("field", "textField", CustomFieldsFormPanel.this);
TextField textField = new TextField("field");
/*
* Check if the field is used to display/edit
* Double values.
*/
if (field.isDecimalNumberType()) {
/*
* The following code overwrites the default
* DoubleConverter used by Wicket (getConverter(Class)).
* The original implementation rounds after three
* digits to the right of the decimal point.
*
* As there are requirements to show six digits to
* the right of the decimal point the NumberFormat
* is enhanced in the code below by the DecimalFormat
* class. That has been used because the DecimalFormat
* class supports a formatting pattern which allows
* to use the digits to the right only if really
* needed (currently limited to six digits to the
* right of the decimal point).
*/
textField = new TextField("field", Double.class) {
public org.apache.wicket.util.convert.IConverter getConverter(Class type) {
DoubleConverter converter = (DoubleConverter) DoubleConverter.INSTANCE;
java.text.NumberFormat numberFormat = converter.getNumberFormat(getLocale());
java.text.DecimalFormat decimalFormat = (java.text.DecimalFormat)numberFormat;
decimalFormat.applyPattern("###,##0.######");
converter.setNumberFormat(getLocale(), decimalFormat);
return converter;
};
};
}
textField.add(new ErrorHighlighter());
textField.setRequired(isRequired);
textField.setLabel(new Model(field.getLabel()));
f.add(model.bind(textField, field.getName().getText()));
listItem.add(f);
}
}
};
listView.setReuseItems(true);
add(listView);
} // end method addComponents(...)
}