Hi,
I made a select-all check box inside a table.
I used the example from
http://javathoughts.capesugarbird.com/2007/09/ajax-select-all-checkbox-for-wicket.html
It works well in most cases.
Here's some code:
Adding the checkgroup to the panel:
private void addCheckGroup() {
checkGroup = new MyAjaxCheckBox("allChecked", new
PropertyModel(this, "allChecked")) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
final boolean isSelected = isChecked();
if (isSelected) {
checkGroupModel.addAll(entitiesList);
} else {
checkGroupModel.clear();
}
for (MyAjaxCheckBox check : checkboxes) {
check.setOutputMarkupId(true);
target.addComponent(check);
}
for (EntityWrapper entity : entitiesList) {
entity.setSelect(isSelected);
}
// target.addComponent(EntitiesPanel.this);
EntitiesPanel.this.onUpdate(target);
}
@Override
public boolean isVisible() {
return (withSelect && entitiesList != null &&
entitiesList.size() > 0);
}
};
checkGroup.setOutputMarkupId(true);
// checkGroup.setVisible(false);
add(checkGroup);
}
The Checkbox column inside the table, and the fragment it uses:
private AbstractColumn createCheckboxColumn() {
AbstractColumn p = new AbstractColumn(new Model()) {
private static final long serialVersionUID = 1L;
public void populateItem(Item cellItem, String componentId,
IModel rowModel) {
EntityWrapper confEntity = (EntityWrapper)
rowModel.getObject();
Fragment frag = new CheckboxEntityFrag(componentId,
"checkboxFrag",
EntitiesPanel.this, confEntity);
cellItem.add(frag);
}
};
return p;
}
private CheckboxEntityFrag(String id, String markupId,
MarkupContainer markupProvider,
final EntityWrapper value) {
super(id, markupId, markupProvider);
checkbox = new MyAjaxCheckBox("entityCheckbox", new
PropertyModel(value, "select")) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (isChecked()) {
if (!checkGroupModel.contains(value))
checkGroupModel.add(value);
} else {
checkGroupModel.remove(value);
}
setAllChecked(checkGroupModel.size() ==
entitiesList.size());
checkGroup.setOutputMarkupId(true);
target.addComponent(checkGroup);
EntitiesPanel.this.onUpdate(target);
}
};
add(checkbox);
checkboxes.add(checkbox);
}
}
The problem:
someone else uses my panel for his purposes.
He has a page (search page) that has my panel (with the table and the
checkboxes).
His page has a navigation button - NEXT that uses setResponsePage.
The next page has a PREV button to go back.
Going back is also with setResponsePage WITH THE ORIGINAL one.
The scenario:
Open the search page (with my panel) - the 'select-all' work fine.
Press next.
Press back.
Press the 'select-all' again.
I get an exception: java.lang.IllegalStateException: No Page found for
component [MarkupContainer [Component id = entityCheckbox, page = <No Page>,
path = 1:cells:1:cell:entityCheckbox.EntitiesPanel$CheckboxEntityFrag$1]]
Is there something in a page's component's life cycle that I'm missing?
Hope it's clear.
(I'll be away for a few days so bare with me if I'm not answering)
Thanks
--
Eyal Golan
[EMAIL PROTECTED]
Visit: http://jvdrums.sourceforge.net/