package edu.ualberta.med.biobank.forms;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.action.info.AddressSaveInfo;
import edu.ualberta.med.biobank.common.action.info.ResearchGroupAdapterInfo;
import edu.ualberta.med.biobank.common.action.info.ResearchGroupReadInfo;
import edu.ualberta.med.biobank.common.action.info.ResearchGroupSaveInfo;
import edu.ualberta.med.biobank.common.action.researchGroup.ResearchGroupGetInfoAction;
import edu.ualberta.med.biobank.common.action.researchGroup.ResearchGroupSaveAction;
import edu.ualberta.med.biobank.common.peer.ResearchGroupPeer;
import edu.ualberta.med.biobank.common.wrappers.CommentWrapper;
import edu.ualberta.med.biobank.common.wrappers.ResearchGroupWrapper;
import edu.ualberta.med.biobank.common.wrappers.StudyWrapper;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import edu.ualberta.med.biobank.gui.common.validators.NonEmptyStringValidator;
import edu.ualberta.med.biobank.gui.common.widgets.BgcBaseText;
import edu.ualberta.med.biobank.gui.common.widgets.BgcEntryFormWidgetListener;
import edu.ualberta.med.biobank.gui.common.widgets.MultiSelectEvent;
import edu.ualberta.med.biobank.gui.common.widgets.utils.ComboSelectionUpdate;
import edu.ualberta.med.biobank.model.ActivityStatus;
import edu.ualberta.med.biobank.model.Comment;
import edu.ualberta.med.biobank.model.ResearchGroup;
import edu.ualberta.med.biobank.treeview.admin.ResearchGroupAdapter;
import edu.ualberta.med.biobank.widgets.infotables.CommentsInfoTable;
import edu.ualberta.med.biobank.widgets.utils.GuiUtil;
import gov.nih.nci.system.applicationservice.ApplicationException;
@SuppressWarnings("unused")
public class ResearchGroupEntryForm extends AddressEntryFormCommon {
public static final String ID =
"edu.ualberta.med.biobank.forms.ResearchGroupEntryForm";
private static final String MSG_NEW_RG_OK =
"New Research Group information.";
private static final String MSG_RG_OK =
"Research Group information.";
private static final String MSG_NO_RG_NAME =
"Research Group must have a name";
private static final String MSG_NO_RG_NAME_SHORT =
"Research Group must have a short name";
private ResearchGroupAdapter researchGroupAdapter;
private ResearchGroupWrapper researchGroup = new ResearchGroupWrapper(
SessionManager.getAppService());
private BgcBaseText commentWidget;
private CommentWrapper comment = new CommentWrapper(
SessionManager.getAppService());
private BgcEntryFormWidgetListener listener =
new BgcEntryFormWidgetListener() {
@Override
public void selectionChanged(MultiSelectEvent event) {
setDirty(true);
}
};
private ComboViewer activityStatusComboViewer;
private ComboViewer studyComboViewer;
private CommentsInfoTable commentEntryTable;
@Override
protected void init() throws Exception {
Assert.isTrue((adapter instanceof ResearchGroupAdapter),
"Invalid editor input: object of type "
+ adapter.getClass().getName());
researchGroupAdapter = (ResearchGroupAdapter) adapter;
setRgInfo(adapter.getId());
String tabName;
if (researchGroup.isNew()) {
tabName = "New Research Group";
} else
tabName = NLS.bind("Research Group {0}",
researchGroup.getNameShort());
setPartName(tabName);
}
private void setRgInfo(Integer id) throws ApplicationException {
if (id == null) {
ResearchGroup rg = new ResearchGroup();
researchGroup.setWrappedObject(rg);
researchGroup.setActivityStatus(ActivityStatus.ACTIVE);
} else {
ResearchGroupReadInfo read =
SessionManager.getAppService().doAction(
new ResearchGroupGetInfoAction(id));
researchGroup.setWrappedObject(read.researchGroup);
}
comment.setWrappedObject(new Comment());
}
@Override
protected String getOkMessage() {
if (researchGroup.getId() == null) {
return MSG_NEW_RG_OK;
}
return MSG_RG_OK;
}
@Override
protected void createFormContent() throws ApplicationException {
form.setText("Research Group Information");
page.setLayout(new GridLayout(1, false));
toolkit
.createLabel(
page,
"Research Groups can be associated with studies after submitting this initial information.",
SWT.LEFT);
createResearchGroupInfoSection();
createAddressArea(researchGroup);
createButtonsSection();
}
private void createResearchGroupInfoSection() throws ApplicationException {
Composite client = toolkit.createComposite(page);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 10;
client.setLayout(layout);
client.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
toolkit.paintBordersFor(client);
setFirstControl(createBoundWidgetWithLabel(client, BgcBaseText.class,
SWT.NONE, "Name", null, researchGroup,
ResearchGroupPeer.NAME.getName(), new NonEmptyStringValidator(
MSG_NO_RG_NAME)));
createBoundWidgetWithLabel(client, BgcBaseText.class, SWT.NONE,
"Name Short", null, researchGroup,
ResearchGroupPeer.NAME_SHORT.getName(),
new NonEmptyStringValidator(MSG_NO_RG_NAME_SHORT));
toolkit.paintBordersFor(client);
List<StudyWrapper> availableStudies = ResearchGroupWrapper
.getAvailStudies(SessionManager.getAppService());
if (!researchGroup.isNew())
availableStudies.add(researchGroup.getStudy());
studyComboViewer = createComboViewer(client,
"Study", availableStudies,
researchGroup.getStudy(),
"Select the associated study",
new ComboSelectionUpdate() {
@Override
public void doSelection(Object selectedObject) {
researchGroup.setStudy((StudyWrapper) selectedObject);
}
});
studyComboViewer.getControl().setEnabled(
SessionManager.getUser().isSuperAdmin());
activityStatusComboViewer = createComboViewer(client,
"Activity status",
ActivityStatus.valuesList(), researchGroup.getActivityStatus(),
"Research Group must have an activity status",
new ComboSelectionUpdate() {
@Override
public void doSelection(Object selectedObject) {
researchGroup
.setActivityStatus((ActivityStatus) selectedObject);
}
});
createCommentSection();
}
private void createCommentSection() {
Composite client = createSectionWithClient("Comments");
GridLayout gl = new GridLayout(2, false);
client.setLayout(gl);
commentEntryTable = new CommentsInfoTable(client,
researchGroup.getCommentCollection(false));
GridData gd = new GridData();
gd.horizontalSpan = 2;
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = SWT.FILL;
commentEntryTable.setLayoutData(gd);
commentWidget =
(BgcBaseText) createBoundWidgetWithLabel(client, BgcBaseText.class,
SWT.MULTI,
"Add a comment", null, comment, "message", null);
}
private void createButtonsSection() {
Composite client = toolkit.createComposite(page);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 10;
client.setLayout(layout);
client.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
toolkit.paintBordersFor(client);
}
@Override
public void saveForm() throws Exception {
AddressSaveInfo addressInfo =
new AddressSaveInfo(researchGroup.getAddress().getId(),
researchGroup.getAddress().getStreet1(), researchGroup
.getAddress().getStreet2(), researchGroup.getAddress()
.getCity(), researchGroup.getAddress().getProvince(),
researchGroup.getAddress().getPostalCode(), researchGroup
.getAddress().getEmailAddress(),
researchGroup.getAddress().getPhoneNumber(), researchGroup
.getAddress().getFaxNumber(), researchGroup.getAddress()
.getCountry());
ResearchGroupSaveInfo info =
new ResearchGroupSaveInfo(researchGroup.getId(),
researchGroup.getName(), researchGroup.getNameShort(),
researchGroup.getStudy().getId(),
comment.getMessage() == null ? ""
: comment.getMessage(), addressInfo, researchGroup
.getActivityStatus());
ResearchGroupSaveAction save = new ResearchGroupSaveAction(info);
Integer id = SessionManager.getAppService().doAction(save)
.getId();
ResearchGroupReadInfo read =
SessionManager.getAppService().doAction(
new ResearchGroupGetInfoAction(id));
researchGroup.setWrappedObject(read.researchGroup);
adapter.setValue(new ResearchGroupAdapterInfo(read.researchGroup
.getId(), read.researchGroup
.getName()));
}
@Override
protected void doAfterSave() throws Exception {
SessionManager.getUser().updateCurrentCenter(researchGroup);
}
@Override
public String getNextOpenedFormId() {
return ResearchGroupViewForm.ID;
}
@Override
public void setValues() throws Exception {
try {
if (researchGroup.isNew()) {
researchGroup.setActivityStatus(ActivityStatus.ACTIVE);
researchGroup.setStudy(null);
}
GuiUtil.reset(activityStatusComboViewer,
researchGroup.getActivityStatus());
GuiUtil.reset(studyComboViewer, researchGroup.getStudy());
} catch (Exception e) {
BgcPlugin.openAsyncError("Error", "Unable to reload form");
}
}
}