package edu.ualberta.med.biobank.forms; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.Assert; 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.Event; import org.eclipse.swt.widgets.Listener; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.action.dispatch.DispatchGetInfoAction; import edu.ualberta.med.biobank.common.action.dispatch.DispatchSaveAction; import edu.ualberta.med.biobank.common.action.info.DispatchReadInfo; import edu.ualberta.med.biobank.common.action.info.DispatchSaveInfo; import edu.ualberta.med.biobank.common.action.info.DispatchSpecimenInfo; import edu.ualberta.med.biobank.common.action.info.ShipmentInfoSaveInfo; import edu.ualberta.med.biobank.common.wrappers.CommentWrapper; import edu.ualberta.med.biobank.common.wrappers.DispatchSpecimenWrapper; import edu.ualberta.med.biobank.common.wrappers.DispatchWrapper; import edu.ualberta.med.biobank.gui.common.BgcLogger; 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.MultiSelectEvent; import edu.ualberta.med.biobank.model.Comment; import edu.ualberta.med.biobank.model.Dispatch; import edu.ualberta.med.biobank.treeview.AdapterBase; import edu.ualberta.med.biobank.treeview.dispatch.DispatchAdapter; import edu.ualberta.med.biobank.views.SpecimenTransitView; public abstract class AbstractDispatchEntryForm extends BiobankEntryForm { @SuppressWarnings("unused") private static BgcLogger logger = BgcLogger .getLogger(AbstractDispatchEntryForm.class.getName()); protected DispatchWrapper dispatch = new DispatchWrapper( SessionManager.getAppService()); protected BgcEntryFormWidgetListener biobankListener = new BgcEntryFormWidgetListener() { @Override public void selectionChanged(MultiSelectEvent event) { reloadSpecimens(); setDirty(true); } }; protected boolean tryAgain; protected DispatchReadInfo dispatchInfo; protected CommentWrapper comment = new CommentWrapper( SessionManager.getAppService()); protected Set<Integer> oldSpecIds; @Override protected void init() throws Exception { Assert.isNotNull(adapter, "Adapter should be no null"); Assert.isTrue((adapter instanceof DispatchAdapter), "Invalid editor input: object of type " + adapter.getClass().getName()); setDispatchInfo(adapter.getId()); setPartName(getTextForPartName()); } 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); } comment.setWrappedObject(new Comment()); } protected abstract String getTextForPartName(); /** * Create a field to enter inventory id one by one + a button to open a scan * dialog */ protected void createSpecimensSelectionActions(Composite composite, boolean setAsFirstControl) { Composite addComposite = toolkit.createComposite(composite); addComposite.setLayout(new GridLayout(5, false)); toolkit.createLabel(addComposite, "Enter inventory ID to add:"); final BgcBaseText newSpecimenText = new BgcBaseText(addComposite, SWT.NONE, toolkit); GridData gd = new GridData(); gd.widthHint = 100; newSpecimenText.setLayoutData(gd); newSpecimenText.addListener(SWT.DefaultSelection, new Listener() { @Override public void handleEvent(Event e) { doSpecimenTextAction(newSpecimenText.getText()); newSpecimenText.setFocus(); newSpecimenText.setText(""); } }); if (setAsFirstControl) { setFirstControl(newSpecimenText); } Button addButton = toolkit.createButton(addComposite, "", SWT.PUSH); addButton.setImage(BgcPlugin.getDefault().getImageRegistry() .get(BgcPlugin.IMG_ADD)); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doSpecimenTextAction(newSpecimenText.getText()); newSpecimenText.setFocus(); newSpecimenText.setText(""); } }); toolkit.createLabel(addComposite, "or open scan dialog:"); Button openScanButton = toolkit .createButton(addComposite, "", SWT.PUSH); openScanButton.setImage(BgcPlugin.getDefault().getImageRegistry() .get(BgcPlugin.IMG_DISPATCH_SHIPMENT_ADD_SPECIMEN)); openScanButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openScanDialog(); } }); } /** * open scan when click on button */ protected abstract void openScanDialog(); /** * add specimen represented by the inventoryid entered in the text field */ protected abstract void doSpecimenTextAction(String text); protected boolean needToTryAgainIfConcurrency() { return false; } protected void doTrySettingAgain() throws Exception { // default does nothing } @Override protected void doAfterSave() throws Exception { if (tryAgain) { tryAgain = false; confirm(); } else SpecimenTransitView.getCurrent().reload(); } protected abstract void reloadSpecimens(); @Override public void setValues() throws Exception { reloadSpecimens(); } @Override protected void saveForm() throws Exception { Set<DispatchSpecimenInfo> dsInfos = new HashSet<DispatchSpecimenInfo>(); for (DispatchSpecimenWrapper ds : dispatch .getDispatchSpecimenCollection(false)) dsInfos.add(new DispatchSpecimenInfo(ds.getId(), ds.getSpecimen() .getId(), ds.getState())); DispatchSaveInfo dInfo = new DispatchSaveInfo(dispatch.getId(), dispatch.getReceiverCenter() .getId(), dispatch.getSenderCenter().getId(), dispatch.getState(), (comment.getMessage() == null) ? "" : comment.getMessage()); ShipmentInfoSaveInfo ship = null; if (!dispatch.isNew() && dispatch.getShipmentInfo() != null) ship = DispatchSaveAction.prepareShipInfo(dispatch.getShipmentInfo()); DispatchSaveAction save = new DispatchSaveAction(dInfo, dsInfos, ship); dispatch.setId(SessionManager.getAppService().doAction(save).getId()); ((AdapterBase) adapter).setModelObject(dispatch); } }