/******************************************************************************* * Copyright (c) 2006-2010, G. Weirich, D. Lutz, P. Schönbucher 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.views; import java.util.ArrayList; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IViewSite; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.FormText; import ch.elexis.core.constants.Preferences; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListener; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.actions.BackgroundJob; import ch.elexis.core.ui.actions.BackgroundJob.BackgroundJobListener; import ch.elexis.core.ui.actions.HistoryLoader; import ch.elexis.core.ui.actions.KonsFilter; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Patient; /** * Anzeige der vergangenen Konsultationen. Es sollen einerseits "sofort" die letzten 3 oder 4 Kons * angezeigt werden, andererseits aber je nach Anforderung auch frühere nachgeladen werden. Dies ist * noch nicht korrekt implemetiert - aktuell werden immer alle Kons. geladen. * * @author Gerry * */ public class HistoryDisplay extends ScrolledComposite implements BackgroundJobListener, ElexisEventListener { FormText text; ArrayList<Konsultation> lKons; private HistoryLoader loader; private boolean bLock; HistoryDisplay self = this; boolean multiline = false; public HistoryDisplay(Composite parent, final IViewSite site){ this(parent, site, false); } public HistoryDisplay(Composite parent, final IViewSite site, boolean multiline){ super(parent, SWT.V_SCROLL | SWT.BORDER); this.multiline = multiline; lKons = new ArrayList<Konsultation>(20); text = UiDesk.getToolkit().createFormText(this, false); text.setWhitespaceNormalized(true); text.setColor(UiDesk.COL_BLUE, UiDesk.getColorRegistry().get(UiDesk.COL_BLUE)); text.setColor(UiDesk.COL_GREEN, UiDesk.getColorRegistry().get(UiDesk.COL_LIGHTGREY)); text.setFont(UiDesk.getFont(Preferences.USR_DEFAULTFONT)); setContent(text); text.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e){ String id = (String) e.getHref(); Konsultation k = Konsultation.load(id); ElexisEventDispatcher.fireSelectionEvent(k); } }); text.setText(Messages.HistoryDisplay_NoPatientSelected, false, false); //$NON-NLS-1$ addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e){ text.setSize(text.computeSize(self.getSize().x - 15, SWT.DEFAULT)); } }); ElexisEventDispatcher.getInstance().addListeners(this); } @Override public void dispose(){ ElexisEventDispatcher.getInstance().removeListeners(this); super.dispose(); } public void setFilter(KonsFilter f){ stop(); loader.setFilter(f); } public void start(){ start(null); } public void start(KonsFilter f){ stop(); loader = new HistoryLoader(new StringBuilder(), lKons, multiline); loader.setFilter(f); loader.addListener(this); loader.schedule(); } public void stop(){ if (loader != null) { loader.removeListener(this); loader.cancel(); } } public void load(Fall fall, boolean clear){ if (clear) { lKons.clear(); } if (fall != null) { Konsultation[] kons = fall.getBehandlungen(true); for (Konsultation k : kons) { lKons.add(k); } } } public void load(Patient pat){ if (pat != null) { lKons.clear(); Fall[] faelle = pat.getFaelle(); for (Fall f : faelle) { load(f, false); } } } public void jobFinished(BackgroundJob j){ UiDesk.getDisplay().asyncExec(new Runnable() { public void run(){ String s = (String) loader.getData(); // check if widget is valid if (!isDisposed()) { text.setText(s, true, true); text.setSize(text.computeSize(self.getSize().x - 10, SWT.DEFAULT)); } } }); } public void catchElexisEvent(ElexisEvent ev){ UiDesk.asyncExec(new Runnable() { public void run(){ if (text != null && (!text.isDisposed())) { text.setFont(UiDesk.getFont(Preferences.USR_DEFAULTFONT)); } } }); } private final ElexisEvent eetemplate = new ElexisEvent(null, null, ElexisEvent.EVENT_USER_CHANGED); public ElexisEvent getElexisEventFilter(){ return eetemplate; } }