/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition 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; version 3 of the License.
//
// This community edition 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 org.projectforge.web.mobile;
import org.apache.log4j.Logger;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.projectforge.common.NumberHelper;
import org.projectforge.core.AbstractBaseDO;
import org.projectforge.core.BaseDao;
import org.projectforge.core.ModificationStatus;
import org.projectforge.web.wicket.AbstractEditPage;
import org.projectforge.web.wicket.AbstractListPage;
import org.projectforge.web.wicket.EditPageSupport;
import org.projectforge.web.wicket.IEditPage;
import org.projectforge.web.wicket.WicketUtils;
/**
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public abstract class AbstractMobileEditPage<O extends AbstractBaseDO< ? >, F extends AbstractMobileEditForm<O, ? >, D extends BaseDao<O>>
extends AbstractSecuredMobilePage implements IEditPage<O, D>
{
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(AbstractMobileEditPage.class);
private static final long serialVersionUID = -2264060989458529585L;
protected F form;
protected String i18nPrefix;
private EditPageSupport<O, D> editPageSupport;
public AbstractMobileEditPage(final PageParameters parameters, final String i18nPrefix)
{
super(parameters);
this.i18nPrefix = i18nPrefix;
final Integer id = WicketUtils.getAsInteger(parameters, AbstractEditPage.PARAMETER_KEY_ID);
O data = null;
if (NumberHelper.greaterZero(id) == true) {
data = getBaseDao().getById(id);
if (data == null) {
log.error("Oups, no object id given. Can't display object.");
setResponsePage(getListPageClass());
return;
}
init();
} else {
init(data);
}
}
protected abstract Class< ? extends AbstractMobileListPage< ? , ? , ? >> getListPageClass();
protected void init()
{
init(null);
}
@SuppressWarnings("unchecked")
protected void init(O data)
{
final Integer id = WicketUtils.getAsInteger(getPageParameters(), AbstractEditPage.PARAMETER_KEY_ID);
if (data == null) {
if (NumberHelper.greaterZero(id) == true) {
data = getBaseDao().getById(id);
}
if (data == null) {
data = (O) WicketUtils.getAsObject(getPageParameters(), AbstractEditPage.PARAMETER_KEY_DATA_PRESET, getBaseDao().newInstance()
.getClass());
if (data == null) {
data = getBaseDao().newInstance();
}
}
}
form = newEditForm(this, data);
pageContainer.add(form);
form.init();
// add(new Label("title", getString(AbstractEditPage.getTitleKey(i18nPrefix, isNew()))));
this.editPageSupport = new EditPageSupport<O, D>(this, getBaseDao());
}
/**
* User has clicked the submit button, so create or update the data object.
*/
protected void save()
{
if (isNew() == true) {
create();
} else {
update();
}
}
/**
* User has clicked the save button for storing a new item.
*/
protected void create()
{
this.editPageSupport.create();
}
/**
* User has clicked the update button for updating an existing item.
*/
protected void update()
{
this.editPageSupport.update();
}
protected void undelete()
{
this.editPageSupport.undelete();
}
protected void markAsDeleted()
{
this.editPageSupport.markAsDeleted();
}
protected void delete()
{
this.editPageSupport.delete();
}
@Override
public WebPage afterSave()
{
return null;
}
@Override
public WebPage afterSaveOrUpdate()
{
return null;
}
@Override
public WebPage afterUpdate(final ModificationStatus modified)
{
return null;
}
/**
* Will be called directly after deleting the data object (delete or update deleted=true). Any return value is not yet supported.
*/
@Override
public WebPage afterDelete()
{
// Do nothing at default.
return null;
}
/**
* Will be called directly after un-deleting the data object (update deleted=false). Any return value is not yet supported.
*/
@Override
public WebPage afterUndelete()
{
// Do nothing at default.
return null;
}
@Override
public void clearIds()
{
getData().setId(null);
}
@Override
public boolean isAlreadySubmitted()
{
return this.alreadySubmitted;
}
@Override
public WebPage onDelete()
{
return null;
}
@Override
public WebPage onSaveOrUpdate()
{
return null;
}
@Override
public WebPage onUndelete()
{
return null;
}
@Override
public void setAlreadySubmitted(final boolean alreadySubmitted)
{
this.alreadySubmitted = alreadySubmitted;
}
@Override
public void setResponsePage()
{
if (this.returnToPage != null) {
setResponsePageAndHighlightedRow(this.returnToPage);
} else {
final EditMobilePage ann = getClass().getAnnotation(EditMobilePage.class);
final Class< ? extends AbstractSecuredMobilePage> redirectPage;
if (ann != null && ann.defaultReturnPage() != null) {
redirectPage = getClass().getAnnotation(EditMobilePage.class).defaultReturnPage();
} else {
redirectPage = WicketUtils.getDefaultMobilePage();
}
final PageParameters params = new PageParameters();
params.add(AbstractListPage.PARAMETER_HIGHLIGHTED_ROW, getData().getId());
setResponsePage(redirectPage, params);
}
}
/**
* Does nothing (not yet supported). Is this use-ful on a mobile device?
* @see org.projectforge.web.wicket.IEditPage#setResponsePageAndHighlightedRow(org.apache.wicket.markup.html.WebPage)
*/
@Override
public void setResponsePageAndHighlightedRow(final WebPage page)
{
}
@Override
public O getData()
{
if (form == null || form.getData() == null) {
getLogger().error("Data of form is null. Maybe you have forgotten to call AbstractEditPage.init() in constructor.");
}
return form.getData();
}
/**
* @see AbstractEditPage#isNew
*/
public boolean isNew()
{
if (form == null) {
getLogger().error("Data of form is null. Maybe you have forgotten to call AbstractEditPage.init() in constructor.");
}
return (getData() == null || getData().getId() == null);
}
/**
* @see org.projectforge.web.wicket.AbstractEditPage#getTitleKey(String, boolean)
*/
@Override
protected String getTitle()
{
return getString(AbstractEditPage.getTitleKey(i18nPrefix, isNew()));
}
protected abstract D getBaseDao();
protected abstract Logger getLogger();
protected abstract F newEditForm(AbstractMobileEditPage< ? , ? , ? > parentPage, O data);
}