package edu.ualberta.med.biobank.views; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; 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 edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.formatters.DateFormatter; import edu.ualberta.med.biobank.common.permission.dispatch.DispatchReadPermission; import edu.ualberta.med.biobank.common.permission.shipment.OriginInfoReadPermission; import edu.ualberta.med.biobank.common.wrappers.ClinicWrapper; import edu.ualberta.med.biobank.common.wrappers.DispatchWrapper; import edu.ualberta.med.biobank.common.wrappers.ModelWrapper; import edu.ualberta.med.biobank.common.wrappers.OriginInfoWrapper; import edu.ualberta.med.biobank.gui.common.BgcLogger; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.gui.common.widgets.DateTimeWidget; import edu.ualberta.med.biobank.treeview.AbstractAdapterBase; import edu.ualberta.med.biobank.treeview.AbstractSearchedNode; import edu.ualberta.med.biobank.treeview.AbstractTodayNode; import edu.ualberta.med.biobank.treeview.AdapterBase; import edu.ualberta.med.biobank.treeview.DateNode; import edu.ualberta.med.biobank.treeview.RootNode; import edu.ualberta.med.biobank.treeview.dispatch.DispatchAdapter; import edu.ualberta.med.biobank.treeview.dispatch.DispatchCenterAdapter; import edu.ualberta.med.biobank.treeview.dispatch.OriginInfoSearchedNode; import edu.ualberta.med.biobank.treeview.shipment.ClinicWithShipmentAdapter; import edu.ualberta.med.biobank.treeview.shipment.ShipmentAdapter; import edu.ualberta.med.biobank.treeview.shipment.ShipmentTodayNode; import gov.nih.nci.system.applicationservice.ApplicationException; public class SpecimenTransitView extends AbstractTodaySearchAdministrationView { public static final String ID = "edu.ualberta.med.biobank.views.SpecimenTransitView"; //$NON-NLS-1$ private static BgcLogger logger = BgcLogger .getLogger(SpecimenTransitView.class.getName()); private Button radioWaybill; private Composite dateComposite; private DateTimeWidget dateWidget; private DispatchCenterAdapter centerNode; private Button radioDateReceived; private Button radioDateSent; private static SpecimenTransitView currentInstance; public SpecimenTransitView() { currentInstance = this; SessionManager.addView(this); } public void createNodes() throws Exception { if (SessionManager.getUser().getCurrentWorkingCenter() != null) { centerNode = new DispatchCenterAdapter((RootNode) rootNode, SessionManager.getUser().getCurrentWorkingCenter()); centerNode.setParent(rootNode); rootNode.addChild(centerNode); } todayNode = createTodayNode(); todayNode.setParent(rootNode); rootNode.addChild(todayNode); searchedNode = createSearchedNode(); searchedNode.setParent(rootNode); rootNode.addChild(searchedNode); } @Override protected void createTreeTextOptions(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(3, false); layout.horizontalSpacing = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; composite.setLayout(layout); radioWaybill = new Button(composite, SWT.RADIO); radioWaybill.setText(Messages.SpecimenTransitView_waybill_label); radioWaybill.setSelection(true); radioWaybill.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (radioWaybill.getSelection()) { showTextOnly(true); } } }); radioDateReceived = new Button(composite, SWT.RADIO); radioDateReceived.setText(Messages.SpecimenTransitView_received_label); radioDateReceived.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (radioDateReceived.getSelection()) { showTextOnly(false); } } }); radioDateSent = new Button(composite, SWT.RADIO); radioDateSent.setText(Messages.SpecimenTransitView_packed_label); radioDateSent.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (radioDateSent.getSelection()) { showTextOnly(false); } } }); dateComposite = new Composite(parent, SWT.NONE); layout = new GridLayout(2, false); layout.horizontalSpacing = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; dateComposite.setLayout(layout); GridData gd = new GridData(); gd.exclude = true; dateComposite.setLayoutData(gd); dateWidget = new DateTimeWidget(dateComposite, SWT.DATE, new Date()); dateWidget.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { internalSearch(); } }); Button searchButton = new Button(dateComposite, SWT.PUSH); searchButton.setText(Messages.SpecimenTransitView_go_label); searchButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { internalSearch(); } }); } protected void showTextOnly(boolean show) { treeText.setVisible(show); ((GridData) treeText.getLayoutData()).exclude = !show; dateComposite.setVisible(!show); ((GridData) dateComposite.getLayoutData()).exclude = show; treeText.getParent().layout(true, true); } @Override public void reload() { if (rootNode != null) { rootNode.removeAll(); try { createNodes(); } catch (Exception e) { logger.error(Messages.SpecimenTransitView_nodes_error_title, e); } for (AbstractAdapterBase adaper : rootNode.getChildren()) { adaper.rebuild(); } } try { setSearchFieldsEnablement(SessionManager.getAppService().isAllowed( new DispatchReadPermission(SessionManager.getUser() .getCurrentWorkingCenter().getWrappedObject())) || SessionManager.getAppService().isAllowed( new OriginInfoReadPermission(SessionManager.getUser() .getCurrentWorkingCenter().getWrappedObject()))); } catch (ApplicationException e) { BgcPlugin.openAccessDeniedErrorMessage(); } super.reload(); } @Override protected void internalSearch() { try { List<? extends ModelWrapper<?>> searchedObject = search(); if (searchedObject == null || searchedObject.size() == 0) { String msg; if (radioWaybill.getSelection()) { msg = NLS .bind( Messages.SpecimenTransitView_notfound_waybill_error_msg, treeText.getText()); } else { msg = NLS.bind( Messages.SpecimenTransitView_notfound_date_error_msg, DateFormatter.formatAsDate(dateWidget.getDate())); } BgcPlugin.openMessage( Messages.SpecimenTransitView_notfound_error_title, msg); } else { showSearchedObjectsInTree(searchedObject, true); getTreeViewer().expandToLevel(searchedNode, 2); } } catch (Exception e) { BgcPlugin.openError(Messages.SpecimenTransitView_search_error_msg, e); } } protected List<ModelWrapper<?>> search() throws Exception { List<ModelWrapper<?>> wrappers = new ArrayList<ModelWrapper<?>>(); if (radioWaybill.getSelection()) { wrappers.addAll(OriginInfoWrapper.getShipmentsByWaybill( SessionManager.getAppService(), treeText.getText().trim())); wrappers.addAll(DispatchWrapper.getDispatchesByWaybill( SessionManager.getAppService(), treeText.getText().trim())); return wrappers; } else if (radioDateReceived.getSelection()) { Date date = dateWidget.getDate(); if (date != null) { wrappers.addAll(OriginInfoWrapper.getShipmentsByDateReceived( SessionManager.getAppService(), date, SessionManager .getUser().getCurrentWorkingCenter())); wrappers.addAll(DispatchWrapper.getDispatchesByDateReceived( SessionManager.getAppService(), date, SessionManager .getUser().getCurrentWorkingCenter())); return wrappers; } } else { Date date = dateWidget.getDate(); if (date != null) { wrappers.addAll(OriginInfoWrapper.getShipmentsByDateSent( SessionManager.getAppService(), date, SessionManager .getUser().getCurrentWorkingCenter())); wrappers.addAll(DispatchWrapper.getDispatchesByDateSent( SessionManager.getAppService(), date, SessionManager .getUser().getCurrentWorkingCenter())); return wrappers; } } return null; } @Override protected void showSearchedObjectsInTree( List<? extends ModelWrapper<?>> searchedObjects, boolean doubleClick) { for (ModelWrapper<?> searchedObject : searchedObjects) { List<AbstractAdapterBase> nodeRes = rootNode.search( searchedObject.getClass(), searchedObject.getId()); if (nodeRes.size() == 0) { searchedNode.addSearchObject(searchedObject, searchedObject.getId()); SpecimenTransitView.addToNode(searchedNode, searchedObject); } } if (searchedObjects.size() == 1) { ModelWrapper<?> searchedWrap = searchedObjects.get(0); List<AbstractAdapterBase> nodeRes = rootNode.search( searchedWrap.getClass(), searchedWrap.getId()); if (nodeRes.size() > 0) nodeRes.get(0).performDoubleClick(); } else { searchedNode.performExpand(); BgcPlugin.openMessage( Messages.SpecimenTransitView_res_dialog_title, NLS.bind( Messages.SpecimenTransitView_found_multiple_msg, searchedObjects.size())); } } public static AbstractAdapterBase addToNode(AdapterBase parentNode, Object obj) { if (currentInstance != null && obj instanceof OriginInfoWrapper) { OriginInfoWrapper originInfo = (OriginInfoWrapper) obj; String text = ""; //$NON-NLS-1$ AdapterBase topNode = parentNode; if (parentNode.equals(currentInstance.searchedNode) && !currentInstance.radioWaybill.getSelection()) { Date date; if (currentInstance.radioDateReceived.getSelection()) { text = Messages.SpecimenTransitView_date_received_node_label; date = originInfo.getShipmentInfo().getReceivedAt(); } else { text = Messages.SpecimenTransitView_date_packed_node_label; date = originInfo.getShipmentInfo().getPackedAt(); } if (date == null) return null; date = (Date) date.clone(); Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.SECOND, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.HOUR_OF_DAY, 0); date = c.getTime(); List<AbstractAdapterBase> dateNodeRes = parentNode.search( date.getClass(), DateNode.idBuilder(text, date) ); AbstractAdapterBase dateNode = null; if (dateNodeRes.size() > 0) dateNode = dateNodeRes.get(0); else { dateNode = new DateNode(parentNode, text, date); parentNode.addChild(dateNode); } topNode = (AdapterBase) dateNode; } List<AbstractAdapterBase> centerAdapterList = topNode.search( originInfo.getCenter().getClass(), originInfo.getCenter() .getId()); AdapterBase centerAdapter = null; if (centerAdapterList.size() > 0) centerAdapter = (AdapterBase) centerAdapterList.get(0); else if (originInfo.getCenter() instanceof ClinicWrapper) { centerAdapter = new ClinicWithShipmentAdapter(topNode, (ClinicWrapper) originInfo.getCenter()); topNode.addChild(centerAdapter); } if (centerAdapter != null) { ShipmentAdapter shipmentAdapter = null; List<AbstractAdapterBase> shipmentAdapterList = centerAdapter .search(OriginInfoWrapper.class, originInfo.getId()); if (shipmentAdapterList.size() > 0) shipmentAdapter = (ShipmentAdapter) shipmentAdapterList .get(0); else { shipmentAdapter = new ShipmentAdapter(centerAdapter, originInfo); centerAdapter.addChild(shipmentAdapter); } return shipmentAdapter; } } else if (currentInstance != null && obj instanceof DispatchWrapper) { List<AbstractAdapterBase> res = parentNode.search( DispatchWrapper.class, ((DispatchWrapper) obj).getId()); if (res.size() == 0) { DispatchAdapter dispatch = new DispatchAdapter(parentNode, (DispatchWrapper) obj); parentNode.addChild(dispatch); } } return null; } public static SpecimenTransitView getCurrent() { return currentInstance; } @Override protected String getTreeTextToolTip() { return Messages.SpecimenTransitView_search_text_tooltip; } @Override public String getId() { return ID; } @Override protected AbstractTodayNode<?> createTodayNode() { return new ShipmentTodayNode((RootNode) rootNode, 1); } @Override protected AbstractSearchedNode createSearchedNode() { if (searchedNode == null) return new OriginInfoSearchedNode((RootNode) rootNode, 2); return searchedNode; } @Override protected List<? extends ModelWrapper<?>> search(String text) throws Exception { return null; } @Override protected void notFound(String text) { } public static void showShipment(OriginInfoWrapper shipment) { if (currentInstance != null) { currentInstance.showSearchedObjectsInTree(Arrays.asList(shipment), false); } } public static void reloadCurrent() { if (currentInstance != null) currentInstance.reload(); } @Override protected String getString() { return toString(); } public static ShipmentAdapter getCurrentShipment() { AbstractAdapterBase selectedNode = currentInstance.getSelectedNode(); if (selectedNode != null && selectedNode instanceof ShipmentAdapter) { return (ShipmentAdapter) selectedNode; } return null; } @Override public void clear() { if (centerNode != null) rootNode.removeChild(centerNode); setSearchFieldsEnablement(false); super.clear(); } @Override protected void createRootNode() { createOldRootNode(); } }