/***************************************************************************** * 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(); } }