/*
* 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.nsesss;
import com.smartgwt.client.widgets.Canvas;
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.events.ChangeEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
import cz.cas.lib.proarc.webapp.client.ClientMessages;
import cz.cas.lib.proarc.webapp.client.ds.LanguagesDataSource;
import cz.cas.lib.proarc.webapp.client.ds.MetaModelDataSource.MetaModelRecord;
import cz.cas.lib.proarc.webapp.client.widget.form.FormGenerator;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableForm;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableForm.Row;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableFormItem;
import cz.cas.lib.proarc.webapp.client.widget.mods.RepeatableFormItem.FormWidget;
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.Form;
import java.util.logging.Logger;
/**
* The form to edit NSESSS V2 format.
*
* @author Jan Pokorsky
*/
public class NsesssV2Form {
private static final Logger LOG = Logger.getLogger(NsesssV2Form.class.getName());
private final String activeLocale;
private final MetaModelRecord model;
public NsesssV2Form(ClientMessages i18n, MetaModelRecord model) {
activeLocale = LanguagesDataSource.activeLocale();
this.model = model;
}
public DynamicForm getForm() {
String modelId = model.getId();
Form f;
if ("model:desFolder".equals(modelId)) {
f = DesForms.spisForm();
} else if ("model:desInternalRecord".equals(modelId)) {
f = DesForms.intenalDocumentForm();
} else if ("model:desExternalRecord".equals(modelId)) {
f = DesForms.externalDocumentForm();
} else {
return null;
}
return new NsesssV2FormGenerator(f, activeLocale).generateForm();
}
private static class NsesssV2FormGenerator extends FormGenerator {
public NsesssV2FormGenerator(Form f, String activeLocale) {
super(f, activeLocale);
}
@Override
protected FormWidget customizeNestedForm(FormWidget fw, Field f) {
if (!Field.CUSTOM_FORM.equals(f.getType())) {
return fw;
}
final DynamicForm form = (DynamicForm) fw.getWidget();
if ("Subjekt".equals(f.getName())
&& f.getParent() != null && "Prijemce".equals(f.getParent().getName())) {
FormItem formItem = form.getField("subjectType");
if (formItem != null) {
return attachVyrizeniPrijemceSubjektGroup(fw, formItem, f);
}
} else if ("Subjekt".equals(f.getName())
&& f.getParent() != null && "Odesilatel".equals(f.getParent().getName())) {
FormItem formItem = form.getField("subjectType");
if (formItem != null) {
return attachPuvodDorucenyDokumentOdesilatelSubjectGroup(fw, formItem, f);
}
}
return fw;
}
private FormWidget attachVyrizeniPrijemceSubjektGroup(FormWidget fw, final FormItem itemSubject, final Field group) {
class Handler implements FormWidgetListener, ChangeHandler {
@Override
public void onDataLoad() {
if (itemSubject.getValue() == null) {
// init of empty form
itemSubject.setValue("PravnickaOsoba");
}
resetDokumentPrijemceForm(itemSubject.getForm(), group, null, false);
}
@Override
public void onChange(ChangeEvent event) {
String name = event.getItem().getName();
Object oldValue = event.getOldValue();
Object value = event.getValue();
if (oldValue == null || !oldValue.equals(value)) {
resetDokumentPrijemceForm(itemSubject.getForm(), group, String.valueOf(value), true);
}
}
}
Handler handler = new Handler();
fw.addFormWidgetListener(handler);
itemSubject.addChangeHandler(handler);
return fw;
}
/** XXX ugly; requires refactoring! */
private FormWidget attachPuvodDorucenyDokumentOdesilatelSubjectGroup(FormWidget fw, final FormItem itemSubject, final Field group) {
class Handler implements FormWidgetListener, ChangeHandler {
@Override
public void onDataLoad() {
if (itemSubject.getValue() == null) {
// init of empty form
itemSubject.setValue("PravnickaOsoba");
}
resetDorucenyDokumentOdesilatelForm(itemSubject.getForm(), group, null, false);
}
@Override
public void onChange(ChangeEvent event) {
String name = event.getItem().getName();
Object oldValue = event.getOldValue();
Object value = event.getValue();
if (oldValue == null || !oldValue.equals(value)) {
resetDorucenyDokumentOdesilatelForm(itemSubject.getForm(), group, String.valueOf(value), true);
}
}
}
Handler handler = new Handler();
fw.addFormWidgetListener(handler);
itemSubject.addChangeHandler(handler);
return fw;
}
/** Switches form members according to selected subject type. */
private void resetDorucenyDokumentOdesilatelForm(DynamicForm form, Field group, String subjectTypeValue, boolean clear) {
String value = subjectTypeValue != null ? subjectTypeValue : form.getValueAsString("subjectType");
boolean isPravnickaOsoba = "PravnickaOsoba".equals(value);
resetField(form.getField("PostovniAdresa"), clear && isPravnickaOsoba, !isPravnickaOsoba, !isPravnickaOsoba);
resetIdentifierField(form.getField("IdentifikatorOrganizace"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetIdentifierField(form.getField("IdentifikatorFyzickeOsoby"), false, true, false);
resetField(form.getField("NazevFyzickeOsoby"), false, true, !isPravnickaOsoba);
resetField(form.getField("NazevOrganizace"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetField(form.getField("OrganizacniUtvar"), clear && !isPravnickaOsoba, isPravnickaOsoba, false);
resetField(form.getField("PracovniPozice"), clear && !isPravnickaOsoba, isPravnickaOsoba, false);
resetField(form.getField("SidloOrganizace"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetField(form.getField("ElektronickyKontakt"), false, true, !isPravnickaOsoba);
}
/** Switches form members according to selected subject type. */
private void resetDokumentPrijemceForm(DynamicForm form, Field group, String subjectTypeValue, boolean clear) {
String value = subjectTypeValue != null ? subjectTypeValue : form.getValueAsString("subjectType");
boolean isPravnickaOsoba = "PravnickaOsoba".equals(value);
resetField(form.getField("PostovniAdresa"), clear && isPravnickaOsoba, !isPravnickaOsoba, !isPravnickaOsoba);
resetIdentifierField(form.getField("IdentifikatorOrganizace"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetIdentifierField(form.getField("IdentifikatorFyzickeOsoby"), false, true, !isPravnickaOsoba);
resetField(form.getField("NazevOrganizace"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetField(form.getField("OrganizacniUtvar"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetField(form.getField("PracovniPozice"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
resetField(form.getField("SidloOrganizace"), clear && !isPravnickaOsoba, isPravnickaOsoba, isPravnickaOsoba);
}
/** Resets nested Identifier members. */
private void resetIdentifierField(FormItem fi, boolean clear, boolean visible, boolean required) {
Canvas canvas = ((RepeatableFormItem) fi).getCanvas();
RepeatableForm rf = (RepeatableForm) canvas;
for (Row row : rf.getRows()) {
ValuesManager vm = row.getForm();
DynamicForm[] nestedForms = vm.getMembers();
for (DynamicForm nf : nestedForms) {
for (FormItem formItem : nf.getFields()) {
formItem.setRequired(required);
}
}
}
resetField(fi, clear, visible, required);
}
private void resetField(FormItem fi, boolean clear, boolean visible, boolean required) {
fi.setVisible(visible);
fi.setRequired(required);
clearIfTrue(clear, fi);
}
private void clearIfTrue(boolean state, FormItem fi) {
if (state) {
fi.clearValue();
// fi.setValue((Object) null);
}
}
}
}