/*
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.components.panels.tasks;
import java.util.Locale;
import net.databinder.components.hib.DataForm;
import net.databinder.models.hib.HibernateObjectModel;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.validation.IFormValidator;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;
import wicket.contrib.tinymce.TinyMceBehavior;
import wicket.contrib.tinymce.settings.Button;
import wicket.contrib.tinymce.settings.FullScreenPlugin;
import wicket.contrib.tinymce.settings.PastePlugin;
import wicket.contrib.tinymce.settings.SearchReplacePlugin;
import wicket.contrib.tinymce.settings.TablePlugin;
import wicket.contrib.tinymce.settings.TinyMCESettings;
import de.elatexam.editor.components.panels.tasks.cloze.ClozeSubtaskDefInputPanel;
import de.elatexam.editor.components.panels.tasks.mapping.MappingSubtaskDefInputPanel;
import de.elatexam.editor.components.panels.tasks.mc.McSubtaskDefInputPanel;
import de.elatexam.editor.components.panels.tasks.paint.PaintSubtaskDefInputPanel;
import de.elatexam.editor.components.panels.tasks.text.TextSubtaskDefInputPanel;
import de.elatexam.model.ClozeSubTaskDef;
import de.elatexam.model.MappingSubTaskDef;
import de.elatexam.model.McSubTaskDef;
import de.elatexam.model.PaintSubTaskDef;
import de.elatexam.model.SubTaskDef;
import de.elatexam.model.TextSubTaskDef;
/**
* @author Steffen Dienst
*
*/
public class SubtaskDefInputPanel<T extends SubTaskDef> extends Panel {
/**
* @author Steffen Dienst
*
* @param <T>
*/
public class SubtaskDefForm extends DataForm<T> {
private final Class<T> modelClass;
public SubtaskDefForm(final String id, final HibernateObjectModel<T> model) {
super(id, model);
this.modelClass = (Class<T>) model.getObject().getClass();
init();
}
/**
* @param id
* @param modelClass2
* @return
*/
private SubtaskSpecificsInputPanel getTaskSpecificFormPanel(final String id) {
if (modelClass.equals(McSubTaskDef.class))
return new McSubtaskDefInputPanel(id, (IModel<McSubTaskDef>) getModel());
else if (modelClass.equals(TextSubTaskDef.class))
return new TextSubtaskDefInputPanel(id);
else if (modelClass.equals(MappingSubTaskDef.class))
return new MappingSubtaskDefInputPanel(id, (IModel<MappingSubTaskDef>) getModel());
else if (modelClass.equals(ClozeSubTaskDef.class))
return new ClozeSubtaskDefInputPanel(id, (IModel<ClozeSubTaskDef>) getModel());
else if (modelClass.equals(PaintSubTaskDef.class))
return new PaintSubtaskDefInputPanel(id, (IModel<PaintSubTaskDef>) getModel());
else
return new SubtaskSpecificsInputPanel<T>(id) {
};
}
/**
* @param returnPage
*
*/
private void init() {
add(new FeedbackPanel("feedback"));
// add common SubTaskDef input fields
TextField<String> idTf = new TextField<String>("xmlid");
idTf.add(new AttributeAppender("placeholder", "eindeutiger Bezeichner"));
add(idTf.setRequired(true));
final TextArea<String> problemText = new TextArea<String>("problem") {
@Override
public IConverter<String> getConverter(Class type) {
return new IConverter<String>() {
public String convertToObject(final String text, final Locale locale) {
return text.replaceAll("<p>", "").replaceAll("</p>", "<br/>");
}
public String convertToString(final String value, final Locale locale) {
return value == null ? "" : value.toString();
}
};
}
};
// set the type, else the converter won't get called
problemText.setType(String.class);
add(problemText.setRequired(true).add(new TinyMceBehavior(createFullFeatureset())));
// add subtask input elements
SubtaskSpecificsInputPanel<T> specificPanel = getTaskSpecificFormPanel("specificelements");
add(specificPanel);
IFormValidator fv = specificPanel.getFormValidator();
if (fv != null)
add(fv);
// add correction and hints
add(new TextField<String>("hint").add(new AttributeAppender("placeholder", "Hinweis für Studenten")));
add(new TextArea<String>("correctionHint"));
add(new org.apache.wicket.markup.html.form.Button("saveButton"));
add(new org.apache.wicket.markup.html.form.Button("cancelButton") {
@Override
public void onSubmit() {
clearPersistentObject();
// setResponsePage(returnPage);
}
}.setDefaultFormProcessing(false));
}
/*
* (non-Javadoc)
*
* @see net.databinder.components.hib.DataForm#onSubmit()
*/
@Override
protected void onSubmit() {
super.onSubmit();
info("Gespeichert!");
// clearPersistentObject();
// setResponsePage(new ShowSubtaskDefsPage(modelClass));
}
}
public SubtaskDefInputPanel(final String id, final HibernateObjectModel<T> model) {
super(id);
add(new SubtaskDefForm("taskform", model));
}
/**
* Add all tinymce features to the rich text editor.
*
* @return
*/
public static TinyMCESettings createFullFeatureset() {
final TinyMCESettings settings = new TinyMCESettings(TinyMCESettings.Theme.advanced);
// first toolbar
settings.add(Button.fontselect, TinyMCESettings.Toolbar.first, TinyMCESettings.Position.after);
settings.add(Button.fontsizeselect, TinyMCESettings.Toolbar.first, TinyMCESettings.Position.after);
// second toolbar
final PastePlugin pastePlugin = new PastePlugin();
final SearchReplacePlugin searchReplacePlugin = new SearchReplacePlugin();
settings.add(Button.cut, TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(Button.copy, TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(pastePlugin.getPasteButton(), TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(pastePlugin.getPasteTextButton(), TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(pastePlugin.getPasteWordButton(), TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(Button.separator, TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(searchReplacePlugin.getSearchButton(), TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(searchReplacePlugin.getReplaceButton(), TinyMCESettings.Toolbar.second, TinyMCESettings.Position.before);
settings.add(Button.separator, TinyMCESettings.Toolbar.second, TinyMCESettings.Position.after);
settings.add(Button.forecolor, TinyMCESettings.Toolbar.second, TinyMCESettings.Position.after);
settings.add(Button.backcolor, TinyMCESettings.Toolbar.second, TinyMCESettings.Position.after);
// third toolbar
final TablePlugin tablePlugin = new TablePlugin();
final FullScreenPlugin fullScreenPlugin = new FullScreenPlugin();
settings.add(tablePlugin.getTableControls(), TinyMCESettings.Toolbar.third, TinyMCESettings.Position.before);
settings.add(Button.separator, TinyMCESettings.Toolbar.third, TinyMCESettings.Position.after);
settings.add(Button.separator, TinyMCESettings.Toolbar.third, TinyMCESettings.Position.before);
settings.add(fullScreenPlugin.getFullscreenButton(), TinyMCESettings.Toolbar.third, TinyMCESettings.Position.after);
// other settings
settings.setToolbarAlign(TinyMCESettings.Align.left);
settings.setToolbarLocation(TinyMCESettings.Location.top);
settings.setStatusbarLocation(TinyMCESettings.Location.bottom);
settings.setResizing(true);
// remove superflous buttons
settings.disableButton(Button.image);
settings.disableButton(Button.anchor);
settings.disableButton(Button.link);
settings.disableButton(Button.unlink);
settings.disableButton(Button.visualaid);
settings.disableButton(Button.cleanup);
settings.disableButton(Button.help);
return settings;
}
}