package edu.ualberta.med.biobank.treeview.dispatch; import java.util.Date; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Tree; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.action.dispatch.DispatchChangeStateAction; import edu.ualberta.med.biobank.common.action.dispatch.DispatchDeleteAction; import edu.ualberta.med.biobank.common.action.dispatch.DispatchSaveAction; import edu.ualberta.med.biobank.common.permission.dispatch.DispatchDeletePermission; import edu.ualberta.med.biobank.common.permission.dispatch.DispatchReadPermission; import edu.ualberta.med.biobank.common.permission.dispatch.DispatchUpdatePermission; import edu.ualberta.med.biobank.common.util.DispatchState; import edu.ualberta.med.biobank.common.wrappers.CenterWrapper; import edu.ualberta.med.biobank.common.wrappers.DispatchWrapper; import edu.ualberta.med.biobank.common.wrappers.ModelWrapper; import edu.ualberta.med.biobank.common.wrappers.ShipmentInfoWrapper; import edu.ualberta.med.biobank.forms.DispatchReceivingEntryForm; import edu.ualberta.med.biobank.forms.DispatchSendingEntryForm; import edu.ualberta.med.biobank.forms.DispatchViewForm; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.treeview.AbstractAdapterBase; import edu.ualberta.med.biobank.treeview.AdapterBase; import edu.ualberta.med.biobank.views.SpecimenTransitView; import gov.nih.nci.system.applicationservice.ApplicationException; public class DispatchAdapter extends AdapterBase { public DispatchAdapter(AdapterBase parent, DispatchWrapper ship) { super(parent, ship); } private DispatchWrapper getDispatchWrapper() { return (DispatchWrapper) getModelObject(); } @Override public void init() { try { this.isDeletable = SessionManager.getAppService().isAllowed( new DispatchDeletePermission(getModelObject().getId())); this.isReadable = SessionManager.getAppService().isAllowed( new DispatchReadPermission(getModelObject().getId())); this.isEditable = SessionManager.getAppService().isAllowed( new DispatchUpdatePermission(getModelObject().getId())); } catch (ApplicationException e) { BgcPlugin.openAsyncError("Permission Error", "Unable to retrieve user permissions"); } } @Override public boolean isEditable() { boolean editable = super.isEditable(); if (getDispatchWrapper() != null) { return editable && ((getDispatchWrapper().getSenderCenter().equals( SessionManager.getUser().getCurrentWorkingCenter()) && (getDispatchWrapper() .isNew() || getDispatchWrapper().isInCreationState() || getDispatchWrapper().isInTransitState() || getDispatchWrapper() .isInLostState())) || (getDispatchWrapper() .getReceiverCenter().equals( SessionManager.getUser().getCurrentWorkingCenter()) && (getDispatchWrapper() .isInReceivedState() || getDispatchWrapper().isInLostState() || getDispatchWrapper() .isInClosedState()))); } return editable; } @Override protected String getLabelInternal() { DispatchWrapper dispatch = getDispatchWrapper(); Assert.isNotNull(dispatch, "Dispatch is null"); //$NON-NLS-1$ String label = ""; //$NON-NLS-1$ if (dispatch.getSenderCenter() != null && dispatch.getReceiverCenter() != null) label += dispatch.getSenderCenter().getNameShort() + " -> " //$NON-NLS-1$ + dispatch.getReceiverCenter().getNameShort(); ShipmentInfoWrapper shipInfo = dispatch.getShipmentInfo(); if ((shipInfo != null) && (shipInfo.getPackedAt() != null)) label += " [" + dispatch.getFormattedPackedAt() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ return label; } @Override public String getTooltipTextInternal() { return getTooltipText(Messages.DispatchAdapter_dispatch_label); } @Override public void popupMenu(TreeViewer tv, Tree tree, Menu menu) { CenterWrapper<?> siteParent = SessionManager.getUser() .getCurrentWorkingCenter(); addViewMenu(menu, Messages.DispatchAdapter_dispatch_label); try { if (isDeletable()) { addDeleteMenu(menu, Messages.DispatchAdapter_dispatch_label); } if (siteParent.equals(getDispatchWrapper().getReceiverCenter()) && isEditable && getDispatchWrapper().hasErrors()) { MenuItem mi = new MenuItem(menu, SWT.PUSH); mi.setText(Messages.DispatchAdapter_close_label); mi.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { doClose(); } }); } if (siteParent.equals(getDispatchWrapper().getSenderCenter()) && isEditable && getDispatchWrapper().isInTransitState()) { MenuItem mi = new MenuItem(menu, SWT.PUSH); mi.setText(Messages.DispatchAdapter_move_creation_label); mi.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { setDispatchAsCreation(); } }); } if (siteParent.equals(getDispatchWrapper().getReceiverCenter()) && getDispatchWrapper().isInTransitState()) { MenuItem mi = new MenuItem(menu, SWT.PUSH); mi.setText(Messages.DispatchAdapter_receive_label); mi.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { doReceive(); } }); mi = new MenuItem(menu, SWT.PUSH); mi.setText(Messages.DispatchAdapter_receive_process_label); mi.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { doReceiveAndProcess(); } }); mi = new MenuItem(menu, SWT.PUSH); mi.setText(Messages.DispatchAdapter_lost_label); mi.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { doSetAsLost(); } }); } addEditMenu(menu, Messages.DispatchAdapter_dispatch_label); } catch (Exception e) { BgcPlugin.openAsyncError(Messages.DispatchAdapter_check_error_msg, e); } } @Override public void runDelete() throws Exception { DispatchDeleteAction delete = new DispatchDeleteAction(getDispatchWrapper().getWrappedObject()); SessionManager.getAppService().doAction(delete); } @Override protected String getConfirmDeleteMessage() { return Messages.DispatchAdapter_delete_confirm_msg; } public void doReceive() { setDispatchAsReceived(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { openViewForm(); } }); } public void doSend() { setDispatchAsSent(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { openViewForm(); } }); } private void setDispatchAsSent() { getDispatchWrapper().setState(DispatchState.IN_TRANSIT); persistDispatch(); } public void doReceiveAndProcess() { setDispatchAsReceived(); openEntryForm(); } public void doClose() { getDispatchWrapper().setState(DispatchState.CLOSED); persistDispatch(); openViewForm(); } public void doSetAsLost() { try { // to be sure has last database data. getDispatchWrapper().reload(); } catch (Exception ex) { BgcPlugin.openAsyncError(Messages.DispatchAdapter_reload_error, ex); } getDispatchWrapper().setState(DispatchState.LOST); persistDispatch(); openViewForm(); } private void setDispatchAsReceived() { getDispatchWrapper().getShipmentInfo().setReceivedAt(new Date()); getDispatchWrapper().setState(DispatchState.RECEIVED); persistDispatch(); } private void persistDispatch() { DispatchChangeStateAction action = new DispatchChangeStateAction(getDispatchWrapper().getId(), getDispatchWrapper().getDispatchState(), DispatchSaveAction.prepareShipInfo(getDispatchWrapper() .getShipmentInfo())); try { SessionManager.getAppService().doAction(action); } catch (ApplicationException e) { BgcPlugin.openAsyncError("Unable to save changes", e); } Display.getDefault().syncExec(new Runnable() { @Override public void run() { SpecimenTransitView.reloadCurrent(); } }); } private void setDispatchAsCreation() { getDispatchWrapper().setState(DispatchState.CREATION); getDispatchWrapper().setShipmentInfo(null); persistDispatch(); } @Override protected AdapterBase createChildNode() { return null; } @Override protected AdapterBase createChildNode(Object child) { return null; } @Override protected List<? extends ModelWrapper<?>> getWrapperChildren() throws Exception { return null; } @Override public String getViewFormId() { return DispatchViewForm.ID; } @Override public String getEntryFormId() { if (getDispatchWrapper().isInCreationState() || (getDispatchWrapper().isInTransitState() && SessionManager .getUser().getCurrentWorkingCenter() .equals(getDispatchWrapper().getSenderCenter()))) return DispatchSendingEntryForm.ID; return DispatchReceivingEntryForm.ID; } @Override public int compareTo(AbstractAdapterBase o) { if (o instanceof DispatchAdapter) return internalCompareTo(o); return 0; } }