Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java')
-rw-r--r--org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java781
1 files changed, 0 insertions, 781 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
deleted file mode 100644
index 7ee6a016311..00000000000
--- a/org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java
+++ /dev/null
@@ -1,781 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.text.projection;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.text.AbstractDocument;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DefaultLineTracker;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.ILineTracker;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextStore;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.Region;
-
-
-
-/**
- * A <code>ProjectionDocument</code> represents a projection of its master
- * document. The contents of a projection document is a sequence of fragments of
- * the master document, i.e. the projection document can be thought as being
- * constructed from the master document by not copying the whole master document
- * but omitting several ranges of the master document.
- * <p>
- * The projection document utilizes its master document as
- * <code>ITextStore</code>.
- * <p>
- * API in progress. Do not yet use.
- *
- * @since 3.0
- */
-public class ProjectionDocument extends AbstractDocument {
-
-
- /**
- * Prefix of the name of the position category used to keep track of the master
- * document's fragments that correspond to the segments of the projection
- * document.
- */
- private final static String FRAGMENTS_CATEGORY_PREFIX= "__fragmentsCategory"; //$NON-NLS-1$
-
- /**
- * Name of the position category used to keep track of the project
- * document's segments that correspond to the fragments of the master
- * document.
- */
- private final static String SEGMENTS_CATEGORY= "__segmentsCategory"; //$NON-NLS-1$
-
-
- /** The master document */
- private IDocument fMasterDocument;
- /** The master document as document extension */
- private IDocumentExtension fMasterDocumentExtension;
- /** The fragments' position category */
- private String fFragmentsCategory;
- /** The segment's position category */
- private String fSegmentsCategory;
- /** The document event issued by the master document */
- private DocumentEvent fMasterEvent;
- /** The document event to be issued by the projection document */
- private ProjectionDocumentEvent fSlaveEvent;
- /** The original document event generated by a direct manipulation of this projection document */
- private DocumentEvent fOriginalEvent;
- /** Indicates whether the projection document initiated a master document update or not */
- private boolean fIsUpdating= false;
- /** Indicated whether the projection document is in auto expand mode nor not */
- private boolean fIsAutoExpanding= false;
- /** The position updater for the segments */
- private SegmentUpdater fSegmentUpdater;
- /** The position updater for the fragments */
- private FragmentUpdater fFragmentsUpdater;
- /** The projection mapping */
- private ProjectionMapping fMapping;
-
- /**
- * Creates a projection document for the given master document.
- *
- * @param masterDocument the master document
- */
- public ProjectionDocument(IDocument masterDocument) {
- super();
-
- fMasterDocument= masterDocument;
- if (fMasterDocument instanceof IDocumentExtension)
- fMasterDocumentExtension= (IDocumentExtension) fMasterDocument;
-
- fSegmentsCategory= SEGMENTS_CATEGORY;
- fFragmentsCategory= FRAGMENTS_CATEGORY_PREFIX + hashCode();
- fMasterDocument.addPositionCategory(fFragmentsCategory);
- fFragmentsUpdater= new FragmentUpdater(fFragmentsCategory);
- fMasterDocument.addPositionUpdater(fFragmentsUpdater);
-
- fMapping= new ProjectionMapping(masterDocument, fFragmentsCategory, this, fSegmentsCategory);
-
- ITextStore s= new ProjectionTextStore(masterDocument, fMapping);
- ILineTracker tracker= new DefaultLineTracker();
-
- setTextStore(s);
- setLineTracker(tracker);
-
- completeInitialization();
-
- initializeProjection();
- tracker.set(s.get(0, s.getLength()));
- }
-
- /**
- * Disposes this projection document.
- */
- public void dispose() {
- fMasterDocument.removePositionUpdater(fFragmentsUpdater);
- try {
- fMasterDocument.removePositionCategory(fFragmentsCategory);
- } catch (BadPositionCategoryException x) {
- // allow multiple dispose calls
- }
- }
-
- private void internalError() {
- throw new IllegalStateException();
- }
-
- protected final Position[] getFragments() {
- try {
- return fMasterDocument.getPositions(fFragmentsCategory);
- } catch (BadPositionCategoryException e) {
- internalError();
- }
- // unreachable
- return null;
- }
-
- protected final Position[] getSegments() {
- try {
- return getPositions(fSegmentsCategory);
- } catch (BadPositionCategoryException e) {
- internalError();
- }
- // unreachable
- return null;
- }
-
- /**
- * Returns the projection mapping used by this document.
- *
- * @return the projection mapping used by this document
- */
- public ProjectionMapping getProjectionMapping(){
- return fMapping;
- }
-
- /**
- * Returns the master document of this projection document.
- *
- * @return the master document of this projection document
- */
- public IDocument getMasterDocument() {
- return fMasterDocument;
- }
-
- /**
- * Initializes the projection document from the master document based on
- * the master's fragments.
- */
- private void initializeProjection() {
-
- try {
-
- addPositionCategory(fSegmentsCategory);
- fSegmentUpdater= new SegmentUpdater(fSegmentsCategory);
- addPositionUpdater(fSegmentUpdater);
-
- int offset= 0;
- Position[] fragments= getFragments();
- for (int i= 0; i < fragments.length; i++) {
- Fragment fragment= (Fragment) fragments[i];
- Segment segment= new Segment(offset, fragment.getLength());
- segment.fragment= fragment;
- addPosition(fSegmentsCategory, segment);
- offset += fragment.length;
- }
-
- } catch (BadPositionCategoryException x) {
- internalError();
- } catch (BadLocationException x) {
- internalError();
- }
- }
-
- private Segment createSegmentFor(Fragment fragment, int index) throws BadLocationException, BadPositionCategoryException {
-
- int offset= 0;
- if (index > 0) {
- Position[] segments= getSegments();
- Segment segment= (Segment) segments[index - 1];
- offset= segment.getOffset() + segment.getLength();
- }
-
- Segment segment= new Segment(offset, 0);
- segment.fragment= fragment;
- fragment.segment= segment;
- addPosition(fSegmentsCategory, segment);
- return segment;
- }
-
- /**
- * Adds the given range of the master document to this projection document.
- *
- * @param offsetInMaster offset of the master document range
- * @param lengthInMaster length of the master document range
- * @throws BadLocationException if the given range is invalid in the master document
- */
- private void internalAddMasterDocumentRange(int offsetInMaster, int lengthInMaster) throws BadLocationException {
-
- if (lengthInMaster == 0)
- return;
-
- try {
-
- Position[] fragments= getFragments();
- int index= fMasterDocument.computeIndexInCategory(fFragmentsCategory, offsetInMaster);
-
- Fragment left= null;
- Fragment right= null;
-
- if (index < fragments.length) {
- if (offsetInMaster == fragments[index].offset)
- throw new IllegalArgumentException("overlaps with existing fragment");
- if (offsetInMaster + lengthInMaster == fragments[index].offset)
- right= (Fragment) fragments[index];
- }
-
- if (0 < index && index <= fragments.length) {
- Fragment fragment= (Fragment) fragments[index - 1];
- if (fragment.includes(offsetInMaster))
- throw new IllegalArgumentException("overlaps with existing fragment");
- if (fragment.getOffset() + fragment.getLength() == offsetInMaster)
- left= fragment;
- }
-
- int offsetInSlave= 0;
- if (index > 0) {
- Fragment fragment= (Fragment) fragments[index - 1];
- Segment segment= fragment.segment;
- offsetInSlave= segment.getOffset() + segment.getLength();
- }
-
- ProjectionDocumentEvent event= new ProjectionDocumentEvent(this, offsetInSlave, 0, fMasterDocument.get(offsetInMaster, lengthInMaster), offsetInMaster, lengthInMaster);
- super.fireDocumentAboutToBeChanged(event);
-
- // check for neighboring fragment
- if (left != null && right != null) {
-
- int endOffset= right.getOffset() + right.getLength();
- left.setLength(endOffset - left.getOffset());
- left.segment.setLength(left.segment.getLength() + right.segment.getLength());
-
- removePosition(fSegmentsCategory, right.segment);
- fMasterDocument.removePosition(fFragmentsCategory, right);
-
- } else if (left != null) {
- int endOffset= offsetInMaster +lengthInMaster;
- left.setLength(endOffset - left.getOffset());
- left.segment.markForStretch();
-
- } else if (right != null) {
- right.setOffset(right.getOffset() - lengthInMaster);
- right.setLength(right.getLength() + lengthInMaster);
- right.segment.markForStretch();
-
- } else {
- // create a new segment
- Fragment fragment= new Fragment(offsetInMaster, lengthInMaster);
- fMasterDocument.addPosition(fFragmentsCategory, fragment);
- Segment segment= createSegmentFor(fragment, index);
- segment.markForStretch();
- }
-
- getTracker().replace(event.getOffset(), event.getLength(), event.getText());
- super.fireDocumentChanged(event);
-
- } catch (BadPositionCategoryException x) {
- internalError();
- }
- }
-
- /**
- * Finds the fragment of the master document that represents the given range.
- *
- * @param offsetInMaster the offset of the range in the master document
- * @param lengthInMaster the length of the range in the master document
- * @return the fragment representing the given master document range
- */
- private Fragment findFragment(int offsetInMaster, int lengthInMaster) {
- Position[] fragments= getFragments();
- for (int i= 0; i < fragments.length; i++) {
- Fragment f= (Fragment) fragments[i];
- if (f.getOffset() <= offsetInMaster && offsetInMaster + lengthInMaster <= f.getOffset() + f.getLength())
- return f;
- }
- return null;
- }
-
- /**
- * Removes the given range of the master document from this projection
- * document.
- *
- * @param offsetInMaster the offset of the range in the master document
- * @param lengthInMaster the length of the range in the master document
- *
- * @throws BadLocationException if the given range is not valid in the
- * master document
- * @throws IllegalArgumentException if the given range is not projected in
- * this projection document or is not completely comprised by
- * an existing fragment
- */
- private void internalRemoveMasterDocumentRange(int offsetInMaster, int lengthInMaster) throws BadLocationException {
- try {
-
- IRegion imageRegion= fMapping.toExactImageRegion(new Region(offsetInMaster, lengthInMaster));
- if (imageRegion == null)
- throw new IllegalArgumentException();
-
- Fragment fragment= findFragment(offsetInMaster, lengthInMaster);
- if (fragment == null)
- throw new IllegalArgumentException();
-
- ProjectionDocumentEvent event= new ProjectionDocumentEvent(this, imageRegion.getOffset(), imageRegion.getLength(), null, offsetInMaster, lengthInMaster);
- super.fireDocumentAboutToBeChanged(event);
-
- if (fragment.getOffset() == offsetInMaster) {
- fragment.setOffset(offsetInMaster + lengthInMaster);
- fragment.setLength(fragment.getLength() - lengthInMaster);
- } else if (fragment.getOffset() + fragment.getLength() == offsetInMaster + lengthInMaster) {
- fragment.setLength(fragment.getLength() - lengthInMaster);
- } else {
- // split fragment into three fragments, let position updater remove it
-
- // add fragment for the region to be removed
- Fragment newFragment= new Fragment(offsetInMaster, lengthInMaster);
- Segment segment= new Segment(imageRegion.getOffset(), imageRegion.getLength());
- newFragment.segment= segment;
- segment.fragment= newFragment;
- fMasterDocument.addPosition(fFragmentsCategory, newFragment);
- addPosition(fSegmentsCategory, segment);
-
- // add fragment for the remainder right of the deleted range in the original fragment
- int offset= offsetInMaster + lengthInMaster;
- newFragment= new Fragment(offset, fragment.getOffset() + fragment.getLength() - offset);
- offset= imageRegion.getOffset() + imageRegion.getLength();
- segment= new Segment(offset, fragment.segment.getOffset() + fragment.segment.getLength() - offset);
- newFragment.segment= segment;
- segment.fragment= newFragment;
- fMasterDocument.addPosition(fFragmentsCategory, newFragment);
- addPosition(fSegmentsCategory, segment);
-
- // adjust length of initial fragment (the left one)
- fragment.setLength(offsetInMaster - fragment.getOffset());
- fragment.segment.setLength(imageRegion.getOffset() - fragment.segment.getOffset());
- }
-
- getTracker().replace(event.getOffset(), event.getLength(), event.getText());
- super.fireDocumentChanged(event);
-
- } catch (BadPositionCategoryException x) {
- internalError();
- }
- }
-
- private IRegion[] computeUnprojectedMasterRegions(int offsetInMaster, int lengthInMaster) throws BadLocationException {
-
- IRegion[] fragments= null;
- IRegion imageRegion= fMapping.toImageRegion(new Region(offsetInMaster, lengthInMaster));
- if (imageRegion != null)
- fragments= fMapping.toExactOriginRegions(imageRegion);
-
- if (fragments == null || fragments.length == 0)
- return new IRegion[] { new Region(offsetInMaster, lengthInMaster) };
-
- List gaps= new ArrayList();
-
- IRegion region= fragments[0];
- if (offsetInMaster < region.getOffset())
- gaps.add(new Region(offsetInMaster, region.getOffset() - offsetInMaster));
-
- for (int i= 0; i < fragments.length - 1; i++) {
- IRegion left= fragments[i];
- IRegion right= fragments[i + 1];
- int leftEnd= left.getOffset() + left.getLength();
- if (leftEnd < right.getOffset())
- gaps.add(new Region(leftEnd, right.getOffset() - leftEnd));
- }
-
- region= fragments[fragments.length - 1];
- int leftEnd= region.getOffset() + region.getLength();
- int rightEnd= offsetInMaster + lengthInMaster;
- if (leftEnd < rightEnd)
- gaps.add(new Region(leftEnd, rightEnd - leftEnd));
-
- IRegion[] result= new IRegion[gaps.size()];
- gaps.toArray(result);
- return result;
- }
-
- /**
- * Ensures that the given range of the master document is part of this
- * projection document.
- *
- * @param offsetInMaster the offset of the master document range
- * @param lengthInMaster the length of the master document range
- */
- public void addMasterDocumentRange(int offsetInMaster, int lengthInMaster) throws BadLocationException {
-
- IRegion[] gaps= computeUnprojectedMasterRegions(offsetInMaster, lengthInMaster);
- if (gaps == null)
- return;
-
- for (int i= 0; i < gaps.length; i++) {
- IRegion gap= gaps[i];
- internalAddMasterDocumentRange(gap.getOffset(), gap.getLength());
- }
- }
-
- /**
- * Ensures that the given range of the master document is not part of this
- * projection document.
- *
- * @param offsetInMaster the offset of the master document range
- * @param lengthInMaster the length of the master document range
- */
- public void removeMasterDocumentRange(int offsetInMaster, int lengthInMaster) throws BadLocationException {
-
- IRegion[] fragments= null;
- IRegion imageRegion= fMapping.toImageRegion(new Region(offsetInMaster, lengthInMaster));
- if (imageRegion != null)
- fragments= fMapping.toExactOriginRegions(imageRegion);
-
- if (fragments == null || fragments.length == 0)
- return;
-
- for (int i= 0; i < fragments.length; i++) {
- IRegion fragment= fragments[i];
- internalRemoveMasterDocumentRange(fragment.getOffset(), fragment.getLength());
- }
- }
-
- /**
- * Returns whether this project is being updated.
- *
- * @return <code>true</code> if the document is updating
- */
- protected boolean isUpdating() {
- return fIsUpdating;
- }
-
- /*
- * @see org.eclipse.jface.text.IDocument#replace(int, int, java.lang.String)
- */
- public void replace(int offset, int length, String text) throws BadLocationException {
- try {
- fIsUpdating= true;
- if (fMasterDocumentExtension != null)
- fMasterDocumentExtension.stopPostNotificationProcessing();
-
- super.replace(offset, length, text);
-
- } finally {
- fIsUpdating= false;
- if (fMasterDocumentExtension != null)
- fMasterDocumentExtension.resumePostNotificationProcessing();
- }
- }
-
- /*
- * @see org.eclipse.jface.text.IDocument#set(java.lang.String)
- */
- public void set(String text) {
- try {
- fIsUpdating= true;
- if (fMasterDocumentExtension != null)
- fMasterDocumentExtension.stopPostNotificationProcessing();
-
- super.set(text);
-
- } finally {
- fIsUpdating= false;
- if (fMasterDocumentExtension != null)
- fMasterDocumentExtension.resumePostNotificationProcessing();
- }
- }
-
- /**
- * Transforms a document event of the master document into a projection
- * document based document event.
- *
- * @param masterEvent the master document event
- * @return the slave document event
- */
- private ProjectionDocumentEvent normalize(DocumentEvent masterEvent) throws BadLocationException {
- if (!isUpdating()) {
- IRegion imageRegion= fMapping.toExactImageRegion(new Region(masterEvent.getOffset(), masterEvent.getLength()));
- if (imageRegion != null)
- return new ProjectionDocumentEvent(this, imageRegion.getOffset(), imageRegion.getLength(), masterEvent.getText(), masterEvent);
- return null;
- } else {
- ProjectionDocumentEvent event= new ProjectionDocumentEvent(this, fOriginalEvent.getOffset(), fOriginalEvent.getLength(), fOriginalEvent.getText(), masterEvent);
- fOriginalEvent= null;
- return event;
- }
- }
-
- private boolean includes(IRegion region, int offset) {
- if (region == null)
- return false;
- return region.getOffset() <= offset && offset <= region.getOffset() + region.getLength();
- }
-
- private boolean includes(IRegion region1, int offset, int length) {
- if (region1 == null)
- return false;
- return region1.getOffset() <= offset && (offset + length <= region1.getOffset() + region1.getLength());
- }
-
- /**
- * Compute the gaps that must be covered in order to ensure that the range affected
- * by the given document event is completely projected.
- *
- * @param event the master document event
- * @return the gaps to be covered
- */
- private IRegion[] computeCoverageGap(DocumentEvent event) {
-
- IRegion left= null;
- List gaps= new ArrayList();
-
- try {
- // deal with the beginning of the event region
- int imageOffset= fMapping.toImageOffset(event.getOffset());
- if (imageOffset == -1) {
- Position[] fragments= getFragments();
- int index= fMasterDocument.computeIndexInCategory(fFragmentsCategory, event.getOffset());
- if (index < fragments.length) {
- Fragment fragment= (Fragment) fragments[index];
- left= new Region(event.getOffset(), fragment.getOffset() - event.getOffset());
- gaps.add(left);
- }
- }
-
- // the event itself
- if (!includes(left, event.getOffset(), event.getLength()))
- gaps.add(new Region(event.getOffset(), event.getLength()));
-
- // deal with the end of the event region
- int inclusiveOriginEndOffset= event.getOffset() + Math.max(0, event.getLength() - 1);
- int inclusiveImageEndOffset= fMapping.toImageOffset(inclusiveOriginEndOffset);
- if (inclusiveImageEndOffset == -1 && !includes(left, inclusiveOriginEndOffset)) {
- int index= fMasterDocument.computeIndexInCategory(fFragmentsCategory, inclusiveOriginEndOffset);
- if (0 < index) {
- Position[] fragments= getFragments();
- Fragment fragment= (Fragment) fragments[index - 1];
- gaps.add(new Region(fragment.getOffset(), inclusiveOriginEndOffset + 1 - fragment.getOffset()));
- }
- }
-
- } catch (BadLocationException e) {
- internalError();
- } catch (BadPositionCategoryException e) {
- internalError();
- }
-
- IRegion[] result= new IRegion[gaps.size()];
- gaps.toArray(result);
- return result;
- }
-
- /**
- * Ensures that when the master event effects this projection document, that the whole region described by the
- * event is part of this projection document.
- *
- * @param masterEvent the master document event
- * @return <code>true</code> if masterEvent affects this projection document
- * @throws BadLocationException in case the master event is not valid
- */
- protected final boolean adaptProjectionToMasterChange(DocumentEvent masterEvent) throws BadLocationException {
- if (!isUpdating() && fFragmentsUpdater.affectsPositions(masterEvent) || fIsAutoExpanding) {
-
- IRegion[] gaps= computeCoverageGap(masterEvent);
- for (int i= 0; i < gaps.length; i++) {
- IRegion gap= gaps[i];
- addMasterDocumentRange(gap.getOffset(), gap.getLength());
- }
- return true;
-
- } 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();
- }
- }
-
- return isUpdating();
- }
-
- /**
- * When called, this projection document is informed about a forthcoming
- * change of its master document. This projection document checks whether
- * the master document change affects it and if so informs all document
- * listeners.
- *
- * @param masterEvent the master document event
- */
- public void masterDocumentAboutToBeChanged(DocumentEvent masterEvent) {
- try {
-
- boolean assertNotNull= adaptProjectionToMasterChange(masterEvent);
- fSlaveEvent= normalize(masterEvent);
- if (assertNotNull && fSlaveEvent == null)
- internalError();
-
- fMasterEvent= masterEvent;
- if (fSlaveEvent != null)
- delayedFireDocumentAboutToBeChanged();
-
- } catch (BadLocationException e) {
- internalError();
- }
- }
-
- /**
- * When called, this projection document is informed about a change of its
- * master document. If this projection document is affected it informs all
- * of its document listeners.
- *
- * @param masterEvent the master document event
- */
- public void masterDocumentChanged(DocumentEvent masterEvent) {
- if ( !isUpdating() && masterEvent == fMasterEvent) {
- if (fSlaveEvent != null) {
- try {
- getTracker().replace(fSlaveEvent.getOffset(), fSlaveEvent.getLength(), fSlaveEvent.getText());
- fireDocumentChanged(fSlaveEvent);
- } catch (BadLocationException e) {
- internalError();
- }
- } else {
- ensureWellFormedSegmentation();
- }
- }
- }
-
- /*
- * @see org.eclipse.jface.text.AbstractDocument#fireDocumentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
- */
- protected void fireDocumentAboutToBeChanged(DocumentEvent event) {
- fOriginalEvent= event;
- // delay it until there is a notification from the master document
- // at this point, it is expensive to construct the master document information
- }
-
- /**
- * Fires the slave document event as about-to-be-changed event to all registered listeners.
- */
- private void delayedFireDocumentAboutToBeChanged() {
- super.fireDocumentAboutToBeChanged(fSlaveEvent);
- }
-
- /**
- * Ignores the given event and sends the semantically equal slave document event instead.
- *
- * @param event the event to be ignored
- */
- protected void fireDocumentChanged(DocumentEvent event) {
- super.fireDocumentChanged(fSlaveEvent);
- }
-
- /*
- * @see org.eclipse.jface.text.AbstractDocument#updateDocumentStructures(org.eclipse.jface.text.DocumentEvent)
- */
- protected void updateDocumentStructures(DocumentEvent event) {
- super.updateDocumentStructures(event);
- ensureWellFormedSegmentation();
- }
-
- private void ensureWellFormedSegmentation() {
- Position[] segments= getSegments();
- for (int i= 0; i < segments.length; i++) {
- Segment segment= (Segment) segments[i];
- if (segment.isDeleted()) {
- try {
- removePosition(fSegmentsCategory, segment);
- fMasterDocument.removePosition(fFragmentsCategory, segment.fragment);
- } catch (BadPositionCategoryException e) {
- internalError();
- }
- } else if (i < segments.length - 1) {
- Segment next= (Segment) segments[i + 1];
- if (next.isDeleted())
- continue;
- Fragment fragment= segment.fragment;
- if (fragment.getOffset() + fragment.getLength() == next.fragment.getOffset()) {
- // join fragments and their corresponding segments
- segment.setLength(segment.getLength() + next.getLength());
- fragment.setLength(fragment.getLength() + next.fragment.getLength());
- next.delete();
- }
- }
- }
- }
-
- /*
- * @see IDocumentExtension#registerPostNotificationReplace(IDocumentListener, IDocumentExtension.IReplace)
- */
- public void registerPostNotificationReplace(IDocumentListener owner, IDocumentExtension.IReplace replace) {
- if (!isUpdating())
- throw new UnsupportedOperationException();
- super.registerPostNotificationReplace(owner, replace);
- }
-
- /**
- * Sets the auto expand mode for this document.
- */
- public void setAutoExpandMode(boolean autoExpandMode) {
- fIsAutoExpanding= autoExpandMode;
- }
-
- /**
- * Replaces all master document ranges with the given master document range.
- *
- * @param offsetInMaster the offset in the master document
- * @param lengthInMaster the length in the master document
- * @throws BadLocationException if the given range of the master document is not valid
- */
- public void replaceMasterDocumentRanges(int offsetInMaster, int lengthInMaster) throws BadLocationException {
- try {
-
- ProjectionDocumentEvent event= new ProjectionDocumentEvent(this, 0, fMapping.getImageLength(), fMasterDocument.get(offsetInMaster, lengthInMaster), offsetInMaster, lengthInMaster);
- super.fireDocumentAboutToBeChanged(event);
-
- Position[] fragments= getFragments();
- for (int i= 0; i < fragments.length; i++) {
- Fragment fragment= (Fragment) fragments[i];
- fMasterDocument.removePosition(fFragmentsCategory, fragment);
- removePosition(fSegmentsCategory, fragment.segment);
- }
-
- Fragment fragment= new Fragment(offsetInMaster, lengthInMaster);
- Segment segment= new Segment(0, 0);
- segment.fragment= fragment;
- fragment.segment= segment;
- fMasterDocument.addPosition(fFragmentsCategory, fragment);
- addPosition(fSegmentsCategory, segment);
-
- getTracker().set(fMasterDocument.get(offsetInMaster, lengthInMaster));
- super.fireDocumentChanged(event);
-
- } catch (BadPositionCategoryException x) {
- internalError();
- }
- }
-}

Back to the top