package ch.elexis.core.ui.laboratory.dialogs; import java.util.Calendar; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import ch.elexis.core.model.ILabResult; import ch.elexis.core.types.LabItemTyp; import ch.elexis.core.ui.views.controls.LaborSelectionComposite; import ch.elexis.data.LabResult; import ch.rgw.tools.TimeTool; public class EditLabResultDialog extends TitleAreaDialog { private Composite editComposite; private Text resultTxt; private Text unitTxt; private Text refMaleTxt; private Text refFemaleTxt; private LaborSelectionComposite originSelection; private DateTime observationDate; private DateTime analyseDate; private DateTime transmissionDate; private DateTime observationTime; private DateTime analyseTime; private DateTime transmissionTime; private LabResult result; public EditLabResultDialog(Shell parentShell, ILabResult act){ this(parentShell, LabResult.load(act.getId())); } public EditLabResultDialog(Shell parentShell, LabResult act){ super(parentShell); result = act; } @Override protected Control createDialogArea(Composite parent){ getShell().setText(Messages.EditLabResultDialog_shellTitle); setTitle(Messages.EditLabResultDialog_title); setMessage(String.format(Messages.EditLabResultDialog_message, result.getItem().getLabel(), result.getPatient().getLabel())); editComposite = new Composite(parent, SWT.NONE); editComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); editComposite.setLayout(new GridLayout(2, false)); Label lbl = new Label(editComposite, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelValue); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); if (result.getItem().getTyp() == LabItemTyp.TEXT) { resultTxt = new Text(editComposite, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); data.heightHint = 100; resultTxt.setLayoutData(data); } else { resultTxt = new Text(editComposite, SWT.BORDER); resultTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); } lbl = new Label(editComposite, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelUnit); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); unitTxt = new Text(editComposite, SWT.BORDER); unitTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); unitTxt.setTextLimit(80); lbl = new Label(editComposite, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelRefMale); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); refMaleTxt = new Text(editComposite, SWT.BORDER); refMaleTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); refMaleTxt.setTextLimit(80); lbl = new Label(editComposite, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelRefFemale); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); refFemaleTxt = new Text(editComposite, SWT.BORDER); refFemaleTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); refFemaleTxt.setTextLimit(80); lbl = new Label(editComposite, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelLab); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); originSelection = new LaborSelectionComposite(editComposite, SWT.NONE); originSelection.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); lbl = new Label(editComposite, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelTime); lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); Group grp = new Group(editComposite, SWT.NONE); grp.setLayout(new GridLayout(3, false)); grp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); lbl = new Label(grp, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelObservation); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); observationTime = new DateTime(grp, SWT.TIME); observationTime.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); observationDate = new DateTime(grp, SWT.DATE); observationDate.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); lbl = new Label(grp, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelTransmission); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); transmissionTime = new DateTime(grp, SWT.TIME); transmissionTime.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); transmissionDate = new DateTime(grp, SWT.DATE); transmissionDate.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); lbl = new Label(grp, SWT.NONE); lbl.setText(Messages.EditLabResultDialog_labelAnalyse); lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); analyseTime = new DateTime(grp, SWT.TIME); analyseTime.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); analyseDate = new DateTime(grp, SWT.DATE); analyseDate.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); updateModelToTarget(); return editComposite; } private String getUnit(){ String ret = result.getUnit(); if (ret == null || ret.isEmpty()) { ret = result.getItem().getUnit(); } return ret; } private String getRefMale(){ String ret = result.getRefMale(); if (ret == null || ret.isEmpty()) { ret = result.getItem().getReferenceMale(); } return ret; } private String getRefFemale(){ String ret = result.getRefFemale(); if (ret == null || ret.isEmpty()) { ret = result.getItem().getReferenceFemale(); } return ret; } private TimeTool getTransmissionDate(){ TimeTool ret = result.getTransmissionTime(); if (ret == null) { ret = result.getDateTime(); } return ret; } private TimeTool getAnalyseDate(){ TimeTool ret = result.getAnalyseTime(); if (ret == null) { ret = result.getDateTime(); } return ret; } private TimeTool getSampleDate(){ TimeTool ret = result.getObservationTime(); if (ret == null) { ret = result.getDateTime(); } return ret; } private void updateDateTimeModelToTarget(){ TimeTool date = getTransmissionDate(); transmissionTime.setTime(date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE), date.get(Calendar.SECOND)); transmissionDate.setDate(date.get(Calendar.YEAR), date.get(Calendar.MONTH), date.get(Calendar.DAY_OF_MONTH)); date = getSampleDate(); observationTime.setTime(date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE), date.get(Calendar.SECOND)); observationDate.setDate(date.get(Calendar.YEAR), date.get(Calendar.MONTH), date.get(Calendar.DAY_OF_MONTH)); date = getAnalyseDate(); analyseTime.setTime(date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE), date.get(Calendar.SECOND)); analyseDate.setDate(date.get(Calendar.YEAR), date.get(Calendar.MONTH), date.get(Calendar.DAY_OF_MONTH)); } private void updateDateTimeTargetToModel(){ TimeTool date = new TimeTool(); getTime(transmissionTime, date); getDate(transmissionDate, date); result.setTransmissionTime(date); getTime(observationTime, date); getDate(observationDate, date); result.setObservationTime(date); getTime(analyseTime, date); getDate(analyseDate, date); result.setAnalyseTime(date); } private void getTime(DateTime widget, TimeTool time){ time.set(Calendar.HOUR_OF_DAY, widget.getHours()); time.set(Calendar.MINUTE, widget.getMinutes()); time.set(Calendar.SECOND, widget.getSeconds()); } private void getDate(DateTime widget, TimeTool date){ date.set(Calendar.YEAR, widget.getYear()); date.set(Calendar.MONTH, widget.getMonth()); date.set(Calendar.DAY_OF_MONTH, widget.getDay()); } private void updateModelToTarget(){ if (result != null) { if (result.getItem().getTyp() == LabItemTyp.NUMERIC || result.getItem().getTyp() == LabItemTyp.ABSOLUTE) { resultTxt.setText(result.getResult()); unitTxt.setText(getUnit()); refMaleTxt.setText(getRefMale()); refFemaleTxt.setText(getRefFemale()); } else if (result.getItem().getTyp() == LabItemTyp.TEXT) { if (result.isLongText()) { resultTxt.setText(result.getComment()); } else { resultTxt.setText(result.getResult()); } unitTxt.setText(getUnit()); unitTxt.setEnabled(false); refMaleTxt.setText(getRefMale()); refMaleTxt.setEnabled(false); refFemaleTxt.setText(getRefFemale()); refFemaleTxt.setEnabled(false); } updateDateTimeModelToTarget(); originSelection.setKontakt(result.getOrigin()); } } private void updateTargetToModel(){ if (result != null) { if (result.getItem().getTyp() == LabItemTyp.NUMERIC || result.getItem().getTyp() == LabItemTyp.ABSOLUTE) { result.setResult(resultTxt.getText()); result.setUnit(unitTxt.getText()); result.setRefMale(refMaleTxt.getText()); result.setRefFemale(refFemaleTxt.getText()); updateDateTimeTargetToModel(); } else if (result.getItem().getTyp() == LabItemTyp.TEXT) { if (result.isLongText()) { result.setResult("text"); //$NON-NLS-1$ result.set(LabResult.COMMENT, resultTxt.getText()); } else { // convert to long text if (resultTxt.getText().length() < 200) { result.setResult(resultTxt.getText()); } else { result.setResult("text"); //$NON-NLS-1$ result.set(LabResult.COMMENT, resultTxt.getText()); } } updateDateTimeTargetToModel(); } result.setOrigin(originSelection.getKontakt()); } } private boolean isValid(){ if (resultTxt.getText().length() < 1) { setErrorMessage(Messages.EditLabResultDialog_errorNoResult); return false; } if (!resultTxt.getText().isEmpty() && result.getItem().getTyp() == LabItemTyp.NUMERIC) { try { String numeric = resultTxt.getText(); if (numeric.startsWith("<") || numeric.startsWith(">")) { numeric = numeric.substring(1, numeric.length()); } Float.parseFloat(numeric); } catch (NumberFormatException e) { setErrorMessage(Messages.EditLabResultDialog_errorResultNotNumber); return false; } } if (!resultTxt.getText().isEmpty() && result.getItem().getTyp() == LabItemTyp.ABSOLUTE) { if (!LabResult.isValidAbsoluteRefValue(resultTxt.getText())) { setErrorMessage(Messages.EditLabItemDialog_errorResultNotAbsolute); return false; } } if (!refMaleTxt.getText().isEmpty()) { if (result.getItem().getTyp() == LabItemTyp.ABSOLUTE) { if (!LabResult.isValidAbsoluteRefValue(refMaleTxt.getText())) { setErrorMessage(Messages.EditLabItemDialog_errorRefMaleNotAbsolute); return false; } } else if (result.getItem().getTyp() != LabItemTyp.TEXT && !LabResult.isValidNumericRefValue(refMaleTxt.getText())) { setErrorMessage(Messages.EditLabResultDialog_errorRefMaleNotNumber); return false; } } if (!refFemaleTxt.getText().isEmpty()) { if (result.getItem().getTyp() == LabItemTyp.ABSOLUTE) { if (!LabResult.isValidAbsoluteRefValue(refFemaleTxt.getText())) { setErrorMessage(Messages.EditLabItemDialog_errorRefFemaleNotAbsolute); return false; } } else if (result.getItem().getTyp() != LabItemTyp.TEXT && !LabResult.isValidNumericRefValue(refFemaleTxt.getText())) { setErrorMessage(Messages.EditLabResultDialog_errorRefFemaleNotNumber); return false; } } return true; } @Override protected void okPressed(){ if (!isValid()) { return; } updateTargetToModel(); super.okPressed(); } }