001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.text.template.contentassist;
011:
012: import org.eclipse.jface.text.BadPositionCategoryException;
013: import org.eclipse.jface.text.DocumentEvent;
014: import org.eclipse.jface.text.IPositionUpdater;
015: import org.eclipse.jface.text.Position;
016:
017: /**
018: * Position updater that takes any change in [position.offset, position.offset + position.length] as
019: * belonging to the position.
020: *
021: * @since 3.0
022: */
023: class InclusivePositionUpdater implements IPositionUpdater {
024:
025: /** The position category. */
026: private final String fCategory;
027:
028: /**
029: * Creates a new updater for the given <code>category</code>.
030: *
031: * @param category the new category.
032: */
033: public InclusivePositionUpdater(String category) {
034: fCategory = category;
035: }
036:
037: /*
038: * @see org.eclipse.jface.text.IPositionUpdater#update(org.eclipse.jface.text.DocumentEvent)
039: */
040: public void update(DocumentEvent event) {
041:
042: int eventOffset = event.getOffset();
043: int eventOldLength = event.getLength();
044: int eventNewLength = event.getText() == null ? 0 : event
045: .getText().length();
046: int deltaLength = eventNewLength - eventOldLength;
047:
048: try {
049: Position[] positions = event.getDocument().getPositions(
050: fCategory);
051:
052: for (int i = 0; i != positions.length; i++) {
053:
054: Position position = positions[i];
055:
056: if (position.isDeleted())
057: continue;
058:
059: int offset = position.getOffset();
060: int length = position.getLength();
061: int end = offset + length;
062:
063: if (offset > eventOffset + eventOldLength)
064: // position comes way
065: // after change - shift
066: position.setOffset(offset + deltaLength);
067: else if (end < eventOffset) {
068: // position comes way before change -
069: // leave alone
070: } else if (offset <= eventOffset
071: && end >= eventOffset + eventOldLength) {
072: // event completely internal to the position - adjust length
073: position.setLength(length + deltaLength);
074: } else if (offset < eventOffset) {
075: // event extends over end of position - adjust length
076: int newEnd = eventOffset + eventNewLength;
077: position.setLength(newEnd - offset);
078: } else if (end > eventOffset + eventOldLength) {
079: // event extends from before position into it - adjust offset
080: // and length
081: // offset becomes end of event, length ajusted acordingly
082: // we want to recycle the overlapping part
083: position.setOffset(eventOffset);
084: int deleted = eventOffset + eventOldLength - offset;
085: position.setLength(length - deleted
086: + eventNewLength);
087: } else {
088: // event consumes the position - delete it
089: position.delete();
090: }
091: }
092: } catch (BadPositionCategoryException e) {
093: // ignore and return
094: }
095: }
096:
097: /**
098: * Returns the position category.
099: *
100: * @return the position category
101: */
102: public String getCategory() {
103: return fCategory;
104: }
105:
106: }
|