/*****************************************************************************
* Copyright (c) 2008 g-Eclipse Consortium
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Initial development of the original code was made for the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Ariel Garcia - initial API and implementation
*****************************************************************************/
package eu.geclipse.ui.internal.actions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.actions.SelectionListenerAction;
import eu.geclipse.core.ICoreProblems;
import eu.geclipse.core.accesscontrol.IACL;
import eu.geclipse.core.model.IProtectable;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.dialogs.AccessControlDialog;
import eu.geclipse.ui.dialogs.ProblemDialog;
import eu.geclipse.ui.internal.Activator;
/**
* The action to access the permissions management dialog.
*
* @author agarcia
*/
public class ManagePermissionsAction extends SelectionListenerAction {
private IWorkbenchSite site;
/** The <code>IProtectable</code> elements whose permissions should be managed */
private List< IProtectable > selectedElements;
/**
* Constructs the action for opening the ACL editor.
*
* @param site the {@link IWorkbenchPartSite} where this action will be present.
*/
public ManagePermissionsAction( final IWorkbenchPartSite site ) {
super( Messages.getString( "ManagePermissionsAction.title" ) ); //$NON-NLS-1$
super.setToolTipText( Messages.getString( "ManagePermissionsAction.tooltip" ) ); //$NON-NLS-1$
this.site = site;
this.selectedElements = new ArrayList< IProtectable >();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
if ( this.selectedElements == null ) {
return;
}
List< IACL > aclList = new ArrayList< IACL >();
try {
Iterator< ? > it = this.selectedElements.iterator();
IProtectable next;
while ( it.hasNext() ) {
next = ( IProtectable ) it.next();
IACL acl = next.fetchACL( null );
if ( acl == null ) {
throw new ProblemException( ICoreProblems.ACCESSCONTROL_INVALID_ACL,
Messages.getString("ManagePermissionsAction.null_ACL_error"), //$NON-NLS-1$
Activator.PLUGIN_ID );
}
aclList.add( acl );
}
// All elements of the list must be of the same type, so query the first
boolean saveAsWhole = aclList.get( 0 ).canSaveWholeACL();
AccessControlDialog dialog = new AccessControlDialog( aclList,
saveAsWhole,
this.site.getShell() );
dialog.open();
} catch ( ProblemException pe ) {
ProblemDialog.openProblem(
this.site.getShell(),
Messages.getString("ManagePermissionsAction.error_fetching_ACL_title"), //$NON-NLS-1$
Messages.getString("ManagePermissionsAction.error_fetching_ACL_description"), //$NON-NLS-1$
pe );
Activator.logException( pe );
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
protected boolean updateSelection( final IStructuredSelection selection ) {
Class< ? > type = null;
IProtectable protectable;
this.selectedElements.clear();
boolean enabled = super.updateSelection( selection );
Iterator< ? > it = selection.iterator();
while ( enabled && it.hasNext() ) {
Object next = it.next();
protectable = null;
// Connection elements do not implement IProtectable directly but adapt to it
if ( next instanceof IProtectable ) {
protectable = ( IProtectable ) next;
} else if ( next instanceof IAdaptable ) {
IAdaptable adaptable = ( IAdaptable ) next;
protectable = ( IProtectable ) adaptable.getAdapter( IProtectable.class );
}
// Enable only if the selected elements implement the interface
if ( protectable != null ) {
this.selectedElements.add( protectable );
} else {
enabled = false;
}
// Enable only if all the selected elements are of the same type
if ( type == null ) {
type = next.getClass();
} else if ( type != next.getClass() ) {
enabled = false;
}
}
// TODO allow editing multiple objects at the same time (if canSaveWholeACL() == true)
if ( this.selectedElements.size() > 1 ) {
enabled = false;
}
return enabled && ! this.selectedElements.isEmpty();
}
}