/* * Copyright 2014 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 java.util.Comparator; import org.cruxframework.crux.core.client.collection.Array; import com.google.gwt.event.shared.HandlerRegistration; /** * An eager, paged and filterable {@link DataProvider} * * @author Thiago da Rosa de Bustamante */ public class EagerPagedDataProvider<T> extends AbstractPagedDataProvider<T> implements EagerProvider<T>, FilterableProvider<T> { protected EagerDataLoader<T> dataLoader; public EagerPagedDataProvider() { } public EagerPagedDataProvider(DataProvider.EditionDataHandler<T> handler) { super(handler); } public EagerPagedDataProvider(DataProvider.EditionDataHandler<T> handler, EagerDataLoader<T> dataLoader) { super(handler); this.dataLoader = dataLoader; } @Override public void setDataLoader(EagerDataLoader<T> dataLoader) { this.dataLoader = dataLoader; } @Override public EagerDataLoader<T> getDataLoader() { return dataLoader; } @Override public void load() { if (!isLoaded() && dataLoader != null) { dataLoader.onLoadData(new EagerLoadEvent<T>(this)); } } @Override public boolean nextPage() { if (super.nextPage()) { firePageLoadedEvent(getPageStartRecord(), getPageEndRecord()); return true; } return false; } @Override public boolean previousPage() { if (super.previousPage()) { firePageLoadedEvent(getPageStartRecord(), getPageEndRecord()); return true; } return false; } /** * Sort DataProvider records, using the given comparator * @param comparator Comparator used for sorting. * @param restart if true, change the current position to the first dataProvider record. * If false, the dataProvider will be positioned on the first current page record. */ public void sort(Comparator<T> comparator, boolean restart) { ensureLoaded(); ensureNotDirty(); if (data != null) { sortArray(data, comparator, !restart); boolean pageChanded = false; if (restart) { pageChanded = hasPreviousPage(); first(); } fireSortedEvent(pageChanded); } } @Override public FilterRegistration<T> addFilter(final DataFilter<T> filter) { ensureNotDirty(); return operations.addFilter(filter); } @Override public void removeFilters() { operations.removeFilters(); } @Override public HandlerRegistration addDataFilterHandler(DataFilterHandler<T> handler) { return operations.addDataFilterHandler(handler); } @Override public Array<T> getData() { return operations.getData(); } @Override protected boolean setCurrentPage(int pageNumber, boolean fireEvents) { if (currentPage == pageNumber) { return true; } if (super.setCurrentPage(pageNumber, fireEvents)) { if (fireEvents) { firePageLoadedEvent(getPageStartRecord(), getPageEndRecord()); } return true; } return false; } @Override protected void update(Array<DataProviderRecord<T>> records) { this.data = records; operations.saveInitialData(records); firePageLoadedEvent(getPageStartRecord(), getPageEndRecord()); } @Override public boolean isPageLoaded(int page) { return isLoaded(); } }