package edu.ualberta.med.biobank.dialogs.user; import java.text.MessageFormat; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.Status; import org.eclipse.swt.SWT; 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.action.security.GroupGetOutput; import edu.ualberta.med.biobank.common.action.security.ManagerContext; import edu.ualberta.med.biobank.common.action.security.MembershipContext; import edu.ualberta.med.biobank.common.action.security.MembershipContextGetAction; import edu.ualberta.med.biobank.common.action.security.MembershipContextGetInput; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.gui.common.dialogs.BgcDialogPage; import edu.ualberta.med.biobank.gui.common.dialogs.BgcDialogWithPages; import edu.ualberta.med.biobank.gui.common.widgets.utils.TableFilter; import edu.ualberta.med.biobank.model.Group; import edu.ualberta.med.biobank.model.Membership; import edu.ualberta.med.biobank.widgets.infotables.GroupInfoTable; import gov.nih.nci.system.applicationservice.ApplicationException; public abstract class GroupsPage extends BgcDialogPage { private final ManagerContext context; private GroupInfoTable groupInfoTable; public GroupsPage(BgcDialogWithPages dialog, ManagerContext context) { super(dialog); this.context = context; } @Override public String getTitle() { return "Groups"; } @Override public void createControl(Composite parent) { Composite content = new Composite(parent, SWT.NONE); content.setLayout(new GridLayout(1, false)); new TableFilter<Group>(content) { @Override protected boolean accept(Group group, String text) { return contains(group.getName(), text); } @Override public List<Group> getAllCollection() { return getCurrentAllGroupsList(); } @Override public void setFilteredList(List<Group> filteredObjects) { groupInfoTable.setList(filteredObjects); } }; groupInfoTable = new GroupInfoTable(content, context.getGroups(), context) { @Override protected boolean deleteGroup(Group group) { boolean deleted = super.deleteGroup(group); if (deleted) getCurrentAllGroupsList().remove(group); return deleted; } @Override protected void duplicate(Group src) { Group newGroup = new Group(); newGroup.setName("Copy of " + src.getName()); newGroup.setDescription(src.getDescription()); for (Membership srcMemb : src.getMemberships()) { new Membership(srcMemb, newGroup); } addGroup(newGroup); } @Override protected Boolean canEdit(Group target) throws ApplicationException { return true; } @Override protected Boolean canDelete(Group target) throws ApplicationException { return true; } @Override protected Boolean canView(Group target) throws ApplicationException { return true; } }; setControl(content); } protected void addGroup(Group group) { MembershipContext membershipContext = null; try { membershipContext = SessionManager .getAppService() .doAction( new MembershipContextGetAction( new MembershipContextGetInput())).getContext(); } catch (Throwable t) { TmpUtil.displayException(t); return; } GroupGetOutput output = new GroupGetOutput(group, membershipContext); GroupEditDialog dlg = new GroupEditDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), output, context); int res = dlg.open(); if (res == Status.OK) { BgcPlugin.openAsyncInformation( "Group Added", MessageFormat .format("Successfully added new group {0}.", group.getName())); List<Group> allCurrent = getCurrentAllGroupsList(); allCurrent.add(group); Collections.sort(allCurrent, new GroupInfoTable.GroupComparator()); groupInfoTable.reload(); groupInfoTable.setSelection(group); } } @Override public void runAddAction() { addGroup(new Group()); } protected abstract List<Group> getCurrentAllGroupsList(); }