[300182] Expose convert to faceted form action from configure menu
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/plugin.properties b/plugins/org.eclipse.wst.common.project.facet.ui/plugin.properties
index ebea5dc..bfc8a6d 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/plugin.properties
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/plugin.properties
@@ -2,4 +2,5 @@
 providerName = Eclipse Web Tools Platform
 project.facets = Project Facets
 runtimesPropertyPageLabel = Targeted Runtimes
-basicFacetedProjectWizardName = Faceted Project
\ No newline at end of file
+basicFacetedProjectWizardName = Faceted Project
+convertToFacetedFormCommandName = Convert to Faceted Form...
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/plugin.xml b/plugins/org.eclipse.wst.common.project.facet.ui/plugin.xml
index 14e9574..07cd21c 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/plugin.xml
@@ -91,5 +91,33 @@
       category="org.eclipse.ui.Basic">
     </wizard>
   </extension>
+  
+  <extension point="org.eclipse.ui.commands">
+    <command
+      categoryId="org.eclipse.ui.category.file"
+      defaultHandler="org.eclipse.wst.common.project.facet.ui.internal.ConvertProjectToFacetedFormCommandHandler"
+      id="org.eclipse.wst.common.project.facet.ui.ConvertProjectToFacetedForm"
+      name="%convertToFacetedFormCommandName">
+    </command>
+  </extension>
+  
+  <extension point="org.eclipse.ui.menus">
+    <menuContribution locationURI="popup:org.eclipse.ui.projectConfigure?after=additions">
+      <command commandId="org.eclipse.wst.common.project.facet.ui.ConvertProjectToFacetedForm" style="push">
+        <visibleWhen checkEnabled="false">
+          <and>
+            <count value="1"/>
+            <iterate ifEmpty="false" operator="and">
+              <adapt type="org.eclipse.core.resources.IProject">
+                <not>
+                  <test property="org.eclipse.core.resources.projectNature" value="org.eclipse.wst.common.project.facet.core.nature"/>
+                </not>
+              </adapt>
+            </iterate>
+          </and>
+        </visibleWhen>
+      </command>
+    </menuContribution>
+  </extension>
 
 </plugin>
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormCommandHandler.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormCommandHandler.java
new file mode 100644
index 0000000..c103478
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormCommandHandler.java
@@ -0,0 +1,76 @@
+/******************************************************************************
+ * Copyright (c) 2010 Oracle
+ * 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:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************/
+
+package org.eclipse.wst.common.project.facet.ui.internal;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
+ */
+
+public final class ConvertProjectToFacetedFormCommandHandler
+
+    extends AbstractHandler
+    
+{
+    public Object execute( final ExecutionEvent event )
+    
+        throws ExecutionException
+        
+    {
+        IProject project = null;
+        final ISelection currentSelection = HandlerUtil.getCurrentSelection( event );
+        
+        if( currentSelection instanceof IStructuredSelection ) 
+        {
+            final Object element = ( (IStructuredSelection) currentSelection).getFirstElement();
+            project = (IProject) Platform.getAdapterManager().getAdapter( element, IProject.class );
+        } 
+
+        if( project == null )
+        {
+            return null;
+        }
+        
+        final IWorkbenchWindow activeWorkbenchWindow = HandlerUtil.getActiveWorkbenchWindow( event );
+        
+        if( activeWorkbenchWindow != null )
+        {
+            final Shell shell = activeWorkbenchWindow.getShell();
+            
+            ConvertProjectToFacetedFormRunnable.runInProgressDialog( shell, project );
+            
+            final PreferenceDialog dialog 
+                = PreferencesUtil.createPropertyDialogOn( shell, project, FacetsPropertyPage.ID, 
+                                                          null, null, PreferencesUtil.OPTION_NONE );
+            
+            if( dialog != null ) 
+            {
+                dialog.open();
+            }
+        }
+        
+        return null;
+    }
+    
+}
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormRunnable.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormRunnable.java
new file mode 100644
index 0000000..9d833f8
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormRunnable.java
@@ -0,0 +1,113 @@
+/******************************************************************************
+ * Copyright (c) 2010 Oracle
+ * 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:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************/
+
+package org.eclipse.wst.common.project.facet.ui.internal;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
+ */
+
+public final class ConvertProjectToFacetedFormRunnable
+
+    implements IRunnableWithProgress
+    
+{
+    private final IProject project;
+    
+    public static void runInProgressDialog( final Shell shell,
+                                            final IProject project )
+    {
+        final ConvertProjectToFacetedFormRunnable runnable = new ConvertProjectToFacetedFormRunnable( project );
+        
+        try
+        {
+            new ProgressMonitorDialog( shell ).run( true, true, runnable );
+        }
+        catch( InvocationTargetException e )
+        {
+            FacetUiPlugin.log( e );
+        }
+        catch( InterruptedException e ) {}
+    }
+    
+    public ConvertProjectToFacetedFormRunnable( final IProject project )
+    {
+        this.project = project;
+    }
+    
+    public void run( final IProgressMonitor monitor )
+    
+        throws InvocationTargetException, InterruptedException
+        
+    {
+        monitor.beginTask( Resources.taskConvertingProject, 1000 );
+        
+        try
+        {
+            final IProgressMonitor createProgressMonitor = new SubProgressMonitor( monitor, 100 );
+            final IFacetedProject fpj = ProjectFacetsManager.create( this.project, true, createProgressMonitor );
+            
+            if( monitor.isCanceled() )
+            {
+                throw new InterruptedException();
+            }
+            
+            monitor.setTaskName( Resources.taskDetectingTechnologies );
+            
+            final IProgressMonitor detectProgressMonitor = new SubProgressMonitor( monitor, 800 );
+            final IFacetedProjectWorkingCopy fpjwc = fpj.createWorkingCopy();
+            fpjwc.detect( detectProgressMonitor );
+            
+            monitor.setTaskName( Resources.taskInstallingFacets );
+            
+            final IProgressMonitor commitChangesProgressMonitor = new SubProgressMonitor( monitor, 100 );
+            fpjwc.commitChanges( commitChangesProgressMonitor );
+        }
+        catch( CoreException e )
+        {
+            throw new InvocationTargetException( e );
+        }
+        finally
+        {
+            monitor.done();
+        }
+    }
+    
+    private static final class Resources 
+    
+        extends NLS
+        
+    {
+        public static String taskConvertingProject;
+        public static String taskDetectingTechnologies;
+        public static String taskInstallingFacets;
+        
+        static
+        {
+            initializeMessages( ConvertProjectToFacetedFormRunnable.class.getName(), Resources.class );
+        }
+    }
+    
+}
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormRunnable.properties b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormRunnable.properties
new file mode 100644
index 0000000..8f7fb47
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConvertProjectToFacetedFormRunnable.properties
@@ -0,0 +1,3 @@
+taskConvertingProject = Converting project to faceted form...
+taskDetectingTechnologies = Detecting existing technologies...
+taskInstallingFacets = Installing project facets...
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.java
index 171e3ff..ff5024b 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.java
@@ -34,7 +34,6 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.ErrorDialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
@@ -87,6 +86,8 @@
 	extends PropertyPage
 	
 {
+    public static final String ID = "org.eclipse.wst.common.project.facet.ui.FacetsPropertyPage"; //$NON-NLS-1$
+    
     private IProject project;
 	private IFacetedProject fpj;
     private IFacetedProjectWorkingCopy fpjwc;
@@ -540,21 +541,7 @@
 	
 	private void handleConvertProjectAction()
 	{
-	    final ConvertProjectAction action = new ConvertProjectAction( this.project );
-	    
-	    try
-	    {
-	        new ProgressMonitorDialog( getShell() ).run( true, true, action );
-	    }
-	    catch( InvocationTargetException e )
-	    {
-	        
-	    }
-	    catch( InterruptedException e )
-	    {
-	        
-	    }
-	    
+	    ConvertProjectToFacetedFormRunnable.runInProgressDialog( getShell(), this.project );
 	    resetContents();
 	}
 
@@ -587,57 +574,6 @@
         }
     }
     
-    private static final class ConvertProjectAction
-    
-        implements IRunnableWithProgress
-        
-    {
-        private final IProject project;
-        
-        public ConvertProjectAction( final IProject project )
-        {
-            this.project = project;
-        }
-        
-        public void run( final IProgressMonitor monitor )
-        
-            throws InvocationTargetException, InterruptedException
-            
-        {
-            monitor.beginTask( Resources.taskConvertingProject, 1000 );
-            
-            try
-            {
-                final IProgressMonitor createProgressMonitor = new SubProgressMonitor( monitor, 100 );
-                final IFacetedProject fpj = ProjectFacetsManager.create( this.project, true, createProgressMonitor );
-                
-                if( monitor.isCanceled() )
-                {
-                    throw new InterruptedException();
-                }
-                
-                monitor.setTaskName( Resources.taskDetectingTechnologies );
-                
-                final IProgressMonitor detectProgressMonitor = new SubProgressMonitor( monitor, 800 );
-                final IFacetedProjectWorkingCopy fpjwc = SharedWorkingCopyManager.getWorkingCopy( fpj );
-                fpjwc.detect( detectProgressMonitor );
-                
-                monitor.setTaskName( Resources.taskInstallingFacets );
-                
-                final IProgressMonitor commitChangesProgressMonitor = new SubProgressMonitor( monitor, 100 );
-                fpjwc.commitChanges( commitChangesProgressMonitor );
-            }
-            catch( CoreException e )
-            {
-                throw new InvocationTargetException( e );
-            }
-            finally
-            {
-                monitor.done();
-            }
-        }
-    }
-
     private static final class Resources 
     
     	extends NLS
@@ -651,9 +587,6 @@
         public static String modifyWithUnknownWarningMessage;
         public static String projectNotFacetedMessage;
         public static String convertLink;
-        public static String taskConvertingProject;
-        public static String taskDetectingTechnologies;
-        public static String taskInstallingFacets;
         
         static
         {
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.properties b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.properties
index c4c12a3..44369a9 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.properties
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsPropertyPage.properties
@@ -6,6 +6,3 @@
 modifyWithUnknownWarningMessage = Modifying a faceted project when implementations of one or more installed facets are not available can potentially result in a corrupted project. Are you sure you want to proceed?
 projectNotFacetedMessage = This project is not configured to use project facets. Converting this project to faceted form will allow you to easily control the available technologies.
 convertLink = Convert to faceted form...
-taskConvertingProject = Converting project to faceted form...
-taskDetectingTechnologies = Detecting existing technologies...
-taskInstallingFacets = Installing project facets...