/******************************************************************************* * Copyright (c) 2001, 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 * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.jst.jsp.ui.internal.taginfo; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jst.jsp.core.internal.Logger; import org.eclipse.wst.sse.core.StructuredModelManager; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.utils.StringUtils; /** * Provides hover help documentation for xml tags * * @see org.eclipse.jface.text.ITextHover */ public class XMLJavadocHoverProcessor extends JSPJavaJavadocHoverProcessor { /* * (non-Javadoc) * * @see * org.eclipse.jst.jsp.ui.internal.taginfo.JSPJavaJavadocHoverProcessor * #getHoverInfo(org.eclipse.jface.text.ITextViewer, * org.eclipse.jface.text.IRegion) */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { String elementName = null; try { elementName = textViewer.getDocument().get(hoverRegion.getOffset(), hoverRegion.getLength()); } catch (BadLocationException e) { return null; } IStructuredModel model = null; try { model = StructuredModelManager.getModelManager().getExistingModelForRead(textViewer.getDocument()); if (model != null) { String baseLocation = model.getBaseLocation(); // URL fixup from the taglib index record if (baseLocation.startsWith("jar:/file:")) { baseLocation = StringUtils.replace(baseLocation, "jar:/", "jar:"); } /* * Handle opened TLD files from JARs on the Java Build Path by * finding a package fragment root for the same .jar file and * opening the class from there. Note that this might be from * a different Java project's build path than the TLD. */ if (baseLocation.startsWith("jar:file:") && baseLocation.indexOf('!') > 9) { String baseFile = baseLocation.substring(9, baseLocation.indexOf('!')); IPath basePath = new Path(baseFile); IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); for (int i = 0; i < projects.length; i++) { try { if (projects[i].isAccessible() && projects[i].hasNature(JavaCore.NATURE_ID)) { IJavaProject javaProject = JavaCore.create(projects[i]); if (javaProject.exists()) { IPackageFragmentRoot root = javaProject.findPackageFragmentRoot(basePath); if (root != null) { // TLDs don't reference method names IType type = javaProject.findType(elementName); if (type != null) { return getHoverInfo(new IJavaElement[]{type}); } } } } } catch (CoreException e) { Logger.logException(e); } } } else { IPath basePath = new Path(baseLocation); if (basePath.segmentCount() > 1) { IJavaProject javaProject = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject(basePath.segment(0))); if (javaProject.exists()) { try { // TLDs don't reference method names IType type = javaProject.findType(elementName); if (type != null) { return getHoverInfo(new IJavaElement[]{type}); } } catch (JavaModelException e) { Logger.logException(e); } } } } } } finally { if (model != null) model.releaseFromRead(); } return null; } /* * (non-Javadoc) * * @see * org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface. * text.ITextViewer, int) */ public IRegion getHoverRegion(ITextViewer textViewer, int offset) { return JavaWordFinder.findWord(textViewer.getDocument(), offset, true); } }