/*
* Copyright (C) 2013 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;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.VLayout;
import cz.cas.lib.proarc.webapp.client.ClientMessages;
import cz.cas.lib.proarc.webapp.client.ClientUtils;
import cz.cas.lib.proarc.webapp.client.action.ActionEvent;
import cz.cas.lib.proarc.webapp.client.action.Actions;
import cz.cas.lib.proarc.webapp.client.action.RefreshAction.Refreshable;
import cz.cas.lib.proarc.webapp.client.action.SaveAction;
import cz.cas.lib.proarc.webapp.client.ds.DeviceDataSource;
import cz.cas.lib.proarc.webapp.client.ds.DigitalObjectAdministrationDataSource;
import cz.cas.lib.proarc.webapp.client.ds.DigitalObjectDataSource.DigitalObject;
import cz.cas.lib.proarc.webapp.client.ds.RestConfig;
import cz.cas.lib.proarc.webapp.shared.rest.DigitalObjectResourceApi;
/**
* Edits administration and technical meta data of digital object.
* It support modification of single object and batch modification of
* selected values (for now device) as well.
*
* @author Jan Pokorsky
*/
public final class DigitalObjectAdministrationEditor implements BatchDatastreamEditor, Refreshable {
private DigitalObject[] digitalObjects;
private Object activeEditor;
private PlainEditor plainEditor;
private BatchEditor batchEditor;
private final ClientMessages i18n;
private VLayout container;
public DigitalObjectAdministrationEditor(ClientMessages i18n) {
this.i18n = i18n;
this.container = new VLayout();
}
@Override
public void edit(DigitalObject[] items) {
this.digitalObjects = items;
if (items == null || items.length == 0) {
setActiveEditor(null);
} else if (items.length == 1) {
setActiveEditor(getPlainEditor());
plainEditor.getForm().fetchData(items[0].toCriteria());
} else {
setActiveEditor(getBatchEditor());
DynamicForm form = batchEditor.getForm();
form.editNewRecord();
}
}
@Override
public void edit(DigitalObject digitalObject) {
DigitalObject[] objs = digitalObject == null ? null : new DigitalObject[] { digitalObject };
edit(objs);
}
@Override
public void focus() {
if (activeEditor instanceof PlainEditor) {
plainEditor.getForm().focus();
} else if (activeEditor instanceof BatchEditor) {
batchEditor.getForm().focus();
}
}
@Override
@SuppressWarnings("unchecked")
public <T> T getCapability(Class<T> clazz) {
T c = null;
if (Refreshable.class.equals(clazz) || BatchDatastreamEditor.class.equals(clazz)) {
c = (T) this;
}
return c;
}
@Override
public Canvas[] getToolbarItems() {
SaveAction saveAction = new SaveAction(i18n) {
@Override
public void performAction(ActionEvent event) {
save();
}
};
return new Canvas[] {
Actions.asIconButton(saveAction, this)
};
}
@Override
public Canvas getUI() {
return container;
}
@Override
public void refresh() {
getPlainEditor().invalidateCache();
edit(digitalObjects);
}
public void save() {
if (activeEditor instanceof BatchEditor) {
saveBatchEditor();
} else if (activeEditor instanceof PlainEditor) {
savePlainEditor();
}
}
private void savePlainEditor() {
DynamicForm form = getPlainEditor().getForm();
if (!form.valuesHaveChanged()) {
// nothing to save, ignore
return ;
}
form.saveData(new DSCallback() {
@Override
public void execute(DSResponse response, Object rawData, DSRequest request) {
if (RestConfig.isStatusOk(response)) {
StatusView.getInstance().show(i18n.SaveAction_Done_Msg());
}
}
});
}
private void saveBatchEditor() {
DynamicForm form = getBatchEditor().getForm();
String device = form.getValueAsString(DigitalObjectAdministrationDataSource.FIELD_DEVICE);
String[] pids = DigitalObject.toPidArray(digitalObjects);
Record update = new Record();
update.setAttribute(DigitalObjectAdministrationDataSource.FIELD_PID, pids);
String batchId = digitalObjects[0].getBatchId();
if (batchId != null) {
update.setAttribute(DigitalObjectResourceApi.ATM_ITEM_BATCHID, batchId);
}
update.setAttribute(DigitalObjectAdministrationDataSource.FIELD_DEVICE, device);
DigitalObjectAdministrationDataSource.getInstance().updateData(update, new DSCallback() {
@Override
public void execute(DSResponse response, Object rawData, DSRequest request) {
if (RestConfig.isStatusOk(response)) {
StatusView.getInstance().show(i18n.SaveAction_Done_Msg());
}
}
});
}
private void setActiveEditor(Object editor) {
this.activeEditor = editor;
if (editor instanceof BatchEditor) {
container.setMembers(batchEditor.getWidget());
} else if (editor instanceof PlainEditor) {
container.setMembers(plainEditor.getWidget());
} else {
container.setMembers((Canvas) null);
}
}
private PlainEditor getPlainEditor() {
if (plainEditor == null) {
plainEditor = new PlainEditor(i18n);
}
return plainEditor;
}
private BatchEditor getBatchEditor() {
if (batchEditor == null) {
batchEditor = new BatchEditor(i18n);
}
return batchEditor;
}
private static final class PlainEditor {
private final VLayout widget;
private final DynamicForm form;
public PlainEditor(ClientMessages i18n) {
widget = new VLayout();
form = new DynamicForm();
form.setDataSource(DigitalObjectAdministrationDataSource.getInstance());
form.setBrowserSpellCheck(false);
TextItem pid = new TextItem(DigitalObjectAdministrationDataSource.FIELD_PID,
i18n.DigitalObjectEditor_AdministrationEditor_Pid_Title());
pid.setWidth("*");
pid.setCanEdit(Boolean.FALSE);
TextItem model = new TextItem(DigitalObjectAdministrationDataSource.FIELD_MODEL,
i18n.DigitalObjectEditor_AdministrationEditor_Model_Title());
model.setCanEdit(Boolean.FALSE);
TextItem owner = new TextItem(DigitalObjectAdministrationDataSource.FIELD_OWNER,
i18n.DigitalObjectEditor_AdministrationEditor_Owner_Title());
owner.setCanEdit(Boolean.FALSE);
TextItem creationDate = new TextItem(DigitalObjectAdministrationDataSource.FIELD_CREATED,
i18n.DigitalObjectEditor_AdministrationEditor_Created_Title());
creationDate.setCanEdit(Boolean.FALSE);
TextItem modificationDate = new TextItem(DigitalObjectAdministrationDataSource.FIELD_MODIFIED,
i18n.DigitalObjectEditor_AdministrationEditor_Modified_Title());
modificationDate.setCanEdit(Boolean.FALSE);
SelectItem device = new SelectItem(DigitalObjectAdministrationDataSource.FIELD_DEVICE,
i18n.DigitalObjectEditor_AdministrationEditor_Device_Title());
device.setWidth(250);
DeviceDataSource.setOptionDataSource(device);
device.setAllowEmptyValue(true);
device.setEmptyDisplayValue(ClientUtils.format("<i><%s></i>",
i18n.DigitalObjectEditor_AdministrationEditor_NoDeviceSelection_Title()));
TextItem filename = new TextItem(DigitalObjectAdministrationDataSource.FIELD_FILENAME,
i18n.DigitalObjectEditor_AdministrationEditor_File_Title());
filename.setWidth("*");
filename.setCanEdit(Boolean.FALSE);
TextItem export = new TextItem(DigitalObjectAdministrationDataSource.FIELD_EXPORT,
i18n.DigitalObjectEditor_AdministrationEditor_Export_Title());
export.setWidth("*");
export.setCanEdit(Boolean.FALSE);
form.setItems(pid, model, owner, creationDate, modificationDate, device, filename, export);
widget.setMembers(form);
}
public VLayout getWidget() {
return widget;
}
public DynamicForm getForm() {
return form;
}
public void invalidateCache() {
form.invalidateCache();
form.getField(DigitalObjectAdministrationDataSource.FIELD_DEVICE)
.invalidateDisplayValueCache();
}
}
private static final class BatchEditor {
private final VLayout widget;
private final DynamicForm form;
public BatchEditor(ClientMessages i18n) {
widget = new VLayout();
form = new DynamicForm();
form.setBrowserSpellCheck(false);
TextItem owner = new TextItem(DigitalObjectAdministrationDataSource.FIELD_OWNER);
owner.setCanEdit(Boolean.FALSE);
SelectItem device = new SelectItem(DigitalObjectAdministrationDataSource.FIELD_DEVICE,
i18n.ImportSourceChooser_OptionScanner_Title());
DeviceDataSource.setOptionDataSource(device);
device.setWidth(250);
device.setAllowEmptyValue(true);
device.setEmptyDisplayValue(ClientUtils.format("<i><%s></i>",
i18n.DigitalObjectEditor_AdministrationEditor_NoDeviceSelection_Title()));
form.setItems(device);
widget.setMembers(form);
}
public VLayout getWidget() {
return widget;
}
public DynamicForm getForm() {
return form;
}
public void invalidateCache() {
form.invalidateCache();
form.getField(DigitalObjectAdministrationDataSource.FIELD_DEVICE)
.invalidateDisplayValueCache();
}
}
}