/////////////////////////////////////////////////////////////////////////////
//
// 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.task;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.projectforge.task.TaskFilter;
import org.projectforge.web.wicket.AbstractForm;
import org.projectforge.web.wicket.CsrfTokenHandler;
import org.projectforge.web.wicket.WebConstants;
import org.projectforge.web.wicket.WicketUtils;
import org.projectforge.web.wicket.bootstrap.GridBuilder;
import org.projectforge.web.wicket.bootstrap.GridSize;
import org.projectforge.web.wicket.components.SingleButtonPanel;
import org.projectforge.web.wicket.flowlayout.CheckBoxButton;
import org.projectforge.web.wicket.flowlayout.DivPanel;
import org.projectforge.web.wicket.flowlayout.FieldSetIconPosition;
import org.projectforge.web.wicket.flowlayout.FieldsetPanel;
import org.projectforge.web.wicket.flowlayout.IconPanel;
import org.projectforge.web.wicket.flowlayout.IconType;
import org.projectforge.web.wicket.flowlayout.InputPanel;
import org.projectforge.web.wicket.flowlayout.MyComponentsRepeater;
public class TaskTreeForm extends AbstractForm<TaskFilter, TaskTreePage>
{
private static final long serialVersionUID = -203572415793301622L;
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TaskTreeForm.class);
private TaskFilter searchFilter;
private MyComponentsRepeater<Component> actionButtons;
private SingleButtonPanel cancelButtonPanel;
private SingleButtonPanel resetButtonPanel;
private SingleButtonPanel listViewButtonPanel;
private SingleButtonPanel searchButtonPanel;
protected GridBuilder gridBuilder;
/**
* Cross site request forgery token.
*/
private final CsrfTokenHandler csrfTokenHandler;
@Override
@SuppressWarnings("serial")
protected void init()
{
super.init();
add(createFeedbackPanel());
gridBuilder = newGridBuilder(this, "flowform");
{
gridBuilder.newSplitPanel(GridSize.COL50);
final FieldsetPanel fs = gridBuilder.newFieldset(getString("searchFilter"));
final TextField<String> searchField = new TextField<String>(InputPanel.WICKET_ID, new PropertyModel<String>(getSearchFilter(),
"searchString"));
searchField.add(WicketUtils.setFocus());
fs.add(new InputPanel(fs.newChildId(), searchField));
fs.add(new IconPanel(fs.newIconChildId(), IconType.HELP, getString("tooltip.lucene.link")).setOnClickLocation(getRequestCycle(),
WebConstants.DOC_LINK_HANDBUCH_LUCENE, true), FieldSetIconPosition.TOP_RIGHT);
}
{
gridBuilder.newSplitPanel(GridSize.COL50);
final FieldsetPanel fs = gridBuilder.newFieldset(getString("label.options")).suppressLabelForWarning();
final DivPanel checkBoxPanel = fs.addNewCheckBoxButtonDiv();
checkBoxPanel.add(new MyCheckBoxPanel(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(getSearchFilter(), "notOpened"),
getString("task.status.notOpened")));
checkBoxPanel.add(new MyCheckBoxPanel(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(getSearchFilter(), "opened"),
getString("task.status.opened")));
checkBoxPanel.add(new MyCheckBoxPanel(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(getSearchFilter(), "closed"),
getString("task.status.closed")));
checkBoxPanel.add(new MyCheckBoxPanel(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(getSearchFilter(), "deleted"),
getString("deleted")));
}
actionButtons = new MyComponentsRepeater<Component>("actionButtons");
add(actionButtons.getRepeatingView());
{
final Button cancelButton = new Button("button", new Model<String>("cancel")) {
@Override
public final void onSubmit()
{
getParentPage().onCancelSubmit();
}
};
cancelButton.setDefaultFormProcessing(false);
cancelButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), cancelButton, getString("cancel"), SingleButtonPanel.CANCEL);
actionButtons.add(cancelButtonPanel);
}
{
final Button resetButton = new Button("button", new Model<String>("reset")) {
@Override
public final void onSubmit()
{
getParentPage().onResetSubmit();
}
};
resetButton.setDefaultFormProcessing(false);
resetButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), resetButton, getString("reset"), SingleButtonPanel.RESET);
actionButtons.add(resetButtonPanel);
}
{
final Button listViewButton = new Button("button", new Model<String>("listView")) {
@Override
public final void onSubmit()
{
getParentPage().onListViewSubmit();
}
};
listViewButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), listViewButton, getString("listView"),
SingleButtonPanel.NORMAL);
actionButtons.add(listViewButtonPanel);
}
{
final Button searchButton = new Button("button", new Model<String>("search")) {
@Override
public final void onSubmit()
{
getParentPage().onSearchSubmit();
}
};
searchButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), searchButton, getString("search"),
SingleButtonPanel.DEFAULT_SUBMIT);
actionButtons.add(searchButtonPanel);
setDefaultButton(searchButton);
}
setComponentsVisibility();
}
public TaskTreeForm(final TaskTreePage parentPage)
{
super(parentPage);
csrfTokenHandler = new CsrfTokenHandler(this);
}
@Override
public void onBeforeRender()
{
super.onBeforeRender();
actionButtons.render();
}
protected void setComponentsVisibility()
{
if (parentPage.isSelectMode() == false) {
// Show cancel button only in select mode.
cancelButtonPanel.setVisible(false);
}
searchButtonPanel.setVisible(true);
resetButtonPanel.setVisible(true);
}
public TaskFilter getSearchFilter()
{
if (this.searchFilter == null) {
final Object filter = getParentPage().getUserPrefEntry(TaskListForm.class.getName() + ":Filter");
if (filter != null) {
try {
this.searchFilter = (TaskFilter) filter;
} catch (final ClassCastException ex) {
// Probably a new software release results in an incompability of old and new filter format.
log.info("Could not restore filter from user prefs: (old) filter type "
+ filter.getClass().getName()
+ " is not assignable to (new) filter type TaskFilter (OK, probably new software release).");
}
}
}
if (this.searchFilter == null) {
this.searchFilter = new TaskFilter();
getParentPage().putUserPrefEntry(TaskListForm.class.getName() + ":Filter", this.searchFilter, true);
}
return this.searchFilter;
}
@Override
protected void onSubmit()
{
super.onSubmit();
csrfTokenHandler.onSubmit();
parentPage.refresh();
}
@SuppressWarnings("serial")
private class MyCheckBoxPanel extends CheckBoxButton
{
public MyCheckBoxPanel(final String id, final IModel<Boolean> model, final String labelString)
{
super(id, model, labelString);
}
@Override
protected boolean wantOnSelectionChangedNotifications()
{
return true;
}
@Override
protected void onSelectionChanged(final Boolean newSelection)
{
parentPage.refresh();
}
}
}