use of com.github.bordertech.wcomponents.WTable in project wcomponents by BorderTech.
the class WTableRowRendererRenderer method doRender.
/**
* Paints the given WTableRowRenderer.
*
* @param component the WTableRowRenderer to paint.
* @param renderContext the RenderContext to paint to.
*/
@Override
public void doRender(final WComponent component, final WebXmlRenderContext renderContext) {
WTableRowRenderer renderer = (WTableRowRenderer) component;
XmlStringBuilder xml = renderContext.getWriter();
WTable table = renderer.getTable();
TableModel dataModel = table.getTableModel();
int[] columnOrder = table.getColumnOrder();
final int numCols = columnOrder == null ? table.getColumnCount() : columnOrder.length;
// Get current row details
RowIdWrapper wrapper = renderer.getCurrentRowIdWrapper();
List<Integer> rowIndex = wrapper.getRowIndex();
boolean tableSelectable = table.getSelectMode() != SelectMode.NONE;
boolean rowSelectable = tableSelectable && dataModel.isSelectable(rowIndex);
boolean rowSelected = rowSelectable && table.getSelectedRows().contains(wrapper.getRowKey());
boolean tableExpandable = table.getExpandMode() != WTable.ExpandMode.NONE;
boolean rowExpandable = tableExpandable && dataModel.isExpandable(rowIndex) && wrapper.hasChildren();
boolean rowExpanded = rowExpandable && table.getExpandedRows().contains(wrapper.getRowKey());
String rowIndexAsString = TableUtil.rowIndexListToString(rowIndex);
xml.appendTagOpen("ui:tr");
xml.appendAttribute("rowIndex", rowIndexAsString);
xml.appendOptionalAttribute("unselectable", !rowSelectable, "true");
xml.appendOptionalAttribute("selected", rowSelected, "true");
xml.appendOptionalAttribute("expandable", rowExpandable && !rowExpanded, "true");
xml.appendClose();
// wrote the column cell.
// need this before we get into the loop
boolean isRowHeader = table.isRowHeaders();
for (int i = 0; i < numCols; i++) {
int colIndex = columnOrder == null ? i : columnOrder[i];
WTableColumn col = table.getColumn(colIndex);
String cellTag = "ui:td";
if (col.isVisible()) {
if (isRowHeader) {
// The first rendered column will be the row header.
cellTag = "ui:th";
// only set one col as the row header.
isRowHeader = false;
}
xml.appendTag(cellTag);
renderer.getRenderer(colIndex).paint(renderContext);
xml.appendEndTag(cellTag);
}
}
if (rowExpandable) {
xml.appendTagOpen("ui:subtr");
xml.appendOptionalAttribute("open", rowExpanded, "true");
xml.appendClose();
if (rowExpanded || table.getExpandMode() == ExpandMode.CLIENT) {
renderChildren(renderer, renderContext, wrapper.getChildren());
}
xml.appendEndTag("ui:subtr");
}
xml.appendEndTag("ui:tr");
}
use of com.github.bordertech.wcomponents.WTable in project wcomponents by BorderTech.
the class WTableRenderer_Test method testXssEscaping.
@Test
public void testXssEscaping() throws IOException, SAXException, XpathException {
WTable table = new WTable();
table.addColumn(new WTableColumn(getMaliciousContent(), WText.class));
table.addColumn(new WTableColumn(getMaliciousContent(), WText.class));
table.addColumn(new WTableColumn(getMaliciousContent(), WText.class));
table.setNoDataMessage(getMaliciousAttribute("ui:table"));
UIContext uic = createUIContext();
assertSafeContent(table);
WButton button = new WButton("dummy");
table.addAction(button);
table.addActionConstraint(button, new ActionConstraint(0, 1, false, getMaliciousAttribute("ui:action")));
assertSafeContent(table);
TableModel tableModel = createTableModel();
table.setTableModel(tableModel);
// clear out cached data from previous renders
uic.clearScratchMap();
assertSafeContent(table);
table.setCaption(getMaliciousAttribute("ui:table"));
assertSafeContent(table);
}
use of com.github.bordertech.wcomponents.WTable in project wcomponents by BorderTech.
the class WTableRenderer_Test method testDoPaintMissingAttributesColumnStriping.
@Test
public void testDoPaintMissingAttributesColumnStriping() throws IOException, SAXException, XpathException {
WTable component = new WTable();
component.addColumn(new WTableColumn(COL1_HEADING_TEST, WTextField.class));
component.addColumn(new WTableColumn(COL2_HEADING_TEST, WTextField.class));
component.addColumn(new WTableColumn(COL3_HEADING_TEST, WTextField.class));
component.setTableModel(createTableModel());
component.setVisible(true);
component.setStripingType(WTable.StripingType.COLUMNS);
component.setSeparatorType(WTable.SeparatorType.VERTICAL);
assertXpathNotExists("//ui:table/@caption", component);
assertXpathEvaluatesTo("table", "//ui:table/@type", component);
assertXpathEvaluatesTo("cols", "//ui:table/@striping", component);
assertXpathEvaluatesTo("vertical", "//ui:table/@separators", component);
}
use of com.github.bordertech.wcomponents.WTable in project wcomponents by BorderTech.
the class WTableRenderer_Test method testDoPaintWithInvisibleColumnAndNoColumnHeaders.
@Test
public void testDoPaintWithInvisibleColumnAndNoColumnHeaders() throws IOException, SAXException, XpathException {
WTable component = new WTable();
component.addColumn(new WTableColumn(COL1_HEADING_TEST, WTextField.class));
component.addColumn(new WTableColumn(COL2_HEADING_TEST, WTextField.class));
component.addColumn(new WTableColumn(COL3_HEADING_TEST, WTextField.class));
TableModel tableModel = createTableModel();
component.setTableModel(tableModel);
component.setVisible(true);
final int testColIndex = 1;
final boolean testShowColHeaders = false;
component.getColumn(testColIndex).setVisible(false);
component.setShowColumnHeaders(testShowColHeaders);
// head hidden=true
assertXpathEvaluatesTo(TRUE, "//ui:table/ui:thead/@hidden", component);
// column headers - only COL1 and COL3 showing - in positions 1 and 2 respectively - only 2 cols
assertXpathEvaluatesTo(COL1_HEADING_TEST, "//ui:table/ui:thead/ui:th[1]/ui:decoratedlabel/ui:labelbody", component);
assertXpathEvaluatesTo(COL3_HEADING_TEST, "//ui:table/ui:thead/ui:th[2]/ui:decoratedlabel/ui:labelbody", component);
assertXpathNotExists("//ui:table/ui:thead/ui:th[3]/ui:decoratedlabel/ui:labelbody", component);
// first row - col1 and col3 from model in positions 1 and 2 respectively - only 2 cols showing
List<Integer> row = new ArrayList<>();
row.add(0);
String firstName = (String) tableModel.getValueAt(row, 0);
String entryDate = (String) tableModel.getValueAt(row, 2);
assertXpathEvaluatesTo(firstName, "//ui:table/ui:tbody/ui:tr[1]/ui:td[1]/ui:textfield", component);
assertXpathEvaluatesTo(entryDate, "//ui:table/ui:tbody/ui:tr[1]/ui:td[2]/ui:textfield", component);
assertXpathNotExists("//ui:table/ui:tbody/ui:tr[1]/ui:td[3]/ui:textfield", component);
}
use of com.github.bordertech.wcomponents.WTable in project wcomponents by BorderTech.
the class WTableRenderer_Test method testDoPaintToggleSubRowSelection.
@Test
public void testDoPaintToggleSubRowSelection() throws IOException, SAXException, XpathException {
WTable component = new WTable();
component.addColumn(new WTableColumn(COL1_HEADING_TEST, WTextField.class));
component.addColumn(new WTableColumn(COL2_HEADING_TEST, WTextField.class));
component.addColumn(new WTableColumn(COL3_HEADING_TEST, WTextField.class));
TableModel tableModel = createTableModel();
component.setTableModel(tableModel);
component.setVisible(true);
component.setSelectMode(WTable.SelectMode.MULTIPLE);
component.setToggleSubRowSelection(true);
component.setExpandMode(ExpandMode.CLIENT);
assertXpathExists("//ui:table/ui:rowselection", component);
assertXpathEvaluatesTo(TRUE, "//ui:table/ui:rowselection/@toggle", component);
}
Aggregations