/* * Copyright 2010 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.view.client; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.event.shared.GwtEvent.Type; import com.google.gwt.view.client.CellPreviewEvent.Handler; import java.util.ArrayList; import java.util.List; /** * A mock {@link HasData} used for testing. * * @param <T> the data type */ public class MockHasData<T> implements HasData<T> { private static final int DEFAULT_PAGE_SIZE = 10; /** * A mock {@link RowCountChangeEvent.Handler} used for testing. */ public static class MockRowCountChangeHandler implements RowCountChangeEvent.Handler { private int lastRowCount = -1; private boolean lastRowCountExact; public int getLastRowCount() { return lastRowCount; } public boolean isLastRowCountExact() { return lastRowCountExact; } public void onRowCountChange(RowCountChangeEvent event) { this.lastRowCount = event.getNewRowCount(); this.lastRowCountExact = event.isNewRowCountExact(); } public void reset() { lastRowCount = -1; lastRowCountExact = false; } } /** * A mock {@link RangeChangeEvent.Handler} used for testing. */ public static class MockRangeChangeHandler implements RangeChangeEvent.Handler { private Range lastRange; public Range getLastRange() { return lastRange; } public void onRangeChange(RangeChangeEvent event) { this.lastRange = event.getNewRange(); } public void reset() { lastRange = null; } } private final HandlerManager handlerManager = new HandlerManager(this); private Range lastRange; private List<T> lastRowData; private int pageStart; private int pageSize = DEFAULT_PAGE_SIZE; private int rowCount; private boolean rowCountExact; private HandlerRegistration selectionHandler; private SelectionModel<? super T> selectionModel; public HandlerRegistration addCellPreviewHandler(Handler<T> handler) { return handlerManager.addHandler(CellPreviewEvent.getType(), handler); } public HandlerRegistration addRangeChangeHandler( RangeChangeEvent.Handler handler) { return handlerManager.addHandler(RangeChangeEvent.getType(), handler); } public HandlerRegistration addRowCountChangeHandler( RowCountChangeEvent.Handler handler) { return handlerManager.addHandler(RowCountChangeEvent.getType(), handler); } /** * Clear the last data set by {@link #setRowData(int, List)}. */ public void clearLastRowDataAndRange() { lastRowData = null; lastRange = null; } public void fireEvent(GwtEvent<?> event) { handlerManager.fireEvent(event); } public T getVisibleItem(int indexOnPage) { return lastRowData.get(indexOnPage); } public int getVisibleItemCount() { return lastRowData == null ? 0 : lastRowData.size(); } public List<T> getVisibleItems() { return lastRowData; } /** * Gets the number of handlers listening to the event type. * * @param type the event type * @return the number of registered handlers */ public int getHandlerCount(Type<?> type) { return handlerManager.getHandlerCount(type); } /** * Get the last data set in {@link #setRowData(int, List)}. * * @return the last data set */ public List<? extends T> getLastRowData() { return lastRowData; } /** * Get the last data range set in {@link #setRowData(int, List)}. * * @return the last data range */ public Range getLastRowDataRange() { return lastRange; } public int getRowCount() { return rowCount; } public SelectionModel<? super T> getSelectionModel() { return selectionModel; } public Range getVisibleRange() { return new Range(pageStart, pageSize); } public boolean isRowCountExact() { return rowCountExact; } public void setRowData(int start, List<? extends T> values) { lastRange = new Range(start, values.size()); lastRowData = new ArrayList<T>(values); } public final void setRowCount(int count) { setRowCount(count, true); } public void setRowCount(int count, boolean isExact) { if (this.rowCount == count && this.rowCountExact == isExact) { return; } this.rowCount = count; this.rowCountExact = isExact; RowCountChangeEvent.fire(this, count, isExact); } public final void setVisibleRange(int start, int length) { setVisibleRange(new Range(start, length)); } public void setVisibleRange(Range range) { setVisibleRange(range, false, false); } public void setVisibleRangeAndClearData( Range range, boolean forceRangeChangeEvent) { setVisibleRange(range, true, forceRangeChangeEvent); } public void setSelectionModel(SelectionModel<? super T> selectionModel) { // Remove the old selection handler. if (selectionHandler != null) { selectionHandler.removeHandler(); selectionHandler = null; } // Add the new selection model. this.selectionModel = selectionModel; if (selectionModel != null) { selectionHandler = selectionModel.addSelectionChangeHandler( new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { } }); } } private void setVisibleRange( Range range, boolean clearData, boolean forceRangeChangeEvent) { int start = range.getStart(); int length = range.getLength(); if (clearData) { lastRowData = null; } if (!forceRangeChangeEvent && this.pageStart == start && this.pageSize == length) { return; } this.pageStart = start; this.pageSize = length; RangeChangeEvent.fire(this, getVisibleRange()); } }