package ilarkesto.gwt.client; import ilarkesto.gwt.client.editor.ABooleanEditorModel; import ilarkesto.gwt.client.editor.ADateAndTimeEditorModel; import ilarkesto.gwt.client.editor.ADateEditorModel; import ilarkesto.gwt.client.editor.AIntegerEditorModel; import ilarkesto.gwt.client.editor.ATextEditorModel; import ilarkesto.gwt.client.editor.DateAndTimeEditorWidget; import ilarkesto.gwt.client.editor.DateEditorWidget; import ilarkesto.gwt.client.editor.IntegerEditorWidget; import ilarkesto.gwt.client.editor.RichtextEditorWidget; import ilarkesto.gwt.client.editor.TextEditorWidget; import ilarkesto.gwt.client.editor.YesNoEditorWidget; import java.util.ArrayList; import java.util.List; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTMLTable.ColumnFormatter; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant; import com.google.gwt.user.client.ui.Widget; public class TableBuilder { private Row currentRow = new Row(); private List<Row> rows = new ArrayList<Row>(); private String width = "100%"; private String[] columnWidths; private int cellSpacing; private int cellPadding; private boolean centered; public TableBuilder() {} public FlexTable createTable() { if (!currentRow.cells.isEmpty()) nextRow(); FlexTable table = new FlexTable(); table.setCellSpacing(cellSpacing); table.setCellPadding(cellPadding); if (centered) table.getElement().setAttribute("align", "center"); String widthAsString = width == null ? "" : width; table.setWidth(widthAsString); table.getElement().setAttribute("width", widthAsString); if (columnWidths != null) { ColumnFormatter columnFormatter = table.getColumnFormatter(); for (int i = 0; i < columnWidths.length; i++) { columnFormatter.setWidth(i, columnWidths[i]); } } int rowIndex = 0; for (Row row : rows) { int colIndex = 0; for (Cell cell : row.cells) { table.setWidget(rowIndex, colIndex, cell.widget); if (cell.colspan > 1) table.getFlexCellFormatter().setColSpan(rowIndex, colIndex, cell.colspan); if (cell.align != null) { table.getCellFormatter().setHorizontalAlignment(rowIndex, colIndex, cell.align); } colIndex += cell.colspan; } rowIndex++; } return table; } public void setColumnWidths(int... columnWidths) { this.columnWidths = new String[columnWidths.length]; for (int i = 0; i < columnWidths.length; i++) { this.columnWidths[i] = columnWidths[i] + "px"; } } public void setColumnWidths(String... columnWidths) { this.columnWidths = columnWidths; } public TableBuilder addFieldRow(String label, ATextEditorModel model, int colspan) { addField(label, model, colspan); nextRow(); return this; } public TableBuilder addFieldRow(String label, Widget value, int colspan) { addField(label, value, colspan); nextRow(); return this; } public TableBuilder addFieldRow(String label, ATextEditorModel model) { addField(label, model, 1); nextRow(); return this; } public TableBuilder addFieldRow(String label, AIntegerEditorModel model) { addField(label, model, 1); nextRow(); return this; } public TableBuilder addFieldRow(String label, ABooleanEditorModel model) { addField(label, model, 1); nextRow(); return this; } public TableBuilder addFieldRow(String label, ADateAndTimeEditorModel model) { addField(label, model, 1); nextRow(); return this; } public TableBuilder addFieldRow(String label, ADateEditorModel model) { addField(label, model, 1); nextRow(); return this; } public TableBuilder addFieldRow(String label, Widget value) { addField(label, value); nextRow(); return this; } public TableBuilder addField(String label, Widget value) { addFieldLabel(label); add(value); return this; } public TableBuilder addField(String label, ATextEditorModel model, int colspan) { Widget editor; if (model.isRichtext()) { editor = new RichtextEditorWidget(model); } else { editor = new TextEditorWidget(model); if (model.isMandatory()) { ((TextEditorWidget) editor).switchToEditModeIfNull(); } } // if (model.isRichtext()) { // FlowPanel panel = new FlowPanel(); // panel.add(Gwt.createFieldLabel(label)); // panel.add(editor); // return add(panel, colspan + 1); // } else { // } return addField(label, editor, colspan); } public TableBuilder addField(String label, ADateAndTimeEditorModel model, int colspan) { return addField(label, new DateAndTimeEditorWidget(model), colspan); } public TableBuilder addField(String label, ADateEditorModel model) { return addField(label, model, 1); } public TableBuilder addField(String label, ADateEditorModel model, int colspan) { return addField(label, new DateEditorWidget(model), colspan); } public TableBuilder addField(String label, AIntegerEditorModel model) { return addField(label, new IntegerEditorWidget(model), 1); } public TableBuilder addField(String label, AIntegerEditorModel model, int colspan) { return addField(label, new IntegerEditorWidget(model), colspan); } public TableBuilder addField(String label, ABooleanEditorModel model, int colspan) { return addField(label, new YesNoEditorWidget(model), colspan); } public TableBuilder addField(String label, Widget value, int colspan) { addFieldLabel(label); add(value, colspan, null); return this; } public TableBuilder addFieldLabel(String text) { add(Gwt.createFieldLabel(text), 1, HasHorizontalAlignment.ALIGN_RIGHT); return this; } public TableBuilder addRow(Widget widget, int colspan) { add(widget, colspan, null); nextRow(); return this; } public TableBuilder addRow(Widget... widgets) { add(widgets); nextRow(); return this; } public TableBuilder add(Widget... widgets) { for (Widget widget : widgets) { add(widget); } return this; } public TableBuilder add(Widget widget) { return add(widget, 1, null); } public TableBuilder add(Widget widget, int colspan) { return add(widget, colspan, null); } public TableBuilder add(Widget widget, int colspan, HorizontalAlignmentConstant align) { Cell cell = new Cell(); cell.widget = widget; cell.align = align; cell.colspan = colspan; currentRow.cells.add(cell); return this; } public TableBuilder nextRow() { rows.add(currentRow); currentRow = new Row(); return this; } public void setWidth(String width) { this.width = width; } public void setCellSpacing(int cellSpacing) { this.cellSpacing = cellSpacing; } public void setCellPadding(int cellPadding) { this.cellPadding = cellPadding; } public void setCentered(boolean centered) { this.centered = centered; if (centered) setWidth(null); } private static class Row { private List<Cell> cells = new ArrayList<Cell>(); } private static class Cell { private Widget widget; private int colspan = 1; private HorizontalAlignmentConstant align; } public static FlexTable row(int spacing, Widget... widgets) { return row(true, spacing, widgets); } public static FlexTable row(boolean width100, int spacing, Widget... widgets) { assert widgets.length > 0; TableBuilder tb = new TableBuilder(); if (!width100) tb.setWidth(null); if (widgets.length == 1) { tb.add(widgets[0]); return tb.createTable(); } int columnWidth = 100 / widgets.length; String[] widths = new String[(widgets.length * 2) - 1]; int colIndex = 0; for (int i = 0; i < widgets.length; i++) { if (colIndex > 0) { widths[colIndex] = spacing + "pt"; colIndex++; } widths[colIndex] = columnWidth + "%"; colIndex++; } tb.setColumnWidths(widths); boolean first = true; for (Widget widget : widgets) { if (first) { first = false; } else { tb.add(Gwt.createSpacer(spacing, 1)); } tb.add(widget); } tb.nextRow(); return tb.createTable(); } public static FlexTable column(int spacing, Widget... widgets) { assert widgets.length > 0; TableBuilder tb = new TableBuilder(); boolean first = true; for (Widget widget : widgets) { if (first) { first = false; } else { tb.addRow(Gwt.createSpacer(1, spacing)); } tb.addRow(widget); } return tb.createTable(); } }