/**
* Copyright 2011 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 org.bricket.plugin.gallery.web;
import java.io.Serializable;
import java.util.Collection;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.bricket.plugin.gallery.domain.Gallery;
import org.bricket.plugin.gallery.service.GalleryService;
import org.bricket.plugin.picture.domain.Picture;
import org.bricket.web.common.link.GenericLinkConfig;
import org.bricket.web.event.BricketAbstractEvent;
import org.bricket.web.master.AIModelMasterComponent;
import org.bricket.web.master.IModelMasterUpdateEvent;
import org.bricket.web.master.SimpleIModelMaster;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import brix.jcr.wrapper.BrixNode;
import brix.web.nodepage.BrixPageParameters;
/**
* @author Ingo Renner
* @author Henning Teek
*
*/
public class EditOrCreateGalleryPanel extends AIModelMasterComponent<Gallery> {
private final Logger log = LoggerFactory.getLogger(EditOrCreateGalleryPanel.class);
@SpringBean
private GalleryService galleryService;
private final GenericLinkConfig config;
private boolean initializeFromPageParameters = true;
public EditOrCreateGalleryPanel(String id, IModel<BrixNode> tileNode) {
super(id);
config = new GenericLinkConfig();
config.load(tileNode.getObject());
}
public EditOrCreateGalleryPanel(String id, Gallery gallery) {
super(id);
config = null;
initializeFromPageParameters = false;
setModelMaster(new SimpleIModelMaster<Gallery>(new Model<Gallery>(gallery), Gallery.class));
}
@Override
protected void initGui() {
final Form<Gallery> form = createForm();
add(form);
}
private Form<Gallery> createForm() {
Form<Gallery> form = new Form<Gallery>("form", new CompoundPropertyModel<Gallery>(getModelMaster().getIModel()));
StringResourceModel ltitle = new StringResourceModel("title.label", EditOrCreateGalleryPanel.this, null);
form.add(new Label("title.label", ltitle));
form.add(new TextField<String>("title", String.class).setRequired(true).setLabel(ltitle));
StringResourceModel ldescription = new StringResourceModel("description.label", EditOrCreateGalleryPanel.this,
null);
form.add(new Label("description.label", ldescription));
form.add(new TextField<String>("description", String.class).setRequired(true).setLabel(ldescription));
// Select pictures
IChoiceRenderer<Picture> renderer = new ChoiceRenderer<Picture>("title", "id");
IModel<? extends Collection<? extends Picture>> choices = new Model(
(Serializable) galleryService.loadAvailablePictures());
Palette<Picture> p = new Palette<Picture>("pictures", choices, renderer, 15, true);
p.setVisible(!((Gallery) getDefaultModelObject()).isNew());
form.add(p);
// TODO Untergallerien zuweisen bzw erstellen
form.add(new AjaxLink<Void>("cancel") {
@Override
public void onClick(AjaxRequestTarget target) {
getSession().cleanupFeedbackMessages();
returnToManagement(target);
}
});
form.add(new AjaxButton("submit", form) {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
log.info("onSubmit obj=" + form.getModelObject());
doSave(form, target);
doSlaveUpdate(target);
target.addComponent(getFeedback());
returnToManagement(target);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.addComponent(getFeedback());
}
});
form.setOutputMarkupId(true);
return form;
}
protected void returnToManagement(AjaxRequestTarget target) {
if (config != null && config.getUrl() != null && !"".equals(config.getUrl())) {
// Redirect to other Page
getRequestCycle().setRequestTarget(new RedirectRequestTarget(config.getUrl()));
} else {
// Panel refresh
final Form<Gallery> form = createForm();
addOrReplace(form);
target.addComponent(getFeedback());
target.addComponent(form);
}
}
/**
* @param form
* @param target
*/
protected void doSave(Form<?> form, AjaxRequestTarget target) {
try {
log.info("doSave " + form.getModelObject());
galleryService.saveGallery((Gallery) form.getModelObject());
info(new StringResourceModel("feedback.success", EditOrCreateGalleryPanel.this, null).getString());
} catch (Exception e) {
error("Speichern ist fehlgeschlagen, Fehler " + e.getMessage());
}
}
protected void doSlaveUpdate(AjaxRequestTarget target) {
IModelMasterUpdateEvent event = new IModelMasterUpdateEvent(this, target);
event.fire();
}
public void contributeToPageParameters(BrixPageParameters arg0) {
}
@Override
public void onInitializeFromPageParameters(BrixPageParameters params) {
if (initializeFromPageParameters) {
if (!params.getQueryParam(GalleryPageParameterDefinition.GALLERIE_PAGE_PARAMETER).isEmpty()) {
try {
long galleryId = params.getQueryParam(GalleryPageParameterDefinition.GALLERIE_PAGE_PARAMETER)
.toLong();
Gallery gallery = galleryService.loadGallery(galleryId);
setModelMaster(new SimpleIModelMaster<Gallery>(new Model<Gallery>(gallery), Gallery.class));
} catch (Exception e) {
log.error("Could not get gallery from pageparameter. Error: " + e.getMessage(), e);
setModelMasterWithNewObject();
}
} else {
setModelMasterWithNewObject();
}
} else {
setModelMasterWithNewObject();
}
Assert.notNull(getModelMaster());
Assert.notNull(getModelMaster().getIModel());
setDefaultModel(new CompoundPropertyModel<Gallery>(getModelMaster().getIModel()));
log.info("onInitializeFromPageParameters obj=" + getDefaultModelObject());
}
private void setModelMasterWithNewObject() {
setModelMaster(new SimpleIModelMaster<Gallery>(new Model<Gallery>(galleryService.createDomainObject()),
Gallery.class));
}
@Override
public void notifyEvent(BricketAbstractEvent event) {
// im Moment nix zu Tun.
}
public GalleryService getGalleryService() {
return galleryService;
}
public void setGalleryService(GalleryService galleryService) {
this.galleryService = galleryService;
}
public boolean isInitializeFromPageParameters() {
return initializeFromPageParameters;
}
public void setInitializeFromPageParameters(boolean initializeFromPageParameters) {
this.initializeFromPageParameters = initializeFromPageParameters;
}
public Logger getLog() {
return log;
}
public GenericLinkConfig getConfig() {
return config;
}
}