package edu.ualberta.med.biobank.forms; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Display; import org.eclipse.swt.widgets.Label; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.action.dispatch.DispatchGetInfoAction; import edu.ualberta.med.biobank.common.action.info.DispatchReadInfo; import edu.ualberta.med.biobank.common.permission.dispatch.DispatchChangeStatePermission; import edu.ualberta.med.biobank.common.wrappers.DispatchSpecimenWrapper; import edu.ualberta.med.biobank.common.wrappers.DispatchWrapper; import edu.ualberta.med.biobank.common.wrappers.ShipmentInfoWrapper; import edu.ualberta.med.biobank.dialogs.dispatch.SendDispatchDialog; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.gui.common.widgets.BgcBaseText; import edu.ualberta.med.biobank.gui.common.widgets.BgcEntryFormWidgetListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableDoubleClickItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableEditItemListener; import edu.ualberta.med.biobank.gui.common.widgets.InfoTableEvent; import edu.ualberta.med.biobank.gui.common.widgets.InfoTableSelection; import edu.ualberta.med.biobank.gui.common.widgets.MultiSelectEvent; import edu.ualberta.med.biobank.model.Dispatch; import edu.ualberta.med.biobank.treeview.SpecimenAdapter; import edu.ualberta.med.biobank.treeview.dispatch.DispatchAdapter; import edu.ualberta.med.biobank.views.SpecimenTransitView; import edu.ualberta.med.biobank.widgets.infotables.CommentsInfoTable; import edu.ualberta.med.biobank.widgets.infotables.DispatchSpecimenListInfoTable; import edu.ualberta.med.biobank.widgets.trees.DispatchSpecimensTreeTable; public class DispatchViewForm extends BiobankViewForm { public static final String ID = "edu.ualberta.med.biobank.forms.DispatchViewForm"; private DispatchAdapter dispatchAdapter; private DispatchWrapper dispatch = new DispatchWrapper( SessionManager.getAppService()); private BgcBaseText senderLabel; private BgcBaseText receiverLabel; private BgcBaseText departedLabel; private BgcBaseText shippingMethodLabel; private BgcBaseText waybillLabel; private BgcBaseText dateReceivedLabel; private DispatchSpecimensTreeTable specimensTree; private DispatchSpecimenListInfoTable specimensNonProcessedTable; private CommentsInfoTable commentTable; @Override protected void init() throws Exception { Assert.isTrue((adapter instanceof DispatchAdapter), "Invalid editor input: object of type " + adapter.getClass().getName()); dispatchAdapter = (DispatchAdapter) adapter; setDispatchInfo(adapter.getId()); setPartName("Dispatch"); } private void setDispatchInfo(Integer id) throws Exception { if (id == null) { Dispatch d = new Dispatch(); dispatch.setWrappedObject(d); } else { DispatchReadInfo read = SessionManager.getAppService().doAction( new DispatchGetInfoAction(adapter.getId())); read.dispatch.setDispatchSpecimens(read.specimens); dispatch.setWrappedObject(read.dispatch); SessionManager.logLookup(read.dispatch); } } @Override public void setValues() throws Exception { commentTable.setList(dispatch.getCommentCollection(false)); setDispatchValues(); specimensTree.refresh(); } @Override protected void createFormContent() throws Exception { String dateString = null; if (dispatch.getShipmentInfo() != null && dispatch.getShipmentInfo().getPackedAt() != null) { dateString = dispatch.getFormattedPackedAt(); } if (dateString == null) form.setText(NLS.bind( "Dispatch created for {1}", dateString, dispatch.getSenderCenter().getNameShort())); else form.setText(NLS.bind("Dispatch sent on {0} from {1}", dateString, dispatch.getSenderCenter().getNameShort())); page.setLayout(new GridLayout(1, false)); page.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createMainSection(); createTreeTableSection(); setDispatchValues(); DispatchChangeStatePermission perm = new DispatchChangeStatePermission(dispatch.getId()); Assert.isNotNull(SessionManager.getUser().getCurrentWorkingCenter()); if (SessionManager.getAppService().isAllowed(perm)) { if (dispatch.isInCreationState() && SessionManager.getUser().getCurrentWorkingCenter() .equals(dispatch.getSenderCenter())) createSendButton(); else if (dispatch.isInTransitState() && SessionManager.getUser().getCurrentWorkingCenter() .equals(dispatch.getReceiverCenter())) createReceiveButtons(); else if (dispatch.isInReceivedState() && SessionManager.getUser().getCurrentWorkingCenter() .equals(dispatch.getReceiverCenter()) && dispatch.getNonProcessedDispatchSpecimenCollection().size() == 0) createCloseButton(); } commentTable.setList(dispatch.getCommentCollection(false)); } @Override protected void addEditAction() { super.addEditAction(); } private void createTreeTableSection() { if (dispatch.isInCreationState()) { Composite parent = createSectionWithClient("Specimens added"); specimensNonProcessedTable = new DispatchSpecimenListInfoTable(parent, dispatch, false) { @Override public List<DispatchSpecimenWrapper> getInternalDispatchSpecimens() { return dispatch.getDispatchSpecimenCollection(false); } }; specimensNonProcessedTable.adaptToToolkit(toolkit, true); specimensNonProcessedTable .addClickListener(new IInfoTableDoubleClickItemListener<DispatchSpecimenWrapper>() { @Override public void doubleClick( InfoTableEvent<DispatchSpecimenWrapper> event) { Object selection = event.getSelection(); if (selection instanceof InfoTableSelection) { InfoTableSelection tableSelection = (InfoTableSelection) selection; DispatchSpecimenWrapper dsa = (DispatchSpecimenWrapper) tableSelection .getObject(); if (dsa != null) { SessionManager.openViewForm(dsa.getSpecimen()); } } } }); specimensNonProcessedTable .addSelectionChangedListener(new BgcEntryFormWidgetListener() { @Override public void selectionChanged(MultiSelectEvent event) { specimensNonProcessedTable.reloadCollection(); } }); specimensNonProcessedTable .addEditItemListener(new IInfoTableEditItemListener<DispatchSpecimenWrapper>() { @Override public void editItem( InfoTableEvent<DispatchSpecimenWrapper> event) { Object selection = event.getSelection(); if (selection instanceof InfoTableSelection) { InfoTableSelection tableSelection = (InfoTableSelection) selection; DispatchSpecimenWrapper dsa = (DispatchSpecimenWrapper) tableSelection .getObject(); if (dsa != null) { new SpecimenAdapter(null, dsa.getSpecimen()) .openEntryForm(); } } } }); } else { specimensTree = new DispatchSpecimensTreeTable(page, dispatch, false); specimensTree.addClickListener(); } } private void createReceiveButtons() { Composite composite = toolkit.createComposite(page); composite.setLayout(new GridLayout(3, false)); Button sendButton = toolkit.createButton(composite, "Receive", SWT.PUSH); sendButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { dispatchAdapter.doReceive(); } }); Button sendProcessButton = toolkit.createButton(composite, "Receive and Process", SWT.PUSH); sendProcessButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { dispatchAdapter.doReceiveAndProcess(); } }); Button lostProcessButton = toolkit.createButton(composite, "Lost", SWT.PUSH); lostProcessButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { dispatchAdapter.doSetAsLost(); } }); } private void createCloseButton() { Composite composite = toolkit.createComposite(page); composite.setLayout(new GridLayout(2, false)); Button sendButton = toolkit.createButton(composite, "Done", SWT.PUSH); sendButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { dispatchAdapter.doClose(); } }); } private void createSendButton() { final Button sendButton = toolkit.createButton(page, "Send", SWT.PUSH); sendButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (new SendDispatchDialog(Display.getDefault() .getActiveShell(), dispatch).open() == Dialog.OK) { IRunnableContext context = new ProgressMonitorDialog(Display.getDefault() .getActiveShell()); try { context.run(true, true, new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) { monitor.beginTask( "Saving...", IProgressMonitor.UNKNOWN); try { dispatchAdapter.setModelObject(dispatch); dispatchAdapter.doSend(); } catch (Exception ex) { saveErrorCatch(ex, monitor, false); return; } monitor.done(); } }); } catch (Exception e1) { BgcPlugin.openAsyncError( "Save error", e1); } SpecimenTransitView.getCurrent().reload(); dispatchAdapter.openViewForm(); } } }); } private void createMainSection() { Composite client = toolkit.createComposite(page); GridLayout layout = new GridLayout(2, false); layout.horizontalSpacing = 10; client.setLayout(layout); client.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); toolkit.paintBordersFor(client); String stateMessage = null; if (dispatch.isInLostState()) stateMessage = " Dispatch Lost "; else if (dispatch.isInClosedState()) stateMessage = " Dispatch Complete "; if (stateMessage != null) { Label label = widgetCreator.createLabel(client, stateMessage, SWT.CENTER, false); label.setBackground(Display.getDefault().getSystemColor( SWT.COLOR_RED)); label.setForeground(Display.getDefault().getSystemColor( SWT.COLOR_WHITE)); GridData gd = new GridData(); gd.horizontalAlignment = SWT.CENTER; gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; label.setLayoutData(gd); } senderLabel = createReadOnlyLabelledField(client, SWT.NONE, "Sender"); receiverLabel = createReadOnlyLabelledField(client, SWT.NONE, "Receiver"); if (!dispatch.isInCreationState()) { departedLabel = createReadOnlyLabelledField(client, SWT.NONE, "Packed at"); shippingMethodLabel = createReadOnlyLabelledField(client, SWT.NONE, "Shipping Method"); waybillLabel = createReadOnlyLabelledField(client, SWT.NONE, "Waybill"); } if (dispatch.hasBeenReceived()) { dateReceivedLabel = createReadOnlyLabelledField(client, SWT.NONE, "Date received"); } createCommentsSection(); } private void createCommentsSection() { Composite client = createSectionWithClient("Comments"); commentTable = new CommentsInfoTable(client, dispatch.getCommentCollection(false)); commentTable.adaptToToolkit(toolkit, true); toolkit.paintBordersFor(commentTable); } private void setDispatchValues() { setTextValue( senderLabel, dispatch.getSenderCenter().getName()); setTextValue( receiverLabel, dispatch.getReceiverCenter().getName()); if (departedLabel != null) setTextValue(departedLabel, dispatch.getFormattedPackedAt()); ShipmentInfoWrapper shipInfo = dispatch.getShipmentInfo(); if (shipInfo != null) { if (shippingMethodLabel != null) setTextValue(shippingMethodLabel, shipInfo.getShippingMethod() == null ? "" : shipInfo .getShippingMethod().getName()); if (waybillLabel != null) setTextValue(waybillLabel, shipInfo.getWaybill()); if (dateReceivedLabel != null) setTextValue(dateReceivedLabel, shipInfo.getFormattedDateReceived()); } } }