| package org.eclipse.wst.jsdt.web.ui.views.contentoutline; |
| |
| |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| import org.eclipse.wst.jsdt.internal.ui.compare.JavaNode; |
| |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.jface.text.Position; |
| import org.eclipse.jface.viewers.IContentProvider; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.wst.html.ui.internal.contentoutline.JFaceNodeAdapterForHTML; |
| import org.eclipse.wst.jsdt.core.IJavaElement; |
| import org.eclipse.wst.jsdt.core.JavaModelException; |
| import org.eclipse.wst.jsdt.internal.core.NamedMember; |
| import org.eclipse.wst.jsdt.internal.core.SourceMethod; |
| import org.eclipse.wst.jsdt.internal.core.SourceRefElement; |
| import org.eclipse.wst.jsdt.internal.core.SourceType; |
| import org.eclipse.wst.jsdt.ui.JavaElementLabelProvider; |
| import org.eclipse.wst.jsdt.ui.StandardJavaElementContentProvider; |
| import org.eclipse.wst.jsdt.web.core.internal.Logger; |
| import org.eclipse.wst.jsdt.web.core.internal.java.IJSPTranslation; |
| import org.eclipse.wst.jsdt.web.core.internal.java.JSPTranslation; |
| import org.eclipse.wst.jsdt.web.core.internal.java.JSPTranslationAdapter; |
| import org.eclipse.wst.sse.core.StructuredModelManager; |
| import org.eclipse.wst.sse.core.internal.model.FactoryRegistry; |
| import org.eclipse.wst.sse.core.internal.provisional.IModelManager; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter; |
| import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; |
| import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; |
| import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter; |
| import org.eclipse.wst.xml.core.internal.document.NodeImpl; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; |
| import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeAdapterFactory; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| |
| public class JFaceNodeAdapterForJs extends JFaceNodeAdapterForHTML { |
| |
| public JFaceNodeAdapterForJs(JFaceNodeAdapterFactory adapterFactory) { |
| super(adapterFactory); |
| } |
| |
| private StandardJavaElementContentProvider fJavaElementProvider; |
| private JavaElementLabelProvider fJavaElementLabelProvider; |
| //private Hashtable parents = new Hashtable(); |
| |
| public Object[] getChildren(Object object) { |
| if(object instanceof IJavaElement) return getJavaElementProvider().getChildren(object); |
| Node node = (Node) object; |
| if (isJSElementParent(node)) { |
| Object[] results = getJSElementsFromNode(node.getFirstChild()); |
| return results; |
| } |
| return super.getChildren(object); |
| } |
| |
| public Object[] getElements(Object object) { |
| if(object instanceof IJavaElement) return getJavaElementProvider().getElements(object); |
| // if(parents.contains(object)){ |
| // NodeList list= ((Node)parents.get(object)).getChildNodes(); |
| // Object obj[] = new Object[list.getLength()]; |
| // for(int i = 0;i<list.getLength();i++){ |
| // obj[i] = list.item(i); |
| // } |
| // return obj; |
| // } |
| return super.getElements(object); |
| } |
| |
| |
| |
| public String getLabelText(Object node) { |
| if(node instanceof JsJfaceNode) return getJavaElementLabelProvider().getText(((JsJfaceNode)node).getJsElement()); |
| if(node instanceof IJavaElement) return getJavaElementLabelProvider().getText((IJavaElement)node); |
| return super.getLabelText(node); |
| } |
| |
| |
| |
| public Image getLabelImage(Object node) { |
| if(node instanceof JsJfaceNode) return getJavaElementLabelProvider().getImage(((JsJfaceNode)node).getJsElement()); |
| if(node instanceof IJavaElement) return getJavaElementLabelProvider().getImage((IJavaElement)node); |
| return super.getLabelImage(node); |
| } |
| |
| public Object getParent(Object element) { |
| |
| // if(parents.contains(element)){ |
| // return ((Node)parents.get(element)); |
| // } |
| if(element instanceof IJavaElement) return getJavaElementProvider().getParent(element); |
| return super.getParent(element); |
| } |
| |
| public boolean hasChildren(Object object) { |
| if(object instanceof IJavaElement) return getJavaElementProvider().hasChildren(object); |
| |
| Node node = (Node) object; |
| |
| if ( isJSElementParent(node) ) { |
| // if(parents.contains(node)) return true; |
| |
| Object[] nodes = getJSElementsFromNode(node.getFirstChild()); |
| |
| return (nodes != null && nodes.length > 0); |
| } |
| |
| return super.hasChildren(object); |
| } |
| |
| private boolean isJSElementParent(Node node) { |
| return (node.hasChildNodes() && node.getNodeName().equalsIgnoreCase("script")); |
| } |
| |
| private boolean isJSElement(Object object) { |
| |
| if(object instanceof IJavaElement) return true; |
| |
| Node node = (Node) object; |
| Node parent = node.getParentNode(); |
| if (parent != null && parent.getNodeName().equalsIgnoreCase("script") && node.getNodeType() == Node.TEXT_NODE) { |
| return true; |
| } |
| return false; |
| } |
| |
| private Object[] getJSElementsFromNode(Node node) { |
| IStructuredModel model = null; |
| IModelManager modelManager = StructuredModelManager.getModelManager(); |
| JSPTranslation translation = null; |
| |
| IJavaElement[] result = null; |
| IDocument viewerDoc = null; |
| |
| try { |
| if (modelManager != null) { |
| IStructuredDocument doc = ((NodeImpl) node).getStructuredDocument(); |
| // model = modelManager.getExistingModelForRead(doc); |
| model = modelManager.getExistingModelForRead(doc); |
| } |
| IDOMModel domModel = (IDOMModel) model; |
| IDOMDocument xmlDoc = domModel.getDocument(); |
| viewerDoc = xmlDoc.getStructuredDocument(); |
| |
| JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) xmlDoc.getAdapterFor(IJSPTranslation.class); |
| translation = translationAdapter.getJSPTranslation(); |
| |
| |
| int startOffset = 0; |
| int endOffset = 0; |
| int type = node.getNodeType(); |
| if (node.getNodeType() == Node.TEXT_NODE && (node instanceof NodeImpl) && translation != null) { |
| startOffset = ((NodeImpl) node).getStartOffset(); |
| endOffset = ((NodeImpl) node).getEndOffset(); |
| |
| result = translation.getElementsFromJspRange(startOffset, endOffset,true); |
| |
| } |
| if (result == null) |
| return null; |
| } catch (Exception e) { |
| Logger.logException(e); |
| } finally { |
| if (model != null) { |
| // model.changedModel(); |
| model.releaseFromRead(); |
| } |
| } |
| |
| |
| Object[] newResults=new Object[result.length]; |
| |
| for (int i = 0; i < result.length; i++) { |
| int htmllength = 0; |
| int htmloffset = 0; |
| Position position=null; |
| try { |
| htmllength = ((SourceRefElement) (result[i])).getSourceRange().getLength(); |
| htmloffset = translation.getJspOffset(((SourceRefElement) (result[i])).getSourceRange().getOffset()); |
| position = new Position(htmloffset, htmllength); |
| } catch (JavaModelException e) { |
| e.printStackTrace(); |
| } |
| |
| |
| newResults[i] = getJsNode(node.getParentNode(), (IJavaElement)result[i], position, model.getFactoryRegistry()); |
| //newResults[i] = new JavaNode(parent,result[i].getElementType(),result[i].getElementName(),htmloffset,htmllength); |
| //parents.put(result[i], node); |
| //parents.put(newResults[i], node); |
| |
| |
| } |
| return newResults; |
| } |
| |
| private Object getJsNode(Node parent, IJavaElement root, Position position, FactoryRegistry registry){ |
| //JavaNode node = new JavaNode(parent,root.getElementType(),root.getElementName(),position.getOffset(), position.getLength()); |
| //if(true) return node; |
| //if(true) return new JsElement(root); |
| JsJfaceNode instance = new JsJfaceNode(parent, root, position); |
| |
| ((JsJfaceNode)instance).setAdapterRegistry(registry); |
| |
| INodeAdapter adapter = ((JsJfaceNode)instance).getAdapterFor(IJFaceNodeAdapter.class); |
| if(!(adapter instanceof JFaceNodeAdapterForJs)){ |
| ((JsJfaceNode)instance).removeAdapter(adapter); |
| ((JsJfaceNode)instance).addAdapter(this); |
| } |
| return instance; |
| } |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| // // TODO Auto-generated method stub |
| // System.out.println("Umiplement method inputChanged" ); |
| // //super.inputChanged(viewer, oldInput, newInput); |
| // if(oldInput instanceof JSDTJfaceNode){ |
| // if(newInput instanceof JSDTJfaceNode){ |
| // super.inputChanged(viewer, oldInput, newInput); |
| // } |
| // } |
| |
| // if(oldInput!=null && parents.contains(oldInput)) parents.remove(oldInput); |
| // super.inputChanged(viewer, oldInput, newInput); |
| |
| } |
| |
| public ISelection getSelection(TreeViewer viewer, ISelection selection) { |
| |
| if (selection instanceof StructuredSelection) { |
| StructuredSelection ss = (StructuredSelection) selection; |
| if(ss==null) return null; |
| Object firstElement = ss.getFirstElement(); |
| if (isJSElement(firstElement)) |
| return new StructuredSelection(firstElement); |
| if (isJSElementParent((Node) firstElement)) |
| return new StructuredSelection(getJSElementsFromNode(((Node) firstElement).getFirstChild())); |
| } |
| |
| return null; |
| } |
| private StandardJavaElementContentProvider getJavaElementProvider() { |
| if (fJavaElementProvider == null) { |
| fJavaElementProvider = new StandardJavaElementContentProvider(true); |
| } |
| return fJavaElementProvider; |
| |
| } |
| |
| private JavaElementLabelProvider getJavaElementLabelProvider() { |
| if (fJavaElementLabelProvider == null) { |
| fJavaElementLabelProvider = new JavaElementLabelProvider(); |
| } |
| return fJavaElementLabelProvider; |
| |
| } |
| |
| } |