/*
* Copyright (C) 2014 Jan Pokorsky
*
* 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 cz.cas.lib.proarc.webapp.client.widget.mods;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.ValuesManager;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import cz.cas.lib.proarc.webapp.client.widget.form.FormGenerator;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableFormItem.FormWidget;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableFormItem.FormWidgetFactory;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableFormItem.FormWidgetListener;
import cz.cas.lib.proarc.webapp.shared.form.Field;
import cz.cas.lib.proarc.webapp.shared.form.FieldBuilder;
import cz.cas.lib.proarc.webapp.shared.form.Form;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Logger;
/**
* Supports form behavior related to NDK specification.
*
* @author Jan Pokorsky
*/
public class NdkFormGenerator extends FormGenerator {
private static final Logger LOG = Logger.getLogger(NdkFormGenerator.class.getName());
/**
* The name of synthetic field to show unknown values of a nested form.
*/
public static final String HIDDEN_FIELDS_NAME = "__hiddenFields";
public NdkFormGenerator(Form f, String activeLocale) {
super(f, activeLocale);
}
@Override
public SelectItem getSelectItem(Field f, String lang) {
SelectItem item = super.getSelectItem(f, lang);
item.setAllowEmptyValue(true);
return item;
}
@Override
public RepeatableFormItem createNestedFormItem(final Field f, final String lang) {
if (f.getMember(HIDDEN_FIELDS_NAME) == null) {
f.getFields().add(new FieldBuilder(HIDDEN_FIELDS_NAME)
.setTitle("Hodnoty mimo NDK - " + f.getName())
.setMaxOccurrences(1).setType(Field.TEXT)
.setReadOnly(true)
.setHidden(true)
.createField());
}
RepeatableFormItem rfi = new RepeatableFormItem(f, new FormWidgetFactory() {
@Override
public DynamicForm create() {
throw new UnsupportedOperationException();
}
@Override
public FormWidget createFormWidget(Field formField) {
DynamicForm df = createNestedForm(f, lang);
ValuesManager vm = new ValuesManager();
vm.addMember(df);
return customizeNestedForm(new FormWidget(df, vm), f);
}
});
rfi.setPrompt(f.getHint(lang));
oneRow(rfi);
return rfi;
}
@Override
protected FormWidget customizeNestedForm(final FormWidget fw, final Field f) {
fw.addFormWidgetListener(new FormWidgetListener() {
@Override
public void onDataLoad() {
ValuesManager vm = fw.getValues();
Map<?, ?> values = vm.getValues();
StringBuilder sb = new StringBuilder();
for (Entry<?, ?> entry : values.entrySet()) {
if (HIDDEN_FIELDS_NAME.equals(entry.getKey())) {
continue;
}
Field member = f.getMember(String.valueOf(entry.getKey()));
if (member == null) {
sb.append(entry.getKey()).append('=').append(entry.getValue());
sb.append(", ");
}
}
// vm.setValue("_hiddenFields", sb.toString());
DynamicForm memberForField = (DynamicForm) vm.getMemberForField(HIDDEN_FIELDS_NAME);
FormItem field = memberForField.getField(HIDDEN_FIELDS_NAME);
field.setVisible(sb.toString().trim().length() != 0);
field.setValue(sb.toString());
}
});
return fw;
}
}