package ch.elexis.core.ui.laboratory.controls.util; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.FocusCellHighlighter; import org.eclipse.jface.viewers.ICellEditorListener; import org.eclipse.jface.viewers.ICellEditorValidator; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.TreeViewerEditor; import org.eclipse.jface.viewers.TreeViewerFocusCellManager; import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.types.LabItemTyp; import ch.elexis.core.ui.laboratory.controls.LaborResultsComposite; import ch.elexis.core.ui.laboratory.controls.Messages; import ch.elexis.core.ui.laboratory.controls.model.LaborItemResults; import ch.elexis.core.ui.locks.AcquireLockBlockingUi; import ch.elexis.core.ui.locks.ILockHandler; import ch.elexis.data.Kontakt; import ch.elexis.data.LabItem; import ch.elexis.data.LabOrder; import ch.elexis.data.LabResult; import ch.rgw.tools.TimeTool; public class LabResultEditingSupport extends EditingSupport { protected final String SMALLER = "<"; protected final String BIGGER = ">"; protected TextCellEditor textCellEditor; protected TreeViewerFocusCellManager focusCell; private TreeViewerColumn column; private LaborResultsComposite composite; public LabResultEditingSupport(LaborResultsComposite laborResultsComposite, TreeViewer viewer, TreeViewerColumn column){ super(viewer); this.column = column; this.composite = laborResultsComposite; setUpCellEditor(viewer); addValidator(); } protected void setUpCellEditor(ColumnViewer viewer){ // set up validation of the cell editors textCellEditor = new TextCellEditor((Composite) viewer.getControl()); textCellEditor.addListener(new ICellEditorListener() { @Override public void editorValueChanged(boolean oldValidState, boolean newValidState){ if (newValidState) { textCellEditor.getControl() .setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); } else { textCellEditor.getControl() .setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); } } @Override public void cancelEditor(){ textCellEditor.getControl() .setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); } @Override public void applyEditorValue(){ textCellEditor.getControl() .setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); } }); focusCell = new TreeViewerFocusCellManager((TreeViewer) viewer, new FocusCellHighlighter(viewer) { }); ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(viewer) { @Override protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event){ return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.KEYPAD_CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; } }; TreeViewerEditor.create((TreeViewer) viewer, focusCell, actSupport, ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION); } protected void addValidator(){ textCellEditor.setValidator(new ICellEditorValidator() { @Override public String isValid(Object value){ IStructuredSelection selection = (IStructuredSelection) getViewer().getSelection(); LaborItemResults results = (LaborItemResults) selection.getFirstElement(); if (results != null && value instanceof String) { if (results.getLabItem().getTyp() == LabItemTyp.NUMERIC || results.getLabItem().getTyp() == LabItemTyp.ABSOLUTE) { try { String editedValue = (String) value; if (editedValue.startsWith(SMALLER) || editedValue.startsWith(BIGGER)) { String nrValue = editedValue.replace(SMALLER, "").replace(BIGGER, ""); editedValue = nrValue.trim(); } Float.parseFloat(editedValue); } catch (NumberFormatException e) { return Messages.LaborOrdersComposite_validatorNotNumber; } } } return null; } }); } @Override protected boolean canEdit(Object element){ return element instanceof LaborItemResults; } @Override protected CellEditor getCellEditor(Object element){ if (element instanceof LaborItemResults) { LabItem labItem = ((LaborItemResults) element).getLabItem(); if (labItem.getTyp() == LabItemTyp.DOCUMENT) { return null; } else { return textCellEditor; } } return null; } @Override protected Object getValue(Object element){ return ""; //$NON-NLS-1$ } private TimeTool getDate() { return (TimeTool) column.getColumn().getData(LaborResultsComposite.COLUMN_DATE_KEY); } @Override protected void setValue(final Object element, final Object value){ if (element instanceof LaborItemResults && value != null) { LabItem labItem = ((LaborItemResults) element).getLabItem(); if (labItem.getTyp() == LabItemTyp.DOCUMENT) { return; } LabResult result = createResult(labItem, LabOrder.getOrCreateManualLabor()); final LabResult lockResult = result; AcquireLockBlockingUi.aquireAndRun(result, new ILockHandler() { @Override public void lockFailed(){ // do nothing } @Override public void lockAcquired(){ if (lockResult.getItem().getTyp() == LabItemTyp.TEXT) { lockResult.setResult("Text"); //$NON-NLS-1$ lockResult.set(LabResult.COMMENT, value.toString()); } else if (lockResult.getItem().getTyp() == LabItemTyp.DOCUMENT) { // dont know what todo ... } else { lockResult.setResult(value.toString()); } } }); int columnIdx = focusCell.getFocusCell().getColumnIndex(); ViewerRow row = focusCell.getFocusCell().getViewerRow(); ViewerRow nextRow = row.getNeighbor(ViewerRow.BELOW, true); composite.reload(); if (nextRow != null) { getViewer().setSelection(new StructuredSelection(nextRow.getElement()), true); getViewer().editElement(nextRow.getElement(), columnIdx); } } } private LabResult createResult(LabItem item, Kontakt origin){ TimeTool now = new TimeTool(); LabOrder order = new LabOrder(CoreHub.actUser, CoreHub.actMandant, ElexisEventDispatcher.getSelectedPatient(), item, null, LabOrder.getNextOrderId(), "Eingabe", now); LabResult result = order.createResult(origin); order.setState(LabOrder.State.DONE); result.setTransmissionTime(now); result.setObservationTime(getDate()); return result; } }