/*******************************************************************************
 * Copyright (c) 2005, 2017 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.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.IRule;
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<StyleRange> ranges = new TreeSet<>((sr1, sr2) -> {
		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<IRule> 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();
	}

	@Override
	public StyleRange[] getStyleRanges(int offset, int length) {
		List<StyleRange> 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<StyleRange> iterator = ranges.tailSet(sr).iterator(); iterator.hasNext();) {
			StyleRange r = iterator.next();
			if (r.start >= offset && r.start + r.length <= offset + length)
				result.add((StyleRange) r.clone());
			else
				break;
		}

		if (result.size() > 0)
			return result.toArray(new StyleRange[result.size()]);

		sr.length = length;
		return new StyleRange[] { sr };
	}

	@Override
	public boolean isReadOnly(int offset) {
		return false;
	}
}
