/*******************************************************************************
* Copyright (c) 2009-2010, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.elexis.core.ui.actions;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ILazyContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldProvider;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
/**
* A PersistentObjectLoader for flat tables. This is also an ILazyContentProvider for Structured
* Viewers and a ContentProvider for @see CommonViewer
*
* @author Gerry
*
*/
public class FlatDataLoader extends PersistentObjectLoader implements ILazyContentProvider {
//private static final String LOADMESSAGE = "Lade Daten..."; //$NON-NLS-1$
private List<? extends PersistentObject> raw = null;
private List<? extends PersistentObject> filtered = null;
public FlatDataLoader(CommonViewer cv, Query<? extends PersistentObject> qbe){
super(cv, qbe);
}
/**
* Constructor without CommonViewer. Do not in Connection with CommonViewers
*
* @param qbe
*/
public FlatDataLoader(Query<? extends PersistentObject> qbe){
super(null, qbe);
}
/**
* From @see DelayableJob.IWorker
*/
public IStatus work(IProgressMonitor monitor, HashMap<String, Object> params){
if (isSuspended()) {
return Status.CANCEL_STATUS;
}
final TableViewer tv = (TableViewer) cv.getViewerWidget();
if (filtered != null) {
filtered.clear();
}
filtered = null;
setQuery();
applyQueryFilters();
if (orderFields != null) {
qbe.orderBy(false, orderFields);
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
raw = qbe.execute();
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
UiDesk.asyncExec(new Runnable() {
public void run(){
// Avoid access to disposed table
if (tv != null && !tv.getTable().isDisposed()) {
tv.setItemCount(0);
filtered = raw;
tv.setItemCount(raw.size());
}
}
});
return Status.OK_STATUS;
}
public void setResult(List<PersistentObject> res){
raw = res;
}
/**
* prepare the query so it returns the appropriate Objects on execute(). The default
* implemetation lets the ControlFieldProvider set the query. Subclasses may override
*/
protected void setQuery(){
qbe.clear();
ControlFieldProvider cfp = cv.getConfigurer().getControlFieldProvider();
if (cfp != null) {
cfp.setQuery(qbe);
}
}
public void updateElement(int index){
if (filtered != null) {
if (index >= 0 && index < filtered.size()) {
Object o = filtered.get(index);
if (o != null) {
TableViewer tv = (TableViewer) cv.getViewerWidget();
tv.replace(filtered.get(index), index);
}
}
}
}
}