package edu.ualberta.med.biobank.forms; import java.util.Arrays; import java.util.List; import java.util.Locale; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ComboViewer; 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.Composite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.Section; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.action.scanprocess.CellInfo; import edu.ualberta.med.biobank.common.action.scanprocess.DispatchCreateProcessAction; import edu.ualberta.med.biobank.common.action.scanprocess.data.ShipmentProcessInfo; import edu.ualberta.med.biobank.common.action.scanprocess.result.CellProcessResult; import edu.ualberta.med.biobank.common.action.specimen.SpecimenGetInfoAction; import edu.ualberta.med.biobank.common.peer.ShipmentInfoPeer; import edu.ualberta.med.biobank.common.util.DispatchSpecimenState; import edu.ualberta.med.biobank.common.wrappers.CenterWrapper; import edu.ualberta.med.biobank.common.wrappers.DispatchSpecimenWrapper; import edu.ualberta.med.biobank.common.wrappers.ShipmentInfoWrapper; import edu.ualberta.med.biobank.common.wrappers.ShippingMethodWrapper; import edu.ualberta.med.biobank.common.wrappers.SpecimenWrapper; import edu.ualberta.med.biobank.dialogs.dispatch.DispatchCreateScanDialog; 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.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.utils.ComboSelectionUpdate; import edu.ualberta.med.biobank.model.Specimen; import edu.ualberta.med.biobank.treeview.SpecimenAdapter; import edu.ualberta.med.biobank.widgets.BiobankLabelProvider; import edu.ualberta.med.biobank.widgets.infotables.CommentsInfoTable; import edu.ualberta.med.biobank.widgets.infotables.DispatchSpecimenListInfoTable; import edu.ualberta.med.biobank.widgets.trees.DispatchSpecimensTreeTable; import edu.ualberta.med.biobank.widgets.utils.GuiUtil; import gov.nih.nci.system.applicationservice.ApplicationException; public class DispatchSendingEntryForm extends AbstractDispatchEntryForm { public static final String ID = "edu.ualberta.med.biobank.forms.DispatchSendingEntryForm"; public static final String MSG_NEW_DISPATCH_OK = "Creating a new dispatch record."; public static final String MSG_DISPATCH_OK = "Editing an existing dispatch record."; private ComboViewer destSiteComboViewer; private ComboViewer shippingMethodViewer; protected DispatchSpecimenListInfoTable specimensNonProcessedTable; private DispatchSpecimensTreeTable specimensTreeTable; private ShipmentInfoWrapper shipmentInfo = null; private CommentsInfoTable commentEntryTable; @Override protected void init() throws Exception { super.init(); if (dispatch.isNew()) { Assert .isNotNull(SessionManager.getUser().getCurrentWorkingCenter()); dispatch.getWrappedObject().setSenderCenter( SessionManager.getUser() .getCurrentWorkingCenter().getWrappedObject()); } else { shipmentInfo = dispatch.getShipmentInfo(); } } @Override public void createPartControl(Composite parent) { super.createPartControl(parent); // if the shipment is new, and if the combos hold only one element, // there will be default selections but dirty will be set to false by // default anyway if (dispatch.isNew()) { setDirty(true); } } @Override protected void createFormContent() throws Exception { form.setText("Dispatch Information"); form.setMessage(getOkMessage(), IMessageProvider.NONE); page.setLayout(new GridLayout(1, false)); 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); setFirstControl(client); createReceiverCombo(client); if (!dispatch.isNew() && !dispatch.isInCreationState()) { ShippingMethodWrapper selectedShippingMethod = dispatch .getShipmentInfo().getShippingMethod(); shippingMethodViewer = widgetCreator.createComboViewer(client, "Shipping Method", ShippingMethodWrapper.getShippingMethods(SessionManager .getAppService()), selectedShippingMethod, null, new ComboSelectionUpdate() { @Override public void doSelection(Object selectedObject) { dispatch.getShipmentInfo().setShippingMethod( (ShippingMethodWrapper) selectedObject); } }, new BiobankLabelProvider()); createBoundWidgetWithLabel(client, BgcBaseText.class, SWT.NONE, "Waybill", null, shipmentInfo, ShipmentInfoPeer.WAYBILL.getName(), null); createDateTimeWidget(client, "Departed", null, shipmentInfo, ShipmentInfoPeer.PACKED_AT.getName(), null); } createCommentSection(); createSpecimensSelectionSection(); } private void createCommentSection() { Composite client = createSectionWithClient("Comments"); GridLayout gl = new GridLayout(2, false); client.setLayout(gl); commentEntryTable = new CommentsInfoTable(client, dispatch.getCommentCollection(false)); GridData gd = new GridData(); gd.horizontalSpan = 2; gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; commentEntryTable.setLayoutData(gd); createBoundWidgetWithLabel(client, BgcBaseText.class, SWT.MULTI, "Add a comment", null, comment, "message", null); } private void createReceiverCombo(Composite client) { if (dispatch.isInTransitState()) { BgcBaseText receiverLabel = createReadOnlyLabelledField(client, SWT.NONE, "Receiver"); setTextValue(receiverLabel, dispatch.getReceiverCenter() .getNameShort()); } else { Assert .isNotNull(SessionManager.getUser().getCurrentWorkingCenter()); try { destSiteComboViewer = createComboViewer(client, "Receiver", CenterWrapper.getOtherCenters(SessionManager .getAppService(), SessionManager.getUser() .getCurrentWorkingCenter()), dispatch.getReceiverCenter(), "Dispatch must have a receiver", new ComboSelectionUpdate() { @Override public void doSelection(Object selectedObject) { dispatch .setReceiverCenter((CenterWrapper<?>) selectedObject); setDirty(true); } }); } catch (ApplicationException e) { BgcPlugin .openAsyncError( "Error", "Unable to retrieve Centers"); } } } private void createSpecimensSelectionSection() { if (dispatch.isInCreationState()) { Section section = createSection("Specimens"); Composite composite = toolkit.createComposite(section); composite.setLayout(new GridLayout(1, false)); section.setClient(composite); if (dispatch.isInCreationState()) { addSectionToolbar(section, "Add specimens to this dispatch", new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openScanDialog(); } }, null, BgcPlugin.IMG_DISPATCH_SHIPMENT_ADD_SPECIMEN); createSpecimensSelectionActions(composite, false); createSpecimensNonProcessedSection(true); } } else { specimensTreeTable = new DispatchSpecimensTreeTable(page, dispatch, !dispatch.isInClosedState() && !dispatch.isInLostState()); specimensTreeTable.addSelectionChangedListener(biobankListener); specimensTreeTable.addClickListener(); } } protected void createSpecimensNonProcessedSection(boolean edit) { String title = "Specimens"; if (dispatch.isInCreationState()) { title = "Added specimens"; } Composite parent = createSectionWithClient(title); specimensNonProcessedTable = new DispatchSpecimenListInfoTable(parent, dispatch, edit) { @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 .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(); } } } }); specimensNonProcessedTable.addSelectionChangedListener(biobankListener); } @Override protected void openScanDialog() { Assert.isNotNull(SessionManager.getUser().getCurrentWorkingCenter()); DispatchCreateScanDialog dialog = new DispatchCreateScanDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), dispatch, SessionManager.getUser().getCurrentWorkingCenter()); dialog.open(); setDirty(true); // FIXME add a boolean in the dialog to know if // specimens were added reloadSpecimens(); } @Override protected void doSpecimenTextAction(String inventoryId) { Assert.isNotNull(SessionManager.getUser().getCurrentWorkingCenter()); try { CellProcessResult res = (CellProcessResult) SessionManager .getAppService().doAction( new DispatchCreateProcessAction( new ShipmentProcessInfo(null, dispatch, true), SessionManager.getUser() .getCurrentWorkingCenter().getId(), new CellInfo(-1, -1, inventoryId, null), Locale.getDefault())); switch (res.getProcessStatus()) { case FILLED: // ok Specimen spec = SessionManager.getAppService() .doAction(new SpecimenGetInfoAction(res .getCell().getSpecimenId())).getSpecimen(); dispatch.addSpecimens(Arrays.asList(new SpecimenWrapper( SessionManager.getAppService(), spec)), DispatchSpecimenState.NONE); reloadSpecimens(); setDirty(true); break; case ERROR: BgcPlugin.openAsyncError( "Invalid specimen", res.getCell().getInformation()); break; } } catch (Exception e) { BgcPlugin.openAsyncError( "Error", "Error adding the specimen", e); } } @Override protected String getOkMessage() { return (dispatch.isNew()) ? MSG_NEW_DISPATCH_OK : MSG_DISPATCH_OK; } @Override public String getNextOpenedFormId() { return DispatchViewForm.ID; } @Override public void setValues() throws Exception { CenterWrapper<?> sender = dispatch.getSenderCenter(); super.setValues(); dispatch.setSenderCenter(sender); if (shipmentInfo != null) { dispatch.setShipmentInfo(shipmentInfo); GuiUtil.reset(shippingMethodViewer, shipmentInfo.getShippingMethod()); } GuiUtil.reset(destSiteComboViewer, dispatch.getReceiverCenter()); } @Override protected String getTextForPartName() { if (dispatch.isNew()) { return "New Dispatch"; } Assert.isNotNull(dispatch, "Dispatch is null"); String label = dispatch.getSenderCenter().getNameShort() + " -> " + dispatch.getReceiverCenter().getNameShort(); String packedAt = dispatch.getFormattedPackedAt(); if (packedAt != null) label += " [" + packedAt + "]"; return label; } @Override protected void reloadSpecimens() { if (specimensNonProcessedTable != null) { specimensNonProcessedTable.reloadCollection(); page.layout(true, true); book.reflow(true); } if (specimensTreeTable != null) { specimensTreeTable.refresh(); } } }