001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 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.ui.examples.templateeditor.editors;
011:
012: import org.eclipse.jface.text.BadLocationException;
013: import org.eclipse.jface.text.DocumentEvent;
014: import org.eclipse.jface.text.IDocument;
015: import org.eclipse.jface.text.IRegion;
016: import org.eclipse.jface.text.ITypedRegion;
017: import org.eclipse.jface.text.Region;
018: import org.eclipse.jface.text.TextAttribute;
019: import org.eclipse.jface.text.TextPresentation;
020: import org.eclipse.jface.text.presentation.IPresentationDamager;
021: import org.eclipse.jface.text.presentation.IPresentationRepairer;
022: import org.eclipse.swt.custom.StyleRange;
023:
024: import org.eclipse.core.runtime.Assert;
025:
026: public class NonRuleBasedDamagerRepairer implements
027: IPresentationDamager, IPresentationRepairer {
028:
029: /** The document this object works on */
030: protected IDocument fDocument;
031: /** The default text attribute if non is returned as data by the current token */
032: protected TextAttribute fDefaultTextAttribute;
033:
034: /**
035: * Creates a new damager/repairer.
036: *
037: * @param defaultTextAttribute the default text attribute for all detected regions
038: */
039: public NonRuleBasedDamagerRepairer(
040: TextAttribute defaultTextAttribute) {
041: Assert.isNotNull(defaultTextAttribute);
042: fDefaultTextAttribute = defaultTextAttribute;
043: }
044:
045: /*
046: * @see org.eclipse.jface.text.presentation.IPresentationRepairer#setDocument(org.eclipse.jface.text.IDocument)
047: */
048: public void setDocument(IDocument document) {
049: fDocument = document;
050: }
051:
052: /**
053: * Returns the end offset of the line that contains the specified offset or
054: * if the offset is inside a line delimiter, the end offset of the next
055: * line.
056: *
057: * @param offset the offset whose line end offset must be computed
058: * @return the line end offset for the given offset
059: * @exception BadLocationException if offset is invalid in the current document
060: */
061: protected int endOfLineOf(int offset) throws BadLocationException {
062:
063: IRegion info = fDocument.getLineInformationOfOffset(offset);
064: if (offset <= info.getOffset() + info.getLength())
065: return info.getOffset() + info.getLength();
066:
067: int line = fDocument.getLineOfOffset(offset);
068: try {
069: info = fDocument.getLineInformation(line + 1);
070: return info.getOffset() + info.getLength();
071: } catch (BadLocationException x) {
072: return fDocument.getLength();
073: }
074: }
075:
076: /*
077: * @see org.eclipse.jface.text.presentation.IPresentationDamager#getDamageRegion(org.eclipse.jface.text.ITypedRegion, org.eclipse.jface.text.DocumentEvent, boolean)
078: */
079: public IRegion getDamageRegion(ITypedRegion partition,
080: DocumentEvent event, boolean documentPartitioningChanged) {
081: if (!documentPartitioningChanged) {
082: try {
083:
084: IRegion info = fDocument
085: .getLineInformationOfOffset(event.getOffset());
086: int start = Math.max(partition.getOffset(), info
087: .getOffset());
088: int end = event.getOffset()
089: + (event.getText() == null ? event.getLength()
090: : event.getText().length());
091:
092: if (info.getOffset() <= end
093: && end <= info.getOffset() + info.getLength()) {
094: // optimize the case of the same line
095: end = info.getOffset() + info.getLength();
096: } else
097: end = endOfLineOf(end);
098:
099: end = Math.min(partition.getOffset()
100: + partition.getLength(), end);
101: return new Region(start, end - start);
102:
103: } catch (BadLocationException x) {
104: }
105: }
106:
107: return partition;
108: }
109:
110: /*
111: * @see org.eclipse.jface.text.presentation.IPresentationRepairer#createPresentation(org.eclipse.jface.text.TextPresentation, org.eclipse.jface.text.ITypedRegion)
112: */
113: public void createPresentation(TextPresentation presentation,
114: ITypedRegion region) {
115: addRange(presentation, region.getOffset(), region.getLength(),
116: fDefaultTextAttribute);
117: }
118:
119: /**
120: * Adds style information to the given text presentation.
121: *
122: * @param presentation the text presentation to be extended
123: * @param offset the offset of the range to be styled
124: * @param length the length of the range to be styled
125: * @param attr the attribute describing the style of the range to be styled
126: */
127: protected void addRange(TextPresentation presentation, int offset,
128: int length, TextAttribute attr) {
129: if (attr != null)
130: presentation.addStyleRange(new StyleRange(offset, length,
131: attr.getForeground(), attr.getBackground(), attr
132: .getStyle()));
133: }
134: }
|