/* * Copyright (C) 2003-2007 Kepler Project. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.keplerproject.ldt.ui.editors; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.TextPresentation; import org.eclipse.jface.text.presentation.IPresentationDamager; import org.eclipse.jface.text.presentation.IPresentationRepairer; import org.eclipse.jface.util.Assert; import org.eclipse.swt.custom.StyleRange; /** * A partition Based DemagerRepairer. * Used to highlight a complete partition. * @author guilherme Martins * @version $id$ */ public class NonRuleBasedDamagerRepairer implements IPresentationDamager, IPresentationRepairer { /** The document this object works on */ protected IDocument fDocument; /** The default text attribute if non is returned as data by the current token */ protected TextAttribute fDefaultTextAttribute; /** * Constructor for NonRuleBasedDamagerRepairer. */ public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute) { Assert.isNotNull(defaultTextAttribute); fDefaultTextAttribute = defaultTextAttribute; } /** * @see IPresentationRepairer#setDocument(IDocument) */ public void setDocument(IDocument document) { fDocument = document; } /** * Returns the end offset of the line that contains the specified offset or * if the offset is inside a line delimiter, the end offset of the next line. * * @param offset the offset whose line end offset must be computed * @return the line end offset for the given offset * @exception BadLocationException if offset is invalid in the current document */ protected int endOfLineOf(int offset) throws BadLocationException { IRegion info = fDocument.getLineInformationOfOffset(offset); if (offset <= info.getOffset() + info.getLength()) return info.getOffset() + info.getLength(); int line = fDocument.getLineOfOffset(offset); try { info = fDocument.getLineInformation(line + 1); return info.getOffset() + info.getLength(); } catch (BadLocationException x) { return fDocument.getLength(); } } /** * @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean) */ public IRegion getDamageRegion( ITypedRegion partition, DocumentEvent event, boolean documentPartitioningChanged) { if (!documentPartitioningChanged) { try { IRegion info = fDocument.getLineInformationOfOffset(event.getOffset()); int start = Math.max(partition.getOffset(), info.getOffset()); int end = event.getOffset() + (event.getText() == null ? event.getLength() : event.getText().length()); if (info.getOffset() <= end && end <= info.getOffset() + info.getLength()) { // optimize the case of the same line end = info.getOffset() + info.getLength(); } else end = endOfLineOf(end); end = Math.min( partition.getOffset() + partition.getLength(), end); return new Region(start, end - start); } catch (BadLocationException x) { } } return partition; } /** * @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion) */ public void createPresentation( TextPresentation presentation, ITypedRegion region) { addRange( presentation, region.getOffset(), region.getLength(), fDefaultTextAttribute); } /** * Adds style information to the given text presentation. * * @param presentation the text presentation to be extended * @param offset the offset of the range to be styled * @param length the length of the range to be styled * @param attr the attribute describing the style of the range to be styled */ protected void addRange( TextPresentation presentation, int offset, int length, TextAttribute attr) { if (attr != null) presentation.addStyleRange( new StyleRange( offset, length, attr.getForeground(), attr.getBackground(), attr.getStyle())); } }