diff options
[73271] Folding for XML/HTML family languages editors
Diffstat (limited to 'bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java')
-rw-r--r-- | bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java | 130 |
1 files changed, 115 insertions, 15 deletions
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java index f6d639da9f..3612ec63a5 100644 --- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java +++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java @@ -11,6 +11,11 @@ *******************************************************************************/ package org.eclipse.jst.jsp.ui.internal.projection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace; import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory; @@ -23,7 +28,11 @@ public class ProjectionModelNodeAdapterFactoryHTML extends AbstractAdapterFactor // org.eclipse.wst.html.ui.internal.projection // org.eclipse.jst.jsp.ui.internal.projection - private ProjectionViewer fProjectionViewer; + /** + * List of projection viewers currently associated with this projection + * model node adapter factory. + */ + private HashMap fProjectionViewers; public ProjectionModelNodeAdapterFactoryHTML(Object adapterKey, boolean registerAdapters) { super(adapterKey, registerAdapters); @@ -42,7 +51,7 @@ public class ProjectionModelNodeAdapterFactoryHTML extends AbstractAdapterFactor * "adapt-able" node */ protected INodeAdapter createAdapter(INodeNotifier target) { - if ((fProjectionViewer != null) && (target instanceof Node) && ((Node) target).getNodeType() == Node.ELEMENT_NODE) { + if ((isActive()) && (target instanceof Node) && ((Node) target).getNodeType() == Node.ELEMENT_NODE) { Node node = (Node) target; if (isNodeProjectable(node)) { @@ -67,10 +76,6 @@ public class ProjectionModelNodeAdapterFactoryHTML extends AbstractAdapterFactor return null; } - ProjectionViewer getProjectionViewer() { - return fProjectionViewer; - } - /** * Returns true if node is a node type able to fold * @@ -81,25 +86,120 @@ public class ProjectionModelNodeAdapterFactoryHTML extends AbstractAdapterFactor if (node.getNodeType() == Node.ELEMENT_NODE) { String tagName = node.getNodeName(); // node is only projectable if it is head, body, script, style, - // table tags - if (HTML40Namespace.ElementName.HEAD.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.BODY.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.SCRIPT.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.STYLE.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.TABLE.equalsIgnoreCase((tagName))) + // table, ul, ol tags + if (HTML40Namespace.ElementName.HEAD.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.BODY.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.SCRIPT.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.STYLE.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.TABLE.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.UL.equalsIgnoreCase(tagName) || HTML40Namespace.ElementName.OL.equalsIgnoreCase(tagName)) return true; } return false; } - /* - * (non-Javadoc) + /** + * Return true if this factory is currently actively managing projection * - * @see org.eclipse.wst.sse.core.AbstractAdapterFactory#release() + * @return */ - public void release() { - fProjectionViewer = null; + boolean isActive() { + return (fProjectionViewers != null && !fProjectionViewers.isEmpty()); + } + + /** + * Updates projection annotation model if document is not in flux. + * Otherwise, queues up the changes to be applied when document is ready. + * + * @param node + * @param deletions + * @param additions + * @param modifications + */ + void queueAnnotationModelChanges(Node node, Annotation[] deletions, Map additions, Annotation[] modifications) { + queueAnnotationModelChanges(node, deletions, additions, modifications, null); + } + + /** + * Updates projection annotation model for a specific projection viewer if + * document is not in flux. Otherwise, queues up the changes to be applied + * when document is ready. + * + * @param node + * @param deletions + * @param additions + * @param modifications + * @param viewer + */ + void queueAnnotationModelChanges(Node node, Annotation[] deletions, Map additions, Annotation[] modifications, ProjectionViewer viewer) { + // create a change object for latest change and add to queue + ProjectionAnnotationModelChanges newChange = new ProjectionAnnotationModelChanges(node, deletions, additions, modifications); + if (fProjectionViewers != null) { + if (viewer != null) { + ProjectionViewerInformation info = (ProjectionViewerInformation) fProjectionViewers.get(viewer); + if (info != null) { + info.queueAnnotationModelChanges(newChange); + } + } + else { + Iterator infos = fProjectionViewers.values().iterator(); + while (infos.hasNext()) { + ProjectionViewerInformation info = (ProjectionViewerInformation) infos.next(); + info.queueAnnotationModelChanges(newChange); + } + } + } + } + public void release() { + // go through every projectionviewer and call + // removeProjectionViewer(viewer); + if (fProjectionViewers != null) { + Iterator infos = fProjectionViewers.values().iterator(); + while (infos.hasNext()) { + ProjectionViewerInformation info = (ProjectionViewerInformation) infos.next(); + info.dispose(); + infos.remove(); + } + fProjectionViewers = null; + } super.release(); } - void setProjectionViewer(ProjectionViewer viewer) { - fProjectionViewer = viewer; + /** + * Adds viewer to list of projection viewers this factory is associated + * with + * + * @param viewer - + * assumes viewer's document and projection annotation model + * are not null + */ + void addProjectionViewer(ProjectionViewer viewer) { + // remove old entry if it exists + removeProjectionViewer(viewer); + + if (fProjectionViewers == null) { + fProjectionViewers = new HashMap(); + } + + // create new object containing projection viewer and its info + ProjectionViewerInformation info = new ProjectionViewerInformation(viewer); + fProjectionViewers.put(viewer, info); + info.initialize(); + } + + /** + * Removes the given viewer from the list of projection viewers this + * factor is associated with + * + * @param viewer + */ + void removeProjectionViewer(ProjectionViewer viewer) { + if (fProjectionViewers != null) { + // remove entry from list of viewers + ProjectionViewerInformation info = (ProjectionViewerInformation) fProjectionViewers.remove(viewer); + if (info != null) { + info.dispose(); + } + // if removing last projection viewer, clear out everything + if (fProjectionViewers.isEmpty()) { + fProjectionViewers = null; + } + } } } |