package com.gwt.ui.client.masterview;
import java.util.List;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class GridRenderer {
private static final String GRID_STYLE = "masterview-grid";
private static final String GRID_HEADER_STYLE = "masterview-grid-header";
private static final String GRID_ROW_HIGHLIGHT_STYLE = "masterview-grid-row-highlight";
private static final String GRID_ROW_EVEN_STYLE = "masterview-grid-row-even";
private static final String GRID_ROW_ODD_STYLE = "masterview-grid-row-odd";
private static final String GRID_HEADER_CELL_STYLE = "masterview-grid-header-cell";
private static final String GRID_ROW_CELL_STYLE = "masterview-grid-row-cell";
private static final String GRID_CELL_ASCENDING_SORTING_STYLE = "masterview-grid-sorted-asc";
private static final String GRID_CELL_DESCENDING_SORTING_STYLE = "masterview-grid-sorted-desc";
private static final String GRID_FILTER_ROW_STYLE = "masterview-grid-filter";
private static final String GRID_FILTER_TEXTBOX_STYLE = "masterview-grid-filter-textbox";
private final DataSource dataSource;
private final Grid grid;
public GridRenderer(DataSource dataSource, Grid grid) {
this.dataSource = dataSource;
this.grid = grid;
}
public String getRowStyle(int row) {
if (row % 2 == 0) {
return GRID_ROW_EVEN_STYLE;
} else {
return GRID_ROW_ODD_STYLE;
}
}
public void highlightRow(int rowNumber) {
if (rowNumber >= grid.getFirstRowWithDataNumber()) {
if (!(grid.isSelectionEnabled() && grid.getSelectedRow() == rowNumber))
grid.getRowFormatter().setStyleName(rowNumber, getRowHighlightStyle());
}
}
public void cancelRowHighlighting(int rowNumber) {
if (rowNumber >= grid.getFirstRowWithDataNumber()) {
if (!grid.isSelectionEnabled()) {
grid.getRowFormatter().setStyleName(rowNumber, getRowStyle(rowNumber));
} else {
if (grid.getSelectedRow() != rowNumber)
grid.getRowFormatter().setStyleName(rowNumber, getRowStyle(rowNumber));
}
}
}
@SuppressWarnings("unchecked")
public void renderHeader(List columns) {
int baseColumn = 0;
for (int i = 0; i < columns.size(); i++) {
Column column = (Column)columns.get(i);
if (!column.isWidget()) {
grid.setText(0, baseColumn + i, column.getTitle());
} else {
grid.setWidget(0, baseColumn + i, column.getWidget());
}
grid.getCellFormatter().setStyleName(0, baseColumn + i, GRID_HEADER_CELL_STYLE);
if (!column.getWidth().equals("")) {
grid.getCellFormatter().setWidth(0, baseColumn + i, column.getWidth());
}
}
grid.getRowFormatter().setStyleName(0, getHeaderStyle());
}
@SuppressWarnings("unchecked")
public void renderFilters(List columns) {
int baseColumn = 0;
for (int i = 0; i < columns.size(); i++) {
final Column column = (Column)columns.get(i);
final TextBox filterTextBox = new TextBox();
filterTextBox.setWidth("100%");
filterTextBox.setText("Filter is not set...");
filterTextBox.addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent arg0) {
if (filterTextBox.getText().equals("Filter is not set...")) {
filterTextBox.setText("");
}
}
});
filterTextBox.addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent arg0) {
if (filterTextBox.getText().matches("[*]*")) {
filterTextBox.setText("Filter is not set...");
grid.removeFilter(column);
} else {
grid.applyFilter(column, filterTextBox.getText());
}
}
});
filterTextBox.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
if (filterTextBox.getText().matches("[*]*")) {
grid.removeFilter(column);
} else {
grid.applyFilter(column, filterTextBox.getText());
}
}
});
filterTextBox.setStyleName(getFilterTextBoxStyle());
if (column.hideFiltre) {
filterTextBox.setVisible(false);
}
grid.setWidget(1, baseColumn + i, filterTextBox);
/*grid.getCellFormatter().setStyleName(0, baseColumn + i, GRID_HEADER_CELL_STYLE);*/
if (!column.getWidth().equals("")) {
grid.getCellFormatter().setWidth(1, baseColumn + i, column.getWidth());
}
}
grid.getRowFormatter().setStyleName(1, getFilterStyle());
}
private String getFilterTextBoxStyle() {
return GRID_FILTER_TEXTBOX_STYLE;
}
public String getFilterStyle() {
return GRID_FILTER_ROW_STYLE;
}
@SuppressWarnings("unchecked")
protected void renderEmptyBody(List columns) {
grid.setText(grid.getFirstRowWithDataNumber(), 0, "");
grid.getRowFormatter().setStyleName(grid.getFirstRowWithDataNumber(), getRowStyle(1));
grid.getFlexCellFormatter().setColSpan(grid.getFirstRowWithDataNumber(), 0, columns.size());
}
@SuppressWarnings("unchecked")
public int renderItems(List columns, DataSource dataSource) {
if (dataSource.isEmpty()) {
renderEmptyBody(columns);
return 1;
}
int baseColumn = 0;
int itemsCount = dataSource.getDisplayData().size();
int rowNumber = grid.getFirstRowWithDataNumber();
for (int itemNumber = 0; itemNumber < itemsCount; itemNumber++) {
Object item = dataSource.getDisplayData().get(itemNumber);
for (int columnNumber = 0; columnNumber < columns.size(); columnNumber++) {
Column column = (Column)columns.get(baseColumn + columnNumber);
Object cellContent = dataSource.getPropertyMapper().getProperty(item, column.getPropertyName());
if (cellContent instanceof Widget) {
grid.setWidget(rowNumber, baseColumn + columnNumber, (Widget)cellContent);
} else {
grid.setText(rowNumber, baseColumn + columnNumber, cellContent.toString());
}
grid.getCellFormatter().setStyleName(rowNumber, baseColumn + columnNumber, GRID_ROW_CELL_STYLE);
if (!column.getWidth().equals("")) {
grid.getCellFormatter().setWidth(rowNumber, baseColumn + columnNumber, column.getWidth());
}
}
grid.getRowFormatter().setStyleName(rowNumber, getRowStyle(rowNumber));
rowNumber++;
}
return itemsCount;
}
/** override this for cutomization */
public String getGridStyle() {
return GRID_STYLE;
}
/** override this for cutomization */
public String getHeaderStyle() {
return GRID_HEADER_STYLE;
}
/** override this for cutomization */
public String getRowHighlightStyle() {
return GRID_ROW_HIGHLIGHT_STYLE;
}
/** override this for cutomization */
public String getCellAscendingSortingStyle() {
return GRID_CELL_ASCENDING_SORTING_STYLE;
}
/** override this for cutomization */
public String getHeaderCellStyle() {
return GRID_HEADER_STYLE;
}
/** override this for cutomization */
public String getCellDescendingSortingStyle() {
return GRID_CELL_DESCENDING_SORTING_STYLE;
}
}