Author: vrubezhny
Date: 2009-05-22 14:39:41 -0400 (Fri, 22 May 2009)
New Revision: 15454
Modified:
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/contentassist/FaceletPageContectAssistProcessor.java
Log:
JBIDE-2808: Improve/refactor org.jboss.tools.common.kb plugin.
The skeleton for initial implementation of new-style ContentAssistProcessors
Modified:
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/contentassist/FaceletPageContectAssistProcessor.java
===================================================================
---
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/contentassist/FaceletPageContectAssistProcessor.java 2009-05-22
18:10:43 UTC (rev 15453)
+++
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/contentassist/FaceletPageContectAssistProcessor.java 2009-05-22
18:39:41 UTC (rev 15454)
@@ -1,7 +1,23 @@
package org.jboss.tools.jst.jsp.contentassist;
+import java.util.Map;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.jboss.tools.jst.web.kb.IPageContext;
import org.jboss.tools.jst.web.kb.internal.FaceletPageContextImpl;
+import org.jboss.tools.jst.web.kb.taglib.INameSpace;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
public class FaceletPageContectAssistProcessor extends JspContentAssistProcessor {
@@ -28,6 +44,114 @@
}
protected void setNameSpaces(IPageContext superContext, FaceletPageContextImpl context)
{
- // TODO
+ IStructuredModel sModel = StructuredModelManager
+ .getModelManager()
+ .getExistingModelForRead(getDocument());
+ if (superContext != null) {
+ IRegion region = new Region (0, getDocument().getLength());
+ Map<String, INameSpace> nameSpaces = superContext.getNameSpaces(getOffset());
+ for (String prefix : nameSpaces.keySet()) {
+ context.addNameSpace(region, nameSpaces.get(prefix));
+ }
+ }
+
+ try {
+ if (sModel == null)
+ return;
+
+ Document xmlDocument = (sModel instanceof IDOMModel) ? ((IDOMModel) sModel)
+ .getDocument()
+ : null;
+
+ if (xmlDocument == null)
+ return;
+
+ Node n = findNodeForOffset(xmlDocument, getOffset());
+ while (n != null) {
+ if (!(n instanceof Element)) {
+ if (n instanceof Attr) {
+ n = ((Attr) n).getOwnerElement();
+ } else {
+ n = n.getParentNode();
+ }
+ continue;
+ }
+
+ NamedNodeMap attrs = n.getAttributes();
+ for (int j = 0; attrs != null && j < attrs.getLength(); j++) {
+ Attr a = (Attr) attrs.item(j);
+ String name = a.getName();
+ if (name.startsWith("xmlns:")) {
+ final String prefix = name.substring("xmlns:".length());
+ final String uri = a.getValue();
+ if (prefix != null && prefix.trim().length() > 0 &&
+ uri != null && uri.trim().length() > 0) {
+
+ // TODO: Check the IRegion instance creation
+ IRegion region = new Region(
+ ((IndexedRegion)n).getStartOffset(),
+ ((IndexedRegion)n).getLength());
+
+ INameSpace nameSpace = new INameSpace(){
+
+ public String getURI() {
+ return uri.trim();
+ }
+
+ public String getPrefix() {
+ return prefix.trim();
+ }
+ };
+ context.addNameSpace(region, nameSpace);
+ }
+ }
+ }
+
+ n = n.getParentNode();
+ }
+
+ return;
+ } finally {
+ if (sModel != null) {
+ sModel.releaseFromRead();
+ }
+ }
}
+
+
+ /* Utility functions */
+ private Node findNodeForOffset(IDOMNode node, int offset) {
+ if(node == null) return null;
+ if (!node.contains(offset)) return null;
+
+ if (node.hasChildNodes()) {
+ // Try to find the node in children
+ NodeList children = node.getChildNodes();
+ for (int i = 0; children != null && i < children.getLength(); i++) {
+ IDOMNode child = (IDOMNode)children.item(i);
+ if (child.contains(offset)) {
+ return findNodeForOffset(child, offset);
+ }
+ }
+ }
+ // Not found in children or nave no children
+ if (node.hasAttributes()) {
+ // Try to find in the node attributes
+ NamedNodeMap attributes = node.getAttributes();
+
+ for (int i = 0; attributes != null && i < attributes.getLength(); i++) {
+ IDOMNode attr = (IDOMNode)attributes.item(i);
+ if (attr.contains(offset)) {
+ return attr;
+ }
+ }
+ }
+ // Return the node itself
+ return node;
+ }
+
+ private Node findNodeForOffset(Node node, int offset) {
+ return (node instanceof IDOMNode) ? findNodeForOffset((IDOMNode)node, offset) : null;
+ }
+
}
Show replies by date