/* * Copyright 2015 cruxframework.org. * * 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 org.cruxframework.crux.core.client.dataprovider; import com.google.gwt.user.client.ui.Composite; /** * @author Thiago da Rosa de Bustamante * */ public abstract class AbstractHasPagedDataProvider<T> extends Composite implements HasPagedDataProvider<PagedDataProvider<T>> { private PagedDataProvider<T> dataProvider; @Override public PagedDataProvider<T> getDataProvider() { return dataProvider; } @Override public void setDataProvider(PagedDataProvider<T> dataProvider, boolean autoLoadData) { if (this.dataProvider != dataProvider) { if (this.dataProvider != null) { removeDataProviderHandler(); } this.dataProvider = dataProvider; if (dataProvider != null) { addDataProviderHandler(); if (autoLoadData) { dataProvider.load(); } if (!autoLoadData && dataProvider.isLoaded()) { onDataProviderSet(); } } } } protected abstract void onDataProviderSet(); @Override public boolean isDataLoaded() { return dataProvider != null && dataProvider.isLoaded(); } @Override public void nextPage() { if(isDataLoaded()) { dataProvider.nextPage(); } } @Override public void setPageSize(int pageSize) { checkDataProvider(); dataProvider.setPageSize(pageSize); } public int getPageSize() { checkDataProvider(); return dataProvider.getPageSize(); } @Override public void goToPage(int page) { if(isDataLoaded()) { if(dataProvider instanceof MeasurablePagedProvider<?>) { ((MeasurablePagedProvider<?>) dataProvider).setCurrentPage(page); } else { throw new UnsupportedOperationException("This operation is only supported when using DataProviders that are instances of MeasurablePagedDataProvider"); } } } @Override public int getPageCount() { if(isDataLoaded() && dataProvider instanceof MeasurablePagedProvider<?>) { MeasurablePagedProvider<?> ds = (MeasurablePagedProvider<?>) dataProvider; return ds.getPageCount(); } else { return -1; } } @Override public void previousPage() { if(isDataLoaded()) { dataProvider.previousPage(); } } @Override public int getCurrentPage() { if(isDataLoaded()) { return dataProvider.getCurrentPage(); } return 0; } @Override public boolean hasNextPage() { if(isDataLoaded()) { return dataProvider.hasNextPage(); } return false; } @Override public boolean hasPreviousPage() { if(isDataLoaded()) { return dataProvider.hasPreviousPage(); } return false; } @Override public void firstPage() { if(isDataLoaded()) { goToPage(1); } } @Override public void lastPage() { if(isDataLoaded()) { goToPage(getPageCount()); } } protected abstract void addDataProviderHandler(); protected abstract void removeDataProviderHandler(); /** * If there is no dataProvider set, raises an error */ protected void checkDataProvider() { assert(this.dataProvider != null) :"No dataProvider set for this component."; } }