package edu.ualberta.med.biobank.widgets.infotables.entry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
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.AliquotedSpecimenWrapper;
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.StudyAliquotedSpecimenDialog;
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.AliquotedSpecimenInfoTable;
import edu.ualberta.med.biobank.widgets.infotables.BiobankTableSorter;
/**
* Displays the current aliquoted specimen collection and allows the user to add
* additional aliquoted specimen to the collection.
*/
public class AliquotedSpecimenEntryInfoTable extends AliquotedSpecimenInfoTable {
private List<AliquotedSpecimenWrapper> selectedAliquotedSpecimen;
private List<AliquotedSpecimenWrapper> addedOrModifiedAliquotedSpecimens;
private List<AliquotedSpecimenWrapper> deletedAliquotedSpecimens;
private boolean isDeletable;
private boolean isEditable;
private Set<SpecimenTypeWrapper> availableSpecimenTypes =
new HashSet<SpecimenTypeWrapper>();
private StudyAliquotedSpecimenDialog dlg;
public AliquotedSpecimenEntryInfoTable(Composite parent,
List<AliquotedSpecimenWrapper> aliquotedSpecimens, boolean isEditable,
boolean isDeletable) {
super(parent, null);
selectedAliquotedSpecimen = aliquotedSpecimens;
if (selectedAliquotedSpecimen == null) {
selectedAliquotedSpecimen =
new ArrayList<AliquotedSpecimenWrapper>();
}
setList(selectedAliquotedSpecimen);
addedOrModifiedAliquotedSpecimens =
new ArrayList<AliquotedSpecimenWrapper>();
deletedAliquotedSpecimens = new ArrayList<AliquotedSpecimenWrapper>();
this.isEditable = isEditable;
this.isDeletable = isDeletable;
setLayout(new GridLayout(1, false));
setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
addEditSupport();
}
@Override
protected boolean isEditMode() {
return true;
}
public void addAliquotedSpecimen() {
AliquotedSpecimenWrapper asw = new AliquotedSpecimenWrapper(
SessionManager.getAppService());
// DO NOT set the study on asw - if it was done then it would have to be
// unset if the user presses the Cancel button
addOrEditAliquotedSpecimen(true, asw);
}
private void addOrEditAliquotedSpecimen(boolean add,
final AliquotedSpecimenWrapper aliquotedSpecimen) {
List<SpecimenTypeWrapper> dialogSpecimenTypes;
if (!add) {
dialogSpecimenTypes =
Arrays.asList(aliquotedSpecimen.getSpecimenType());
} else
dialogSpecimenTypes =
new ArrayList<SpecimenTypeWrapper>(getAvailableSpecimenTypes());
NewListener newListener = null;
if (add) {
// only add to the collection when adding and not editing
newListener = new NewListener() {
@Override
public void newAdded(Object spec) {
AliquotedSpecimenWrapper added =
((AliquotedSpecimenWrapper) spec);
availableSpecimenTypes.remove(added.getSpecimenType());
selectedAliquotedSpecimen.add(added);
dlg.setSpecimenTypes(availableSpecimenTypes);
addedOrModifiedAliquotedSpecimens.add(added);
reloadCollection(selectedAliquotedSpecimen);
notifyListeners();
}
};
}
dlg = new StudyAliquotedSpecimenDialog(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
aliquotedSpecimen, newListener, dialogSpecimenTypes);
int res = dlg.open();
if (!add && res == Dialog.OK) {
reloadCollection(selectedAliquotedSpecimen);
notifyListeners();
}
}
private Collection<SpecimenTypeWrapper> getAvailableSpecimenTypes() {
return availableSpecimenTypes;
}
public void setAvailableSpecimenTypes(List<SourceSpecimenWrapper> types) {
availableSpecimenTypes = new HashSet<SpecimenTypeWrapper>();
for (SourceSpecimenWrapper ssw : types) {
availableSpecimenTypes.addAll(ssw.getSpecimenType()
.getChildSpecimenTypeCollection(false));
}
for (AliquotedSpecimenWrapper ss : selectedAliquotedSpecimen)
availableSpecimenTypes.remove(ss.getSpecimenType());
}
private void addEditSupport() {
if (isEditable) {
addAddItemListener(new IInfoTableAddItemListener<AliquotedSpecimenWrapper>() {
@Override
public void addItem(
InfoTableEvent<AliquotedSpecimenWrapper> event) {
addAliquotedSpecimen();
}
});
}
if (isEditable) {
addEditItemListener(new IInfoTableEditItemListener<AliquotedSpecimenWrapper>() {
@Override
public void editItem(
InfoTableEvent<AliquotedSpecimenWrapper> event) {
AliquotedSpecimenWrapper aliquotedSpecimen = getSelection();
if (aliquotedSpecimen != null)
addOrEditAliquotedSpecimen(false, aliquotedSpecimen);
}
});
}
if (isDeletable) {
addDeleteItemListener(new IInfoTableDeleteItemListener<AliquotedSpecimenWrapper>() {
@Override
public void deleteItem(
InfoTableEvent<AliquotedSpecimenWrapper> event) {
AliquotedSpecimenWrapper aliquotedSpecimen = getSelection();
if (aliquotedSpecimen != null) {
if (!MessageDialog
.openConfirm(
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
Messages.AliquotedSpecimenEntryInfoTable_delete_title,
NLS.bind(
Messages.AliquotedSpecimenEntryInfoTable_delete_question,
aliquotedSpecimen.getSpecimenType()
.getName()))) {
return;
}
availableSpecimenTypes.add(aliquotedSpecimen
.getSpecimenType());
selectedAliquotedSpecimen.remove(aliquotedSpecimen);
setList(selectedAliquotedSpecimen);
deletedAliquotedSpecimens.add(aliquotedSpecimen);
notifyListeners();
}
}
});
}
}
public List<AliquotedSpecimenWrapper> getAddedOrModifiedAliquotedSpecimens() {
return addedOrModifiedAliquotedSpecimens;
}
public List<AliquotedSpecimenWrapper> getDeletedAliquotedSpecimens() {
return deletedAliquotedSpecimens;
}
public void reload(List<AliquotedSpecimenWrapper> aliquotedSpecimens,
boolean isEditable, boolean isDeletable) {
this.isEditable = isEditable;
this.isDeletable = isDeletable;
selectedAliquotedSpecimen = aliquotedSpecimens;
if (selectedAliquotedSpecimen == null) {
selectedAliquotedSpecimen =
new ArrayList<AliquotedSpecimenWrapper>();
}
reloadCollection(selectedAliquotedSpecimen);
addedOrModifiedAliquotedSpecimens =
new ArrayList<AliquotedSpecimenWrapper>();
deletedAliquotedSpecimens = new ArrayList<AliquotedSpecimenWrapper>();
}
@Override
public BiobankTableSorter getComparator() {
return new BiobankTableSorter() {
private static final long serialVersionUID = 1L;
@Override
public int compare(Object e1, Object e2) {
try {
TableRowData i1 = getCollectionModelObject(e1);
TableRowData i2 = getCollectionModelObject(e2);
return super.compare(i1.typeName, i2.typeName);
} catch (Exception e) {
return 0;
}
}
};
}
}