X-Git-Url: http://secure.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.css.ui/src/net/sourceforge/phpeclipse/css/ui/internal/text/CssPairMatcher.java b/archive/net.sourceforge.phpeclipse.css.ui/src/net/sourceforge/phpeclipse/css/ui/internal/text/CssPairMatcher.java new file mode 100644 index 0000000..b308117 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.css.ui/src/net/sourceforge/phpeclipse/css/ui/internal/text/CssPairMatcher.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2003-2004 Christopher Lenz 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: + * Christopher Lenz - initial API and implementation + * + * $Id: CssPairMatcher.java,v 1.1 2004-09-02 18:11:48 jsurfer Exp $ + */ + +package net.sourceforge.phpeclipse.css.ui.internal.text; + +import net.sourceforge.phpeclipse.css.core.internal.text.CssTextUtils; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.source.ICharacterPairMatcher; +import org.eclipse.jface.util.Assert; + +/** + * + */ +public class CssPairMatcher implements ICharacterPairMatcher { + + // Constants --------------------------------------------------------------- + + private static final char PAIRS[] = { + '{', '}', '(', ')', '[', ']' + }; + + // Instance Variables ------------------------------------------------------ + + private IDocument document; + + private int offset; + + private int anchor; + + // ICharacterPairMatcher Implementation ------------------------------------ + + /* + * @see ICharacterPairMatcher#clear + */ + public void clear() { + document = null; + offset = -1; + anchor = 0; + } + + /* + * @see ICharacterPairMatcher#dispose + */ + public void dispose() { + document = null; + } + + /* + * @see ICharacterPairMatcher#match + */ + public IRegion match(IDocument document, int offset) { + Assert.isNotNull(document); + Assert.isLegal(offset >= 0); + this.document = document; + this.offset = offset; + + IRegion retVal = null; + try { + retVal = matchPairsAt(); + } catch (BadLocationException e) { + // ignore, there's probably no matching character to highlight + } + return retVal; + } + + /* + * @see ICharacterPairMatcher#getAnchor + */ + public int getAnchor() { + return anchor; + } + + // Private Methods --------------------------------------------------------- + + private boolean isClosingCharacter(char ch) { + for (int i = 1; i < PAIRS.length; i += 2) { + if (ch == PAIRS[i]) { + return true; + } + } + return false; + } + + private boolean isOpeningCharacter(char ch) { + for (int i = 0; i < PAIRS.length; i += 2) { + if (ch == PAIRS[i]) { + return true; + } + } + return false; + } + + private IRegion matchPairsAt() throws BadLocationException { + int startPos = -1, endPos = -1; + char prevChar = document.getChar(Math.max(offset - 1, 0)); + if (isOpeningCharacter(prevChar)) { + startPos = offset - 1; + if (startPos >= 0) { + anchor = LEFT; + endPos = CssTextUtils.findMatchingClosingPeer( + document, startPos + 1, prevChar); + if (endPos > -1) { + return new Region(startPos, endPos - startPos + 1); + } + } + } + if (isClosingCharacter(prevChar)) { + endPos = offset - 1; + if (endPos >= 0) { + anchor = RIGHT; + startPos = CssTextUtils.findMatchingOpeningPeer( + document, endPos - 1, prevChar); + if (startPos > -1) { + return new Region(startPos, endPos - startPos + 1); + } + } + } + return null; + } + +}