| /******************************************************************************* |
| * Copyright (c) 2000, 2015 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.jdt.internal.debug.ui.launcher; |
| |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.SubProgressMonitor; |
| import org.eclipse.jdt.core.IJavaModel; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.ui.JavaElementLabelProvider; |
| import org.eclipse.jface.operation.IRunnableContext; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.dialogs.TwoPaneElementSelector; |
| |
| /** |
| * A dialog to select a type that extends <code>java.applet.Applet</code>. |
| */ |
| public class AppletSelectionDialog extends TwoPaneElementSelector { |
| |
| private IRunnableContext fRunnableContext; |
| private IJavaProject fProject; |
| private static final IType[] EMPTY_TYPE_ARRAY = new IType[] {}; |
| |
| private static class PackageRenderer extends JavaElementLabelProvider { |
| public PackageRenderer() { |
| super(JavaElementLabelProvider.SHOW_PARAMETERS | JavaElementLabelProvider.SHOW_POST_QUALIFIED | JavaElementLabelProvider.SHOW_ROOT); |
| } |
| |
| @Override |
| public Image getImage(Object element) { |
| return super.getImage(((IType) element).getPackageFragment()); |
| } |
| |
| @Override |
| public String getText(Object element) { |
| return super.getText(((IType) element).getPackageFragment()); |
| } |
| } |
| |
| public AppletSelectionDialog(Shell shell, IRunnableContext context, IJavaProject project) { |
| super(shell, new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_BASICS | JavaElementLabelProvider.SHOW_OVERLAY_ICONS), new PackageRenderer()); |
| |
| Assert.isNotNull(context); |
| |
| fRunnableContext = context; |
| fProject = project; |
| } |
| |
| /** |
| * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) |
| */ |
| @Override |
| protected void configureShell(Shell newShell) { |
| super.configureShell(newShell); |
| } |
| |
| /** |
| * @see org.eclipse.jface.window.Window#open() |
| */ |
| @Override |
| public int open() { |
| IType[] types = getAppletTypes(); |
| if (types == null) { |
| return CANCEL; |
| } |
| setElements(types); |
| return super.open(); |
| } |
| |
| /** |
| * Return all types extending <code>java.lang.Applet</code> in the project, or |
| * all types extending Applet in the workspace if the project is <code>null</code>. |
| * If the search is canceled, return <code>null</code>. |
| * @return the array of {@link IType}s |
| */ |
| private IType[] getAppletTypes() { |
| // Populate an array of java projects with either the project specified in |
| // the constructor, or ALL projects in the workspace if no project was specified |
| final IJavaProject[] javaProjects; |
| if (fProject == null) { |
| try { |
| javaProjects = getJavaModel().getJavaProjects(); |
| } catch (JavaModelException jme) { |
| return EMPTY_TYPE_ARRAY; |
| } |
| } else { |
| javaProjects = new IJavaProject[] {fProject}; |
| } |
| |
| // For each java project, calculate the Applet types it contains and add |
| // them to the results |
| final int projectCount = javaProjects.length; |
| final Set<IType> results = new HashSet<>(projectCount); |
| boolean canceled = false; |
| try { |
| fRunnableContext.run(true, true, new IRunnableWithProgress() { |
| @Override |
| public void run(IProgressMonitor monitor) { |
| monitor.beginTask(LauncherMessages.AppletSelectionDialog_Searching____1, projectCount); |
| for (int i = 0; i < projectCount; i++) { |
| IJavaProject javaProject = javaProjects[i]; |
| SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1); |
| results.addAll(AppletLaunchConfigurationUtils.collectAppletTypesInProject(subMonitor, javaProject)); |
| monitor.worked(1); |
| } |
| monitor.done(); |
| } |
| }); |
| } catch (InvocationTargetException ite) { |
| } catch (InterruptedException ie) { |
| canceled = true; |
| } |
| |
| // Convert the results to an array and return it |
| if (canceled) { |
| return null; |
| } |
| IType[] types = null; |
| types = results.toArray(new IType[results.size()]); |
| return types; |
| } |
| |
| /** |
| * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) |
| */ |
| @Override |
| public Control createDialogArea(Composite parent) { |
| Control control = super.createDialogArea(parent); |
| applyDialogFont(control); |
| return control; |
| } |
| |
| /** |
| * Convenience method to get access to the java model. |
| * @return the current Java model |
| */ |
| private IJavaModel getJavaModel() { |
| return JavaCore.create(getWorkspaceRoot()); |
| } |
| |
| /** |
| * Convenience method to get the workspace root. |
| * @return the {@link IWorkspaceRoot} |
| */ |
| private IWorkspaceRoot getWorkspaceRoot() { |
| return ResourcesPlugin.getWorkspace().getRoot(); |
| } |
| |
| } |