package edu.ualberta.med.biobank.widgets.infotables.entry;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.action.specimen.SpecimenInfo;
import edu.ualberta.med.biobank.common.permission.collectionEvent.CollectionEventUpdatePermission;
import edu.ualberta.med.biobank.dialogs.CEventSourceSpecimenDialog;
import edu.ualberta.med.biobank.dialogs.PagedDialog.NewListener;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
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.model.CollectionEvent;
import edu.ualberta.med.biobank.model.SourceSpecimen;
import edu.ualberta.med.biobank.model.SpecimenType;
import gov.nih.nci.system.applicationservice.ApplicationException;
public class CEventSpecimenEntryInfoTable extends NewSpecimenEntryInfoTable {
protected IObservableValue specimensAdded = new WritableValue(
Boolean.FALSE, Boolean.class);
private boolean isEditable;
private boolean isDeletable;
public CEventSpecimenEntryInfoTable(Composite parent,
List<SpecimenInfo> sourceSpecimens, CollectionEvent cevent,
ColumnsShown columnsShowns) {
super(parent, sourceSpecimens, columnsShowns);
try {
if (cevent.getId() != null) {
this.isEditable =
SessionManager.getAppService().isAllowed(
new CollectionEventUpdatePermission(cevent.getId()));
this.isDeletable =
SessionManager.getAppService().isAllowed(
new CollectionEventUpdatePermission(cevent.getId()));
} else {
// not real deletes or edits
this.isEditable = true;
this.isDeletable = true;
}
} catch (ApplicationException e) {
BgcPlugin.openAsyncError(
Messages.CEventSpecimenEntryInfoTable_error,
Messages.CEventSpecimenEntryInfoTable_message);
}
}
@Override
public void reload(List<SpecimenInfo> specimens) {
super.reload(specimens);
specimensAdded.setValue(currentSpecimens.size() > 0);
}
public void addOrEditSpecimen(boolean add, CommentedSpecimenInfo si,
Set<SourceSpecimen> studySourceTypes,
List<SpecimenType> allSpecimenTypes, final CollectionEvent cEvent,
final Date defaultTimeDrawn) {
NewListener newListener = null;
List<String> inventoryIdExcludeList = new ArrayList<String>();
for (SpecimenInfo sp : currentSpecimens) {
inventoryIdExcludeList.add(sp.specimen.getInventoryId());
}
if (add) {
newListener = new NewListener() {
@Override
public void newAdded(Object mw) {
CommentedSpecimenInfo spec = (CommentedSpecimenInfo) mw;
spec.specimen.setCollectionEvent(cEvent);
spec.specimen.setOriginalCollectionEvent(cEvent);
spec.specimen.setCurrentCenter(SessionManager.getUser()
.getCurrentWorkingCenter().getWrappedObject());
currentSpecimens.add(spec);
specimensAdded.setValue(true);
reloadCollection(currentSpecimens);
notifyListeners();
}
};
} else {
inventoryIdExcludeList.remove(si.specimen.getInventoryId());
}
CEventSourceSpecimenDialog dlg =
new CEventSourceSpecimenDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), si == null ? null
: si, studySourceTypes,
allSpecimenTypes,
inventoryIdExcludeList, newListener, defaultTimeDrawn);
int res = dlg.open();
if (!add && res == Dialog.OK) {
reloadCollection(currentSpecimens);
notifyListeners();
}
}
public void addEditSupport(final Set<SourceSpecimen> studySourceTypes,
final List<SpecimenType> allSpecimenTypes) {
if (isEditable) {
addEditItemListener(new IInfoTableEditItemListener<SpecimenInfo>() {
@Override
public void editItem(InfoTableEvent<SpecimenInfo> event) {
CommentedSpecimenInfo si =
(CommentedSpecimenInfo) getSelection();
if (si != null)
addOrEditSpecimen(false, si, studySourceTypes,
allSpecimenTypes, null, null);
}
});
}
if (isDeletable) {
addDeleteItemListener(new IInfoTableDeleteItemListener<SpecimenInfo>() {
@Override
public void deleteItem(InfoTableEvent<SpecimenInfo> event) {
SpecimenInfo si = getSelection();
if (si != null) {
if (!MessageDialog
.openConfirm(
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
Messages.SpecimenEntryInfoTable_delete_title,
NLS.bind(
Messages.SpecimenEntryInfoTable_delete_question,
si.specimen.getInventoryId()))) {
return;
}
currentSpecimens.remove(si);
setList(currentSpecimens);
if (currentSpecimens.size() == 0) {
specimensAdded.setValue(false);
}
notifyListeners();
}
}
});
}
}
}