/*******************************************************************************
* Copyright (c) 2012 Google, Inc.
* 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:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package com.windowtester.swt.codegen.dialogs;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import com.windowtester.internal.debug.LogHandler;
/**
* Dialog for presenting subclasses of a given type for selection.
*/
public class SubclassSelectionDialog {
private final IType type;
private IJavaProject project;
public SubclassSelectionDialog(IType type) {
this.type = type;
}
public static SubclassSelectionDialog forType(IType type) {
return new SubclassSelectionDialog(type);
}
public SubclassSelectionDialog inProject(IJavaProject project) {
this.project = project;
return this;
}
public String getSelection(){
//TODO: improve exception handling
String result = "";
try {
IType[] subtypes = SearchScopeHelper.forSubclasses(type).inProject(getJavaProject());
SelectionDialog dialog = null;
Object[] types;
IJavaSearchScope scope;
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
scope = getSearchScope();
dialog = JavaUI.createTypeDialog(
window.getShell(),
new ProgressMonitorDialog(window.getShell()),
scope,
IJavaElementSearchConstants.CONSIDER_CLASSES,
false, /*type.getFullyQualifiedName()*/ "", FilteredTypeSelectionExtension.forTypes(subtypes));
dialog.setTitle("Superclass Selection");
dialog.setMessage("Choose a type:");
if (dialog.open() == IDialogConstants.CANCEL_ID) {
return null;
}
types = dialog.getResult();
if (types != null && types.length > 0) {
result = ((IType)types[0]).getFullyQualifiedName();
}
} catch (JavaModelException e) {
LogHandler.log(e);
} catch (Exception e) {
LogHandler.log(e);
}
return result;
}
private IJavaSearchScope getSearchScope() {
return SearchEngine.createJavaSearchScope(new IJavaElement[]{project}, true /* referenced projects */);
}
private IJavaProject getJavaProject() {
return project;
}
}