package ch.elexis.core.ui.laboratory.dialogs;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.util.Extensions;
import ch.elexis.core.model.ILabOrder;
import ch.elexis.core.model.issue.Visibility;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.constants.ExtensionPointConstantsUi;
import ch.elexis.core.ui.laboratory.controls.LabItemTreeSelectionComposite;
import ch.elexis.core.ui.laboratory.controls.LabItemTreeSelectionComposite.Group;
import ch.elexis.core.ui.laboratory.controls.LabItemTreeSelectionComposite.GroupItem;
import ch.elexis.core.ui.laboratory.laborlink.LaborLink;
import ch.elexis.core.ui.laboratory.views.LabOrderView;
import ch.elexis.core.ui.util.IExternLaborOrder;
import ch.elexis.core.ui.util.viewers.DefaultLabelProvider;
import ch.elexis.data.Anwender;
import ch.elexis.data.LabOrder;
import ch.elexis.data.Patient;
import ch.elexis.data.Query;
import ch.elexis.data.Reminder;
import ch.rgw.tools.TimeTool;
public class LaborVerordnungDialog extends TitleAreaDialog {
private static final String LAST_SELECTED_USER = LaborLink.PROVIDER_ID + "/last_selected_user"; //$NON-NLS-1$
private static final String PREV_PRINT_SETTING = LaborLink.PROVIDER_ID + "/prev_print_setting"; //$NON-NLS-1$
private Patient patient = null;
private TimeTool date = null;
private LabItemTreeSelectionComposite selectionComposite;
private ComboViewer userViewer = null;
private ComboViewer externViewer = null;
private DateTime observationTime;
private DateTime observationDate;
private Text orderId;
private Button btnPrint;
public LaborVerordnungDialog(Shell parentShell, Patient patient, TimeTool date){
super(parentShell);
this.patient = patient;
this.date = date;
}
private void selectLastSelectedUser(){
String id = CoreHub.userCfg.get(LAST_SELECTED_USER, ""); //$NON-NLS-1$
Anwender user = Anwender.load(id);
if (user != null && user.exists()) {
StructuredSelection newSelection = new StructuredSelection(user);
userViewer.setSelection(newSelection);
}
}
private void saveLastSelectedUser(){
Anwender user = getSelectedUser();
String id = ""; //$NON-NLS-1$
if (user != null) {
id = user.getId();
}
CoreHub.userCfg.set(LAST_SELECTED_USER, id);
}
@Override
protected Control createDialogArea(Composite parent){
Composite composite = (Composite) super.createDialogArea(parent);
composite.setLayout(new GridLayout(1, false));
selectionComposite = new LabItemTreeSelectionComposite(composite,
new LabItemsLabelProvider(), true, SWT.NONE);
selectionComposite.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event){
updateSelectionMessage();
}
});
selectionComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label label = new Label(composite, SWT.NONE);
label.setText(Messages.LaborVerordnungDialog_labelResponsible);
userViewer = new ComboViewer(composite,
SWT.SINGLE | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
userViewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
userViewer.setContentProvider(new ArrayContentProvider());
userViewer.setLabelProvider(new DefaultLabelProvider());
Query<Anwender> query = new Query<Anwender>(Anwender.class);
List<Anwender> users = query.execute();
users.set(0, new NoAnwender());
userViewer.setInput(users);
selectLastSelectedUser();
label = new Label(composite, SWT.NONE);
label.setText("Extern verordnen"); //$NON-NLS-1$
externViewer = new ComboViewer(composite,
SWT.SINGLE | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
externViewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
externViewer.setContentProvider(new ArrayContentProvider());
externViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element){
if (element instanceof IExternLaborOrder) {
IExternLaborOrder extern = (IExternLaborOrder) element;
return extern.getLabel();
} else {
return "???";
}
}
});
externViewer.setInput(getExternLaborOrder());
label = new Label(composite, SWT.NONE);
label.setText("Entnahme-/Beobachtungszeitpunkt");
label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
Composite dateComposite = new Composite(composite, SWT.NONE);
dateComposite.setLayout(new GridLayout(2, true));
dateComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
observationTime = new DateTime(dateComposite, SWT.TIME);
observationTime.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
observationDate = new DateTime(dateComposite, SWT.DATE);
observationDate.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
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));
label = new Label(composite, SWT.NONE);
label.setText(Messages.LaborVerordnungDialog_labelOrderNumber);
orderId = new Text(composite, SWT.SEARCH);
orderId.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
orderId.setText(LabOrder.getNextOrderId());
orderId.setEnabled(false);
Label lblSeparator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
lblSeparator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
btnPrint = new Button(composite, SWT.CHECK);
btnPrint.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
btnPrint.setText(Messages.LaborVerordnungDialog_printOrders);
btnPrint.setSelection(CoreHub.userCfg.get(PREV_PRINT_SETTING, false));
return composite;
}
private List<IExternLaborOrder> getExternLaborOrder(){
List<IExternLaborOrder> externLaborOrders = Extensions.getClasses(
Extensions.getExtensions(ExtensionPointConstantsUi.LABORORDER), "class", //$NON-NLS-1$ //$NON-NLS-2$
false);
return externLaborOrders;
}
private void updateSelectionMessage(){
List<GroupItem> selected = selectionComposite.getSelectedItems();
StringBuilder sb = new StringBuilder();
for (GroupItem groupItem : selected) {
sb.append(groupItem.getGroupname() + " - " + groupItem.getLabItem().getKuerzel()); //$NON-NLS-1$
sb.append(", "); //$NON-NLS-1$
}
if (sb.length() > 2) {
sb.setLength(sb.length() - 2);
}
setMessage(sb.toString(), IMessageProvider.INFORMATION);
}
@Override
protected Control createContents(Composite parent){
Control contents = super.createContents(parent);
setTitle(Messages.LaborVerordnungDialog_title);
setMessage(Messages.LaborVerordnungDialog_message
+ " verantwortliche Person aus. (Der verantwortlichen Person" //$NON-NLS-1$
+ " wird eine Pendenz zugeordnet.)"); //$NON-NLS-1$
getShell().setText(Messages.LaborVerordnungDialog_shellTitle);
return contents;
}
private List<LabOrder> createLabOrders(List<GroupItem> items){
List<LabOrder> ret = new ArrayList<LabOrder>();
getTime(observationTime, date);
getDate(observationDate, date);
TimeTool now = new TimeTool();
if (items != null) {
for (GroupItem groupItem : items) {
LabOrder order = new LabOrder(CoreHub.actUser, CoreHub.actMandant, patient,
groupItem.getLabItem(), null, orderId.getText(), groupItem.getGroupname(), now);
order.setObservationTimeWithResults(date);
ret.add(order);
}
}
return ret;
}
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 createReminder(Anwender user, List<LabOrder> orders){
StringBuilder message = new StringBuilder("Labor"); //$NON-NLS-1$
StringBuilder params = new StringBuilder();
if (orders != null && !orders.isEmpty()) {
message.append(" ")
.append(
ch.elexis.core.ui.laboratory.controls.Messages.LaborOrdersComposite_columnOrdernumber)
.append(": ").append(orders.get(0).get(LabOrder.FLD_ORDERID)); //$NON-NLS-1$
params.append(LabOrder.FLD_ORDERID + "=" + orders.get(0).get(LabOrder.FLD_ORDERID));
}
Reminder reminder = new Reminder(patient, date.toString(TimeTool.DATE_ISO),
Visibility.ALWAYS, params.toString(), message.toString()); //$NON-NLS-1$
if (user != null) {
reminder.set("Responsible", user.getId()); //$NON-NLS-1$
}
}
private Anwender getSelectedUser(){
Object sel = ((IStructuredSelection) userViewer.getSelection()).getFirstElement();
if (sel instanceof Anwender) {
if (!(sel instanceof NoAnwender)) {
return (Anwender) sel;
}
}
return null;
}
@Override
protected void okPressed(){
List<ILabOrder> existing = LabOrder.getLabOrdersByOrderId(orderId.getText());
if (existing != null) {
String newOrderId = LabOrder.getNextOrderId();
setErrorMessage(String.format(Messages.LaborVerordnungDialog_errorOrderNumber,
orderId.getText(), newOrderId));
orderId.setText(newOrderId);
return;
}
final List<LabOrder> orders = createLabOrders(selectionComposite.getSelectedItems());
ElexisEventDispatcher.reload(LabOrder.class);
if (getSelectedUser() != null) {
createReminder(getSelectedUser(), orders);
}
saveLastSelectedUser();
StructuredSelection externSelection = (StructuredSelection) externViewer.getSelection();
if (!externSelection.isEmpty()) {
IExternLaborOrder extern = (IExternLaborOrder) externSelection.getFirstElement();
extern.order(patient, orders);
}
// save print settings
boolean doPrint = btnPrint.getSelection();
CoreHub.userCfg.set(PREV_PRINT_SETTING, doPrint);
if (doPrint) {
UiDesk.getDisplay().asyncExec(new Runnable() {
@Override
public void run(){
Patient pat = ElexisEventDispatcher.getSelectedPatient();
try {
IWorkbenchPage page =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
LabOrderView labOrderView = (LabOrderView) page.showView(LabOrderView.ID);
labOrderView.createLabOrderPrint(pat, orders);
} catch (PartInitException e) {
e.printStackTrace();
}
}
});
}
super.okPressed();
}
private class LabItemsLabelProvider extends LabelProvider {
private HashMap<Object, String> cache = new HashMap<Object, String>();
@Override
public String getText(Object element){
String label = cache.get(element);
if (label == null) {
if (element instanceof Group) {
label = ((Group) element).toString();
cache.put(element, label);
} else if (element instanceof GroupItem) {
List<LabOrder> orders = LabOrder.getLabOrders(patient, null,
((GroupItem) element).getLabItem(), null, null, date, null);
if (orders != null && !orders.isEmpty()) {
label = Messages.LaborVerordnungDialog_alreadyOrdered
+ ((GroupItem) element).getLabItem().getLabel(); //$NON-NLS-1$
} else {
label = ((GroupItem) element).getLabItem().getLabel();
}
cache.put(element, label);
}
}
return label;
}
}
private static class NoAnwender extends Anwender {
@Override
public String getId(){
return "";
}
@Override
public String getLabel(){
return "";
}
@Override
public String getLabel(boolean shortLabel){
return getLabel();
}
}
}