Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Maetzel2004-06-18 18:54:44 +0000
committerKai Maetzel2004-06-18 18:54:44 +0000
commit396e1a550da9397beab7d153e0c3c5d53e2f50ec (patch)
treeddf8d4a580ecf46b8d82bcc1547d3aff8d983926 /org.eclipse.text/projection
parent344b112de4adfc25510996b989626e0731d9f8bf (diff)
downloadeclipse.platform.text-396e1a550da9397beab7d153e0c3c5d53e2f50ec.tar.gz
eclipse.platform.text-396e1a550da9397beab7d153e0c3c5d53e2f50ec.tar.xz
eclipse.platform.text-396e1a550da9397beab7d153e0c3c5d53e2f50ec.zip
#66157
Diffstat (limited to 'org.eclipse.text/projection')
-rw-r--r--org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java58
-rw-r--r--org.eclipse.text/projection/org/eclipse/jface/text/projection/SegmentUpdater.java2
2 files changed, 44 insertions, 16 deletions
diff --git a/org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java b/org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java
index 2a38c4d17a4..c69e66ed508 100644
--- a/org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java
+++ b/org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java
@@ -648,15 +648,17 @@ public class ProjectionDocument extends AbstractDocument {
} else if (fMapping.getImageLength() == 0 && masterEvent.getLength() == 0) {
- // there is no segment in this projection document, thus one must be created
- // need to bypass the usual infrastructure as the new segment/fragment would be of length 0 and thus the segmentation be not well formed
-
- try {
- Fragment fragment= new Fragment(0, 0);
- fMasterDocument.addPosition(fFragmentsCategory, fragment);
- createSegmentFor(fragment, 0);
- } catch (BadPositionCategoryException x) {
- internalError();
+ Position[] fragments= getFragments();
+ if (fragments.length == 0) {
+ // there is no segment in this projection document, thus one must be created
+ // need to bypass the usual infrastructure as the new segment/fragment would be of length 0 and thus the segmentation be not well formed
+ try {
+ Fragment fragment= new Fragment(0, 0);
+ fMasterDocument.addPosition(fFragmentsCategory, fragment);
+ createSegmentFor(fragment, 0);
+ } catch (BadPositionCategoryException x) {
+ internalError();
+ }
}
}
@@ -704,7 +706,7 @@ public class ProjectionDocument extends AbstractDocument {
} catch (BadLocationException e) {
internalError();
}
- } else if (ensureWellFormedSegmentation())
+ } else if (ensureWellFormedSegmentation(masterEvent.getOffset()))
fMapping.projectionChanged();
}
}
@@ -739,16 +741,28 @@ public class ProjectionDocument extends AbstractDocument {
*/
protected void updateDocumentStructures(DocumentEvent event) {
super.updateDocumentStructures(event);
- ensureWellFormedSegmentation();
+ ensureWellFormedSegmentation(computeAnchor(event));
fMapping.projectionChanged();
}
- private boolean ensureWellFormedSegmentation() {
+ private int computeAnchor(DocumentEvent event) {
+ if (event instanceof ProjectionDocumentEvent) {
+ ProjectionDocumentEvent slave= (ProjectionDocumentEvent) event;
+ if (ProjectionDocumentEvent.CONTENT_CHANGE == slave.getChangeType()) {
+ DocumentEvent master= slave.getMasterEvent();
+ if (master != null)
+ return master.getOffset();
+ }
+ }
+ return -1;
+ }
+
+ private boolean ensureWellFormedSegmentation(int anchorOffset) {
boolean changed= false;
Position[] segments= getSegments();
for (int i= 0; i < segments.length; i++) {
Segment segment= (Segment) segments[i];
- if (segment.isDeleted()) {
+ if (segment.isDeleted() || segment.getLength() == 0) {
try {
removePosition(fSegmentsCategory, segment);
fMasterDocument.removePosition(fFragmentsCategory, segment.fragment);
@@ -758,7 +772,7 @@ public class ProjectionDocument extends AbstractDocument {
}
} else if (i < segments.length - 1) {
Segment next= (Segment) segments[i + 1];
- if (next.isDeleted())
+ if (next.isDeleted() || next.getLength() == 0)
continue;
Fragment fragment= segment.fragment;
if (fragment.getOffset() + fragment.getLength() == next.fragment.getOffset()) {
@@ -769,6 +783,22 @@ public class ProjectionDocument extends AbstractDocument {
}
}
}
+
+ if (changed && anchorOffset != -1) {
+ Position[] changedSegments= getSegments();
+ if (changedSegments == null || changedSegments.length == 0) {
+ Fragment fragment= new Fragment(anchorOffset, 0);
+ try {
+ fMasterDocument.addPosition(fFragmentsCategory, fragment);
+ createSegmentFor(fragment, 0);
+ } catch (BadLocationException e) {
+ internalError();
+ } catch (BadPositionCategoryException e) {
+ internalError();
+ }
+ }
+ }
+
return changed;
}
diff --git a/org.eclipse.text/projection/org/eclipse/jface/text/projection/SegmentUpdater.java b/org.eclipse.text/projection/org/eclipse/jface/text/projection/SegmentUpdater.java
index 1142a7d6999..e73f778b7e1 100644
--- a/org.eclipse.text/projection/org/eclipse/jface/text/projection/SegmentUpdater.java
+++ b/org.eclipse.text/projection/org/eclipse/jface/text/projection/SegmentUpdater.java
@@ -74,8 +74,6 @@ class SegmentUpdater extends DefaultPositionUpdater {
if (notDeleted())
adaptToReplace();
- if (fPosition.getLength() == 0)
- fPosition.isDeleted= true;
}
} catch (BadPositionCategoryException x) {

Back to the top