diff options
Diffstat (limited to 'bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format')
8 files changed, 0 insertions, 1943 deletions
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java deleted file mode 100644 index f30ed3a16c..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2007 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; -import org.eclipse.wst.sse.core.utils.StringUtils; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; -import org.w3c.dom.Node; - - -public class CommentNodeFormatter extends NodeFormatter { - static private final String CR = "\r"; //$NON-NLS-1$ - static private final String LF = "\n"; //$NON-NLS-1$ - - protected String adjustIndentations(String aString, String lineIndent, String singleIndent) { - String result = new String(); - - int indexOfLineDelimiter = StringUtils.indexOfLineDelimiter(aString); - result = aString.substring(0, indexOfLineDelimiter); - while (indexOfLineDelimiter != -1) { - // Before find the next LineDelimiter, we have to figure out the - // size of the current LineDelimiter - // so we can figure out how many bytes to skip before finding the - // next LineDelimiter. - // Otherwise, we may treat the LF in CRLF as the next - // LineDelimiter. - int lineDelimiterSize = 1; - if (aString.length() >= indexOfLineDelimiter + 2 && aString.substring(indexOfLineDelimiter, indexOfLineDelimiter + 1).compareTo(CR) == 0 && aString.substring(indexOfLineDelimiter + 1, indexOfLineDelimiter + 2).compareTo(LF) == 0) - lineDelimiterSize = 2; - - int indexOfNextLineDelimiter = StringUtils.indexOfLineDelimiter(aString, indexOfLineDelimiter + lineDelimiterSize); - int indexOfNonblank = StringUtils.indexOfNonblank(aString, indexOfLineDelimiter); - - if (indexOfNonblank != -1) { - if (indexOfNextLineDelimiter == -1) { - // last line; copy till the end - result += lineIndent + singleIndent + aString.substring(indexOfNonblank); - } else if (indexOfNextLineDelimiter != -1 && indexOfNextLineDelimiter < indexOfNonblank) { - // blank line; just add a indent - result += lineIndent + singleIndent; - } else { - // copy all text between indexOfNonblank and - // indexOfNextLineDelimiter - result += lineIndent + singleIndent + aString.substring(indexOfNonblank, indexOfNextLineDelimiter); - } - - indexOfLineDelimiter = indexOfNextLineDelimiter; - } else { - if (indexOfNextLineDelimiter == -1) { - result += lineIndent; - } else { - // blank line; just add a indent - result += lineIndent + singleIndent; - } - - indexOfLineDelimiter = indexOfNextLineDelimiter; - } - } - - return result; - } - - protected void formatNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - if (node != null) { - // lineDelimiterFound means multi line comment - String nodeValue = node.getNodeValue(); - boolean lineDelimiterFoundInComment = StringUtils.containsLineDelimiter(nodeValue); - - if (lineDelimiterFoundInComment) { - // format indentation before node - formatIndentationBeforeNode(node, formatContraints); - - // adjust indentations in multi line comment - String lineDelimiter = node.getModel().getStructuredDocument().getLineDelimiter(); - String lineIndent = formatContraints.getCurrentIndent(); - String singleIndent = getFormatPreferences().getIndent(); - String newNodevalue = adjustIndentations(nodeValue, lineDelimiter + lineIndent, singleIndent); - if (nodeValue.compareTo(newNodevalue) != 0) - node.setNodeValue(newNodevalue); - } - - if (!nodeHasSiblings(node) || (node.getPreviousSibling() != null && node.getPreviousSibling().getNodeType() == Node.TEXT_NODE && !StringUtils.containsLineDelimiter(node.getPreviousSibling().getNodeValue()) && node.getNextSibling() == null)) { - // single child - // or inline comment after text - // do nothing - } else - // format indentation after node - formatIndentationAfterNode(node, formatContraints); - } - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/DocumentNodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/DocumentNodeFormatter.java deleted file mode 100644 index 297df28a1f..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/DocumentNodeFormatter.java +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2006 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * Jesper Steen Møller - xml:space='preserve' support - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; - - -public class DocumentNodeFormatter extends NodeFormatter { - protected void formatChildren(IDOMNode node, IStructuredFormatContraints formatContraints) { - String singleIndent = getFormatPreferences().getIndent(); - String lineIndent = formatContraints.getCurrentIndent(); - - if (node != null && (fProgressMonitor == null || !fProgressMonitor.isCanceled())) { - // normalize node first to combine adjacent text nodes - node.normalize(); - - IDOMNode nextChild = (IDOMNode) node.getFirstChild(); - while (nextChild != null) { - IDOMNode eachChildNode = nextChild; - nextChild = (IDOMNode) eachChildNode.getNextSibling(); - IStructuredFormatter formatter = getFormatter(eachChildNode); - IStructuredFormatContraints childFormatContraints = formatter.getFormatContraints(); - String childIndent = lineIndent + singleIndent; - childFormatContraints.setCurrentIndent(childIndent); - childFormatContraints.setClearAllBlankLines(formatContraints.getClearAllBlankLines()); - childFormatContraints.setInPreserveSpaceElement(formatContraints.getInPreserveSpaceElement()); - - // format each child - formatter.format(eachChildNode, childFormatContraints); - - if (nextChild != null && nextChild.getParentNode() == null) - // nextNode is deleted during format - nextChild = (IDOMNode) eachChildNode.getNextSibling(); - } - } - } - - protected void formatNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - if (node != null) - formatChildren(node, formatContraints); - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java deleted file mode 100644 index beed8f4d49..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java +++ /dev/null @@ -1,425 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2007 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * Jesper Steen Møller - xml:space='preserve' support - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; -import org.eclipse.wst.sse.core.utils.StringUtils; -import org.eclipse.wst.xml.core.internal.Logger; -import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; -import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; -import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; -import org.eclipse.wst.xml.core.internal.document.AttrImpl; -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.core.internal.provisional.document.IDOMNode; -import org.eclipse.wst.xml.core.internal.provisional.document.ISourceGenerator; -import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; -import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; - - -public class ElementNodeFormatter extends DocumentNodeFormatter { - static private final char DOUBLE_QUOTE = '"';//$NON-NLS-1$ - static private final String DOUBLE_QUOTES = "\"\"";//$NON-NLS-1$ - static private final char EQUAL_CHAR = '='; // equal sign$NON-NLS-1$ - static private final String PRESERVE = "preserve";//$NON-NLS-1$ - static private final String PRESERVE_QUOTED = "\"preserve\"";//$NON-NLS-1$ - static private final char SINGLE_QUOTE = '\'';//$NON-NLS-1$ - static private final String XML_SPACE = "xml:space";//$NON-NLS-1$ - static private final char SPACE_CHAR = ' '; //$NON-NLS-1$ - static private final String XSL_NAMESPACE = "http://www.w3.org/1999/XSL/Transform"; //$NON-NLS-1$ - static private final String XSL_ATTRIBUTE = "attribute"; //$NON-NLS-1$ - static private final String XSL_TEXT = "text"; //$NON-NLS-1$ - - protected void formatEndTag(IDOMNode node, IStructuredFormatContraints formatContraints) { - if (!isEndTagMissing(node)) { - // end tag exists - - IStructuredDocument structuredDocument = node.getModel().getStructuredDocument(); - String lineDelimiter = structuredDocument.getLineDelimiter(); - String nodeIndentation = getNodeIndent(node); - IDOMNode lastChild = (IDOMNode) node.getLastChild(); - if (lastChild != null && lastChild.getNodeType() != Node.TEXT_NODE) { - if (isEndTagMissing(lastChild)) { - // find deepest child - IDOMNode deepestChild = (IDOMNode) lastChild.getLastChild(); - while (deepestChild != null && deepestChild.getLastChild() != null && isEndTagMissing(deepestChild)) { - lastChild = deepestChild; - deepestChild = (IDOMNode) deepestChild.getLastChild(); - } - - if (deepestChild != null) { - if (deepestChild.getNodeType() == Node.TEXT_NODE) { - // Special indentation handling if lastChild's end - // tag is missing and deepestChild is a text node. - String nodeText = deepestChild.getNodeValue(); - - if (!nodeText.endsWith(lineDelimiter + nodeIndentation)) { - nodeText = StringUtils.appendIfNotEndWith(nodeText, lineDelimiter); - nodeText = StringUtils.appendIfNotEndWith(nodeText, nodeIndentation); - } - - replaceNodeValue(deepestChild, nodeText); - } - else - insertAfterNode(lastChild, lineDelimiter + nodeIndentation); - } - } - else - // indent end tag - insertAfterNode(lastChild, lineDelimiter + nodeIndentation); - } - else if (lastChild == null && firstStructuredDocumentRegionContainsLineDelimiters(node)) { - // BUG174243 do not indent end tag if node has empty content - // (otherwise new text node would be introduced) - ModelQueryAdapter adapter = (ModelQueryAdapter) ((IDOMDocument) node.getOwnerDocument()).getAdapterFor(ModelQueryAdapter.class); - CMElementDeclaration elementDeclaration = (CMElementDeclaration) adapter.getModelQuery().getCMNode(node); - if ((elementDeclaration == null) || (elementDeclaration.getContentType() != CMElementDeclaration.EMPTY)) { - // indent end tag - replace(structuredDocument, node.getFirstStructuredDocumentRegion().getEndOffset(), 0, lineDelimiter + nodeIndentation); - } - } - - // format end tag name - IStructuredDocumentRegion endTagStructuredDocumentRegion = node.getLastStructuredDocumentRegion(); - if (endTagStructuredDocumentRegion.getRegions().size() >= 3) { - ITextRegion endTagNameRegion = endTagStructuredDocumentRegion.getRegions().get(1); - removeRegionSpaces(node, endTagStructuredDocumentRegion, endTagNameRegion); - } - } - } - - protected void formatNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - if (node != null) { - // format indentation before node - formatIndentationBeforeNode(node, formatContraints); - - // format start tag - IDOMNode newNode = node; - int startTagStartOffset = node.getStartOffset(); - IDOMModel structuredModel = node.getModel(); - - boolean currentlyInXmlSpacePreserve = formatContraints.getInPreserveSpaceElement(); - formatStartTag(node, formatContraints); - // save new node - newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); - - IStructuredDocumentRegion flatNode = newNode.getFirstStructuredDocumentRegion(); - if (flatNode != null) { - ITextRegionList regions = flatNode.getRegions(); - ITextRegion lastRegion = regions.get(regions.size() - 1); - // format children and end tag if not empty start tag - if (lastRegion.getType() != DOMRegionContext.XML_EMPTY_TAG_CLOSE) { - // format children - formatChildren(newNode, formatContraints); - - // save new node - newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); - - // format end tag - formatEndTag(newNode, formatContraints); - } - } - - formatContraints.setInPreserveSpaceElement(currentlyInXmlSpacePreserve); - // only indent if not at last node - if (newNode != null && newNode.getNextSibling() != null) - // format indentation after node - formatIndentationAfterNode(newNode, formatContraints); - } - } - - /** - * This method formats the start tag name, and formats the attributes if - * available. - */ - protected void formatStartTag(IDOMNode node, IStructuredFormatContraints formatContraints) { - StructuredFormatPreferencesXML preferences = (StructuredFormatPreferencesXML) getFormatPreferences(); - String singleIndent = preferences.getIndent(); - String lineIndent = formatContraints.getCurrentIndent(); - String attrIndent = lineIndent + singleIndent; - boolean splitMultiAttrs = preferences.getSplitMultiAttrs(); - boolean alignEndBracket = preferences.isAlignEndBracket(); - boolean sawXmlSpace = false; - - IStructuredDocumentRegion flatNode = node.getFirstStructuredDocumentRegion(); - NamedNodeMap attributes = node.getAttributes(); - - // Note: attributes should not be null even if the node has no - // attributes. However, attributes.getLength() will be 0. But, check - // for null just in case. - if (attributes != null) { - // compute current available line width - int currentAvailableLineWidth = 0; - try { - // 1 is for "<" - int nodeNameOffset = node.getStartOffset() + 1 + node.getNodeName().length(); - int lineOffset = node.getStructuredDocument().getLineInformationOfOffset(nodeNameOffset).getOffset(); - String text = node.getStructuredDocument().get(lineOffset, nodeNameOffset - lineOffset); - int usedWidth = getIndentationLength(text); - currentAvailableLineWidth = preferences.getLineWidth() - usedWidth; - } - catch (BadLocationException e) { - // log for now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - - StringBuffer stringBuffer = new StringBuffer(); - String lineDelimiter = node.getModel().getStructuredDocument().getLineDelimiter(); - int attrLength = attributes.getLength(); - int lastUndefinedRegionOffset = 0; - boolean startTagSpansOver1Line = false; - - for (int i = 0; i < attrLength; i++) { - AttrImpl attr = (AttrImpl) attributes.item(i); - ITextRegion nameRegion = attr.getNameRegion(); - ITextRegion equalRegion = attr.getEqualRegion(); - ITextRegion valueRegion = attr.getValueRegion(); - - // append undefined regions - String undefinedRegion = getUndefinedRegions(node, lastUndefinedRegionOffset, attr.getStartOffset() - lastUndefinedRegionOffset); - stringBuffer.append(undefinedRegion); - lastUndefinedRegionOffset = attr.getStartOffset(); - - // check for xml:space attribute - if (flatNode.getText(nameRegion).compareTo(XML_SPACE) == 0) { - if (valueRegion == null) { - // [111674] If nothing has been written yet, treat as - // preserve, but only as hint - formatContraints.setInPreserveSpaceElement(true); - // Note we don't set 'sawXmlSpace', so that default or - // fixed DTD/XSD values may override. - } - else { - ISourceGenerator generator = node.getModel().getGenerator(); - String newAttrValue = generator.generateAttrValue(attr); - - // There is a problem in - // StructuredDocumentRegionUtil.getAttrValue(ITextRegion) - // when the region is instanceof ContextRegion. - // Workaround for now. - if (flatNode.getText(valueRegion).length() == 1) { - char firstChar = flatNode.getText(valueRegion).charAt(0); - if ((firstChar == DOUBLE_QUOTE) || (firstChar == SINGLE_QUOTE)) - newAttrValue = DOUBLE_QUOTES; - } - - if (newAttrValue.compareTo(PRESERVE_QUOTED) == 0) - formatContraints.setInPreserveSpaceElement(true); - else - formatContraints.setInPreserveSpaceElement(false); - sawXmlSpace = true; - } - } - - if (splitMultiAttrs && attrLength > 1) { - stringBuffer.append(lineDelimiter + attrIndent); - stringBuffer.append(flatNode.getText(nameRegion)); - startTagSpansOver1Line = true; - if (valueRegion != null) { - // append undefined regions - undefinedRegion = getUndefinedRegions(node, lastUndefinedRegionOffset, flatNode.getStartOffset(equalRegion) - lastUndefinedRegionOffset); - stringBuffer.append(undefinedRegion); - lastUndefinedRegionOffset = flatNode.getStartOffset(equalRegion); - - stringBuffer.append(EQUAL_CHAR); - - // append undefined regions - undefinedRegion = getUndefinedRegions(node, lastUndefinedRegionOffset, flatNode.getStartOffset(valueRegion) - lastUndefinedRegionOffset); - stringBuffer.append(undefinedRegion); - lastUndefinedRegionOffset = flatNode.getStartOffset(valueRegion); - - // Note: trim() should not be needed for - // valueRegion.getText(). Just a workaround for a - // problem found in valueRegion for now. - stringBuffer.append(flatNode.getText(valueRegion).trim()); - } - } - else { - if (valueRegion != null) { - int textLength = 1 + flatNode.getText(nameRegion).length() + 1 + flatNode.getText(valueRegion).length(); - if (i == attrLength - 1) { - if (flatNode != null) { - ITextRegionList regions = flatNode.getRegions(); - ITextRegion lastRegion = regions.get(regions.size() - 1); - if (lastRegion.getType() != DOMRegionContext.XML_EMPTY_TAG_CLOSE) - // 3 is for " />" - textLength += 3; - else - // 1 is for ">" - textLength++; - } - } - - if (currentAvailableLineWidth >= textLength) { - stringBuffer.append(SPACE_CHAR); - currentAvailableLineWidth--; - } - else { - stringBuffer.append(lineDelimiter + attrIndent); - startTagSpansOver1Line = true; - currentAvailableLineWidth = preferences.getLineWidth() - attrIndent.length(); - } - - stringBuffer.append(flatNode.getText(nameRegion)); - - // append undefined regions - undefinedRegion = getUndefinedRegions(node, lastUndefinedRegionOffset, flatNode.getStartOffset(equalRegion) - lastUndefinedRegionOffset); - stringBuffer.append(undefinedRegion); - lastUndefinedRegionOffset = flatNode.getStartOffset(equalRegion); - - stringBuffer.append(EQUAL_CHAR); - - // append undefined regions - undefinedRegion = getUndefinedRegions(node, lastUndefinedRegionOffset, flatNode.getStartOffset(valueRegion) - lastUndefinedRegionOffset); - stringBuffer.append(undefinedRegion); - lastUndefinedRegionOffset = flatNode.getStartOffset(valueRegion); - - // Note: trim() should not be needed for - // valueRegion.getText(). Just a workaround for a - // problem found in valueRegion for now. - stringBuffer.append(flatNode.getText(valueRegion).trim()); - - currentAvailableLineWidth -= flatNode.getText(nameRegion).length(); - currentAvailableLineWidth--; - currentAvailableLineWidth -= flatNode.getText(valueRegion).trim().length(); - } - else { - if (currentAvailableLineWidth >= 1 + flatNode.getText(nameRegion).length()) { - stringBuffer.append(SPACE_CHAR); - currentAvailableLineWidth--; - } - else { - stringBuffer.append(lineDelimiter + attrIndent); - startTagSpansOver1Line = true; - currentAvailableLineWidth = preferences.getLineWidth() - attrIndent.length(); - } - - stringBuffer.append(flatNode.getText(nameRegion)); - - currentAvailableLineWidth -= flatNode.getText(nameRegion).length(); - } - } - } - - // append undefined regions - String undefinedRegion = getUndefinedRegions(node, lastUndefinedRegionOffset, node.getEndOffset() - lastUndefinedRegionOffset); - stringBuffer.append(undefinedRegion); - - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - // 1 is for "<" - int offset = node.getStartOffset() + 1 + node.getNodeName().length(); - // 1 is for "<" - int length = node.getFirstStructuredDocumentRegion().getTextLength() - 1 - node.getNodeName().length(); - - if (flatNode != null) { - ITextRegionList regions = flatNode.getRegions(); - ITextRegion firstRegion = regions.get(0); - ITextRegion lastRegion = regions.get(regions.size() - 1); - - if (firstRegion.getType() == DOMRegionContext.XML_END_TAG_OPEN) - // skip formatting for end tags in this format: </tagName> - return; - else { - if (lastRegion.getType() == DOMRegionContext.XML_TAG_CLOSE || lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) - length = length - lastRegion.getLength(); - - if (lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { - // leave space before XML_EMPTY_TAG_CLOSE: <tagName /> - // unless already going to move end bracket - if (!startTagSpansOver1Line || !alignEndBracket) - stringBuffer.append(SPACE_CHAR); - } - } - } - - if (startTagSpansOver1Line && alignEndBracket) { - stringBuffer.append(lineDelimiter).append(lineIndent); - } - - replace(structuredDocument, offset, length, stringBuffer.toString()); - - // BUG108074 & BUG84688 - preserve whitespace in xsl:text & - // xsl:attribute - String nodeNamespaceURI = node.getNamespaceURI(); - if (XSL_NAMESPACE.equals(nodeNamespaceURI)) { - String nodeName = ((Element) node).getLocalName(); - if (XSL_ATTRIBUTE.equals(nodeName) || XSL_TEXT.equals(nodeName)) { - sawXmlSpace = true; - formatContraints.setInPreserveSpaceElement(true); - } - } - - // If we didn't see a xml:space attribute above, we'll look for - // one in the DTD. - // We do not check for a conflict between a DTD's 'fixed' value - // and the attribute value found in the instance document, we - // leave that to the validator. - if (!sawXmlSpace) { - ModelQueryAdapter adapter = (ModelQueryAdapter) ((IDOMDocument) node.getOwnerDocument()).getAdapterFor(ModelQueryAdapter.class); - CMElementDeclaration elementDeclaration = (CMElementDeclaration) adapter.getModelQuery().getCMNode(node); - if (elementDeclaration != null) { - int contentType = elementDeclaration.getContentType(); - if (preferences.isPreservePCDATAContent() && contentType == CMElementDeclaration.PCDATA) { - formatContraints.setInPreserveSpaceElement(true); - } - else { - CMNamedNodeMap cmAttributes = elementDeclaration.getAttributes(); - // Check implied values from the DTD way. - CMAttributeDeclaration attributeDeclaration = (CMAttributeDeclaration) cmAttributes.getNamedItem(XML_SPACE); - if (attributeDeclaration != null) { - // CMAttributeDeclaration found, check it out. - String defaultValue = attributeDeclaration.getAttrType().getImpliedValue(); - - // xml:space="preserve" means preserve space, - // everything else means back to default. - if (PRESERVE.compareTo(defaultValue) == 0) - formatContraints.setInPreserveSpaceElement(true); - else - formatContraints.setInPreserveSpaceElement(false); - } - } - } - } - } - } - - protected String getUndefinedRegions(IDOMNode node, int startOffset, int length) { - String result = new String(); - - IStructuredDocumentRegion flatNode = node.getFirstStructuredDocumentRegion(); - ITextRegionList regions = flatNode.getRegions(); - for (int i = 0; i < regions.size(); i++) { - ITextRegion region = regions.get(i); - String regionType = region.getType(); - int regionStartOffset = flatNode.getStartOffset(region); - - if (regionType.compareTo(DOMRegionContext.UNDEFINED) == 0 && regionStartOffset >= startOffset && regionStartOffset < startOffset + length) - result = result + flatNode.getFullText(region); - } - - if (result.length() > 0) - return SPACE_CHAR + result.trim(); - else - return result; - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/FormatProcessorXML.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/FormatProcessorXML.java deleted file mode 100644 index a798dbdbda..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/FormatProcessorXML.java +++ /dev/null @@ -1,115 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2007 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import org.eclipse.core.runtime.Preferences; -import org.eclipse.wst.sse.core.internal.format.AbstractStructuredFormatProcessor; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter; -import org.eclipse.wst.xml.core.internal.XMLCorePlugin; -import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames; -import org.w3c.dom.Node; - -public class FormatProcessorXML extends AbstractStructuredFormatProcessor { - protected IStructuredFormatPreferences fFormatPreferences = null; - - protected String getFileExtension() { - return "xml"; //$NON-NLS-1$ - } - - public IStructuredFormatPreferences getFormatPreferences() { - if (fFormatPreferences == null) { - fFormatPreferences = new StructuredFormatPreferencesXML(); - - Preferences preferences = getModelPreferences(); - if (preferences != null) { - fFormatPreferences.setLineWidth(preferences.getInt(XMLCorePreferenceNames.LINE_WIDTH)); - ((StructuredFormatPreferencesXML) fFormatPreferences).setSplitMultiAttrs(preferences.getBoolean(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS)); - ((StructuredFormatPreferencesXML) fFormatPreferences).setAlignEndBracket(preferences.getBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET)); - ((StructuredFormatPreferencesXML) fFormatPreferences).setPreservePCDATAContent(preferences.getBoolean(XMLCorePreferenceNames.PRESERVE_CDATACONTENT)); - fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(XMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES)); - - char indentChar = ' '; - String indentCharPref = preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR); - if (XMLCorePreferenceNames.TAB.equals(indentCharPref)) { - indentChar = '\t'; - } - int indentationWidth = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE); - - StringBuffer indent = new StringBuffer(); - for (int i = 0; i < indentationWidth; i++) { - indent.append(indentChar); - } - fFormatPreferences.setIndent(indent.toString()); - } - } - - return fFormatPreferences; - } - - protected IStructuredFormatter getFormatter(Node node) { - // 262135 - NPE during format of empty document - if (node == null) - return null; - - short nodeType = node.getNodeType(); - IStructuredFormatter formatter = null; - switch (nodeType) { - case Node.ELEMENT_NODE : { - formatter = new ElementNodeFormatter(); - break; - } - case Node.TEXT_NODE : { - formatter = new TextNodeFormatter(); - break; - } - case Node.CDATA_SECTION_NODE : { - formatter = new NoMoveFormatter(); - break; - } - case Node.COMMENT_NODE : { - formatter = new CommentNodeFormatter(); - break; - } - case Node.PROCESSING_INSTRUCTION_NODE : { - formatter = new NodeFormatter(); - break; - } - case Node.DOCUMENT_NODE : { - formatter = new DocumentNodeFormatter(); - break; - } - case Node.ENTITY_REFERENCE_NODE : { - formatter = new NoMoveFormatter(); - break; - } - default : { - formatter = new NodeFormatter(); - } - } - - // init fomatter - formatter.setFormatPreferences(getFormatPreferences()); - formatter.setProgressMonitor(fProgressMonitor); - - return formatter; - } - - protected Preferences getModelPreferences() { - return XMLCorePlugin.getDefault().getPluginPreferences(); - } - - protected void refreshFormatPreferences() { - fFormatPreferences = null; - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/NoMoveFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/NoMoveFormatter.java deleted file mode 100644 index 7b68ece73e..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/NoMoveFormatter.java +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 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.xml.core.internal.provisional.format; - -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; - -/** - * Formats entities which really need no formatting. They are just like text - * nodes. - */ -class NoMoveFormatter extends NodeFormatter { - protected void formatIndentationBeforeNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - // node nothing - } - - protected void formatIndentationAfterNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - // still do nothing - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/NodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/NodeFormatter.java deleted file mode 100644 index f48ed184bf..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/NodeFormatter.java +++ /dev/null @@ -1,753 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2007 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * Jesper Steen Møller - xml:space='preserve' support - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Preferences; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter; -import org.eclipse.wst.sse.core.internal.format.StructuredFormatContraints; -import org.eclipse.wst.sse.core.internal.parser.ContextRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; -import org.eclipse.wst.sse.core.utils.StringUtils; -import org.eclipse.wst.xml.core.internal.Logger; -import org.eclipse.wst.xml.core.internal.XMLCorePlugin; -import org.eclipse.wst.xml.core.internal.document.CDATASectionImpl; -import org.eclipse.wst.xml.core.internal.document.CharacterDataImpl; -import org.eclipse.wst.xml.core.internal.document.CommentImpl; -import org.eclipse.wst.xml.core.internal.parser.regions.TagNameRegion; -import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; -import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; -import org.w3c.dom.Node; - -public class NodeFormatter implements IStructuredFormatter { - static protected final String EMPTY_STRING = ""; //$NON-NLS-1$ - static private final char SPACE_CHAR = ' '; //$NON-NLS-1$ - static private final char TAB_CHAR = '\t'; //$NON-NLS-1$ - static private final String TAB = "\t"; //$NON-NLS-1$ - protected IStructuredFormatContraints fFormatContraints = null; - protected IStructuredFormatPreferences fFormatPreferences = null; - protected IProgressMonitor fProgressMonitor = null; - - protected boolean firstStructuredDocumentRegionContainsLineDelimiters(IDOMNode node) { - boolean result = false; - - if (node != null) { - IStructuredDocumentRegion firstStructuredDocumentRegion = node.getFirstStructuredDocumentRegion(); - if (firstStructuredDocumentRegion != null) { - String firstStructuredDocumentRegionText = firstStructuredDocumentRegion.getText(); - result = StringUtils.containsLineDelimiter(firstStructuredDocumentRegionText); - } - } - - return result; - } - - public void format(Node node) { - IStructuredFormatContraints formatContraints = getFormatContraints(); - - format(node, formatContraints); - } - - public void format(Node node, IStructuredFormatContraints formatContraints) { - if (formatContraints.getFormatWithSiblingIndent()) - formatContraints.setCurrentIndent(getSiblingIndent(node)); - - if (node instanceof IDOMNode) - formatNode((IDOMNode) node, formatContraints); - } - - protected void formatIndentationAfterNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - // [111674] If inside xml:space="preserve" element, we bail - if (formatContraints.getInPreserveSpaceElement()) - return; - if (node != null) { - IDOMNode nextSibling = (IDOMNode) node.getNextSibling(); - IStructuredDocument doc = node.getModel().getStructuredDocument(); - String lineDelimiter = getLineDelimiter(node, doc); - - if (node.getParentNode() != null) { - if (node.getParentNode().getNodeType() == Node.DOCUMENT_NODE) - if (nextSibling != null) - if (nextSibling.getNodeType() == Node.TEXT_NODE) - getFormatter(nextSibling).format(nextSibling, formatContraints); - else if (nextSibling.getNodeType() == Node.COMMENT_NODE) { - // do nothing - } - else { - String lineIndent = formatContraints.getCurrentIndent(); - insertAfterNode(node, lineDelimiter + lineIndent); - } - else { - } - - else if (nextSibling != null) - if (nextSibling.getNodeType() == Node.TEXT_NODE) - getFormatter(nextSibling).format(nextSibling, formatContraints); - else if (nextSibling.getNodeType() == Node.COMMENT_NODE) { - // do nothing - } - else { - String lineIndent = formatContraints.getCurrentIndent(); - insertAfterNode(node, lineDelimiter + lineIndent); - } - else { - IDOMNode indentNode = getParentIndentNode(node); - String lineIndent = getNodeIndent(indentNode); - IDOMNode lastChild = getDeepestChildNode(node); - boolean clearAllBlankLines = formatContraints.getClearAllBlankLines(); - - if (lastChild != null) { - if ((lastChild.getNodeType() == Node.TEXT_NODE) && (lastChild.getNodeValue().endsWith(lineDelimiter + lineIndent))) { - // this text node already ends with the requested - // indentation - } - - else if ((lastChild.getNodeType() == Node.TEXT_NODE) && (lastChild.getNodeValue() != null && lastChild.getNodeValue().endsWith(lineDelimiter))) - if (clearAllBlankLines) { - replaceNodeValue(lastChild, lineDelimiter + lineIndent); - } - else { - // append indentation - insertAfterNode(lastChild, lineIndent); - } - else if (lastChild.getNodeType() == Node.TEXT_NODE) - if (lastChild.getNodeValue().length() == 0) { - // replace - replaceNodeValue(lastChild, lineDelimiter + lineIndent); - } - else { - // append indentation - insertAfterNode(lastChild, lineDelimiter + lineIndent); - } - else { - // as long as not at the end of the document - IStructuredDocumentRegion endRegion = node.getLastStructuredDocumentRegion(); - if (endRegion != null && endRegion.getNext() != null) - // append indentation - insertAfterNode(lastChild, lineDelimiter + lineIndent); - } - } - } - } - } - } - - protected void formatIndentationBeforeNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - // [111674] If inside xml:space="preserve" element, we bail - if (formatContraints.getInPreserveSpaceElement()) - return; - if (node != null) { - IDOMNode previousSibling = (IDOMNode) node.getPreviousSibling(); - IStructuredDocument doc = node.getModel().getStructuredDocument(); - String lineDelimiter = getLineDelimiter(node, doc); - - String lineIndent = formatContraints.getCurrentIndent(); - - if (node.getParentNode() != null) { - if (node.getParentNode().getNodeType() == Node.DOCUMENT_NODE) { - if (previousSibling != null) - if (previousSibling.getNodeType() == Node.TEXT_NODE) - getFormatter(previousSibling).format(previousSibling, formatContraints); - else { - insertBeforeNode(node, lineDelimiter + lineIndent); - } - } - else { - if (previousSibling == null || previousSibling.getNodeType() != Node.TEXT_NODE) { - // 261968 - formatting tag without closing bracket: - // <t1><t1 - // 265673 - Null ptr in formatIndentationBeforeNode - int prevEndNodeOffset = -1; - int prevEndRegionOffset = -1; - if (previousSibling != null) { - prevEndNodeOffset = previousSibling.getEndOffset(); - IStructuredDocumentRegion endRegion = previousSibling.getEndStructuredDocumentRegion(); - if (endRegion != null) { - prevEndRegionOffset = endRegion.getTextEndOffset(); - } - } - if ((previousSibling == null) || (prevEndNodeOffset != -1 && prevEndNodeOffset == prevEndRegionOffset)) { - insertBeforeNode(node, lineDelimiter + lineIndent); - } - - } - else { - if (previousSibling.getNodeValue().length() == 0) { - // replace - replaceNodeValue(previousSibling, lineDelimiter + lineIndent); - } - else { - // append indentation - if (!previousSibling.getNodeValue().endsWith(lineDelimiter + lineIndent)) { - if (previousSibling.getNodeValue().endsWith(lineDelimiter)) { - insertAfterNode(previousSibling, lineIndent); - } - else - getFormatter(previousSibling).format(previousSibling, formatContraints); - } - } - } - } - } - } - } - - private String getLineDelimiter(IDOMNode node, IStructuredDocument doc) { - int line = doc.getLineOfOffset(node.getStartOffset()); - String lineDelimiter = doc.getLineDelimiter(); - try { - if (line > 0) { - lineDelimiter = doc.getLineDelimiter(line - 1); - } - } - catch (BadLocationException e) { - // log for now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - // BUG115716: if cannot get line delimiter from current line, just - // use default line delimiter - if (lineDelimiter == null) - lineDelimiter = doc.getLineDelimiter(); - return lineDelimiter; - } - - protected void formatNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - if (node != null && (fProgressMonitor == null || !fProgressMonitor.isCanceled())) { - // format indentation before node - formatIndentationBeforeNode(node, formatContraints); - - // format indentation after node - formatIndentationAfterNode(node, formatContraints); - } - } - - /** - * This method will compute the correct indentation after this node - * depending on the indentations of its sibling nodes and parent node. Not - * needed anymore? - */ - protected void formatTrailingText(IDOMNode node, IStructuredFormatContraints formatContraints) { - // [111674] If inside xml:space="preserve" element, we bail - if (formatContraints.getInPreserveSpaceElement()) - return; - - String lineDelimiter = node.getModel().getStructuredDocument().getLineDelimiter(); - String lineIndent = formatContraints.getCurrentIndent(); - String parentLineIndent = getNodeIndent(node.getParentNode()); - boolean clearAllBlankLines = formatContraints.getClearAllBlankLines(); - - if ((node != null) && (node.getNodeType() != Node.DOCUMENT_NODE)) { - IDOMNode nextSibling = (IDOMNode) node.getNextSibling(); - if ((nextSibling != null) && (nextSibling.getNodeType() == Node.TEXT_NODE)) { - String nextSiblingText = nextSibling.getNodeValue(); - if (nextSibling.getNextSibling() == null) - if ((nextSibling.getParentNode().getNodeType() == Node.DOCUMENT_NODE) && (nextSiblingText.trim().length() == 0)) - // delete spaces at the end of the document - replaceNodeValue(nextSibling, EMPTY_STRING); - else - // replace the text node with parent indentation - replaceNodeValue(nextSibling, lineDelimiter + parentLineIndent); - else - // replace the text node with indentation - replaceNodeValue(nextSibling, lineDelimiter + lineIndent); - } - else { - if (nextSibling == null) { - lineIndent = parentLineIndent; - - if (node.getParentNode().getNodeType() != Node.DOCUMENT_NODE) - if ((node.getNodeType() == Node.TEXT_NODE) && (node.getNodeValue().endsWith(lineDelimiter + lineIndent))) { - // this text node already ends with the requested - // indentation - } - - else if ((node.getNodeType() == Node.TEXT_NODE) && (node.getNodeValue().endsWith(lineDelimiter))) - if (clearAllBlankLines) - replaceNodeValue(node, lineDelimiter + lineIndent); - else - // append indentation - insertAfterNode(node, lineIndent); - else if (node.getNodeType() == Node.TEXT_NODE) - if (node.getNodeValue().length() == 0) - // replace - replaceNodeValue(node, lineDelimiter + lineIndent); - else - // append indentation - if (!node.getNodeValue().endsWith(lineDelimiter + lineIndent)) - if (node.getNodeValue().endsWith(lineDelimiter)) - insertAfterNode(node, lineIndent); - else - insertAfterNode(node, lineDelimiter + lineIndent); - else - replaceNodeValue(node, lineDelimiter + lineIndent); - } - else { - if ((node.getNodeType() == Node.TEXT_NODE) && (node.getNodeValue().endsWith(lineDelimiter + lineIndent))) { - // this text node already ends with the requested - // indentation - } - - else if ((node.getNodeType() == Node.TEXT_NODE) && (node.getNodeValue().endsWith(lineDelimiter))) - if (clearAllBlankLines) - replaceNodeValue(node, lineDelimiter + lineIndent); - else - // append indentation - insertAfterNode(node, lineIndent); - else if (node.getNodeType() == Node.TEXT_NODE) - if (node.getNodeValue().length() == 0) - // replace - replaceNodeValue(node, lineDelimiter + lineIndent); - else - // append indentation - insertAfterNode(node, lineDelimiter + lineIndent); - else - // append indentation - insertAfterNode(node, lineDelimiter + lineIndent); - } - } - } - } - - protected IDOMNode getDeepestChildNode(IDOMNode node) { - IDOMNode result = null; - IDOMNode lastChild = (IDOMNode) node.getLastChild(); - - if (lastChild == null) - result = node; - else { - result = getDeepestChildNode(lastChild); - - if ((result.getNodeType() == Node.TEXT_NODE || result.getNodeType() == Node.COMMENT_NODE) && !isEndTagMissing(node)) - result = node; - } - - return result; - } - - public IStructuredFormatContraints getFormatContraints() { - if (fFormatContraints == null) { - fFormatContraints = new StructuredFormatContraints(); - - fFormatContraints.setClearAllBlankLines(getFormatPreferences().getClearAllBlankLines()); - } - - return fFormatContraints; - } - - public IStructuredFormatPreferences getFormatPreferences() { - if (fFormatPreferences == null) { - fFormatPreferences = new StructuredFormatPreferencesXML(); - - Preferences preferences = getModelPreferences(); - if (preferences != null) { - fFormatPreferences.setLineWidth(preferences.getInt(XMLCorePreferenceNames.LINE_WIDTH)); - ((StructuredFormatPreferencesXML) fFormatPreferences).setSplitMultiAttrs(preferences.getBoolean(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS)); - ((StructuredFormatPreferencesXML) fFormatPreferences).setAlignEndBracket(preferences.getBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET)); - ((StructuredFormatPreferencesXML) fFormatPreferences).setPreservePCDATAContent(preferences.getBoolean(XMLCorePreferenceNames.PRESERVE_CDATACONTENT)); - fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(XMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES)); - - char indentChar = ' '; - String indentCharPref = preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR); - if (XMLCorePreferenceNames.TAB.equals(indentCharPref)) { - indentChar = '\t'; - } - int indentationWidth = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE); - - StringBuffer indent = new StringBuffer(); - for (int i = 0; i < indentationWidth; i++) { - indent.append(indentChar); - } - fFormatPreferences.setIndent(indent.toString()); - } - } - - return fFormatPreferences; - } - - protected IStructuredFormatter getFormatter(IDOMNode node) { - // 262135 - NPE during format of empty document - if (node == null) - return null; - - short nodeType = ((Node) node).getNodeType(); - IStructuredFormatter formatter = null; - switch (nodeType) { - case Node.ELEMENT_NODE : { - formatter = new ElementNodeFormatter(); - break; - } - case Node.TEXT_NODE : { - formatter = new TextNodeFormatter(); - break; - } - case Node.CDATA_SECTION_NODE : { - formatter = new NoMoveFormatter(); - break; - } - case Node.COMMENT_NODE : { - formatter = new CommentNodeFormatter(); - break; - } - case Node.PROCESSING_INSTRUCTION_NODE : { - formatter = new NodeFormatter(); - break; - } - case Node.DOCUMENT_NODE : { - formatter = new DocumentNodeFormatter(); - break; - } - case Node.ENTITY_REFERENCE_NODE : { - formatter = new NoMoveFormatter(); - break; - } - default : { - formatter = new NodeFormatter(); - } - } - - // init fomatter - formatter.setFormatPreferences(getFormatPreferences()); - formatter.setProgressMonitor(fProgressMonitor); - - return formatter; - } - - protected int getIndentationLength(String indent) { - // TODO Kit : The calculation of IndentationLength is not correct - // here. - // nodeIndentation may contain tabs. Multiply by 4 temporarily to get - // approx. width. - // Need to re-work. - - int indentationLength = 0; - - for (int i = 0; i < indent.length(); i++) { - if (indent.substring(i, i + 1).compareTo(TAB) == 0) - indentationLength += 4; - else - indentationLength++; - } - - return indentationLength; - } - - protected Preferences getModelPreferences() { - return XMLCorePlugin.getDefault().getPluginPreferences(); - } - - /** - * This method will find the indentation for this node. It will search - * backwards starting from the beginning of the node until a character - * other than a space or a tab is found. If this node is null or it's a - * document node or it's a first level node (node's parent is a document - * node) the default empty string will be returned as the indentation. - */ - protected String getNodeIndent(Node node) { - String result = EMPTY_STRING; - - if ((node != null) && (node.getNodeType() != Node.DOCUMENT_NODE) && (node.getParentNode() != null) && (node.getParentNode().getNodeType() != Node.DOCUMENT_NODE)) { - IDOMNode siblingTextNode = (IDOMNode) node.getPreviousSibling(); - if ((siblingTextNode != null) && (siblingTextNode.getNodeType() == Node.TEXT_NODE)) { - // find the indentation - String siblingText = siblingTextNode.getNodeValue(); - int siblingTextLength = siblingText.length(); - if ((siblingText != null) && (siblingTextLength > 0) && ((siblingText.charAt(siblingTextLength - 1) == SPACE_CHAR) || (siblingText.charAt(siblingTextLength - 1) == TAB_CHAR))) { - int searchIndex = siblingTextLength - 1; - while ((searchIndex >= 0) && ((siblingText.charAt(searchIndex) == SPACE_CHAR) || (siblingText.charAt(searchIndex) == TAB_CHAR))) - searchIndex--; - - if (searchIndex < siblingTextLength) - result = siblingText.substring(searchIndex + 1, siblingTextLength); - } - } - } - - return result; - } - - protected String getNodeName(IDOMNode node) { - return node.getNodeName(); - } - - protected String getNodeText(IDOMNode node) { - String text = null; - - if ((node instanceof CharacterDataImpl) && !(node instanceof CommentImpl) && !(node instanceof CDATASectionImpl) && !isJSPTag(node)) - text = ((CharacterDataImpl) node).getSource(); - else - text = node.getFirstStructuredDocumentRegion().getText(); - - return text; - } - - protected IDOMNode getParentIndentNode(IDOMNode node) { - IDOMNode result = null; - IDOMNode parentNode = (IDOMNode) node.getParentNode(); - - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) - result = parentNode; - else { - ITextRegion region = parentNode.getLastStructuredDocumentRegion().getFirstRegion(); - if (region.getType() == DOMRegionContext.XML_END_TAG_OPEN) - result = parentNode; - else - result = getParentIndentNode(parentNode); - } - - return result; - } - - /** - * This method will find the indentation for a node sibling to this node. - * It will try to find a sibling node before this node first. If there is - * no sibling node before this node, it will try to find a sibling node - * after this node. If still not found, we will check if this node is - * already indented from its parent. If yes, this node's indentation will - * be used. Otherwise, the parent node's indentation plus one indentation - * will be used. If this node is null or it's a document node or it's a - * first level node (node's parent is a document node) the default empty - * string will be returned as the indentation. - */ - protected String getSiblingIndent(Node node) { - String result = EMPTY_STRING; - - if ((node != null) && (node.getNodeType() != Node.DOCUMENT_NODE) && (node.getParentNode() != null) && (node.getParentNode().getNodeType() != Node.DOCUMENT_NODE)) { - // find the text node before the previous non-text sibling - // if that's not found, we will try the text node before the next - // non-text sibling - IDOMNode sibling = (IDOMNode) node.getPreviousSibling(); - while ((sibling != null) && (sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.COMMENT_NODE)) { - if (sibling.getNodeType() == Node.COMMENT_NODE && sibling.getPreviousSibling() != null && sibling.getPreviousSibling().getNodeType() == Node.TEXT_NODE && StringUtils.containsLineDelimiter(sibling.getPreviousSibling().getNodeValue())) - break; - sibling = (IDOMNode) sibling.getPreviousSibling(); - } - if (sibling == null) { - sibling = (IDOMNode) node.getNextSibling(); - while ((sibling != null) && (sibling.getNodeType() == Node.TEXT_NODE)) - sibling = (IDOMNode) sibling.getNextSibling(); - } - String singleIndent = getFormatPreferences().getIndent(); - String parentLineIndent = getNodeIndent(node.getParentNode()); - - if (sibling != null) { - String siblingIndent = getNodeIndent(sibling); - if (siblingIndent.length() > 0) - result = siblingIndent; - else { - String nodeIndent = getNodeIndent(node); - if (nodeIndent.length() > parentLineIndent.length()) - // this node is indented from its parent, its - // indentation will be used - result = nodeIndent; - else - result = parentLineIndent + singleIndent; - } - } - else { - String nodeIndent = getNodeIndent(node); - if (nodeIndent.length() > parentLineIndent.length()) - // this node is indented from its parent, its indentation - // will be used - result = nodeIndent; - else - result = parentLineIndent + singleIndent; - } - } - - return result; - } - - protected void insertAfterNode(IDOMNode node, String string) { - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - - int offset = node.getEndOffset(); - int length = 0; - - // 261968 - formatting tag without closing bracket: <t1><t1 - if (node.getEndStructuredDocumentRegion() != null) { - offset = node.getEndStructuredDocumentRegion().getTextEndOffset(); - length = node.getEndOffset() - offset; - } - replace(structuredDocument, offset, length, string); - } - - protected void insertBeforeNode(IDOMNode node, String string) { - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - - replace(structuredDocument, node.getStartOffset(), 0, string); - } - - /** - * Allowing the INodeAdapter to compare itself against the type allows it - * to return true in more than one case. - */ - public boolean isAdapterForType(Object type) { - return type.equals(IStructuredFormatter.class); - } - - protected boolean isEndTagMissing(IDOMNode node) { - boolean result = false; - - if ((node != null) && (node.getNodeType() != Node.DOCUMENT_NODE) && !isJSPTag(node)) { - IStructuredDocumentRegion startTagStructuredDocumentRegion = node.getFirstStructuredDocumentRegion(); - IStructuredDocumentRegion endTagStructuredDocumentRegion = node.getLastStructuredDocumentRegion(); - - ITextRegion startTagNameRegion = null; - if (startTagStructuredDocumentRegion.getRegions().size() > 1) - startTagNameRegion = startTagStructuredDocumentRegion.getRegions().get(1); - ITextRegion endTagNameRegion = null; - if (endTagStructuredDocumentRegion.getRegions().size() > 1) - endTagNameRegion = endTagStructuredDocumentRegion.getRegions().get(1); - - ITextRegionList startTagRegions = startTagStructuredDocumentRegion.getRegions(); - if (startTagNameRegion == endTagNameRegion && startTagNameRegion != null && (startTagRegions.get(0)).getType() != DOMRegionContext.XML_END_TAG_OPEN && (startTagRegions.get(startTagRegions.size() - 1).getType()) != DOMRegionContext.XML_EMPTY_TAG_CLOSE) - // end tag missing - result = true; - } - - return result; - } - - protected boolean nodeHasSiblings(IDOMNode node) { - return (node.getPreviousSibling() != null) || (node.getNextSibling() != null); - } - - /** - * Node changed. No format should be performed automatically. - */ - public void notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { - } - - protected void removeRegionSpaces(IDOMNode node, IStructuredDocumentRegion flatNode, ITextRegion region) { - if ((region != null) && (region instanceof ContextRegion || region instanceof TagNameRegion) && (flatNode.getEndOffset(region) > flatNode.getTextEndOffset(region))) { - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - - replace(structuredDocument, flatNode.getTextEndOffset(region), flatNode.getEndOffset(region) - flatNode.getTextEndOffset(region), EMPTY_STRING); - } - } - - /** - * This method will replace the string at offset and length with a new - * string. If the string to be replaced is the same as the new string, the - * string will not be replaced. - */ - protected void replace(IStructuredDocument structuredDocument, int offset, int length, String string) { - try { - String structuredDocumentString = structuredDocument.get(offset, length); - if (structuredDocumentString.compareTo(string) != 0) - structuredDocument.replaceText(structuredDocument, offset, length, string); - } - catch (BadLocationException e) { - // log for now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - } - - /** - * This method will replace the node value with a new string. If the node - * value to be replaced is the same as the new string, the node value will - * not be replaced. - */ - protected void replaceNodeValue(IDOMNode node, String string) { - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - int offset = node.getStartOffset(); - int length = node.getEndOffset() - node.getStartOffset(); - - try { - String structuredDocumentString = structuredDocument.get(offset, length); - if (structuredDocumentString.compareTo(string) != 0) - replace(structuredDocument, offset, length, string); - } - catch (BadLocationException e) { - // log for now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - } - - public void setFormatPreferences(IStructuredFormatPreferences formatPreferences) { - fFormatPreferences = formatPreferences; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.wst.sse.core.format.IStructuredFormatter#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) - */ - public void setProgressMonitor(IProgressMonitor monitor) { - fProgressMonitor = monitor; - } - - /** - * ISSUE: this is a bit of hidden JSP knowledge that was implemented this - * way for expedency. Should be evolved in future to depend on - * "nestedContext". - */ - private boolean isJSPTag(Node node) { - - final String JSP_CLOSE = "JSP_CLOSE"; //$NON-NLS-1$ - // final String JSP_COMMENT_CLOSE = "JSP_COMMENT_CLOSE"; //$NON-NLS-1$ - - // final String JSP_COMMENT_OPEN = "JSP_COMMENT_OPEN"; //$NON-NLS-1$ - // final String JSP_COMMENT_TEXT = "JSP_COMMENT_TEXT"; //$NON-NLS-1$ - - final String JSP_CONTENT = "JSP_CONTENT"; //$NON-NLS-1$ - final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$ - final String JSP_DIRECTIVE_CLOSE = "JSP_DIRECTIVE_CLOSE"; //$NON-NLS-1$ - final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$NON-NLS-1$ - - final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$ - final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$ - - // final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$ - - final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$ - - boolean result = false; - - if (node instanceof IDOMNode) { - IStructuredDocumentRegion flatNode = ((IDOMNode) node).getFirstStructuredDocumentRegion(); - // in some cases, the nodes exists, but hasn't been associated - // with - // a flatnode yet (the screen updates can be initiated on a - // different thread, - // so the request for a flatnode can come in before the node is - // fully formed. - // if the flatnode is null, we'll just allow the defaults to - // apply. - if (flatNode != null) { - String flatNodeType = flatNode.getType(); - // should not be null, but just to be sure - if (flatNodeType != null) { - if ((flatNodeType.equals(JSP_CONTENT)) || (flatNodeType.equals(JSP_EXPRESSION_OPEN)) || (flatNodeType.equals(JSP_SCRIPTLET_OPEN)) || (flatNodeType.equals(JSP_DECLARATION_OPEN)) || (flatNodeType.equals(JSP_DIRECTIVE_CLOSE)) || (flatNodeType.equals(JSP_DIRECTIVE_NAME)) || (flatNodeType.equals(JSP_DIRECTIVE_OPEN)) || (flatNodeType.equals(JSP_CLOSE))) { - result = true; - } - } - } - } - - return result; - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/StructuredFormatPreferencesXML.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/StructuredFormatPreferencesXML.java deleted file mode 100644 index 07024eb3f5..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/StructuredFormatPreferencesXML.java +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2007 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import org.eclipse.wst.sse.core.internal.format.StructuredFormatPreferences; - -public class StructuredFormatPreferencesXML extends StructuredFormatPreferences { - private boolean fSplitMultiAttrs = false; - private boolean fPreservePCDATAContent = false; - private boolean fAlignEndBracket = false; - - /** - * True if formatter should split elements with multiple attributes onto - * new lines. - * - * @return boolean - */ - public boolean getSplitMultiAttrs() { - return fSplitMultiAttrs; - } - - /** - * Sets whether or not formatter should split elements with multiple - * attributes onto new lines. - * - * @param splitMultiAttrs - */ - public void setSplitMultiAttrs(boolean splitMultiAttrs) { - fSplitMultiAttrs = splitMultiAttrs; - } - - /** - * True if tags with PCDATA content should not have their whitespace - * messed with when formatting. - * - * @return boolean - */ - public boolean isPreservePCDATAContent() { - return fPreservePCDATAContent; - } - - /** - * Sets whether or not formatter should preserve whitespace in tags with - * PCDATA content. - * - * @param preservePCDATAContent - */ - public void setPreservePCDATAContent(boolean preservePCDATAContent) { - fPreservePCDATAContent = preservePCDATAContent; - } - - /** - * True if end brackets of start tags should be placed on a new line if - * the start tag spans more than one line. - * - * @return - */ - public boolean isAlignEndBracket() { - return fAlignEndBracket; - } - - /** - * Sets whether or not formatter should align the end bracket of a start - * tag on a new line if the start tag spans more than one line. - * - * @param alignEndBracket - */ - public void setAlignEndBracket(boolean alignEndBracket) { - fAlignEndBracket = alignEndBracket; - } -} diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/TextNodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/TextNodeFormatter.java deleted file mode 100644 index 873ab766e4..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/TextNodeFormatter.java +++ /dev/null @@ -1,385 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2008 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 - * Jens Lukowski/Innoopract - initial renaming/restructuring - * Jesper Steen Møller - xml:space='preserve' support - * - *******************************************************************************/ -package org.eclipse.wst.xml.core.internal.provisional.format; - -import java.util.List; -import java.util.Vector; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.sse.core.utils.StringUtils; -import org.eclipse.wst.xml.core.internal.Logger; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; -import org.w3c.dom.Node; - - -public class TextNodeFormatter extends NodeFormatter { - static private final String CR = "\r"; //$NON-NLS-1$ - static private final String DELIMITERS = " \t\n\r\f"; //$NON-NLS-1$ - static private final String EMPTY_STRING = ""; //$NON-NLS-1$ - static private final String FF = "\f"; //$NON-NLS-1$ - static private final String LF = "\n"; //$NON-NLS-1$ - static private final String SPACE = " "; //$NON-NLS-1$ - static private final String TAB = "\t"; //$NON-NLS-1$ - - private String compressSpaces(String string, IStructuredFormatContraints formatContraints) { - /* - * Note that the StructuredTextEditor supports mixed new line - * characters (CR, LF, CRLF) in one file. We have to handle that when - * we try to preserve blank lines. - */ - String[] stringArray = null; - boolean clearAllBlankLines = formatContraints.getClearAllBlankLines(); - - if (clearAllBlankLines) - stringArray = StringUtils.asArray(string); - else - stringArray = StringUtils.asArray(string, DELIMITERS, true); - - StringBuffer compressedString = new StringBuffer(); - if (stringArray.length > 0) { - boolean cr = false, lf = false, cr2 = false, nonSpace = true; - - if (stringArray[0].compareTo(CR) == 0) - cr = true; - else if (stringArray[0].compareTo(LF) == 0) - lf = true; - else if ((stringArray[0].compareTo(SPACE) != 0) && (stringArray[0].compareTo(TAB) != 0) && (stringArray[0].compareTo(FF) != 0)) { - compressedString.append(stringArray[0]); - nonSpace = true; - } - - for (int i = 1; i < stringArray.length; i++) { - if (stringArray[i].compareTo(CR) == 0) { - if (cr && lf) { - if (nonSpace) { - compressedString.append(CR + LF); - nonSpace = false; - } - compressedString.append(stringArray[i]); - cr2 = true; - } - else if (cr) { - if (nonSpace) { - compressedString.append(CR); - nonSpace = false; - } - compressedString.append(stringArray[i]); - cr2 = true; - } - else - cr = true; - } - else if (stringArray[i].compareTo(LF) == 0) { - if (cr && lf && cr2) { - compressedString.append(stringArray[i]); - } - else if (lf) { - if (nonSpace) { - compressedString.append(LF); - nonSpace = false; - } - compressedString.append(stringArray[i]); - } - else - lf = true; - } - else if ((stringArray[i].compareTo(SPACE) != 0) && (stringArray[i].compareTo(TAB) != 0) && (stringArray[i].compareTo(FF) != 0)) { - if (compressedString.length() > 0) - compressedString.append(SPACE); - compressedString.append(stringArray[i]); - - cr = false; - lf = false; - cr2 = false; - nonSpace = true; - } - } - } - - return compressedString.toString(); - } - - protected void formatNode(IDOMNode node, IStructuredFormatContraints formatContraints) { - // [111674] If inside xml:space="preserve" element, we bail - if (formatContraints.getInPreserveSpaceElement()) - return; - if (node != null) { - IStructuredDocument doc = node.getStructuredDocument(); - - int lineWidth = getFormatPreferences().getLineWidth(); - int currentAvailableLineWidth = computeAvailableLineWidth(doc, node.getStartOffset(), lineWidth); - - String nodeText = getNodeText(node); - String compressedText = compressSpaces(nodeText, formatContraints); - - IDOMNode parentNode = (IDOMNode) node.getParentNode(); - - if (((enoughSpace(parentNode, currentAvailableLineWidth, compressedText)) && (noSiblingsAndNoFollowingComment(node)) && !firstStructuredDocumentRegionContainsLineDelimiters(parentNode)) || node.getStartOffset() == 0) { - handleNoReflow(node, doc, compressedText, parentNode); - } - else { - // not enough space, need to reflow text - String nodeIndentation = formatContraints.getCurrentIndent(); - currentAvailableLineWidth = lineWidth - getIndentationLength(nodeIndentation); - List vector = reflowText(compressedText, currentAvailableLineWidth); - int vectorSize = vector.size(); - StringBuffer reflowedTextBuffer = new StringBuffer(); - String lineDelimiter = getLineDelimiter(doc, node.getStartOffset()); - // handle first line specially to check for allowWhitespace - if (vectorSize > 0) { - // determines whether or not to allow whitespace if there - // is an entity or cdata before it - boolean allowWhitespace = true; - // [206072] StringIndexOutOfBoundsException - if (nodeText.length() == 0 || !Character.isWhitespace(nodeText.charAt(0))) { - Node previousSibling = node.getPreviousSibling(); - if (previousSibling != null && (previousSibling.getNodeType() == Node.ENTITY_REFERENCE_NODE || previousSibling.getNodeType() == Node.CDATA_SECTION_NODE)) - allowWhitespace = false; - } - String theString = (String) vector.get(0); - if (allowWhitespace) { - reflowedTextBuffer.append(lineDelimiter); - if (theString.trim().length() > 0) - reflowedTextBuffer.append(nodeIndentation).append(theString); - } - else { - reflowedTextBuffer.append(theString); - } - } - // do the rest of the lines - for (int i = 1; i < vectorSize; i++) { - String theString = (String) vector.get(i); - if (theString.trim().length() > 0) - reflowedTextBuffer.append(lineDelimiter).append(nodeIndentation).append(theString); - else - reflowedTextBuffer.append(lineDelimiter); - } - String reflowedText = reflowedTextBuffer.toString(); - if (node.getNextSibling() == null) { - if (isEndTagMissing(parentNode)) { - // don't add indentation to end if parent end tag is - // missing - } - - else { - // add parent's indentation to end - nodeIndentation = getNodeIndent(parentNode); - if (!reflowedText.endsWith(lineDelimiter + nodeIndentation)) { - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, lineDelimiter); - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, nodeIndentation); - } - } - } - else { - if (!reflowedText.endsWith(lineDelimiter + nodeIndentation)) { - // not already ended with the expected indentation - Node nextSibling = node.getNextSibling(); - if (nextSibling.getNodeType() == Node.COMMENT_NODE) { - // add indentation to end if - // currentTextEndsWithLineDelimiter - // or followed by multiLineComment - - int indexOfLastLineDelimiter = StringUtils.indexOfLastLineDelimiter(nodeText); - boolean currentTextEndsWithLineDelimiter = indexOfLastLineDelimiter != -1; - if (currentTextEndsWithLineDelimiter) { - // no more non blank character after the last - // line delimiter - currentTextEndsWithLineDelimiter = StringUtils.indexOfNonblank(nodeText, indexOfLastLineDelimiter) == -1; - } - - String nodeValue = nextSibling.getNodeValue(); - boolean multiLineComment = StringUtils.containsLineDelimiter(nodeValue); - - if (currentTextEndsWithLineDelimiter || multiLineComment) { - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, lineDelimiter); - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, nodeIndentation); - } - } - else if (nextSibling.getNodeType() == Node.ENTITY_REFERENCE_NODE || nextSibling.getNodeType() == Node.CDATA_SECTION_NODE) { - int textLength = nodeText.length(); - if (textLength > 0 && Character.isWhitespace(nodeText.charAt(textLength - 1))) { - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, lineDelimiter); - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, nodeIndentation); - } - } - else { - // not a comment, just add add indentation to end - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, lineDelimiter); - reflowedText = StringUtils.appendIfNotEndWith(reflowedText, nodeIndentation); - } - } - } - - replaceNodeValue(node, reflowedText); - } - } - } - - /** - * Keeps text inline with its parent (no reflow necessary) - * - * @param node - * @param doc - * @param compressedText - * @param parentNode - */ - private void handleNoReflow(IDOMNode node, IStructuredDocument doc, String compressedText, IDOMNode parentNode) { - String nodeIndentation; - // enough space and text has no line delimiters and (node has no - // siblings or followed by inline comment) and - // parentFirstStructuredDocumentRegionContainsLineDelimiters - - if (isEndTagMissing(parentNode)) { - parentNode = (IDOMNode) parentNode.getParentNode(); - while (isEndTagMissing(parentNode)) - parentNode = (IDOMNode) parentNode.getParentNode(); - - // add parent's indentation to end - nodeIndentation = getNodeIndent(parentNode); - String lineDelimiter = getLineDelimiter(doc, node.getStartOffset()); - if (!compressedText.endsWith(lineDelimiter + nodeIndentation)) { - compressedText = StringUtils.appendIfNotEndWith(compressedText, lineDelimiter); - compressedText = StringUtils.appendIfNotEndWith(compressedText, nodeIndentation); - } - } - - if ((parentNode != null) && (parentNode.getNodeType() == Node.DOCUMENT_NODE) && (node.getNodeValue().length() > 0) && (node.getNodeValue().trim().length() == 0) && ((node.getPreviousSibling() == null) || (node.getNextSibling() == null))) - // delete spaces at the beginning or end of the document - compressedText = EMPTY_STRING; - - replaceNodeValue(node, compressedText); - } - - private boolean noSiblingsAndNoFollowingComment(IDOMNode node) { - IDOMNode nextSibling = (IDOMNode) node.getNextSibling(); - return !nodeHasSiblings(node) || (noLineDelimiter(node) && isComment(nextSibling) && noLineDelimiter(nextSibling)); - } - - private boolean isComment(IDOMNode node) { - boolean result = false; - if (node != null) { - result = node.getNodeType() == Node.COMMENT_NODE; - } - return result; - } - - private boolean noLineDelimiter(IDOMNode node) { - boolean result = false; - if (node != null) { - result = !StringUtils.containsLineDelimiter(node.getNodeValue()); - } - return result; - } - - /** - * Calculates if there is enough space on the current line for - * compressedText (and for its parent end tag) - * - * @param parentNode - * @param currentAvailableLineWidth - * @param compressedText - * @return - */ - private boolean enoughSpace(IDOMNode parentNode, int currentAvailableLineWidth, String compressedText) { - int parentEndTagLength = parentNode.getNodeName().length() + 3; - return compressedText.length() <= (currentAvailableLineWidth - parentEndTagLength) && !StringUtils.containsLineDelimiter(compressedText); - } - - protected Vector reflowText(String text, int availableWidth) { - String[] stringArray = null; - boolean clearAllBlankLines = getFormatPreferences().getClearAllBlankLines(); - - if (clearAllBlankLines) - stringArray = StringUtils.asArray(text); - else - stringArray = StringUtils.asArray(text, DELIMITERS, true); - - Vector output = new Vector(); - if ((stringArray != null) && (stringArray.length > 0)) { - StringBuffer buffer = new StringBuffer(); - if (stringArray[0].compareTo(CR) != 0) - buffer.append(stringArray[0]); - int bufferLength = stringArray[0].toString().length(); - boolean cr = stringArray[0].compareTo(CR) == 0; - - for (int i = 1; i < stringArray.length; i++) { - String eachString = stringArray[i]; - if ((eachString.compareTo(SPACE) != 0) && (eachString.compareTo(TAB) != 0) && (eachString.compareTo(FF) != 0)) { - if ((bufferLength + 1 + eachString.length() > availableWidth) || (eachString.compareTo(CR) == 0) || (eachString.compareTo(LF) == 0)) { - if ((eachString.compareTo(LF) == 0) && cr) { - // do nothing - } - else { - output.add(buffer.toString()); - buffer = new StringBuffer(); - bufferLength = 0; - } - cr = eachString.compareTo(CR) == 0; - } - else if (buffer.toString().trim().length() > 0) { - buffer.append(SPACE); - bufferLength++; - } - if ((eachString.compareTo(CR) != 0) && (eachString.compareTo(LF) != 0)) { - buffer.append(eachString); - bufferLength = bufferLength + eachString.length(); - } - } - } - output.add(buffer.toString()); - } - else - output.add(text); - - return output; - } - - private String getLineDelimiter(IStructuredDocument doc, int nodeOffset) { - int line = doc.getLineOfOffset(nodeOffset); - String lineDelimiter = doc.getLineDelimiter(); - try { - if (line > 0) { - lineDelimiter = doc.getLineDelimiter(line - 1); - } - } - catch (BadLocationException e) { - // log for now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - // BUG115716: if cannot get line delimiter from current line, just - // use default line delimiter - if (lineDelimiter == null) - lineDelimiter = doc.getLineDelimiter(); - return lineDelimiter; - } - - private int computeAvailableLineWidth(IStructuredDocument doc, int nodeOffset, int lineWidth) { - // compute current available line width - int currentAvailableLineWidth = 0; - try { - int lineOffset = doc.getLineInformationOfOffset(nodeOffset).getOffset(); - String text = doc.get(lineOffset, nodeOffset - lineOffset); - int usedWidth = getIndentationLength(text); - currentAvailableLineWidth = lineWidth - usedWidth; - } - catch (BadLocationException e) { - // log for now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - return currentAvailableLineWidth; - } - -} |