diff options
Diffstat (limited to 'bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/document/MetaDataAdapter.java')
-rw-r--r-- | bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/document/MetaDataAdapter.java | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/document/MetaDataAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/document/MetaDataAdapter.java new file mode 100644 index 0000000000..a509467ea3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/document/MetaDataAdapter.java @@ -0,0 +1,283 @@ +/******************************************************************************* + * 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.wst.html.core.document; + + + +import java.util.Iterator; + +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.text.IStructuredDocument; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.sse.core.text.ITextRegionList; +import org.eclipse.wst.xml.core.document.TagAdapter; +import org.eclipse.wst.xml.core.document.XMLElement; +import org.eclipse.wst.xml.core.document.XMLModel; +import org.eclipse.wst.xml.core.jsp.model.parser.temp.XMLJSPRegionContexts; +import org.eclipse.wst.xml.core.parser.XMLRegionContext; + +/** + */ +public class MetaDataAdapter implements TagAdapter, MetaData { + + private XMLElement element = null; + private String type = null; + private String data = null; + private String endData = null; + + /** + */ + public MetaDataAdapter(String type) { + super(); + + if (type != null) { + if (type.equals(ANNOTATION)) { + this.type = ANNOTATION; + } + else if (type.equals(AUTHOR_TIME_VISUAL)) { + this.type = AUTHOR_TIME_VISUAL; + } + else { + this.type = type; + } + } + } + + /** + */ + private String getData(IStructuredDocumentRegion flatNode) { + if (flatNode == null) + return null; + ITextRegionList regions = flatNode.getRegions(); + if (regions == null) + return null; + + String data = null; + Iterator e = regions.iterator(); + while (e.hasNext()) { + ITextRegion region = (ITextRegion) e.next(); + String regionType = region.getType(); + if (regionType == XMLRegionContext.XML_COMMENT_TEXT || regionType == XMLJSPRegionContexts.JSP_COMMENT_TEXT) { + data = flatNode.getText(region); + break; + } + } + if (data == null) + return null; + int length = data.length(); + int offset = 0; + for (; offset < length; offset++) { + char c = data.charAt(offset); + if (c == '\r' || c == '\n') { + offset++; + break; + } + } + for (; offset < length; offset++) { + char c = data.charAt(offset); + if (c != '\r' && c != '\n') { + break; + } + } + return data.substring(offset); + } + + /** + */ + public String getData() { + if (this.element == null) + return null; + IStructuredDocumentRegion flatNode = this.element.getStartStructuredDocumentRegion(); + if (flatNode == null) + return null; + if (this.data != null) + return this.data; + return getData(flatNode); + } + + /** + */ + private String getDelimiter(XMLModel model) { + String delim = null; + if (model != null) { + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument != null) + delim = structuredDocument.getLineDelimiter(); + } + if (delim == null) + delim = "\r\n";//$NON-NLS-1$ + return delim; + } + + /** + */ + public String getEndData() { + if (this.element == null) + return null; + IStructuredDocumentRegion flatNode = this.element.getEndStructuredDocumentRegion(); + if (flatNode == null) + return null; + if (this.endData != null) + return this.endData; + return getData(flatNode); + } + + /** + */ + public String getEndTag(XMLElement element) { + StringBuffer buffer = new StringBuffer(); + if (element.isJSPTag()) + buffer.append("<%--");//$NON-NLS-1$ + else + buffer.append("<!--");//$NON-NLS-1$ + buffer.append(METADATA); + buffer.append(' '); + buffer.append(TYPE); + buffer.append("=\"");//$NON-NLS-1$ + buffer.append(this.type); + buffer.append("\" ");//$NON-NLS-1$ + buffer.append(MetaData.ENDSPAN); + String data = getEndData(); + if (data != null && data.length() > 0) { + String delim = getDelimiter(element.getModel()); + buffer.append(delim); + buffer.append(data); + buffer.append(delim); + } + if (element.isJSPTag()) + buffer.append("--%>");//$NON-NLS-1$ + else + buffer.append("-->");//$NON-NLS-1$ + + return buffer.toString(); + } + + /** + */ + public String getStartTag(XMLElement element) { + StringBuffer buffer = new StringBuffer(); + if (element.isJSPTag()) + buffer.append("<%--");//$NON-NLS-1$ + else + buffer.append("<!--");//$NON-NLS-1$ + buffer.append(METADATA); + buffer.append(' '); + buffer.append(TYPE); + buffer.append("=\"");//$NON-NLS-1$ + buffer.append(this.type); + buffer.append("\" ");//$NON-NLS-1$ + buffer.append(MetaData.STARTSPAN); + String data = getData(); + if (data != null && data.length() > 0) { + String delim = getDelimiter(element.getModel()); + buffer.append(delim); + buffer.append(data); + buffer.append(delim); + } + if (element.isJSPTag()) + buffer.append("--%>");//$NON-NLS-1$ + else + buffer.append("-->");//$NON-NLS-1$ + + return buffer.toString(); + } + + /** + */ + public String getType() { + return this.type; + } + + /** + */ + public boolean isAdapterForType(Object type) { + return (type == TagAdapter.class || type == MetaDataAdapter.class); + } + + /** + */ + public boolean isEndTag() { + if (this.element == null) + return false; + if (this.element.hasStartTag()) + return false; + if (this.element.hasEndTag()) + return true; + if (this.data != null) + return false; + return (this.endData != null); + } + + /** + */ + public boolean isRuntimeContainer() { + return (this.type == ANNOTATION || this.type == AUTHOR_TIME_VISUAL); + } + + /** + */ + public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { + } + + /** + */ + public void setData(String data) { + this.data = data; + + if (this.element != null) + this.element.notifyStartTagChanged(); + } + + /** + */ + public void setEndData(String data) { + this.endData = data; + + if (this.element != null) + this.element.notifyEndTagChanged(); + } + + /** + */ + public void setElement(XMLElement element) { + this.element = element; + + if (this.element != null) { + this.element.setCommentTag(true); + if (this.type != MetaData.ANNOTATION) { + this.element.setJSPTag(true); + } + } + } + + /** + */ + public void setRuntimeSource(String source) { + if (source == null) + return; + if (this.element == null) + return; + if (isRuntimeContainer()) + return; + + XMLModel model = this.element.getModel(); + if (model == null) + return; + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument == null) + return; + int offset = this.element.getStartEndOffset(); + int end = this.element.getEndStartOffset(); + int length = end - offset; + structuredDocument.replaceText(model, offset, length, source); + } +}
\ No newline at end of file |