/******************************************************************************* * Copyright (c) 2006-2011, 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.base.befunde; import java.text.MessageFormat; import java.util.Date; import java.util.Hashtable; import java.util.Map; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import ch.elexis.befunde.Messwert; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.interfaces.scripting.Interpreter; import ch.elexis.core.exceptions.ElexisException; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Patient; import ch.elexis.data.Script; import ch.rgw.tools.ExHandler; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeTool; import com.tiff.common.ui.datepicker.DatePickerCombo; public class EditFindingDialog extends TitleAreaDialog { Messwert mw; String name; DatePickerCombo dp; Map names; String[] flds; boolean[] multiline; String[] values; Text[] inputs; EditFindingDialog(final Shell parent, final Messwert m, final String n){ super(parent); mw = m; name = n; names = Messwert.getSetup().getMap(Messwert.FLD_BEFUNDE); flds = ((String) names.get(n + Messwert._FIELDS)).split(Messwert.SETUP_SEPARATOR); multiline = new boolean[flds.length]; values = new String[flds.length]; inputs = new Text[flds.length]; for (int i = 0; i < flds.length; i++) { String[] line = flds[i].split(Messwert.SETUP_CHECKSEPARATOR); flds[i] = line[0]; if (line.length < 2) { multiline[i] = false; } else { multiline[i] = line[1].equals("m") ? true : false; //$NON-NLS-1$ } } } @Override protected Control createDialogArea(final Composite parent){ Composite ret = new Composite(parent, SWT.NONE); Patient pat = ElexisEventDispatcher.getSelectedPatient(); if (pat != null) { ret.setLayout(new GridLayout()); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); dp = new DatePickerCombo(ret, SWT.NONE); if (mw == null) { dp.setDate(new Date()); } if (mw != null) { dp.setDate(new TimeTool(mw.get(Messwert.FLD_DATE)).getTime()); Map vals = mw.getMap(Messwert.FLD_BEFUNDE); for (int i = 0; i < flds.length; i++) { values[i] = (String) vals.get(flds[i]); } } for (int i = 0; i < flds.length; i++) { final String[] heading = flds[i].split("=", 2); //$NON-NLS-1$ if (heading.length == 1) { new Label(ret, SWT.NONE).setText(flds[i]); } else { Label hl = SWTHelper.createHyperlink(ret, heading[0], new ScriptListener(heading[1], i)); hl.setForeground(UiDesk.getColor(UiDesk.COL_BLUE)); } inputs[i] = SWTHelper.createText(ret, multiline[i] ? 4 : 1, SWT.NONE); inputs[i].setText(values[i] == null ? "" : values[i]); //$NON-NLS-1$ if (heading.length > 1) { inputs[i].setEditable(false); } } } return ret; } @Override public void create(){ super.create(); getShell().setText(Messages.getString("EditFindingDialog.captionBefundEditDlg")); //$NON-NLS-1$ Patient pat = ElexisEventDispatcher.getSelectedPatient(); if (pat == null) { setTitle(Messages.getString("EditFindingDialog.noPatientSelected")); //$NON-NLS-1$ } else { setTitle(pat.getLabel()); } setMessage(MessageFormat.format( Messages.getString("EditFindingDialog.enterTextForBefund"), name)); //$NON-NLS-1$ setTitleImage(Images.IMG_LOGO.getImage()); } @SuppressWarnings("unchecked") @Override protected void okPressed(){ Map hash; if (mw == null) { hash = new Hashtable(); mw = new Messwert(ElexisEventDispatcher.getSelectedPatient(), name, dp.getText(), hash); } else { hash = mw.getMap(Messwert.FLD_BEFUNDE); } for (int i = 0; i < flds.length; i++) { String val = inputs[i].getText(); if (StringTool.isNothing(val)) { hash.remove(flds[i]); } else { hash.put(flds[i], val); } } mw.setDate(dp.getDate()); mw.setMap(Messwert.FLD_BEFUNDE, hash); super.okPressed(); } class ScriptListener extends HyperlinkAdapter { int v; String script; ScriptListener(final String scr, final int i){ script = scr; v = i; } @Override public void linkActivated(final HyperlinkEvent e){ for (int vals = 0; vals < inputs.length; vals++) { String sval = inputs[vals].getText(); if (!StringTool.isNothing(sval)) { double dval = 0.0; try { dval = Double.parseDouble(sval); } catch (NumberFormatException nfe) { // don't mind } script = script.replaceAll("F" + Integer.toString(vals + 1), Double //$NON-NLS-1$ .toString(dval)); } } try { Object result = null; if (script.startsWith(Script.SCRIPT_MARKER)) { String scriptname = script.substring(Script.SCRIPT_MARKER.length()); result = Script.executeScript(scriptname); } else { Interpreter scripter = Script.getInterpreterFor(script); result = scripter.run(script, false); } values[v] = result.toString(); // values[v]=Double.toString((Double)scripter.eval(script)); } catch (ElexisException e1) { ExHandler.handle(e1); values[v] = "?eval?"; //$NON-NLS-1$ } inputs[v].setText(values[v]); } } }