/*******************************************************************************
* 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.util;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.wst.jsdt.core.IClassFile;
import org.eclipse.wst.jsdt.core.IImportDeclaration;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.IPackageFragment;
import org.eclipse.wst.jsdt.core.IType;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.core.Signature;
import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil;
import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
import org.eclipse.wst.jsdt.internal.ui.JavaUIMessages;
import org.eclipse.wst.jsdt.internal.ui.actions.SelectionConverter;
import org.eclipse.wst.jsdt.internal.ui.typehierarchy.TypeHierarchyViewPart;
import org.eclipse.wst.jsdt.ui.JavaScriptUI;
public class OpenTypeHierarchyUtil {
private OpenTypeHierarchyUtil() {
}
public static TypeHierarchyViewPart open(IJavaScriptElement element, IWorkbenchWindow window) {
IJavaScriptElement[] candidates= getCandidates(element);
if (candidates != null) {
return open(candidates, window);
}
return null;
}
public static TypeHierarchyViewPart open(IJavaScriptElement[] candidates, IWorkbenchWindow window) {
Assert.isTrue(candidates != null && candidates.length != 0);
IJavaScriptElement input= null;
if (candidates.length > 1) {
String title= JavaUIMessages.OpenTypeHierarchyUtil_selectionDialog_title;
String message= JavaUIMessages.OpenTypeHierarchyUtil_selectionDialog_message;
input= SelectionConverter.selectJavaElement(candidates, window.getShell(), title, message);
} else {
input= candidates[0];
}
if (input == null)
return null;
return openInViewPart(window, input);
}
private static TypeHierarchyViewPart openInViewPart(IWorkbenchWindow window, IJavaScriptElement input) {
IWorkbenchPage page= window.getActivePage();
try {
TypeHierarchyViewPart result= (TypeHierarchyViewPart) page.findView(JavaScriptUI.ID_TYPE_HIERARCHY);
if (result != null) {
result.clearNeededRefresh(); // avoid refresh of old hierarchy on 'becomes visible'
}
result= (TypeHierarchyViewPart) page.showView(JavaScriptUI.ID_TYPE_HIERARCHY);
result.setInputElement(input);
return result;
} catch (CoreException e) {
ExceptionHandler.handle(e, window.getShell(),
JavaUIMessages.OpenTypeHierarchyUtil_error_open_view, e.getMessage());
}
return null;
}
/**
* Converts the input to a possible input candidates
*/
public static IJavaScriptElement[] getCandidates(Object input) {
if (!(input instanceof IJavaScriptElement)) {
return null;
}
try {
IJavaScriptElement elem= (IJavaScriptElement) input;
switch (elem.getElementType()) {
case IJavaScriptElement.INITIALIZER:
case IJavaScriptElement.METHOD:
case IJavaScriptElement.FIELD:
case IJavaScriptElement.TYPE:
case IJavaScriptElement.PACKAGE_FRAGMENT_ROOT:
case IJavaScriptElement.JAVASCRIPT_PROJECT:
return new IJavaScriptElement[] { elem };
case IJavaScriptElement.PACKAGE_FRAGMENT:
if (((IPackageFragment)elem).containsJavaResources())
return new IJavaScriptElement[] {elem};
break;
case IJavaScriptElement.IMPORT_DECLARATION:
IImportDeclaration decl= (IImportDeclaration) elem;
if (decl.isOnDemand()) {
elem= JavaModelUtil.findTypeContainer(elem.getJavaScriptProject(), Signature.getQualifier(elem.getElementName()));
} else {
elem= elem.getJavaScriptProject().findType(elem.getElementName());
}
if (elem == null)
return null;
return new IJavaScriptElement[] {elem};
case IJavaScriptElement.CLASS_FILE:
return new IJavaScriptElement[] { ((IClassFile)input).getType() };
case IJavaScriptElement.JAVASCRIPT_UNIT: {
IJavaScriptUnit cu= (IJavaScriptUnit) elem.getAncestor(IJavaScriptElement.JAVASCRIPT_UNIT);
if (cu != null) {
IType[] types= cu.getTypes();
if (types.length > 0) {
return types;
}
}
break;
}
default:
}
} catch (JavaScriptModelException e) {
JavaScriptPlugin.log(e);
}
return null;
}
}