blob: cab23de6a36b0f7e507b07bc0c743fa624547152 [file] [log] [blame]
/*
* 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());
}
}