/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.eclipse.editors;
import java.util.Stack;
import org.drools.eclipse.DroolsEclipsePlugin;
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;
public final class DroolsPairMatcher implements ICharacterPairMatcher {
private int anchor;
private static final char[] leftChars = new char[] { '(', '{', '[' };
private static final char[] rightChars = new char[] { ')', '}', ']' };
public IRegion match(IDocument document, int offset) {
if (offset <= 0) {
return null;
}
try {
char c = document.getChar(offset - 1);
for (int i = 0; i < rightChars.length; i++) {
if (c == rightChars[i]) {
return searchLeft(document, offset, rightChars[i], leftChars[i]);
}
if (c == leftChars[i]) {
return searchRight(document, offset, rightChars[i], leftChars[i]);
}
}
} catch (BadLocationException e) {
DroolsEclipsePlugin.log(e);
}
return null;
}
private IRegion searchRight(IDocument document, int offset, char rightChar, char leftChar) throws BadLocationException {
Stack stack = new Stack();
anchor = ICharacterPairMatcher.LEFT;
char[] chars = document.get(offset, document.getLength() - offset).toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == leftChar) {
stack.push(new Character(chars[i]));
continue;
}
if (chars[i] == rightChar) {
if (stack.isEmpty()) {
return new Region(offset - 1, i + 2);
} else {
stack.pop();
}
}
}
return null;
}
private IRegion searchLeft(IDocument document, int offset, char rightChar, char leftChar)
throws BadLocationException {
Stack stack = new Stack();
anchor = ICharacterPairMatcher.RIGHT;
char[] chars = document.get(0, offset - 1).toCharArray();
for (int i = chars.length - 1; i >= 0; i--) {
if (chars[i] == rightChar) {
stack.push(new Character(chars[i]));
continue;
}
if (chars[i] == leftChar) {
if (stack.isEmpty()) {
return new Region(i, offset - i);
} else {
stack.pop();
}
}
}
return null;
}
public int getAnchor() {
return anchor;
}
public void dispose() {
}
public void clear() {
}
}