/*
Copyright (C) 2009 Steffen Dienst
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 2 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, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package de.elatexam.editor.pages;
import java.util.List;
import net.databinder.models.hib.HibernateListModel;
import net.databinder.models.hib.HibernateObjectModel;
import net.databinder.models.hib.QueryBuilder;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.event.IEventSource;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.hibernate.Query;
import org.hibernate.Session;
import wicketdnd.theme.WebTheme;
import de.elatexam.editor.TaskEditorApplication;
import de.elatexam.editor.TaskEditorSession;
import de.elatexam.editor.components.panels.tasks.CategoryPanel;
import de.elatexam.editor.components.panels.tasks.ComplexTaskdefPanel;
import de.elatexam.editor.components.panels.tasks.TaskBlockConfigPanel;
import de.elatexam.editor.components.panels.tasks.preview.PreviewSubtaskDefPanel;
import de.elatexam.editor.components.panels.tree.ComplexTaskDefTree;
import de.elatexam.editor.components.panels.tree.ComplexTaskdefTreeProvider;
import de.elatexam.editor.pages.taskdef.TaskDefActions;
import de.elatexam.editor.user.BasicUser;
import de.elatexam.editor.util.RemoveNullResultTransformer;
import de.elatexam.model.Category;
import de.elatexam.model.ComplexTaskDef;
import de.elatexam.model.SubTaskDef;
import de.elatexam.model.TaskBlock;
/**
* @author Steffen Dienst
*
*/
public class TaskDefPage extends SecurePage{
private Panel editPanel;
private ComplexTaskDefTree tree;
TaskDefActions taskdefactions;
public TaskDefPage() {
super();
// add drag-n-drop theme
add(tree = getTree());
editPanel = new EmptyPanel("editpanel");
add(editPanel.setOutputMarkupId(true));
}
public void renderHead(org.apache.wicket.markup.html.IHeaderResponse response) {
super.renderHead(response);
response.renderCSSReference(new WebTheme());
};
/**
* @param tasklistmodel
* @return
*/
ComplexTaskDefTree getTree() {
if(tree == null){
@SuppressWarnings("unchecked")
IModel<List<?>> tasklistmodel = new HibernateListModel(new QueryBuilder() {
public Query build(final Session sess) {
final Query q = sess.createQuery(String.format("select tasks from BasicUser u left join u.taskdefs tasks where u.username='%s'",
TaskEditorSession.get().getUser().getUsername()));
q.setResultTransformer(RemoveNullResultTransformer.INSTANCE);
return q;
}
});
// the admin sees all taskdefs
if (TaskEditorApplication.isAdmin()) {
tasklistmodel = new HibernateListModel(BasicUser.class);
}
tree = new ComplexTaskDefTree("tree", new ComplexTaskdefTreeProvider(tasklistmodel));
}
return tree;
}
private void replaceEditPanelWith(final AjaxRequestTarget target, final Panel edit) {
edit.setOutputMarkupId(true);
editPanel.replaceWith(edit);
editPanel = edit;
target.add(editPanel);
}
/*
* (non-Javadoc)
*
* @see de.elatexam.editor.pages.OverviewPage#createToolbar(java.lang.String)
*/
@Override
protected Component createToolbar(final String id) {
return new TaskDefActions(id, getTree());
}
/* (non-Javadoc)
* @see de.elatexam.editor.components.event.AjaxUpdateEvent.IAjaxUpdateListener#notifyAjaxUpdate(de.elatexam.editor.components.event.AjaxUpdateEvent)
*/
@Override
public void onEvent(IEvent<?> event) {
IEventSource source = event.getSource();
if(source instanceof ComplexTaskDefTree){
HibernateObjectModel<?> selectedModel = (HibernateObjectModel<?>) ((ComplexTaskDefTree)source).getSelected();
renderPanelFor(selectedModel, (AjaxRequestTarget) event.getPayload());
}
}
/**
* Replace right hand form panel with an edit panel for the given model object.
*
* @param t
* @param target
*/
private void renderPanelFor(final HibernateObjectModel<?> selectedModel, final AjaxRequestTarget target) {
if(selectedModel !=null){
final Object t = selectedModel.getObject();
if (t instanceof ComplexTaskDef) {
replaceEditPanelWith(target, new ComplexTaskdefPanel("editpanel", (HibernateObjectModel<ComplexTaskDef>) selectedModel));
} else if (t instanceof Category) {
replaceEditPanelWith(target, new CategoryPanel("editpanel", (HibernateObjectModel<Category>) selectedModel));
} else if (t instanceof TaskBlock) {
replaceEditPanelWith(target, new TaskBlockConfigPanel("editpanel", (HibernateObjectModel<TaskBlock>) selectedModel));
} else if (t instanceof SubTaskDef) {
replaceEditPanelWith(target, new PreviewSubtaskDefPanel<SubTaskDef>("editpanel", (IModel<SubTaskDef>) selectedModel));
//new SubtaskDefInputPanel("editpanel", (HibernateObjectModel<SubTaskDef>) selectedModel));
}
}else{
replaceEditPanelWith(target, new EmptyPanel("editpanel"));
}
}
}