/******************************************************************************* | |
* Copyright (c) 2011 Mia-Software. | |
* 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: | |
* Nicolas Bros (Mia-Software) - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.gmt.modisco.infra.common.ui.internal.util; | |
import java.util.ArrayList; | |
import java.util.List; | |
import org.eclipse.core.resources.ICommand; | |
import org.eclipse.core.resources.IProject; | |
import org.eclipse.core.resources.IProjectDescription; | |
import org.eclipse.core.resources.IWorkspaceRunnable; | |
import org.eclipse.core.resources.ResourcesPlugin; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.NullProgressMonitor; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.core.runtime.jobs.Job; | |
import org.eclipse.gmt.modisco.infra.common.core.internal.utils.PluginUtils; | |
import org.eclipse.gmt.modisco.infra.common.core.internal.utils.ProjectUtils; | |
import org.eclipse.gmt.modisco.infra.common.core.logging.MoDiscoLogger; | |
import org.eclipse.gmt.modisco.infra.common.ui.internal.MoDiscoCommonUIPlugin; | |
import org.eclipse.jdt.core.IJavaElement; | |
import org.eclipse.jdt.core.IJavaProject; | |
import org.eclipse.jdt.core.IType; | |
import org.eclipse.jdt.core.JavaCore; | |
import org.eclipse.jdt.core.search.IJavaSearchScope; | |
import org.eclipse.jdt.core.search.SearchEngine; | |
import org.eclipse.jdt.ui.JavaUI; | |
import org.eclipse.jface.operation.IRunnableContext; | |
import org.eclipse.jface.window.Window; | |
import org.eclipse.swt.widgets.Shell; | |
import org.eclipse.ui.dialogs.SelectionDialog; | |
public final class JavaUtils { | |
private JavaUtils() { | |
// utility class | |
} | |
/** | |
* Open a dialog to let the user choose a type. | |
* | |
* @param javaProject | |
* a project in which types are found (may be <code>null</code>, | |
* in which case only <code>additionalBundlesInSearchPath</code> | |
* is used) | |
* @param additionalBundlesInSearchPath | |
* additional bundles that are in the scope for the search. If | |
* not <code>null</code>, then a temporary plug-in project with | |
* these bundles will be created during the life of the dialog. | |
* @param parentShell | |
* the parent shell of the dialog to be created | |
* @param runnableContext | |
* the runnable context used to show progress when the dialog is | |
* being populated | |
* @param style | |
* flags defining the style of the dialog; the only valid values | |
* are <code>IJavaElementSearchConstants.CONSIDER_CLASSES</code>, | |
* <code>IJavaElementSearchConstants.CONSIDER_INTERFACES</code>, | |
* <code>IJavaElementSearchConstants.CONSIDER_ANNOTATION_TYPES</code> | |
* , <code>IJavaElementSearchConstants.CONSIDER_ENUMS</code>, | |
* <code>IJavaElementSearchConstants.CONSIDER_ALL_TYPES</code>, | |
* <code>IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES</code> | |
* <code>IJavaElementSearchConstants.CONSIDER_CLASSES_AND_ENUMS</code> | |
* .<br/> | |
* Please note that the bitwise OR combination of the elementary | |
* constants is not supported. | |
* @param title | |
* the title of the dialog | |
* @param message | |
* the message of the dialog | |
* @return the selected type or <code>null</code> if none | |
*/ | |
public static IType openTypeSelectionDialog(final IJavaProject javaProject, | |
final List<String> additionalBundlesInSearchPath, final Shell parentShell, | |
final IRunnableContext runnableContext, final int style, final String title, | |
final String message) { | |
final IProject[] tempproj = new IProject[1]; | |
final IJavaProject[] tempJavaProj = new IJavaProject[1]; | |
try { | |
if (additionalBundlesInSearchPath.size() > 0) { | |
/* | |
* Create a temporary plug-in project in order to let the user | |
* choose among types that aren't yet on the buildpath of the | |
* new project | |
*/ | |
try { | |
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { | |
public void run(final IProgressMonitor monitor2) throws CoreException { | |
try { | |
tempproj[0] = ResourcesPlugin.getWorkspace().getRoot() | |
.getProject(".temp" + System.currentTimeMillis()); //$NON-NLS-1$ | |
ProjectUtils.createPluginProject(tempproj[0], | |
new NullProgressMonitor(), false); | |
// remove builders to avoid building the temp | |
// project | |
IProjectDescription projectDescription = tempproj[0].getDescription(); | |
projectDescription.setBuildSpec(new ICommand[0]); | |
tempproj[0].setDescription(projectDescription, | |
new NullProgressMonitor()); | |
tempJavaProj[0] = JavaCore.create(tempproj[0]); | |
PluginUtils.addRequiredBundles(tempproj[0], | |
additionalBundlesInSearchPath); | |
} catch (CoreException e) { | |
MoDiscoLogger.logError(e, MoDiscoCommonUIPlugin.getDefault()); | |
} | |
} | |
}, new NullProgressMonitor()); | |
} catch (Exception e) { | |
MoDiscoLogger.logError(e, MoDiscoCommonUIPlugin.getDefault()); | |
// continue without tempproj | |
} | |
} | |
ArrayList<IJavaElement> scopeElements = new ArrayList<IJavaElement>(); | |
if (javaProject != null) { | |
scopeElements.add(javaProject); | |
} | |
if (tempJavaProj[0] != null) { | |
scopeElements.add(tempJavaProj[0]); | |
} | |
IJavaSearchScope scope = SearchEngine.createJavaSearchScope(scopeElements | |
.toArray(new IJavaElement[scopeElements.size()])); | |
SelectionDialog typeDialog = JavaUI.createTypeDialog(parentShell, runnableContext, | |
scope, style, false); | |
typeDialog.setTitle(title); | |
typeDialog.setMessage(message); | |
if (typeDialog.open() == Window.OK) { | |
Object[] result = typeDialog.getResult(); | |
if (result.length > 0) { | |
return (IType) typeDialog.getResult()[0]; | |
} | |
} | |
} catch (Exception e) { | |
MoDiscoLogger.logError(e, MoDiscoCommonUIPlugin.getDefault()); | |
return null; | |
} finally { | |
if (tempproj[0] != null) { | |
final IProject toDelete = tempproj[0]; | |
Job deleteJob = new Job("delete temp project") { //$NON-NLS-1$ | |
@Override | |
protected IStatus run(final IProgressMonitor monitor1) { | |
try { | |
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { | |
public void run(final IProgressMonitor monitor2) | |
throws CoreException { | |
try { | |
toDelete.delete(true, monitor2); | |
} catch (CoreException e) { | |
MoDiscoLogger.logError(e, | |
MoDiscoCommonUIPlugin.getDefault()); | |
} | |
} | |
}, monitor1); | |
} catch (CoreException e) { | |
MoDiscoLogger.logError(e, MoDiscoCommonUIPlugin.getDefault()); | |
} | |
return Status.OK_STATUS; | |
} | |
}; | |
deleteJob.setSystem(true); | |
deleteJob.setPriority(Job.DECORATE); | |
deleteJob.schedule(); | |
} | |
} | |
return null; | |
} | |
} |