package edu.ualberta.med.biobank.widgets.infotables; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.PlatformUI; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.action.security.GroupDeleteAction; import edu.ualberta.med.biobank.common.action.security.GroupDeleteInput; import edu.ualberta.med.biobank.common.action.security.GroupGetAction; import edu.ualberta.med.biobank.common.action.security.GroupGetInput; import edu.ualberta.med.biobank.common.action.security.GroupGetOutput; import edu.ualberta.med.biobank.common.action.security.ManagerContext; import edu.ualberta.med.biobank.dialogs.user.GroupEditDialog; import edu.ualberta.med.biobank.dialogs.user.TmpUtil; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.gui.common.widgets.BgcLabelProvider; 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.Group; import edu.ualberta.med.biobank.util.NullHelper; public abstract class GroupInfoTable extends DefaultAbstractInfoTableWidget<Group> { public static final int ROWS_PER_PAGE = 12; private static final String[] HEADINGS = new String[] { Messages.GroupInfoTable_name_label }; private final ManagerContext context; public GroupInfoTable(Composite parent, List<Group> collection, ManagerContext context) { super(parent, HEADINGS, ROWS_PER_PAGE); setList(collection); this.context = context; addEditItemListener(new IInfoTableEditItemListener<Group>() { @Override public void editItem(InfoTableEvent<Group> event) { editGroup(getSelection()); } }); addDeleteItemListener(new IInfoTableDeleteItemListener<Group>() { @Override public void deleteItem(InfoTableEvent<Group> event) { deleteGroup(getSelection()); } }); addClickListener(new IInfoTableDoubleClickItemListener<Group>() { @Override public void doubleClick(InfoTableEvent<Group> event) { Group g = getSelection(); if (g != null) editGroup(g); } }); MenuItem item = new MenuItem(menu, SWT.PUSH); item.setText(Messages.GroupInfoTable_duplicate); item.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { duplicate(getSelection()); } }); } protected abstract void duplicate(Group original); @Override protected BgcLabelProvider getLabelProvider() { return new BgcLabelProvider() { @Override public String getColumnText(Object element, int columnIndex) { Group group = (Group) element; switch (columnIndex) { case 0: return group.getName(); default: return ""; //$NON-NLS-1$ } } }; } protected void editGroup(Group group) { GroupGetOutput output = null; try { output = SessionManager.getAppService() .doAction(new GroupGetAction(new GroupGetInput(group))); } catch (Throwable t) { TmpUtil.displayException(t); return; } GroupEditDialog dlg = new GroupEditDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), output, context); int res = dlg.open(); if (res == Dialog.OK) { Group modifiedGroup = output.getGroup(); List<Group> tmp = new ArrayList<Group>(getList()); tmp.remove(group); tmp.add(modifiedGroup); Collections.sort(tmp, new GroupComparator()); setList(tmp); setSelection(modifiedGroup); } } protected boolean deleteGroup(Group group) { try { String name = group.getName(); String message = MessageFormat.format( Messages.GroupInfoTable_delete_confirm_msg, new Object[] { name }); if (BgcPlugin.openConfirm( Messages.GroupInfoTable_delete_confirm_title, message)) { SessionManager.getAppService().doAction( new GroupDeleteAction(new GroupDeleteInput(group))); // remove the group from the collection getList().remove(group); reload(); notifyListeners(); return true; } } catch (Throwable t) { TmpUtil.displayException(t); } return false; } public static class GroupComparator implements Comparator<Group> { @Override public int compare(Group a, Group b) { return NullHelper.safeCompareTo(a.getName(), b.getName(), String.CASE_INSENSITIVE_ORDER); } } }