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.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.TextCellEditor;
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.types.LabItemTyp;
import ch.elexis.core.ui.laboratory.controls.LaborOrderViewerItem;
import ch.elexis.core.ui.laboratory.controls.Messages;
import ch.elexis.core.ui.locks.AcquireLockBlockingUi;
import ch.elexis.core.ui.locks.ILockHandler;
import ch.elexis.data.Kontakt;
import ch.elexis.data.LabOrder;
import ch.elexis.data.LabResult;
import ch.rgw.tools.TimeTool;
public class LabOrderEditingSupport extends EditingSupport {
protected final String SMALLER = "<";
protected final String BIGGER = ">";
protected TextCellEditor textCellEditor;
protected TableViewerFocusCellManager focusCell;
public LabOrderEditingSupport(ColumnViewer viewer){
super(viewer);
setUpCellEditor(viewer);
addValidator();
}
protected void addValidator(){
textCellEditor.setValidator(new ICellEditorValidator() {
@Override
public String isValid(Object value){
IStructuredSelection selection = (IStructuredSelection) getViewer().getSelection();
LaborOrderViewerItem viewerItem =
(LaborOrderViewerItem) selection.getFirstElement();
if (viewerItem != null && value instanceof String) {
if (viewerItem.getLabItemTyp() == LabItemTyp.NUMERIC
|| viewerItem.getLabItemTyp() == 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;
}
});
}
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 TableViewerFocusCellManager((TableViewer) 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;
}
};
TableViewerEditor.create((TableViewer) viewer, focusCell, actSupport,
ColumnViewerEditor.TABBING_VERTICAL
| ColumnViewerEditor.KEYBOARD_ACTIVATION);
}
@Override
protected boolean canEdit(Object element){
return (element instanceof LaborOrderViewerItem)
&& (((LaborOrderViewerItem) element).getLabItemTyp() != LabItemTyp.FORMULA);
}
@Override
protected CellEditor getCellEditor(Object element){
if (element instanceof LaborOrderViewerItem) {
LaborOrderViewerItem viewerItem = ((LaborOrderViewerItem) element);
if (viewerItem.getLabItemTyp() == LabItemTyp.DOCUMENT) {
return null;
} else {
return textCellEditor;
}
}
return null;
}
@Override
protected Object getValue(Object element){
if (element instanceof LaborOrderViewerItem) {
LaborOrderViewerItem viewerItem = (LaborOrderViewerItem) element;
if (viewerItem.getLabItemTyp() == LabItemTyp.DOCUMENT) {
return "Doc"; //$NON-NLS-1$
} else if (viewerItem.getLabItemTyp() == LabItemTyp.TEXT) {
LabResult result = viewerItem.getLabResult();
if (result != null) {
return result.getComment();
}
} else {
LabResult result = viewerItem.getLabResult();
if (result != null) {
return result.getResult();
}
}
}
return ""; //$NON-NLS-1$
}
@Override
protected void setValue(final Object element, final Object value){
LaborOrderViewerItem viewerItem = getSelectedItem();
if (viewerItem instanceof LaborOrderViewerItem && value != null) {
LabResult result = (LabResult) viewerItem.getLabResult();
if (result == null) {
result =
createResult(viewerItem, LabOrder.getOrCreateManualLabor());
}
final LabResult lockResult = result;
AcquireLockBlockingUi.aquireAndRun(result, new ILockHandler() {
@Override
public void lockFailed(){
// TODO Auto-generated method stub
}
@Override
public void lockAcquired(){
if (lockResult.getItem().getTyp() == LabItemTyp.TEXT) {
lockResult.setResult("Text"); //$NON-NLS-1$
lockResult.set(LabResult.COMMENT, value.toString());
viewerItem.setState(LabOrder.State.DONE);
} else if (lockResult.getItem().getTyp() == LabItemTyp.DOCUMENT) {
// dont know what todo ...
} else {
lockResult.setResult(value.toString());
viewerItem.setState(LabOrder.State.DONE);
}
}
});
int columnIdx = focusCell.getFocusCell().getColumnIndex();
ViewerRow row = focusCell.getFocusCell().getViewerRow();
ViewerRow nextRow = row.getNeighbor(ViewerRow.BELOW, true);
viewerItem.refreshResultString();
if (nextRow != null) {
getViewer().setSelection(new StructuredSelection(nextRow.getElement()), true);
getViewer().editElement(nextRow.getElement(), columnIdx);
}
}
}
private LaborOrderViewerItem getSelectedItem(){
ISelection selection = getViewer().getSelection();
if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
return (LaborOrderViewerItem) ((IStructuredSelection) selection).getFirstElement();
}
return null;
}
private LabResult createResult(LaborOrderViewerItem viewerItem, Kontakt origin){
LabResult result = viewerItem.createResult(origin);
result.setTransmissionTime(new TimeTool());
return result;
}
}