Hey Johan,
thanks to your tip, I was able to locate the problem.
As what you said, each time the page was rendered, I added more checkboxes
to the list.
I am using fragment that add checkbox.
What I did instead, was, using a Map instead of a List:
Here is the change:
///// package and import ....
@SuppressWarnings("unchecked")
abstract class EntitiesPanel<E extends ConfigurationEntity> extends Panel {
private static final long serialVersionUID = -4638085092491297735L;
private static final int DEFAULT_PAGING = 100;
private final String configurationName;
private final Class browserClass;
private final boolean withSelect;
private final int paging;
/** True if all items are selected */
private boolean allChecked;
/** Maintains a list of checked items. */
private final List<EntityWrapper<E>> checkGroupModel = new
ArrayList<EntityWrapper<E>>();
/** The select-all check box * */
private MyAjaxCheckBox checkGroup;
/** Each select boc * */
/** The list of all entities* */
private List<EntityWrapper<E>> entitiesList;
/** The table * */
private DataTable entityDataTable;
*private final Map<EntityWrapper, EntityCheckBox> checkboxesMap;*
@SpringBean(name = "sageDalSecured")
protected SageDal sageDal;
EntitiesPanel(String id, String confName, Class browserClass) {
this(id, confName, browserClass, false, DEFAULT_PAGING);
}
EntitiesPanel(String id, String confName, Class browserClass, boolean
withSelect,
int paging) {
super(id);
add(HeaderContributor.forCss(EntitiesPanel.class, "EntitiesPanel.css
"));
...
this.withSelect = withSelect;
this.configurationName = confName;
this.browserClass = browserClass;
this.paging = paging;
entitiesList = new ArrayList<EntityWrapper<E>>();
checkboxesMap = new HashMap<EntityWrapper, EntityCheckBox>();
addCheckGroup();
}
final void addToPanel(Set<EntityWrapper<E>> wrappedEntities) {
setEntitiesList(wrappedEntities);
final boolean listEmpty = (entitiesList.size() == 0);
EntityDataProvider entitiesProvider = new
EntityDataProvider(entitiesList,
getLinkSortProp());
final List<String> allFields;
if (listEmpty) {
allFields = new ArrayList<String>();
} else {
allFields = getAllFields(configurationName);
}
createTable(entitiesProvider, allFields);
}
List<AbstractColumn> getColumnsForTable(List<String> allFields) {
List<AbstractColumn> columns = new ArrayList<AbstractColumn>();
for (String field : allFields) {
columns.add(createColumn(field));
}
return columns;
}
final PropertyColumn createColumn(final String fieldName) {
PropertyColumn p = new PropertyColumn(new
Model(getColumnHeader(fieldName)),
fieldName, fieldName) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item cellItem, String componentId,
IModel rowModel) {
ConfigurationEntity confEntity = ((EntityWrapper)
rowModel.getObject())
.getEntity();
...
Fragment frag = new CellEntityFrag(componentId, "cellFrag",
EntitiesPanel.this, strValue);
cellItem.add(frag);
}
};
return p;
}
/** Subclasses can override */
// protected void onUpdate(AjaxRequestTarget target) {
// }
// Private Methods
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();
}
*Collection<EntityCheckBox> checkboxes =
checkboxesMap.values();
for (EntityCheckBox check : checkboxes) {
check.setOutputMarkupId(true);
target.addComponent(check);
}*
for (EntityWrapper entity : entitiesList) {
entity.setSelect(isSelected);
}
// EntitiesPanel.this.onUpdate(target);
}
@Override
public boolean isVisible() {
return (withSelect && entitiesList != null &&
entitiesList.size() > 0);
}
};
checkGroup.setOutputMarkupId(true);
Label allSelectedLabel = new Label("allSelectedLabel", new
Model(Utils
.getLocalizationField("allSelected", "entities.label.")));
add(checkGroup);
add(allSelectedLabel);
}
private void createTable(EntityDataProvider entitiesProvider, final
List<String> allFields) {
List<AbstractColumn> columns = new ArrayList<AbstractColumn>();
if (entitiesProvider.size() == 0) {
columns.add(new AbstractColumn(new Model()) {
private static final long serialVersionUID = 1L;
public void populateItem(Item cellItem, String componentId,
IModel rowModel) {
}
});
} else {
if (withSelect) {
columns.add(createCheckboxColumn());
}
if (allFields.size() > 0) {
columns.add(createLinkColumn());
columns.addAll(getColumnsForTable(allFields));
}
}
IColumn[] columnsArray = (IColumn[]) columns.toArray(new
IColumn[0]);
entityDataTable = new DataTable("entitiesList", columnsArray,
entitiesProvider, paging);
add(entityDataTable);
}
private AbstractColumn createCheckboxColumn() {
AbstractColumn p = new AbstractColumn(new Model()) {
private static final long serialVersionUID = 1L;
private CheckboxEntityFrag frag;
public void populateItem(Item cellItem, String componentId,
IModel rowModel) {
EntityWrapper confEntity = (EntityWrapper)
rowModel.getObject();
frag = new CheckboxEntityFrag(componentId, "checkboxFrag",
EntitiesPanel.this,
confEntity);
cellItem.add(frag);
}
};
return p;
}
private PropertyColumn createLinkColumn() {
PropertyColumn p = new PropertyColumn(new Model(getLinkHeader()),
getLinkSortProp(),
getLinkHeader()) {
private static final long serialVersionUID = 11L;
@Override
public void populateItem(Item cellItem, String componentId,
IModel rowModel) {
ConfigurationEntity confEntity = ((EntityWrapper)
rowModel.getObject())
.getEntity();
Fragment frag = new LinkFrag(componentId, "linkFrag",
EntitiesPanel.this,
confEntity);
cellItem.add(frag);
}
};
return p;
}
*private EntityCheckBox getEntityCheckBox(final EntityWrapper
entityWrapper) {
EntityCheckBox checkbox = checkboxesMap.get(entityWrapper);
if (checkbox == null) {
// null indicates that the map doesn't contain this key
checkbox = new EntityCheckBox(entityWrapper);
checkboxesMap.put(entityWrapper, checkbox);
}
return checkbox;
}*
// Fragment Classes
private class LinkFrag extends Fragment {
private static final long serialVersionUID = 1L;
private LinkFrag(String id, String markupId, MarkupContainer
markupProvider,
ConfigurationEntity confEntity) {
super(id, markupId, markupProvider);
PageParameters params = new PageParameters();
params.put("configurationName", configurationName);
putOtherParams(params, confEntity);
PopupSettings popupSettings = new BrowserPopupSettings();
Link linkToEntity = new BookmarkablePageLink("linkToEntity",
browserClass, params)
.setPopupSettings(popupSettings);
Label label = new Label("markupLabel", new
Model(getLinkLabel(confEntity)));
linkToEntity.add(label);
add(linkToEntity);
}
}
private class CellEntityFrag extends Fragment {
private static final long serialVersionUID = 1L;
private CellEntityFrag(String id, String markupId, MarkupContainer
markupProvider,
String value) {
super(id, markupId, markupProvider);
Label label = new Label("value", new Model(value));
add(label);
}
}
private class CheckboxEntityFrag extends Fragment {
private static final long serialVersionUID = 1L;
private CheckboxEntityFrag(String id, String markupId,
MarkupContainer markupProvider,
final EntityWrapper entityWrapper) {
super(id, markupId, markupProvider);
*final EntityCheckBox checkbox =
getEntityCheckBox(entityWrapper);*
add(checkbox);
}
}
// Getters and Setters
public boolean isAllChecked() {
return allChecked;
}
public void setAllChecked(boolean allChecked) {
this.allChecked = allChecked;
}
public List<EntityWrapper<E>> getCheckGroupModel() {
return checkGroupModel;
}
public List<EntityWrapper<E>> getEntitiesList() {
return entitiesList;
}
public final void setEntitiesList(Collection<EntityWrapper<E>>
entitiesList) {
this.entitiesList.clear();
this.entitiesList.addAll(entitiesList);
}
// Abstract methods
abstract String getColumnHeader(String fieldName);
abstract String getLinkHeader();
abstract String getLinkLabel(ConfigurationEntity confEntity);
abstract void putOtherParams(PageParameters params, ConfigurationEntity
confEntity);
abstract List<String> getAllFields(String configurationName);
abstract String getLinkSortProp();
// Private Clases
private class EntityCheckBox extends MyAjaxCheckBox {
private static final long serialVersionUID = -3711335571709705139L;
final EntityWrapper entityWrapper;
private EntityCheckBox(final EntityWrapper entityWrapper) {
super("entityCheckbox", new PropertyModel(entityWrapper,
"select"));
this.entityWrapper = entityWrapper;
}
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (isChecked()) {
if (!checkGroupModel.contains(entityWrapper))
checkGroupModel.add(entityWrapper);
} else {
checkGroupModel.remove(entityWrapper);
}
setAllChecked(checkGroupModel.size() == entitiesList.size());
checkGroup.setOutputMarkupId(true);
target.addComponent(checkGroup);
// EntitiesPanel.this.onUpdate(target);
}
}
}
--
Eyal Golan
[EMAIL PROTECTED]
Visit: http://jvdrums.sourceforge.net/