Sheet provides ajax events for cellSelect, change, sort, filter, columnSelect, rowSelect.
Click on a header once to select it, then you may move columns around when the hand icon appears.
Source
<pe:sheet id="sheet" widgetVar="sheetWidget" value="#{sheetAjaxController.assets}"
var="row" height="400" rowKey="#{row.assetId}" showRowHeaders="true"
sortBy="#{row.assetId}" sortOrder="ascending" width="1000"
stretchH="all" movableCols="true" movableRows="true"
filteredValue="#{sheetAjaxController.filteredAssets}">
<p:ajax event="change" listener="#{sheetAjaxController.cellChangeEvent}"/>
<p:ajax event="columnSelect" listener="#{sheetAjaxController.columnSelectEvent}"/>
<p:ajax event="rowSelect" listener="#{sheetAjaxController.rowSelectEvent}"/>
<f:facet name="header">
<h:outputText value="Assets"/>
</f:facet>
<f:facet name="footer">
<h:outputText value="#{sheetAjaxController.filteredAssets.size()} Records"/>
</f:facet>
<pe:sheetcolumn headerText="Id (readOnly)" readOnly="true" value="#{row.assetId}" colWidth="150"/>
<pe:sheetcolumn headerText="Type (readOnly)" value="#{row.assetType}" readOnly="true" colWidth="100"/>
<pe:sheetcolumn headerText="Platform (readOnly)" value="#{row.platform}" readOnly="true" colWidth="100"/>
<pe:sheetcolumn headerText="Arch (readOnly)" value="#{row.platformArch}" readOnly="true" colWidth="100"/>
<pe:sheetcolumn headerText="Editable" value="#{row.value1}" colWidth="100" styleClass="htRight" colType="numeric"/>
</pe:sheet>
@Named
@ViewScoped
public class SheetAjaxController extends SheetController {
private static final long serialVersionUID = 20120224L;
/**
* Ajax callback from the Sheet component when a cell value is changed.
*/
@Override
public void cellChangeEvent(final SheetEvent event) {
final Sheet sheet = event.getSheet();
final List<SheetUpdate> updates = sheet.getUpdates();
// only show 1 update
SheetUpdate sheetUpdate = IterableUtils.first(updates);
final Long id = (Long) sheetUpdate.getRowKey();
final Object oldValue = sheetUpdate.getOldValue();
final Object newValue = sheetUpdate.getNewValue();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Update Success",
String.format("Asset %s updated. Old Value = %s, New Value = %s", id, oldValue, newValue)));
sheet.commitUpdates();
}
/**
* Ajax callback from the Sheet component when a column is selected.
*/
public static void columnSelectEvent(final SheetEvent event) {
final Sheet sheet = event.getSheet();
final int column = sheet.getSelectedColumn() + 1;
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Column Selected", String.format("Column %d selected.", column)));
}
/**
* Ajax callback from the Sheet component when a row is selected.
*/
public static void rowSelectEvent(final SheetEvent event) {
final Sheet sheet = event.getSheet();
final int row = sheet.getSelectedRow() + 1;
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Row Selected", String.format("Row %d selected.", row)));
}
public static void validateExactly5(final FacesContext context, final UIComponent comp, final Object value) {
if (context == null || comp == null) {
return;
}
final Integer integer = (Integer) value;
if (integer.intValue() != 5) {
final FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
"Value must only be 5 exactly!");
throw new ValidatorException(message);
}
}
}