/******************************************************************************* * 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.LinkedList; import org.eclipse.jface.viewers.Viewer; import ch.elexis.core.ui.actions.DelayableJob.IWorker; import ch.elexis.core.ui.util.viewers.CommonViewer; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldProvider; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ICommonViewerContentProvider; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; /** * This is a replacement for the former BackgroundJob-System. Since it became clear that the * database access takes less than 10% of the total time needed for reload of a CommonViewer, the * BackgroundJobs were not adequate for this task. Furthermore, there were several issues with those * widely used jobs. * * PersistentObjectLoader is a much simpler replacement and does not load in background. Instead it * uses a @see DelayableJob to perform loading. * * @author Gerry * */ public abstract class PersistentObjectLoader implements ICommonViewerContentProvider, IWorker { public final static String PARAM_FIELDNAMES = "fieldnames"; //$NON-NLS-1$ public final static String PARAM_VALUES = "fieldvalues"; //$NON-NLS-1$ protected CommonViewer cv; protected Query<? extends PersistentObject> qbe; private final LinkedList<QueryFilter> queryFilters = new LinkedList<QueryFilter>(); // protected IFilter viewerFilter; protected DelayableJob dj; protected String[] orderFields; private boolean bSuspended; public PersistentObjectLoader(CommonViewer cv, Query<? extends PersistentObject> qbe){ this.cv = cv; this.qbe = qbe; dj = new DelayableJob(Messages.PersistentObjectLoader_LoadingData, this); //$NON-NLS-1$ } public Query<? extends PersistentObject> getQuery(){ return qbe; } /** * start listening the selector fields of the ControlField of the loader's CommonViewer. If the * user enters text or clicks the headings, a changed() or reorder() event will be fired */ public void startListening(){ // viewerFilter = // cv.getConfigurer().getControlFieldProvider().createFilter(); cv.getConfigurer().getControlFieldProvider().addChangeListener(this); } /** * stop listening the selector fields */ public void stopListening(){ cv.getConfigurer().getControlFieldProvider().removeChangeListener(this); } public Object[] getElements(Object inputElement){ // TODO Auto-generated method stub return null; } public void dispose(){ stopListening(); if (dj != null) { dj.cancel(); } } /** * This will be called by the CommonViewer on construction */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput){ dj.launch(0); } /** * One or more of the ControlField's selectors habe been changed. We'll wait a moment for more * changes before we launch the loader. Use this method also to force a restart of the loader * programatically (values can be null) * * @param values * the new values */ public void changed(HashMap<String, String> values){ ControlFieldProvider cfp = cv.getConfigurer().getControlFieldProvider(); if (cfp != null) { if (cfp.isEmpty()) { cv.notify(CommonViewer.Message.empty); } else { cv.notify(CommonViewer.Message.notempty); } } dj.setRuntimeData(PARAM_VALUES, values); dj.launch(DelayableJob.DELAY_ADAPTIVE); } /** * The user request reordering of the table * * @param field * the field name after which the table should e reordered */ public void reorder(String field){ setOrderFields(new String[] { field }); dj.launch(20); } public void selected(){ } public void addQueryFilter(QueryFilter fp){ synchronized (queryFilters) { queryFilters.add(fp); } } public void removeQueryFilter(QueryFilter fp){ synchronized (queryFilters) { queryFilters.remove(fp); } } public void applyQueryFilters(){ synchronized (queryFilters) { for (QueryFilter fp : queryFilters) { fp.apply(qbe); } } } public void setOrderFields(String... name){ orderFields = name; } /** * a QueryFilter can modify the Query of this Loader. It will be called before each reload. * * @author Gerry * */ public interface QueryFilter { public void apply(Query<? extends PersistentObject> qbe); } public void setSuspended(boolean bSuspend){ bSuspended = bSuspend; } public boolean isSuspended(){ return bSuspended; } public void init(){} }