We did this by implementing getHeader(String componentId) in a custom
CheckBoxColumn that implements IColumn to return a new panel that renders a
checkbox.
Note that we are are using custromized DataTable, but the code below should
be enough to demonstrate how to add a checkbox in the column header. It's a
bit dated and could be improved, but you get the idea.
CheckboxColum extends ICustomColumn {
..
..
@Override
public Component getHeader(String componentId) {
return new CheckboxHeader(this, componentId);
}
}
public class CheckboxHeader extends Panel {
private CheckboxColumn checkboxColumn;
public CheckboxHeader(CheckboxColumn checkboxColumn, String id) {
super(id);
this.checkboxColumn = checkboxColumn;
}
@Override
protected void onBeforeRender() {
if (!hasBeenRendered()) {
//refactor: simplify this
add(new HeadCheckboxPanel("checkbox", checkboxColumn));
add(new EmptySpacerTag("spacer"));
}
super.onBeforeRender();
}
private class EmptySpacerTag extends WebMarkupContainer {
public EmptySpacerTag(String id) {
super(id);
}
@Override
public boolean isVisible() {
return !checkboxColumn.getDataTable().isAllowSelectMultiple();
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
processTitleTag(tag);
}
private void processTitleTag(ComponentTag tag) {
if (checkboxColumn.getHeaderTooltipModel() != null) {
Object object =
checkboxColumn.getHeaderTooltipModel().getObject();
if (object != null) {
tag.put("title", object.toString());
}
}
}
}
public class HeadCheckboxPanel extends Panel {
private ICustomColumn column;
public HeadCheckboxPanel(String id, final CheckboxColumn checkboxColumn)
{
super(id);
this.column = checkboxColumn;
}
@Override
protected void onBeforeRender() {
if (!hasBeenRendered()) {
add(new SelectAllCheckboxTag("checkbox"));
}
super.onBeforeRender();
}
@Override
public boolean isVisible() {
return column.getDataTable().isAllowSelectMultiple();
}
private class SelectAllCheckboxTag extends WebMarkupContainer {
public SelectAllCheckboxTag(String id) {
super(id);
}
@Override
protected void onBeforeRender() {
if (!hasBeenRendered()) {
add(new CheckboxOnclickEventBehavior());
}
super.onBeforeRender();
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
processCheckedTag(tag);
}
private void processCheckedTag(ComponentTag tag) {
if (column.getDataTable().isAallVisibleItemsSelected()) {
tag.put("checked", "checked");
}
}
}
private class CheckboxOnclickEventBehavior extends
AjaxFormSubmitEventAdapterBehavior {
public CheckboxOnclickEventBehavior() {
super(HeadCheckboxPanel.this.column.getDataTable().getForm(),
"onclick");
}
@Override
protected void onEvent(AjaxRequestTarget target) {
preserveFormComponentInput();
boolean checked =
Strings.toBoolean(getRequest().getParameter("checked"));
if (checked) {
column.getDataTable().selectAllVisibleItems();
} else {
column.getDataTable().resetSelectedItems();
}
column.getDataTable().update();
}
@Override
public CharSequence getCallbackUrl() {
return super.getCallbackUrl() + "&checked='+this.checked+'";
}
@Override
protected CharSequence getPreconditionScript() {
return
"window.setTimeout(function(){this.checked=!this.checked}.bind(this),0);" +
super.getPreconditionScript();
}
@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
return new CancelEventIfNoAjaxDecorator();
}
private void preserveFormComponentInput() {
Form form = getForm();
form.visitFormComponentsPostOrder(new
PreserveFormComponentInputvisitor());
}
}
}
--
View this message in context:
http://apache-wicket.1842946.n4.nabble.com/Checkbox-in-DataTable-header-tp3335032p3339269.html
Sent from the Users forum mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]