/******************************************************************************* * Copyright (c) 2006-2009, 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.util.viewers; import java.util.HashMap; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import ch.elexis.admin.ACE; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.actions.AbstractDataLoaderJob; import ch.elexis.core.ui.actions.BackgroundJob; import ch.elexis.core.ui.actions.BackgroundJob.BackgroundJobListener; import ch.elexis.core.ui.actions.JobPool; import ch.elexis.core.ui.util.Messages; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldProvider; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ICommonViewerContentProvider; import ch.elexis.data.Query; /** * Ein Content-Provider, der benötigte Daten aus einem BackgroundJob bezieht und einem TableViewer * nur gerade die jeweils benötigten Datne liefern kann. Registriert sich beim Dataloader selbst als * listener und startet diesen auch, wenn Daten benötigt werden. * * @author Gerry */ public class LazyContentProvider implements ICommonViewerContentProvider, ILazyContentProvider, BackgroundJobListener, AbstractDataLoaderJob.FilterProvider { AbstractDataLoaderJob dataloader; CommonViewer tableviewer; ACE required; public LazyContentProvider(CommonViewer viewer, AbstractDataLoaderJob job, ACE rights){ dataloader = job; job.addListener(this); job.addFilterProvider(this); tableviewer = viewer; required = rights; } public void dispose(){ dataloader.removeListener(this); dataloader.removeFilterProvider(this); } public void inputChanged(Viewer viewer, Object oldInput, Object newInput){} public void updateElement(int index){ if (CoreHub.acl.request(required) == false) { ((TableViewer) tableviewer.getViewerWidget()).replace(" --- ", index); //$NON-NLS-1$ return; } if (dataloader.isValid()) { Object[] res = (Object[]) dataloader.getData(); Object nval = Messages.LazyContentProvider_noData; //$NON-NLS-1$ if (index < res.length) { nval = res[index]; } ((TableViewer) tableviewer.getViewerWidget()).replace(nval, index); } else { JobPool pool = JobPool.getJobPool(); if (pool.getJob(dataloader.getJobname()) == null) { pool.addJob(dataloader); } pool.activate(dataloader.getJobname(), Job.SHORT); } } public void jobFinished(BackgroundJob j){ int size = 0; if ((j != null) && (j.getData() != null)) { size = ((Object[]) j.getData()).length; } ((TableViewer) tableviewer.getViewerWidget()).getTable().setItemCount(size == 0 ? 1 : size); tableviewer.notify(CommonViewer.Message.update); } public void startListening(){ tableviewer.getConfigurer().controlFieldProvider.addChangeListener(this); } public void stopListening(){ tableviewer.getConfigurer().controlFieldProvider.removeChangeListener(this); } public void applyFilter(){ Query qbe = dataloader.getQuery(); if (qbe != null) { ViewerConfigurer vc = tableviewer.getConfigurer(); if (vc != null) { ControlFieldProvider cfp = vc.getControlFieldProvider(); cfp.setQuery(qbe); } } } public void changed(HashMap<String, String> vals){ dataloader.invalidate(); if (tableviewer.getConfigurer().getControlFieldProvider().isEmpty()) { tableviewer.notify(CommonViewer.Message.empty); } else { tableviewer.notify(CommonViewer.Message.notempty); } JobPool.getJobPool().activate(dataloader.getJobname(), Job.SHORT); } public void reorder(String field){ dataloader.setOrder(field); changed(null); } public void selected(){ // nothing to do } public Object[] getElements(Object inputElement){ return (Object[]) dataloader.getData(); } @Override public void init(){ // TODO Auto-generated method stub } }