package org.nightlabs.jfire.auth.ui.actions;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.jdo.JDOHelper;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.nightlabs.base.ui.entity.tree.EntityTree;
import org.nightlabs.base.ui.progress.ProgressMonitorWrapper;
import org.nightlabs.base.ui.util.RCPUtil;
import org.nightlabs.jfire.auth.ui.resource.Messages;
import org.nightlabs.jfire.base.login.ui.action.LSDWorkbenchWindowActionDelegate;
import org.nightlabs.jfire.base.ui.jdo.ActiveJDOObjectController;
import org.nightlabs.jfire.security.dao.UserManagementSystemDAO;
import org.nightlabs.jfire.security.integration.UserManagementSystem;
import org.nightlabs.jfire.security.integration.id.UserManagementSystemID;
/**
* Action for removing persistent {@link UserManagementSystem}s selected in {@link EntityTree}.
* TODO: tree should refresh after object is deleted, need add corresponding support in {@link ActiveJDOObjectController}.
*
* @author Denis Dudnik <deniska.dudnik[at]gmail{dot}com>
*
*/
public class RemoveUserManagementSystemAction extends LSDWorkbenchWindowActionDelegate{
private Collection<UserManagementSystemID> selectedUserManagementSystemIDs;
/**
* {@inheritDoc}
*/
@Override
public void run(IAction action) {
try {
if (selectedUserManagementSystemIDs != null
&& !selectedUserManagementSystemIDs.isEmpty()
&& MessageDialog.openConfirm(RCPUtil.getActiveShell(), Messages.getString("org.nightlabs.jfire.auth.ui.actions.RemoveUserManagementSystemAction.confirmTitle"), Messages.getString("org.nightlabs.jfire.auth.ui.actions.RemoveUserManagementSystemAction.confirmMessage"))){ //$NON-NLS-1$ //$NON-NLS-2$
ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(RCPUtil.getActiveShell());
progressDialog.setOpenOnRun(true);
progressDialog.run(false, false, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
UserManagementSystemDAO.sharedInstance().removeUserManagementSystems(selectedUserManagementSystemIDs, new ProgressMonitorWrapper(monitor));
RCPUtil.getActiveShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
MessageDialog.openInformation(RCPUtil.getActiveShell(), Messages.getString("org.nightlabs.jfire.auth.ui.actions.RemoveUserManagementSystemAction.infoTitle"), Messages.getString("org.nightlabs.jfire.auth.ui.actions.RemoveUserManagementSystemAction.infoMessage")); //$NON-NLS-1$ //$NON-NLS-2$
}
});
}
});
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Tracks selection of {@link UserManagementSystem} objects.
*/
@Override
public void selectionChanged(IAction action, ISelection selection) {
action.setEnabled(false);
if (!(selection instanceof IStructuredSelection)){
return;
}
IStructuredSelection sel = (IStructuredSelection) selection;
Set<UserManagementSystemID> userManagementSystemIDs = new HashSet<UserManagementSystemID>();
for (Iterator<?> it = sel.iterator(); it.hasNext(); ) {
Object o = it.next();
Object oid = JDOHelper.getObjectId(o);
if (oid instanceof UserManagementSystemID) {
userManagementSystemIDs.add((UserManagementSystemID) oid);
}
}
selectedUserManagementSystemIDs = userManagementSystemIDs;
action.setEnabled(!selectedUserManagementSystemIDs.isEmpty());
super.selectionChanged(action, selection);
}
}