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]

Reply via email to