/** * Copyright 2008-2016 Qualogy Solutions B.V. * * 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.qualogy.qafe.mgwt.client.ui.component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.ui.UIObject; import com.googlecode.mgwt.ui.client.widget.CellList; import com.googlecode.mgwt.ui.client.widget.celllist.Cell; import com.googlecode.mgwt.ui.client.widget.celllist.CellSelectedEvent; import com.googlecode.mgwt.ui.client.widget.celllist.CellSelectedHandler; import com.qualogy.qafe.mgwt.client.ui.events.CellItemSelectEvent; import com.qualogy.qafe.mgwt.client.ui.events.CellItemSelectHandler; import com.qualogy.qafe.mgwt.client.ui.events.CellRenderEvent; import com.qualogy.qafe.mgwt.client.ui.events.CellRenderHandler; import com.qualogy.qafe.mgwt.client.ui.events.DataChangeHandler; import com.qualogy.qafe.mgwt.client.ui.events.HasCellItemSelectHandlers; import com.qualogy.qafe.mgwt.client.ui.events.HasCellRenderHandler; import com.qualogy.qafe.mgwt.client.ui.events.HasPostRenderHandlers; import com.qualogy.qafe.mgwt.client.ui.events.HasScrollBottomHandlers; import com.qualogy.qafe.mgwt.client.ui.events.PostRenderEvent; import com.qualogy.qafe.mgwt.client.ui.events.PostRenderHandler; import com.qualogy.qafe.mgwt.client.ui.events.ScrollBottomEvent; import com.qualogy.qafe.mgwt.client.ui.events.ScrollBottomHandler; import com.qualogy.qafe.mgwt.shared.QAMLConstants; public class QDataGrid extends CellList implements IsEditable, HasCellRenderHandler, HasPostRenderHandlers, HasCellItemSelectHandlers, HasScrollBottomHandlers, HasPaging, HasIndexSelection, HasAttribute { private static class QCell implements Cell { private QDataGrid source; protected void setSource(QDataGrid source) { this.source = source; } @Override public void render(SafeHtmlBuilder safeHtmlBuilder, Object model) { if (source != null) { final UIObject cellWidget = source.renderCell(model); safeHtmlBuilder.append(new SafeHtml() { @Override public String asString() { return cellWidget.getElement().getString(); } }); } } @Override public boolean canBeSelected(Object model) { return false; } } private CellRenderHandler cellRenderHandler; private List models = new ArrayList(); private List<String> columns = new ArrayList<String>(); private Map<String,CellItemSelectHandler> columnHandlers = new HashMap<String,CellItemSelectHandler>(); private int selectedRowIndex = -1; private int scrollPosition; private String dataName; private HandlerRegistration scrollHandlerRegistration; private int pageSize; private int currentPage; public QDataGrid() { super(new QCell()); ((QCell)cell).setSource(this); addHandler(new CellSelectedHandler() { @Override public void onCellSelected(CellSelectedEvent event) { int index = event.getIndex(); fireCellItemSelect(index); } }, CellSelectedEvent.getType()); } @Override public void addCellItemSelectHandler(String cellItem, CellItemSelectHandler handler) { if (cellItem == null) { return; } if (handler == null) { return; } columnHandlers.put(cellItem, handler); } @Override public void registerCellRenderHandler(CellRenderHandler handler) { this.cellRenderHandler = handler; } @Override public HandlerRegistration addPostRenderHandler(PostRenderHandler handler) { return addHandler(handler, PostRenderEvent.getType()); } @Override public HandlerRegistration addDataChangeHandler(DataChangeHandler handler) { return ComponentHelper.addDataChangeHandler(this, handler); } @Override public HandlerRegistration addScrollBottomHandler(ScrollBottomHandler handler) { return addHandler(handler, ScrollBottomEvent.getType()); } public void addColumn(String column) { if (column == null) { return; } if (columns.contains(column)) { return; } columns.add(column); } @Override public void setDataName(String dataName) { this.dataName = dataName; } @Override public String getDataName() { return dataName; } @Override public void setData(Object data) { models.clear(); if (data instanceof Map) { models.add(data); } else if (data instanceof List) { models.addAll((List)data); } render(models); ComponentHelper.fireDataChange(this, models, null); } @Override public Object getData() { if (selectedRowIndex == -1) { return null; } if (selectedRowIndex > (models.size() -1)) { return null; } Object data = models.get(selectedRowIndex); return data; } @Override public Object getDataModel() { return getData(); } @Override public Object getModel() { List model = null; if (models.size() > 0) { model = new ArrayList(); model.addAll(models); } return model; } @Override public void setEditable(boolean editable) { // TODO Auto-generated method stub } @Override public int getPageSize() { return pageSize; } @Override public void setPageSize(int pageSize) { this.pageSize = pageSize; } @Override public int getCurrentPage() { return currentPage; } @Override public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } @Override public void setSelectedIndex(int index) { selectedRowIndex = index; } @Override public Object getAttribute(String name) { if (QAMLConstants.PROPERTY_PAGESIZE.equals(name)) { return getPageSize(); } if (QAMLConstants.PROPERTY_CURRENT_PAGE.equals(name)) { return getCurrentPage(); } return null; } @Override public void render(List models) { super.render(models); firePostRender(); ComponentHelper.refreshScroll(this); } private UIObject renderCell(Object model) { UIObject cellWidget = null; if (cellRenderHandler != null) { int index = models.indexOf(model); CellRenderEvent event = new CellRenderEvent(this, model, index); cellWidget = (UIObject)event.execute(cellRenderHandler); } return cellWidget; } private void fireCellItemSelect(int index) { selectedRowIndex = index; Object model = models.get(selectedRowIndex); for (String column : columns) { // Mimic the record selection event if (columnHandlers.containsKey(column)) { CellItemSelectHandler cellItemSelectHandler = columnHandlers.get(column); CellItemSelectEvent event = new CellItemSelectEvent(this, column, model, selectedRowIndex); event.execute(cellItemSelectHandler); break; } } } private void firePostRender() { PostRenderEvent event = new PostRenderEvent(this, models); fireEvent(event); } @Override protected void onAttach() { super.onAttach(); scrollHandlerRegistration = ComponentHelper.registerScroll(this); } @Override protected void onDetach() { ComponentHelper.unregisterScroll(scrollHandlerRegistration); super.onDetach(); } }