// $HeadURL$
// $Id$
//
// Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College.
//
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.
package edu.harvard.med.screensaver.ui.screens;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import com.google.common.collect.Sets;
import org.apache.log4j.Logger;
import edu.harvard.med.screensaver.ScreensaverConstants;
import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.UsersDAO;
import edu.harvard.med.screensaver.model.screens.ProjectPhase;
import edu.harvard.med.screensaver.model.screens.Screen;
import edu.harvard.med.screensaver.model.screens.ScreenType;
import edu.harvard.med.screensaver.model.screens.Study;
import edu.harvard.med.screensaver.model.users.LabHead;
import edu.harvard.med.screensaver.model.users.ScreeningRoomUser;
import edu.harvard.med.screensaver.model.users.ScreensaverUserComparator;
import edu.harvard.med.screensaver.ui.arch.util.JSFUtils;
import edu.harvard.med.screensaver.ui.arch.util.UISelectOneBean;
import edu.harvard.med.screensaver.ui.arch.util.UISelectOneEntityBean;
import edu.harvard.med.screensaver.ui.arch.view.EditableEntityViewerBackingBean;
import edu.harvard.med.screensaver.ui.arch.view.aspects.UICommand;
public abstract class AbstractStudyDetailViewer<E extends Study> extends EditableEntityViewerBackingBean<E>
{
private static Logger log = Logger.getLogger(AbstractStudyDetailViewer.class);
private UsersDAO _usersDao;
private UISelectOneEntityBean<LabHead> _labName;
private UISelectOneEntityBean<ScreeningRoomUser> _leadScreener;
protected UISelectOneEntityBean<ScreeningRoomUser> _newCollaborator;
protected SortedSet<ScreeningRoomUser> _collaborators;
/**
* @motivation for CGLIB2
*/
protected AbstractStudyDetailViewer()
{
}
protected AbstractStudyDetailViewer(AbstractStudyDetailViewer thisProxy,
GenericEntityDAO dao,
String viewerActionResult,
UsersDAO usersDao)
{
super(thisProxy, (Class<E>) Screen.class, viewerActionResult, dao);
_usersDao = usersDao;
getIsPanelCollapsedMap().put("studyDetail", false);
}
public DataModel getCollaboratorsDataModel()
{
return new ListDataModel(new ArrayList<ScreeningRoomUser>(_collaborators));
}
public List<SelectItem> getScreenTypeSelectItems()
{
List<ScreenType> items = Arrays.asList(ScreenType.values());
if (getEntity().getScreenType() == null) {
return JSFUtils.createUISelectItemsWithEmptySelection(items, ScreensaverConstants.REQUIRED_VOCAB_FIELD_PROMPT);
}
else {
return JSFUtils.createUISelectItems(items);
}
}
public List<SelectItem> getProjectPhaseSelectItems()
{
List<ProjectPhase> items = Arrays.asList(ProjectPhase.values());
if (getEntity().getProjectPhase() == null) {
return JSFUtils.createUISelectItemsWithEmptySelection(items, ScreensaverConstants.REQUIRED_VOCAB_FIELD_PROMPT);
}
else {
return JSFUtils.createUISelectItems(items);
}
}
public UISelectOneBean<LabHead> getLabName()
{
if (_labName == null) {
SortedSet<LabHead> labHeads = _usersDao.findAllLabHeads();
_labName = new UISelectOneEntityBean<LabHead>(labHeads, getEntity().getLabHead(), true, getDao()) {
@Override
protected String makeLabel(LabHead t) { return t.getLab().getLabName(); }
};
}
return _labName;
}
public UISelectOneBean<ScreeningRoomUser> getNewCollaborator()
{
if (_newCollaborator == null) {
SortedSet<ScreeningRoomUser> collaborators = getCandidateCollaborators(getEntity());
_newCollaborator = new UISelectOneEntityBean<ScreeningRoomUser>(collaborators, null, true, getDao()) {
@Override
protected String makeLabel(ScreeningRoomUser t) { return t.getFullNameLastFirst(); }
@Override
protected String getEmptyLabel()
{
return ScreensaverConstants.REQUIRED_VOCAB_FIELD_PROMPT;
}
};
}
return _newCollaborator;
}
public UISelectOneBean<ScreeningRoomUser> getLeadScreener()
{
if (_leadScreener == null) {
ArrayList<ScreeningRoomUser> leadScreenerCandidates = new ArrayList<ScreeningRoomUser>();
leadScreenerCandidates.addAll(getDao().findAllEntitiesOfType(ScreeningRoomUser.class));
Collections.sort(leadScreenerCandidates, ScreensaverUserComparator.getInstance());
_leadScreener = new UISelectOneEntityBean<ScreeningRoomUser>(leadScreenerCandidates,
getEntity().getLeadScreener(),
getEntity().getLeadScreener() == null,
getDao()) {
@Override
protected String makeLabel(ScreeningRoomUser t) { return t.getFullNameLastFirst(); }
@Override
protected String getEmptyLabel()
{
return ScreensaverConstants.REQUIRED_VOCAB_FIELD_PROMPT;
}
};
}
return _leadScreener;
}
@Override
protected void initializeEntity(E entity)
{
getDao().needReadOnly((Screen) entity, Screen.collaborators);
}
@Override
protected void initializeViewer(E entity)
{
_labName = null;
_leadScreener = null;
_newCollaborator = null;
_collaborators = Sets.newTreeSet(entity.getCollaborators());
}
private SortedSet<ScreeningRoomUser> getCandidateCollaborators(E entity)
{
SortedSet<ScreeningRoomUser> candidateCollaborators = new TreeSet<ScreeningRoomUser>(ScreensaverUserComparator.getInstance());
candidateCollaborators.addAll(getDao().findAllEntitiesOfType(ScreeningRoomUser.class));
candidateCollaborators.removeAll(_collaborators);
return candidateCollaborators;
}
@UICommand
public String addCollaborator()
{
if (getNewCollaborator().getSelection() != null) {
ScreeningRoomUser collaborator = getNewCollaborator().getSelection();
_collaborators.add(collaborator);
_newCollaborator = null;
}
return REDISPLAY_PAGE_ACTION_RESULT;
}
@UICommand
public String deleteCollaborator()
{
ScreeningRoomUser collaborator = (ScreeningRoomUser) getRequestMap().get("element");
_collaborators.remove(collaborator);
_newCollaborator = null;
return REDISPLAY_PAGE_ACTION_RESULT;
}
public SortedSet<ScreeningRoomUser> getCollaborators()
{
return _collaborators;
}
}