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