[224885] Content Assist works strange in some case
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
index 4eaebd7..2e3e0cb 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
@@ -1949,10 +1949,10 @@
if (node.getStructuredDocument().getLength() == 0) {
return null;
}
- ITextRegion result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);
+ ITextRegion result = getContentRegion(offset, node);
while (result == null) {
offset--;
- result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);
+ result = getContentRegion(offset, node);
}
return result;
}
@@ -1976,38 +1976,52 @@
region = getCompletionRegion(offset, flatNode);
}
else {
- // the docPosition is neither within the start nor the end, so it
- // must be content
- flatNode = node.getStructuredDocument().getRegionAtCharacterOffset(offset);
- // (pa) ITextRegion refactor
- // if (flatNode.contains(documentPosition)) {
- if ((flatNode.getStartOffset() <= documentPosition) && (flatNode.getEndOffset() >= documentPosition)) {
- // we're interesting in completing/extending the previous
- // IStructuredDocumentRegion if the current
- // IStructuredDocumentRegion isn't plain content or if it's
- // preceded by an orphan '<'
- if ((offset == flatNode.getStartOffset()) && (flatNode.getPrevious() != null) && (((flatNode.getRegionAtCharacterOffset(documentPosition) != null) && (flatNode.getRegionAtCharacterOffset(documentPosition).getType() != DOMRegionContext.XML_CONTENT)) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN))) {
- // Is the region also the start of the node? If so, the
- // previous IStructuredDocumentRegion is
- // where to look for a useful region.
- region = flatNode.getPrevious().getLastRegion();
- }
- else if (flatNode.getEndOffset() == documentPosition) {
- region = flatNode.getLastRegion();
- }
- else {
- region = flatNode.getFirstRegion();
- }
- }
- else {
- // catch end of document positions where the docPosition isn't
- // in a IStructuredDocumentRegion
- region = flatNode.getLastRegion();
- }
+ region = getContentRegion(offset, node);
}
return region;
}
+
+ /**
+ * Find the region within the content
+ * @param offset offset within the document
+ * @param node
+ * @param flatNode
+ * @return
+ */
+ private ITextRegion getContentRegion(int offset, IDOMNode node) {
+ ITextRegion region = null;
+
+ // the docPosition is neither within the start nor the end, so it
+ // must be content
+ IStructuredDocumentRegion flatNode = node.getStructuredDocument().getRegionAtCharacterOffset(offset);
+ // (pa) ITextRegion refactor
+ // if (flatNode.contains(documentPosition)) {
+ if ((flatNode.getStartOffset() <= offset) && (flatNode.getEndOffset() >= offset)) {
+ // we're interesting in completing/extending the previous
+ // IStructuredDocumentRegion if the current
+ // IStructuredDocumentRegion isn't plain content or if it's
+ // preceded by an orphan '<'
+ if ((offset == flatNode.getStartOffset()) && (flatNode.getPrevious() != null) && (((flatNode.getRegionAtCharacterOffset(offset) != null) && (flatNode.getRegionAtCharacterOffset(offset).getType() != DOMRegionContext.XML_CONTENT)) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN))) {
+ // Is the region also the start of the node? If so, the
+ // previous IStructuredDocumentRegion is
+ // where to look for a useful region.
+ region = flatNode.getPrevious().getLastRegion();
+ }
+ else if (flatNode.getEndOffset() == offset) {
+ region = flatNode.getLastRegion();
+ }
+ else {
+ region = flatNode.getFirstRegion();
+ }
+ }
+ else {
+ // catch end of document positions where the docPosition isn't
+ // in a IStructuredDocumentRegion
+ region = flatNode.getLastRegion();
+ }
+ return region;
+ }
/**
* Provided by default. Subclasses may override with their own