package edu.ualberta.med.biobank.widgets.infotables.entry; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.wrappers.SourceSpecimenWrapper; import edu.ualberta.med.biobank.common.wrappers.SpecimenTypeWrapper; import edu.ualberta.med.biobank.dialogs.PagedDialog.NewListener; import edu.ualberta.med.biobank.dialogs.StudySourceSpecimenDialog; import edu.ualberta.med.biobank.gui.common.BgcLogger; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableAddItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableDeleteItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableEditItemListener; import edu.ualberta.med.biobank.gui.common.widgets.InfoTableEvent; import edu.ualberta.med.biobank.widgets.infotables.BiobankTableSorter; import edu.ualberta.med.biobank.widgets.infotables.SourceSpecimenInfoTable; public class SourceSpecimenEntryInfoTable extends SourceSpecimenInfoTable { @SuppressWarnings("unused") private static BgcLogger LOGGER = BgcLogger .getLogger(SourceSpecimenEntryInfoTable.class.getName()); private List<SpecimenTypeWrapper> availableSpecimenTypes; private List<SourceSpecimenWrapper> selectedSourceSpecimens; private List<SourceSpecimenWrapper> addedOrModifiedSourceSpecimens; private List<SourceSpecimenWrapper> deletedSourceSpecimen; private StudySourceSpecimenDialog dlg; public SourceSpecimenEntryInfoTable(Composite parent, List<SourceSpecimenWrapper> collection) { super(parent, collection); } /** * * @param parent a composite control which will be the parent of the new * instance (cannot be null) * @param study the study the source specimens belong to. */ public SourceSpecimenEntryInfoTable(Composite parent, List<SourceSpecimenWrapper> sourceSpecimens, List<SpecimenTypeWrapper> specimenTypes) { super(parent, null); selectedSourceSpecimens = sourceSpecimens; availableSpecimenTypes = specimenTypes; for (SourceSpecimenWrapper ss : selectedSourceSpecimens) availableSpecimenTypes.remove(ss.getSpecimenType()); if (selectedSourceSpecimens == null) { selectedSourceSpecimens = new ArrayList<SourceSpecimenWrapper>(); } setList(selectedSourceSpecimens); addedOrModifiedSourceSpecimens = new ArrayList<SourceSpecimenWrapper>(); deletedSourceSpecimen = new ArrayList<SourceSpecimenWrapper>(); setLayout(new GridLayout(1, false)); setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); addEditSupport(); } private void addEditSupport() { addAddItemListener(new IInfoTableAddItemListener<SourceSpecimenWrapper>() { @Override public void addItem(InfoTableEvent<SourceSpecimenWrapper> event) { addSourceSpecimen(); } }); addEditItemListener(new IInfoTableEditItemListener<SourceSpecimenWrapper>() { @Override public void editItem(InfoTableEvent<SourceSpecimenWrapper> event) { SourceSpecimenWrapper sourceSpecimen = getSelection(); if (sourceSpecimen != null) addOrEditStudySourceSpecimen(false, sourceSpecimen); } }); addDeleteItemListener(new IInfoTableDeleteItemListener<SourceSpecimenWrapper>() { @Override public void deleteItem( InfoTableEvent<SourceSpecimenWrapper> event) { SourceSpecimenWrapper sourceSpecimen = getSelection(); if (sourceSpecimen != null) { if (!MessageDialog .openConfirm( PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), Messages.SourceSpecimenEntryInfoTable_delete_title, Messages.SourceSpecimenEntryInfoTable_delete_question)) { return; } selectedSourceSpecimens.remove(sourceSpecimen); setList(selectedSourceSpecimens); deletedSourceSpecimen.add(sourceSpecimen); availableSpecimenTypes.add(sourceSpecimen .getSpecimenType()); notifyListeners(); } } }); } @Override protected boolean isEditMode() { return true; } public void addSourceSpecimen() { SourceSpecimenWrapper newSourceSpecimen = new SourceSpecimenWrapper( SessionManager.getAppService()); // DO NOT set the study on newSourceSpecimen - if it was done // then it would have to be unset if the user presses the Cancel button addOrEditStudySourceSpecimen(true, newSourceSpecimen); } private void addOrEditStudySourceSpecimen(final boolean add, final SourceSpecimenWrapper sourceSpecimen) { List<SpecimenTypeWrapper> dialogSpecimenTypes; if (!add) { dialogSpecimenTypes = Arrays.asList(sourceSpecimen.getSpecimenType()); } else dialogSpecimenTypes = availableSpecimenTypes; NewListener newListener = null; if (add) { // only add to the collection when adding and not editing newListener = new NewListener() { @Override public void newAdded(Object spec) { SourceSpecimenWrapper ss = (SourceSpecimenWrapper) spec; availableSpecimenTypes.remove(ss.getSpecimenType()); dlg.setSpecimenTypes(availableSpecimenTypes); selectedSourceSpecimens.add(ss); addedOrModifiedSourceSpecimens.add(ss); reloadCollection(selectedSourceSpecimens); notifyListeners(); } }; } dlg = new StudySourceSpecimenDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), sourceSpecimen.getNeedOriginalVolume(), sourceSpecimen .getSpecimenType(), dialogSpecimenTypes, newListener); int res = dlg.open(); if (res == Dialog.OK) { sourceSpecimen.setNeedOriginalVolume(dlg.getNeedOriginalVolume()); sourceSpecimen.setSpecimenType(dlg.getSpecimenType()); if (!add) { reloadCollection(selectedSourceSpecimens); notifyListeners(); } } } public List<SourceSpecimenWrapper> getAddedOrModifiedSourceSpecimens() { return addedOrModifiedSourceSpecimens; } public List<SourceSpecimenWrapper> getDeletedSourceSpecimens() { return deletedSourceSpecimen; } public void reload(List<SourceSpecimenWrapper> sourceSpecimens) { selectedSourceSpecimens = sourceSpecimens; if (selectedSourceSpecimens == null) { selectedSourceSpecimens = new ArrayList<SourceSpecimenWrapper>(); } reloadCollection(selectedSourceSpecimens); addedOrModifiedSourceSpecimens = new ArrayList<SourceSpecimenWrapper>(); deletedSourceSpecimen = new ArrayList<SourceSpecimenWrapper>(); } @SuppressWarnings("serial") @Override protected BiobankTableSorter getComparator() { return new BiobankTableSorter() { @Override public int compare(Object e1, Object e2) { try { TableRowData i1 = getCollectionModelObject(e1); TableRowData i2 = getCollectionModelObject(e2); return super.compare(i1.name, i2.name); } catch (Exception e) { return 0; } } }; } }