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.Event;
import org.eclipse.swt.widgets.Listener;
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.ManagerContext;
import edu.ualberta.med.biobank.common.action.security.UserDeleteAction;
import edu.ualberta.med.biobank.common.action.security.UserDeleteInput;
import edu.ualberta.med.biobank.common.action.security.UserGetAction;
import edu.ualberta.med.biobank.common.action.security.UserGetInput;
import edu.ualberta.med.biobank.common.action.security.UserGetOutput;
import edu.ualberta.med.biobank.dialogs.user.TmpUtil;
import edu.ualberta.med.biobank.dialogs.user.UserEditDialog;
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.User;
import edu.ualberta.med.biobank.util.NullHelper;
import gov.nih.nci.system.applicationservice.ApplicationException;
public abstract class UserInfoTable extends
DefaultAbstractInfoTableWidget<User> {
public static final int ROWS_PER_PAGE = 12;
private static final String[] HEADINGS = new String[] {
Messages.UserInfoTable_login_label,
Messages.UserInfoTable_fullname_label,
Messages.UserInfoTable_email_label };
private final ManagerContext managerContext;
private MenuItem unlockMenuItem;
public UserInfoTable(Composite parent, List<User> users,
ManagerContext managerContext) {
super(parent, HEADINGS, ROWS_PER_PAGE);
setList(users);
update();
this.managerContext = managerContext;
addEditItemListener(new IInfoTableEditItemListener<User>() {
@Override
public void editItem(InfoTableEvent<User> event) {
User user = getSelection();
editUser(user);
}
});
addDeleteItemListener(new IInfoTableDeleteItemListener<User>() {
@Override
public void deleteItem(InfoTableEvent<User> event) {
User user = getSelection();
deleteUser(user);
}
});
addClickListener(new IInfoTableDoubleClickItemListener<User>() {
@Override
public void doubleClick(InfoTableEvent<User> event) {
User u = getSelection();
if (u != null) editUser(u);
}
});
unlockMenuItem = new MenuItem(menu, SWT.PUSH);
unlockMenuItem.setText(Messages.UserInfoTable_unlock_label);
unlockMenuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
User user = getSelection();
String userName = user.getLogin();
try {
SessionManager.getAppService().unlockUser(userName);
} catch (ApplicationException e) {
BgcPlugin.openAsyncError(MessageFormat.format(
Messages.UserInfoTable_unlock_error_msg,
new Object[] { userName }), e);
}
}
});
menu.addListener(SWT.Show, new Listener() {
@Override
public void handleEvent(Event event) {
User user = getSelection();
unlockMenuItem.setEnabled(isLockedOut(user));
}
});
}
private static boolean isLockedOut(User user) {
boolean lockedOut = false;
try {
Long csmUserId = user.getCsmUserId();
if (csmUserId != null) {
lockedOut = SessionManager.getAppService()
.isUserLockedOut(user.getCsmUserId());
}
} catch (ApplicationException e) {
}
return lockedOut;
}
@Override
protected BgcLabelProvider getLabelProvider() {
return new BgcLabelProvider() {
@Override
public String getColumnText(Object element, int columnIndex) {
User user = (User) element;
switch (columnIndex) {
case 0:
return user.getLogin();
case 1:
return user.getFullName();
case 2:
return user.getEmail();
default:
return ""; //$NON-NLS-1$
}
}
};
}
/**
* return an integer representing the type of result
*/
protected int editUser(User user) {
UserGetOutput output = null;
try {
output = SessionManager.getAppService()
.doAction(new UserGetAction(new UserGetInput(user)));
} catch (Throwable t) {
TmpUtil.displayException(t);
}
UserEditDialog dlg = new UserEditDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), output, managerContext);
int res = dlg.open();
if (res == Dialog.OK) {
User modifiedUser = output.getUser();
List<User> tmp = new ArrayList<User>(getList());
tmp.remove(user);
tmp.add(modifiedUser);
Collections.sort(tmp, new UserComparator());
setList(tmp);
setSelection(modifiedUser);
notifyListeners();
}
return res;
}
protected boolean deleteUser(User user) {
try {
String loginName = user.getLogin();
String message;
if (SessionManager.getUser().equals(user)) {
BgcPlugin.openAsyncError(
Messages.UserInfoTable_delete_error_msg,
Messages.UserInfoTable_confirm_delete_suicide_msg);
return false;
}
message = MessageFormat.format(
Messages.UserInfoTable_confirm_delete_msg,
new Object[] { loginName });
if (BgcPlugin.openConfirm(
Messages.UserInfoTable_confirm_delete_title, message)) {
SessionManager.getAppService().doAction(
new UserDeleteAction(new UserDeleteInput(user)));
// remove the user from the collection
getList().remove(user);
reload();
notifyListeners();
return true;
}
} catch (Exception e) {
BgcPlugin
.openAsyncError(Messages.UserInfoTable_delete_error_msg, e);
}
return false;
}
public static class UserComparator implements Comparator<User> {
@Override
public int compare(User a, User b) {
return NullHelper.safeCompareTo(a.getLogin(), b.getLogin(),
String.CASE_INSENSITIVE_ORDER);
}
}
}