content: /*******************************************************************************
   * Copyright (c) 2000, 2009 IBM Corporation and others.
   * 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
   *
   * Contributors:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.ui.actions;
  
  import java.lang.reflect.InvocationTargetException;
  
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.core.runtime.IProgressMonitor;
  import org.eclipse.jface.action.IAction;
  import org.eclipse.jface.operation.IRunnableContext;
  import org.eclipse.jface.operation.IRunnableWithProgress;
  import org.eclipse.jface.viewers.ISelection;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.ui.IObjectActionDelegate;
  import org.eclipse.ui.IWorkbenchPart;
  import org.eclipse.ui.PlatformUI;
  import org.eclipse.wst.jsdt.core.IIncludePathEntry;
  import org.eclipse.wst.jsdt.core.IJavaScriptProject;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.internal.ui.packageview.JsGlobalScopeContainer;
  import org.eclipse.wst.jsdt.internal.ui.util.ExceptionHandler;
  import org.eclipse.wst.jsdt.ui.wizards.BuildPathDialogAccess;
  
  /**
   * Action to open a dialog to configure classpath containers. Added as a <code>objectContribution</code>
   * to {@link JsGlobalScopeContainer}.
   */
  public class ConfigureContainerAction implements IObjectActionDelegate {
  
  	private ISelection fCurrentSelection;
  	private IWorkbenchPart fPart;
  
  	/*
  	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
  	 */
  	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
  		fPart= targetPart;
  	}
  
  	/*
  	 * @see IActionDelegate#run(IAction)
  	 */
  	public void run(IAction action) {
  		if (fCurrentSelection instanceof IStructuredSelection) {
  			JsGlobalScopeContainer container= (JsGlobalScopeContainer) ((IStructuredSelection) fCurrentSelection).getFirstElement();
  			openWizard(container.getClasspathEntry(), container.getLabel(), container.getJavaProject());
  		}
  	}
  	
  	private void openWizard(IIncludePathEntry entry, String label, final IJavaScriptProject project) {
  		Shell shell= fPart.getSite().getShell();
  		try {
  			IIncludePathEntry[] entries= project.getRawIncludepath();
  			
  			IIncludePathEntry result= BuildPathDialogAccess.configureContainerEntry(shell, entry, project, entries);
  			if (result == null || result.equals(entry)) {
  				return; // user cancelled or no changes
  			}
  
  			int idx= indexInClasspath(entries, entry);
  			if (idx == -1) {
  				return;
  			}
  			
  			final IIncludePathEntry[] newEntries= new IIncludePathEntry[entries.length];
  			System.arraycopy(entries, 0, newEntries, 0, entries.length);
  			newEntries[idx]= result;
  			
  			IRunnableContext context= fPart.getSite().getWorkbenchWindow();
  			if (context == null) {
  				context= PlatformUI.getWorkbench().getProgressService();
  			}
  			context.run(true, true, new IRunnableWithProgress() {
  				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
  					try {			
  						project.setRawIncludepath(newEntries, monitor);
  					} catch (CoreException e) {
  						throw new InvocationTargetException(e);
  					}
  				}
  			});
  		} catch (JavaScriptModelException e) {
  			String title= ActionMessages.ConfigureContainerAction_error_title; 
  			String message= ActionMessages.ConfigureContainerAction_error_creationfailed_message; 
  			ExceptionHandler.handle(e, shell, title, message);
  		} catch (InvocationTargetException e) {
  			String title= ActionMessages.ConfigureContainerAction_error_title; 
  			String message= ActionMessages.ConfigureContainerAction_error_applyingfailed_message; 
  			ExceptionHandler.handle(e, shell, title, message);
  		} catch (InterruptedException e) {
  			// user cancelled
  		}
  	}
  	
  	protected static int indexInClasspath(IIncludePathEntry[] entries, IIncludePathEntry entry) {
  		for (int i= 0; i < entries.length; i++) {
  			if (entries[i] == entry) {
  				return i;
  			}
  		}
  		return -1;
  	}
  
  	/*
  	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
  	 */
  	public void selectionChanged(IAction action, ISelection selection) {
  		fCurrentSelection= selection;
  	}
  
  }
  