package edu.ualberta.med.biobank.widgets.infotables; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.PlatformUI; import edu.ualberta.med.biobank.common.action.security.ManagerContext; import edu.ualberta.med.biobank.common.action.security.MembershipContext; import edu.ualberta.med.biobank.common.util.StringUtil; import edu.ualberta.med.biobank.dialogs.user.MembershipEditWizard; import edu.ualberta.med.biobank.dialogs.user.SecurityWizardDialog; import edu.ualberta.med.biobank.gui.common.widgets.BgcLabelProvider; import edu.ualberta.med.biobank.gui.common.widgets.BgcTableSorter; import edu.ualberta.med.biobank.gui.common.widgets.DefaultAbstractInfoTableWidget; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableDeleteItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableDoubleClickItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableEditItemListener; import edu.ualberta.med.biobank.gui.common.widgets.InfoTableEvent; import edu.ualberta.med.biobank.model.Center; import edu.ualberta.med.biobank.model.Membership; import edu.ualberta.med.biobank.model.PermissionEnum; import edu.ualberta.med.biobank.model.Principal; import edu.ualberta.med.biobank.model.Role; import edu.ualberta.med.biobank.model.Study; import gov.nih.nci.system.applicationservice.ApplicationException; public class MembershipInfoTable extends DefaultAbstractInfoTableWidget<Membership> { public static final int ROWS_PER_PAGE = 7; private static final String[] HEADINGS = new String[] { "Centers", "Studies", "Manager", "Roles and Permissions" }; private final ManagerContext managerContext; @SuppressWarnings("unused") public MembershipInfoTable(Composite parent, final Principal principal, MembershipContext context, ManagerContext managerContext) { super(parent, HEADINGS, ROWS_PER_PAGE); setCollection(principal.getMemberships()); this.managerContext = managerContext; addEditItemListener(new IInfoTableEditItemListener<Membership>() { @Override public void editItem(InfoTableEvent<Membership> event) { Membership membership = getSelection(); editMembership(membership); } }); addDeleteItemListener(new IInfoTableDeleteItemListener<Membership>() { @Override public void deleteItem(InfoTableEvent<Membership> event) { Membership membership = getSelection(); principal.getMemberships().remove(membership); getList().remove(membership); setList(getList()); } }); addClickListener(new IInfoTableDoubleClickItemListener<Membership>() { @Override public void doubleClick(InfoTableEvent<Membership> event) { Membership m = getSelection(); if (m != null) editMembership(m); } }); MultilineHandler handler = new MultilineHandler(); Table table = getTableViewer().getTable(); table.addListener(SWT.MeasureItem, handler); table.addListener(SWT.PaintItem, handler); table.addListener(SWT.EraseItem, handler); } protected void editMembership(Membership m) { Shell shell = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(); MembershipEditWizard wiz = new MembershipEditWizard(m, managerContext); WizardDialog dlg = new SecurityWizardDialog(shell, wiz); int res = dlg.open(); if (res == Dialog.OK) { setCollection(getList()); setSelection(m); notifyListeners(); } } private static String getCentersString(Membership m) { if (m.getDomain().isAllCenters()) { return "All Centers"; } List<String> centerNames = new ArrayList<String>(); for (Center c : m.getDomain().getCenters()) { centerNames.add(c.getNameShort()); } Collections.sort(centerNames, String.CASE_INSENSITIVE_ORDER); return StringUtil.join(centerNames, "\n"); } private static String getStudiesString(Membership m) { if (m.getDomain().isAllStudies()) { return "All Studies"; } List<String> studyNames = new ArrayList<String>(); for (Study s : m.getDomain().getStudies()) { studyNames.add(s.getNameShort()); } Collections.sort(studyNames, String.CASE_INSENSITIVE_ORDER); return StringUtil.join(studyNames, "\n"); } private static String getRolesAndPermissionsSummary(Membership m) { if (m.isEveryPermission()) return "All"; List<String> rolesAndPerms = new ArrayList<String>(); for (Role role : m.getRoles()) { rolesAndPerms.add(role.getName()); } for (PermissionEnum permission : m.getPermissions()) { rolesAndPerms.add(permission.getName()); } Collections.sort(rolesAndPerms, String.CASE_INSENSITIVE_ORDER); String summary = StringUtil.join(rolesAndPerms, ", "); summary = StringUtil.truncate(summary, 50, "..."); return summary; } @Override protected BgcLabelProvider getLabelProvider() { return new BgcLabelProvider() { @Override public String getColumnText(Object element, int columnIndex) { Membership m = (Membership) element; switch (columnIndex) { case 0: return getCentersString(m); case 1: return getStudiesString(m); case 2: return m.isUserManager() ? "Yes" : "No"; case 3: return getRolesAndPermissionsSummary(m); default: return ""; //$NON-NLS-1$ } } }; } @Override protected BgcTableSorter getTableSorter() { return null; } /** * * @see http://www.java2s.com/Tutorial/Java/0280__SWT/MultilineTablecell.htm */ public static class MultilineHandler implements Listener { public MultilineHandler() { } @Override public void handleEvent(Event event) { switch (event.type) { case SWT.MeasureItem: { TableItem item = (TableItem) event.item; String text = getText(item, event.index); Point size = event.gc.textExtent(text); event.width = size.x; event.height = Math.max(event.height, size.y); break; } case SWT.PaintItem: { TableItem item = (TableItem) event.item; String text = getText(item, event.index); Point size = event.gc.textExtent(text); int offset = Math.max(0, (event.height - size.y) / 2); event.gc.drawText(text, event.x, event.y + offset, true); break; } case SWT.EraseItem: { event.detail &= ~SWT.FOREGROUND; break; } } } String getText(TableItem item, int column) { String text = item.getText(column); return text; } } @Override protected Boolean canEdit(Membership target) throws ApplicationException { return true; } @Override protected Boolean canDelete(Membership target) throws ApplicationException { return true; } @Override protected Boolean canView(Membership target) throws ApplicationException { return true; }; }