| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.user.cellview.client; |
| |
| import com.google.gwt.cell.client.Cell.Context; |
| import com.google.gwt.dom.builder.shared.DivBuilder; |
| import com.google.gwt.dom.builder.shared.TableCellBuilder; |
| import com.google.gwt.dom.builder.shared.TableRowBuilder; |
| import com.google.gwt.dom.client.Style.OutlineStyle; |
| import com.google.gwt.user.cellview.client.AbstractCellTable.Style; |
| import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant; |
| import com.google.gwt.user.client.ui.HasVerticalAlignment.VerticalAlignmentConstant; |
| import com.google.gwt.view.client.SelectionModel; |
| |
| /** |
| * Default cell table builder that renders row values into a grid of columns. |
| * |
| * @param <T> the data type of the rows. |
| */ |
| public class DefaultCellTableBuilder<T> extends AbstractCellTableBuilder<T> { |
| |
| private final String evenRowStyle; |
| private final String oddRowStyle; |
| private final String selectedRowStyle; |
| private final String cellStyle; |
| private final String evenCellStyle; |
| private final String oddCellStyle; |
| private final String firstColumnStyle; |
| private final String lastColumnStyle; |
| private final String selectedCellStyle; |
| |
| public DefaultCellTableBuilder(AbstractCellTable<T> cellTable) { |
| super(cellTable); |
| |
| // Cache styles for faster access. |
| Style style = cellTable.getResources().style(); |
| evenRowStyle = style.evenRow(); |
| oddRowStyle = style.oddRow(); |
| selectedRowStyle = " " + style.selectedRow(); |
| cellStyle = style.cell(); |
| evenCellStyle = " " + style.evenRowCell(); |
| oddCellStyle = " " + style.oddRowCell(); |
| firstColumnStyle = " " + style.firstColumn(); |
| lastColumnStyle = " " + style.lastColumn(); |
| selectedCellStyle = " " + style.selectedRowCell(); |
| } |
| |
| @Override |
| public void buildRowImpl(T rowValue, int absRowIndex) { |
| |
| // Calculate the row styles. |
| SelectionModel<? super T> selectionModel = cellTable.getSelectionModel(); |
| boolean isSelected = |
| (selectionModel == null || rowValue == null) ? false : selectionModel.isSelected(rowValue); |
| boolean isEven = absRowIndex % 2 == 0; |
| StringBuilder trClasses = new StringBuilder(isEven ? evenRowStyle : oddRowStyle); |
| if (isSelected) { |
| trClasses.append(selectedRowStyle); |
| } |
| |
| // Add custom row styles. |
| RowStyles<T> rowStyles = cellTable.getRowStyles(); |
| if (rowStyles != null) { |
| String extraRowStyles = rowStyles.getStyleNames(rowValue, absRowIndex); |
| if (extraRowStyles != null) { |
| trClasses.append(" ").append(extraRowStyles); |
| } |
| } |
| |
| // Build the row. |
| TableRowBuilder tr = startRow(); |
| tr.className(trClasses.toString()); |
| |
| // Build the columns. |
| int columnCount = cellTable.getColumnCount(); |
| for (int curColumn = 0; curColumn < columnCount; curColumn++) { |
| Column<T, ?> column = cellTable.getColumn(curColumn); |
| // Create the cell styles. |
| StringBuilder tdClasses = new StringBuilder(cellStyle); |
| tdClasses.append(isEven ? evenCellStyle : oddCellStyle); |
| if (curColumn == 0) { |
| tdClasses.append(firstColumnStyle); |
| } |
| if (isSelected) { |
| tdClasses.append(selectedCellStyle); |
| } |
| // The first and last column could be the same column. |
| if (curColumn == columnCount - 1) { |
| tdClasses.append(lastColumnStyle); |
| } |
| |
| // Add class names specific to the cell. |
| Context context = new Context(absRowIndex, curColumn, cellTable.getValueKey(rowValue)); |
| String cellStyles = column.getCellStyleNames(context, rowValue); |
| if (cellStyles != null) { |
| tdClasses.append(" " + cellStyles); |
| } |
| |
| // Build the cell. |
| HorizontalAlignmentConstant hAlign = column.getHorizontalAlignment(); |
| VerticalAlignmentConstant vAlign = column.getVerticalAlignment(); |
| TableCellBuilder td = tr.startTD(); |
| td.className(tdClasses.toString()); |
| if (hAlign != null) { |
| td.align(hAlign.getTextAlignString()); |
| } |
| if (vAlign != null) { |
| td.vAlign(vAlign.getVerticalAlignString()); |
| } |
| |
| // Add the inner div. |
| DivBuilder div = td.startDiv(); |
| div.style().outlineStyle(OutlineStyle.NONE).endStyle(); |
| |
| // Render the cell into the div. |
| renderCell(div, context, column, rowValue); |
| |
| // End the cell. |
| div.endDiv(); |
| td.endTD(); |
| } |
| |
| // End the row. |
| tr.endTR(); |
| } |
| } |