Java tutorial
/******************************************************************************* * Copyright (c) 2009 Andrey Loskutov. * 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 * Contributor: Andrey Loskutov - initial API and implementation *******************************************************************************/ package de.loskutov.anyedit.jdt; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.jdt.core.IClassFile; 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.JavaModelException; import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.core.search.SearchPattern; import org.eclipse.jdt.core.search.TypeNameRequestor; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import de.loskutov.anyedit.AnyEditToolsPlugin; import de.loskutov.anyedit.IAnyEditConstants; import de.loskutov.anyedit.util.EclipseUtils; /** * @author Andrey * */ public final class JdtUtils { /** * */ private JdtUtils() { super(); } /** * @param typeName * @throws OperationCanceledException * if user doesnt select founded types */ public static int searchAndOpenType(String typeName) throws OperationCanceledException { if (typeName == null) { return 0; } IJavaSearchScope fScope = SearchEngine.createWorkspaceScope(); IType type = null; try { IType[] types = getTypeForName(typeName, fScope, null); if (types.length > 0) { if (types[0] != null) { type = types[0]; } else { return 2; } } } catch (JavaModelException e) { AnyEditToolsPlugin.logError(null, e); } if (type == null) { return 0; } try { IEditorPart part = JavaUI.openInEditor(type); JavaUI.revealInEditor(part, (IJavaElement) type); } catch (CoreException x) { AnyEditToolsPlugin.errorDialog("'Open type' operation failed", x); return 0; } return 1; } /** * Finds a type by the simple name. * see org.eclipse.jdt.internal.corext.codemanipulation.AddImportsOperation * @return null, if no types was found, empty array if more then one type was found, * or only one element, if single match exists */ /* @Nonnull */ private static IType[] getTypeForName(String simpleTypeName, final IJavaSearchScope searchScope, IProgressMonitor monitor) throws JavaModelException { final IType[] result = new IType[1]; final TypeFactory fFactory = new TypeFactory(); TypeNameRequestor requestor = new TypeNameRequestor() { boolean done; boolean found; @Override public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName1, char[][] enclosingTypeNames, String path) { if (done) { return; } IType type = fFactory.create(packageName, simpleTypeName1, enclosingTypeNames, modifiers, path, searchScope, found); if (type != null) { if (found) { // more then one match => we do not need anymore done = true; result[0] = null; } else { found = true; result[0] = type; } } } }; new SearchEngine().searchAllTypeNames(null, SearchPattern.R_EXACT_MATCH, simpleTypeName.toCharArray(), SearchPattern.R_EXACT_MATCH, IJavaSearchConstants.TYPE, searchScope, requestor, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor); return result; } /** * Returns true if the given project is accessible and it has a java nature, otherwise * false. * * @param project * IProject * @return boolean */ private static boolean hasJavaNature(IProject project) { try { return project.hasNature(JavaCore.NATURE_ID); } catch (CoreException e) { // project does not exist or is not open } return false; } private static IJavaProject getJavaProject(IProject project) { if (project == null) { return null; } return JavaCore.create(project); } public static int getTabWidth(IFile file) { int tabWidth = -1; IProject project = file.getProject(); tabWidth = getJavaProjectTabWidth(tabWidth, project); if (tabWidth < 0) { tabWidth = IAnyEditConstants.DEFAULT_TAB_WIDTH; } return tabWidth; } private static int getJavaProjectTabWidth(int tabWidth, IProject project) { IJavaProject javaProject = null; if (project != null && hasJavaNature(project)) { javaProject = getJavaProject(project); } String tabOption; if (javaProject == null || JavaCore.getJavaCore() == null) { tabOption = JavaCore.getOption(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE); } else { tabOption = javaProject.getOption(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, true); } if (tabOption != null) { try { tabWidth = Integer.parseInt(tabOption); } catch (NumberFormatException e) { // TODO: handle exception } } return tabWidth; } /** * @param currentInput class file input * @return may return null */ public static IProject getProjectForClass(IEditorInput currentInput) { IProject project = null; Object adapter = EclipseUtils.getAdapter(currentInput, IClassFile.class); if (adapter instanceof IClassFile) { IClassFile classFile = (IClassFile) adapter; IJavaProject javaProject = classFile.getJavaProject(); if (javaProject != null) { project = javaProject.getProject(); } } return project; } public static IProject getProject(ILaunchConfiguration config) { IProject project = null; // no external config file... // try to find java project, if exist for this configuration IJavaProject javaProject = null; try { javaProject = JavaRuntime.getJavaProject(config); } catch (CoreException e) { AnyEditToolsPlugin.logError(null, e); } if (javaProject != null) { project = javaProject.getProject(); } return project; } }