}
// Hack until https://issues.apache.org/jira/browse/MYFACES-3410 is resolved: move the Collection into a temporary
// variable
HtmlPanelGroup panelGroup = new HtmlPanelGroup();
FaceletsParam param = new FaceletsParam();
param.putAttribute("name", COLLECTION_VAR);
param.putAttribute("value", tableValueExpression);
panelGroup.getChildren().add(param);
// Special support for non-Lists
if (!List.class.isAssignableFrom(clazz))
{
valueHolderTable.setValue(StaticFacesUtils.wrapExpression("forgeview:asList(" + COLLECTION_VAR + ")"));
}
else
{
valueHolderTable.setValue(StaticFacesUtils.wrapExpression(COLLECTION_VAR));
}
panelGroup.getChildren().add(dataTable);
// If not bidirectional, create an 'Add' section (bidirectional does it 'in place')
if (!attributes.containsKey(INVERSE_RELATIONSHIP))
{
HtmlPanelGrid panelGrid = new HtmlPanelGrid();
panelGrid.putAttribute("styleClass", "data-table-footer");
panelGrid.putAttribute("columns", "2");
panelGrid.putAttribute("columnClasses", ",remove-column");
// Select menu at bottom
HtmlSelectOneMenu select = new HtmlSelectOneMenu();
String selectId = dataTable.getAttribute("id") + "Select";
select.putAttribute("id", selectId);
String requestScopedValue = "requestScope['" + selectId + "']";
select.setValue(StaticFacesUtils.wrapExpression(requestScopedValue));
String simpleComponentType = ClassUtils.getSimpleName(componentType);
String controllerName = StringUtils.decapitalize(simpleComponentType);
select.setConverter(StaticFacesUtils.wrapExpression(controllerName + "Bean.converter"));
Map<String, String> emptyAttributes = CollectionUtils.newHashMap();
addSelectItems(select, StaticFacesUtils.wrapExpression(controllerName + "Bean.all"), emptyAttributes);
panelGrid.getChildren().add(select);
// Create 'Add' button
HtmlCommandLink addLink = new HtmlCommandLink();
addLink.putAttribute("styleClass", "add-button");
String addExpression = COLLECTION_VAR + ".add(" + requestScopedValue + ")";
addLink.putAttribute("action", StaticFacesUtils.wrapExpression(addExpression));
addLink.putAttribute("onclick", "if (document.getElementById(document.forms[0].id+':" + selectId
+ "').selectedIndex < 1) { alert('Must select a " + StringUtils.uncamelCase(simpleComponentType)
+ "'); return false; }");
// (id is useful for unit tests)
addLink.putAttribute("id", dataTable.getAttribute("id") + "Add");
panelGrid.getChildren().add(addLink);
panelGroup.getChildren().add(panelGrid);
}
return panelGroup;
}