blob: 4da6ac0b70095be393bdb4b43be7d2ce69986318 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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.jst.jsp.ui.openon;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jst.jsp.core.JSP11Namespace;
import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter;
import org.eclipse.wst.html.ui.openon.DefaultOpenOnHTML;
import org.eclipse.wst.xml.core.document.XMLDocument;
import org.eclipse.wst.xml.core.document.XMLModel;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
/**
* This action opens classes referenced in JSP directive tags of a JSP page.
*/
public class JSPDirectiveOpenOnJSP extends DefaultOpenOnHTML {
JSPJavaOpenOnJSP jspJavaOpenOn;
private JSPJavaOpenOnJSP getJSPJavaOpenOn() {
if (jspJavaOpenOn == null) {
jspJavaOpenOn = new JSPJavaOpenOnJSP();
// set the document to current document
jspJavaOpenOn.setDocument(getDocument());
}
return jspJavaOpenOn;
}
/* (non-Javadoc)
* @see com.ibm.sse.editor.openon.AbstractOpenOn#setDocument(org.eclipse.jface.text.IDocument)
*/
public void setDocument(IDocument doc) {
super.setDocument(doc);
// also set the document for jspJavaOpenOn
if (jspJavaOpenOn != null) {
jspJavaOpenOn.setDocument(doc);
}
}
/**
* Get JSP translation object
*
* @return JSPTranslation if one exists, null otherwise
*/
private JSPTranslation getJSPTranslation() {
// get JSP translation object for this action's editor's document
XMLModel xmlModel = (XMLModel) getModelManager().getExistingModelForRead(getDocument());
if (xmlModel != null) {
XMLDocument xmlDoc = xmlModel.getDocument();
xmlModel.releaseFromRead();
JSPTranslationAdapter adapter = (JSPTranslationAdapter) xmlDoc.getAdapterFor(IJSPTranslation.class);
if (adapter != null) {
return adapter.getJSPTranslation();
}
}
return null;
}
/*
* (non-Javadoc)
* @see com.ibm.sse.editor.AbstractOpenOn#doOpenOn(org.eclipse.jface.text.IRegion)
*/
protected void doOpenOn(IRegion region) {
IRegion newRegion = doGetOpenOnRegion(region.getOffset());
// if there is a corresponding java offset, then use JSPJavaOpenOnJSP
JSPTranslation jspTranslation = getJSPTranslation();
if ((jspTranslation != null) && (newRegion != null) && (jspTranslation.getJavaOffset(newRegion.getOffset()) > -1)) {
getJSPJavaOpenOn().doOpenOn(newRegion);
}
else {
// otherwise use DefaultOpenOnHTML
super.doOpenOn(newRegion);
}
}
/**
* Return an attr of element that is of type URI if one exists. or if element is jsp:usebean
* return the type or class attribute. null otherwise.
* @param element - cannot be null
* @return Attr
*/
protected Attr getLinkableAttr(Element element) {
String tagName = element.getTagName();
// usebean
if (JSP11Namespace.ElementName.USEBEAN.equalsIgnoreCase(tagName)) {
// get the list of attributes for this node
NamedNodeMap attrs = element.getAttributes();
for (int i = 0; i < attrs.getLength(); ++i) {
Attr att = (Attr) attrs.item(i);
String attName = att.getName();
// look for the type or class attribute
if ((JSP11Namespace.ATTR_NAME_TYPE.equalsIgnoreCase(attName)) || (JSP11Namespace.ATTR_NAME_CLASS.equalsIgnoreCase(attName))) {
return att;
}
}
}
// otherwise, just look for attribute value of type URI
return super.getLinkableAttr(element);
}
}