/******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.eclipse.dltk.console.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import org.eclipse.jface.text.rules.FastPartitioner; import org.eclipse.jface.text.rules.IPredicateRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.MultiLineRule; import org.eclipse.jface.text.rules.RuleBasedPartitionScanner; import org.eclipse.jface.text.rules.Token; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.ui.console.IConsoleDocumentPartitioner; public class ScriptConsolePartitioner extends FastPartitioner implements IConsoleDocumentPartitioner { private SortedSet ranges = new TreeSet(new Comparator() { public int compare(Object o1, Object o2) { StyleRange sr1 = (StyleRange) o1; StyleRange sr2 = (StyleRange) o2; int start = sr1.start - sr2.start; if (start == 0) { return sr1.length - sr2.length; } return start; } }); private static class Constants { public static final String MY_DOUBLE_QUOTED = "__my_double"; //$NON-NLS-1$ public static final String MY_SINGLE_QUOTED = "__my_single"; //$NON-NLS-1$ } private static class MyPartitionScanner extends RuleBasedPartitionScanner { public MyPartitionScanner() { IToken myDouble = new Token(Constants.MY_DOUBLE_QUOTED); IToken mySingle = new Token(Constants.MY_SINGLE_QUOTED); List rules = new ArrayList(); rules.add(new MultiLineRule("\'", "\'", mySingle, '\\')); //$NON-NLS-1$ //$NON-NLS-2$ rules.add(new MultiLineRule("\"", "\"", myDouble, '\\')); //$NON-NLS-1$ //$NON-NLS-2$ IPredicateRule[] result = new IPredicateRule[rules.size()]; rules.toArray(result); setPredicateRules(result); } } public ScriptConsolePartitioner() { super(new MyPartitionScanner(), new String[] { Constants.MY_DOUBLE_QUOTED, Constants.MY_SINGLE_QUOTED }); } public void addRange(StyleRange r) { ranges.add(r); } public void addRanges(StyleRange[] r) { ranges.addAll(Arrays.asList(r)); } public void clearRanges() { ranges.clear(); } public StyleRange[] getStyleRanges(int offset, int length) { List result = new ArrayList(); // get the sublist with length = 0 so that it will return all with that // offset. StyleRange sr = new StyleRange(offset, 0, null, null, SWT.NO); for (Iterator iterator = ranges.tailSet(sr).iterator(); iterator .hasNext();) { StyleRange r = (StyleRange) iterator.next(); if (r.start >= offset && r.start + r.length <= offset + length) result.add((StyleRange) r.clone()); else break; } if (result.size() > 0) return (StyleRange[]) result.toArray(new StyleRange[result.size()]); sr.length = length; return new StyleRange[] { sr }; } public boolean isReadOnly(int offset) { return false; } }