package edu.ualberta.med.biobank.dialogs.user;
import java.util.ArrayList;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.PlatformUI;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.action.IdResult;
import edu.ualberta.med.biobank.common.action.security.GroupGetOutput;
import edu.ualberta.med.biobank.common.action.security.GroupSaveAction;
import edu.ualberta.med.biobank.common.action.security.GroupSaveInput;
import edu.ualberta.med.biobank.common.action.security.ManagerContext;
import edu.ualberta.med.biobank.common.action.security.MembershipContext;
import edu.ualberta.med.biobank.common.peer.GroupPeer;
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.model.Group;
import edu.ualberta.med.biobank.model.Membership;
import edu.ualberta.med.biobank.model.User;
import edu.ualberta.med.biobank.widgets.infotables.MembershipInfoTable;
import edu.ualberta.med.biobank.widgets.multiselect.MultiSelectWidget;
import gov.nih.nci.system.applicationservice.ApplicationException;
public class GroupEditDialog extends AbstractSecurityEditDialog {
private final String currentTitle;
private final String titleAreaMessage;
private final Group group;
private final MembershipContext membershipContext;
private final ManagerContext context;
private MembershipInfoTable membershipInfoTable;
private MultiSelectWidget<User> usersWidget;
public GroupEditDialog(Shell parent, GroupGetOutput output,
ManagerContext context) {
super(parent);
this.group = output.getGroup();
this.membershipContext = output.getContext();
this.context = context;
if (group.isNew()) {
currentTitle = "Add Group";
titleAreaMessage = "Add a new group";
} else {
currentTitle = "Edit Group";
titleAreaMessage = "Modify an existing group's information";
}
}
@Override
protected String getDialogShellTitle() {
return currentTitle;
}
@Override
protected String getTitleAreaMessage() {
return titleAreaMessage;
}
@Override
protected String getTitleAreaTitle() {
return currentTitle;
}
@Override
protected void createDialogAreaInternal(Composite parent)
throws ApplicationException {
Composite contents = new Composite(parent, SWT.NONE);
contents.setLayout(new GridLayout(1, false));
contents.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
TabFolder tb = new TabFolder(contents, SWT.TOP);
tb.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
createGeneralFields(createTabItem(tb,
"General", 2));
createMembershipsSection(createTabItem(tb,
"Roles and Permissions", 1));
createUsersSection(createTabItem(tb,
"Users", 1));
}
private void createGeneralFields(Composite createTabItem) {
createBoundWidgetWithLabel(createTabItem, BgcBaseText.class,
SWT.BORDER, "Name", null,
group, GroupPeer.NAME.getName(),
new NonEmptyStringValidator(
"A valid name is required."));
}
private void createMembershipsSection(Composite contents) {
Button addButton = new Button(contents, SWT.PUSH);
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
addMembership();
}
});
addButton.setImage(BgcPlugin.getDefault().getImageRegistry()
.get(BgcPlugin.IMG_ADD));
GridData gd = new GridData();
gd.horizontalAlignment = SWT.RIGHT;
addButton.setLayoutData(gd);
membershipInfoTable =
new MembershipInfoTable(contents, group, membershipContext, context);
}
private void createUsersSection(Composite contents) {
usersWidget = new MultiSelectWidget<User>(contents, SWT.NONE,
"Available users",
"Selected users", 200) {
@Override
protected String getTextForObject(User node) {
return node.getFullName() + " (" + node.getLogin() + ")";
}
};
usersWidget.setSelections(context.getUsers(),
new ArrayList<User>(group.getUsers()));
}
private Composite createTabItem(TabFolder tb, String title, int columns) {
TabItem item = new TabItem(tb, SWT.NONE);
item.setText(title);
Composite contents = new Composite(tb, SWT.NONE);
contents.setLayout(new GridLayout(columns, false));
item.setControl(contents);
return contents;
}
protected void addMembership() {
BusyIndicator.showWhile(Display.getDefault(), new Runnable() {
@Override
public void run() {
Membership m = new Membership();
m.setPrincipal(group);
Shell shell = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell();
MembershipEditWizard wiz = new MembershipEditWizard(m, context);
WizardDialog dlg = new SecurityWizardDialog(shell, wiz);
int res = dlg.open();
if (res == Status.OK) {
m.setPrincipal(group);
group.getMemberships().add(m);
membershipInfoTable.setCollection(group.getMemberships());
membershipInfoTable.setSelection(m);
} else {
m.setPrincipal(null);
}
}
});
}
@Override
protected void okPressed() {
// try saving or updating the group inside this dialog so that if there
// is an error the entered information is not lost
try {
group.getUsers().addAll(usersWidget.getAddedToSelection());
// FIXME: for now it's faster to use the name as the description
group.setDescription(group.getName());
IdResult result = SessionManager.getAppService().doAction(
new GroupSaveAction(new GroupSaveInput(group)));
group.setId(result.getId());
close();
} catch (Throwable t) {
TmpUtil.displayException(t);
}
}
}