Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoramywu2006-06-14 05:08:57 +0000
committeramywu2006-06-14 05:08:57 +0000
commit91c25668b070581fe23302535f43218de5ae94d8 (patch)
tree4dd7c6788a3402343860338d664875aa0b7af102 /bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryHTML.java
parent17320ce8c78b0ce4ed422893bd04c66834404c4d (diff)
downloadwebtools.sourceediting-91c25668b070581fe23302535f43218de5ae94d8.tar.gz
webtools.sourceediting-91c25668b070581fe23302535f43218de5ae94d8.tar.xz
webtools.sourceediting-91c25668b070581fe23302535f43218de5ae94d8.zip
[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.java130
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;
+ }
+ }
}
}

Back to the top