package com.retailwave.fce.client.ui;
/**
* $Id: UserResultsTable.java 5 2010-06-03 11:07:35Z muthu $
* $HeadURL: svn://10.10.200.111:3691/Finance/tags/framework-snapshot1/fce/src/main/java/com/retailwave/fce/client/ui/UserResultsTable.java $
*/
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.gen2.table.client.*;
import com.google.gwt.gen2.table.client.AbstractScrollTable.SortPolicy;
import com.google.gwt.gen2.table.client.TableModelHelper.Request;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.HTML;
import com.retailwave.fce.client.content.user.SearchUser;
import com.retailwave.fce.shared.dto.UserDTO;
import com.retailwave.fce.shared.rpc.UserServiceRemote;
import com.retailwave.fce.shared.rpc.UserServiceRemoteAsync;
import com.retailwave.fce.client.util.UIHelper;
import java.util.List;
import java.util.Set;
/**
* UserResultsTable
* <p/>
* Paging scroll table to list search results for Users
*/
public class UserResultsTable extends DockLayoutPanel {
// todo: generify the list, so the results table can be reused across types
private PagingScrollTable<UserDTO> pagingScrollTable;
private CachedTableModel<UserDTO> cachedTableModel;
private DefaultTableDefinition<UserDTO> tableDefinition;
private SearchUser parentContentWidget;
private String action = SearchUser.actions[0];
private UserDTO userCriteriaDTO;
UserServiceRemoteAsync userServiceAsync = UserServiceRemote.App.getInstance();
/**
* Constructor.
*/
public UserResultsTable() {
super(Style.Unit.EM);
}
public void init(SearchUser contentWidget) {
parentContentWidget = contentWidget;
createPagingScrollTable();
final PagingOptions pagingOptions = new PagingOptions(pagingScrollTable);
addSouth(pagingOptions, 2);
add(pagingScrollTable);
// todo: bug fix.. the table layout gets messed up if its not visible right away (investigate uibinder layout issues)
// setVisible(false);
}
public void search(UserDTO criteria) {
UIHelper.scheduleProgress(SearchUser.uiConstants.searchProgressWait());
userCriteriaDTO = criteria;
cachedTableModel.clearCache();
cachedTableModel.setPreCachedRowCount(10);
// cachedTableModel.setPostCachedRowCount(10);
cachedTableModel.setRowCount(100);
if (null == criteria.getTypeSearch()) {
userServiceAsync.countUsers(new AsyncCallback<Integer>() {
@Override
public void onFailure(Throwable throwable) {
}
@Override
public void onSuccess(Integer integer) {
cachedTableModel.setRowCount(integer);
}
});
} else {
if (criteria.isPartnerUser()) {
userServiceAsync.countPartnerUsers(new AsyncCallback<Integer>() {
@Override
public void onFailure(Throwable throwable) {
}
@Override
public void onSuccess(Integer integer) {
cachedTableModel.setRowCount(integer);
}
});
} else {
userServiceAsync.countLexmarkUsers(new AsyncCallback<Integer>() {
@Override
public void onFailure(Throwable throwable) {
}
@Override
public void onSuccess(Integer integer) {
cachedTableModel.setRowCount(integer);
}
});
}
}
pagingScrollTable.setPageSize(10);
pagingScrollTable.gotoPage(0, true);
}
private PagingScrollTable<UserDTO> createPagingScrollTable() {
cachedTableModel = new CachedTableModel<UserDTO>(new DataSourceTableModel());
tableDefinition = createTableDefinition();
pagingScrollTable = new PagingScrollTable<UserDTO>(cachedTableModel, tableDefinition);
FixedWidthGridBulkRenderer<UserDTO> bulkRenderer =
new FixedWidthGridBulkRenderer<UserDTO>(pagingScrollTable.getDataTable(), pagingScrollTable);
pagingScrollTable.setBulkRenderer(bulkRenderer);
pagingScrollTable.setEmptyTableWidget(new HTML(SearchUser.uiConstants.searchEmpty()));
pagingScrollTable.setCellPadding(3);
pagingScrollTable.setCellSpacing(3);
// pagingScrollTable.setResizePolicy(ScrollTable.ResizePolicy.FILL_WIDTH);
// pagingScrollTable.setColumnResizePolicy(ScrollTable.ColumnResizePolicy.MULTI_CELL);
// note: sorting disabled for performance
// todo: revisit, if sorting required (note: sorting does not work due to bug.. investigate)
pagingScrollTable.setSortPolicy(SortPolicy.DISABLED);
// pagingScrollTable.setHeight("250px");
return pagingScrollTable;
}
private DefaultTableDefinition<UserDTO> createTableDefinition() {
tableDefinition = new
DefaultTableDefinition<UserDTO>();
String[] rowColors = new String[]{"#FFFFDD", "#EEEEEE"};
tableDefinition.setRowRenderer(new DefaultRowRenderer<UserDTO>(rowColors));
{
NameColumnDefinition colDef = new NameColumnDefinition();
colDef.setHeader(0, "Name");
colDef.setMinimumColumnWidth(75);
colDef.setColumnTruncatable(false);
tableDefinition.addColumnDefinition(colDef);
}
{
FullNameColumnDefinition colDef = new FullNameColumnDefinition();
colDef.setHeader(0, "Full Name");
colDef.setMinimumColumnWidth(100);
colDef.setColumnTruncatable(false);
tableDefinition.addColumnDefinition(colDef);
}
{
AbstractColumnDefinition<UserDTO, String> colDef = new EmailColumnDefinition();
colDef.setHeader(0, "Email");
colDef.setMinimumColumnWidth(100);
colDef.setColumnTruncatable(false);
tableDefinition.addColumnDefinition(colDef);
}
{
AbstractColumnDefinition<UserDTO, String> colDef = new UserTypeColumnDefinition();
colDef.setHeader(0, "Type");
colDef.setMinimumColumnWidth(45);
colDef.setPreferredColumnWidth(55);
colDef.setMaximumColumnWidth(70);
colDef.setColumnTruncatable(false);
tableDefinition.addColumnDefinition(colDef);
}
{
AbstractColumnDefinition<UserDTO, String> colDef = new ActiveColumnDefinition();
colDef.setHeader(0, "Active");
colDef.setMinimumColumnWidth(45);
colDef.setPreferredColumnWidth(45);
colDef.setMaximumColumnWidth(45);
colDef.setColumnTruncatable(false);
tableDefinition.addColumnDefinition(colDef);
}
{
AbstractColumnDefinition<UserDTO, String> colDef = new ActionColumnDefinition();
colDef.setHeader(0, "Action");
colDef.setMinimumColumnWidth(45);
colDef.setPreferredColumnWidth(55);
colDef.setMaximumColumnWidth(70);
final ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
// todo: operate in terms of raw generic type
Set<UserDTO> selectedRowValues = pagingScrollTable.getSelectedRowValues();
if (null != selectedRowValues && !selectedRowValues.isEmpty()) {
fireClickEvent(selectedRowValues.iterator().next());
}
}
};
CellRenderer<UserDTO, String> editCellRenderer = new CellRenderer<UserDTO, String>() {
@Override
public void renderRowValue(UserDTO user, ColumnDefinition<UserDTO, String> userStringColumnDefinition,
TableDefinition.AbstractCellView<UserDTO> userAbstractCellView) {
// local variable is required, for repeated rendition
// todo: investigate if button can be cached
Button editButton = new Button(action);
editButton.addClickHandler(clickHandler);
userAbstractCellView.setWidget(editButton);
}
};
colDef.setCellRenderer(editCellRenderer);
tableDefinition.addColumnDefinition(colDef);
}
return tableDefinition;
}
private void fireClickEvent(UserDTO userDTO) {
// todo: fire the modify userCriteriaDTO tree click event
if (SearchUser.actions[0].equalsIgnoreCase(action)) {
parentContentWidget.viewAction(userDTO);
} else if (SearchUser.actions[1].equalsIgnoreCase(action)) {
parentContentWidget.selectAction(userDTO);
} else {
parentContentWidget.actionPerformed(userDTO);
}
}
// column definitions
private final class NameColumnDefinition extends
AbstractColumnDefinition<UserDTO, String> {
@Override
public String getCellValue(UserDTO rowValue) {
return rowValue.getName();
}
@Override
public void setCellValue(UserDTO rowValue, String cellValue) {
rowValue.setName(cellValue);
}
}
private final class FullNameColumnDefinition extends
AbstractColumnDefinition<UserDTO, String> {
@Override
public String getCellValue(UserDTO rowValue) {
return rowValue.getFullName();
}
@Override
public void setCellValue(UserDTO rowValue, String cellValue) {
rowValue.setFullName(cellValue);
}
}
private final class EmailColumnDefinition extends
AbstractColumnDefinition<UserDTO, String> {
@Override
public String getCellValue(UserDTO rowValue) {
return rowValue.getEmailAddress();
}
@Override
public void setCellValue(UserDTO rowValue, String cellValue) {
rowValue.setEmailAddress(cellValue);
}
}
private final class UserTypeColumnDefinition extends
AbstractColumnDefinition<UserDTO, String> {
@Override
public String getCellValue(UserDTO rowValue) {
if (rowValue.isPartnerUser()) {
return "Partner";
} else {
return "Lexmark";
}
}
@Override
public void setCellValue(UserDTO rowValue, String cellValue) {
rowValue.setPartnerUser("Lexmark".equalsIgnoreCase(cellValue));
}
}
private final class ActiveColumnDefinition extends
AbstractColumnDefinition<UserDTO, String> {
@Override
public String getCellValue(UserDTO rowValue) {
if (rowValue.isActive()) {
return "Yes";
} else {
return "No";
}
}
@Override
public void setCellValue(UserDTO rowValue, String cellValue) {
rowValue.setPartnerUser("Yes".equalsIgnoreCase(cellValue));
}
}
private final class ActionColumnDefinition extends
AbstractColumnDefinition<UserDTO, String> {
@Override
public String getCellValue(UserDTO rowValue) {
return action;
}
@Override
public void setCellValue(UserDTO rowValue, String cellValue) {
// rowValue.setActive(cellValue);
}
}
public class DataSourceTableModel extends
MutableTableModel<UserDTO> {
@Override
protected boolean onRowInserted(int beforeRow) {
return true;
}
@Override
protected boolean onRowRemoved(int row) {
return true;
}
@Override
protected boolean onSetRowValue(int row, UserDTO rowValue) {
return true;
}
@Override
public void requestRows(final Request request,
final Callback<UserDTO> callback) {
userServiceAsync.searchUsers(userCriteriaDTO, request, new AsyncCallback<List<UserDTO>>() {
@Override
public void onFailure(Throwable throwable) {
UIHelper.cancelProgress();
UIHelper.showStatus(UIHelper.getUiConstants().searchFail());
}
@Override
public void onSuccess(List<UserDTO> results) {
TableModelHelper.SerializableResponse<UserDTO> response =
new TableModelHelper.SerializableResponse<UserDTO>(results);
// todo: fix a better paging options display strategy if available
// hack: do the size fixing here.. since size ahead of time is a problem without actually fetching them
int sz = results.size();
if (sz < 10) {
int rows = ((request.getStartRow() / pagingScrollTable.getPageSize()) * 10) + sz;
cachedTableModel.setRowCount(rows);
}
callback.onRowsReady(request, response);
setVisible(true);
UIHelper.cancelProgress();
pagingScrollTable.fillWidth();
}
});
}
}
}