/*******************************************************************************
 * Copyright (c) 2012 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
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.text.source;

import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;

/**
 * Extension interface for {@link org.eclipse.jface.text.source.ICharacterPairMatcher}.
 * <p>
 * Extends the character pair matcher with the concept of matching peer character and enclosing peer
 * characters for a given selection.
 *
 * @see org.eclipse.jface.text.source.ICharacterPairMatcher
 * @since 3.8
 */
public interface ICharacterPairMatcherExtension {

	/**
	 * Starting at the given offset (i.e. length 0) or the selected character, the matcher searches
	 * for the matching peer character and if it finds one, returns the minimal region of the
	 * document that contains both characters.
	 *
	 * @param document the document to work on
	 * @param offset the start offset
	 * @param length the selection length which can be negative indicating right-to-left selection
	 * @return the minimal region containing the peer characters or <code>null</code> if there is no
	 *         peer character
	 */
	IRegion match(IDocument document, int offset, int length);


	/**
	 * Starting at the given selection, the matcher searches for a pair of enclosing peer characters
	 * and if it finds one, returns the minimal region of the document that contains the pair.
	 *
	 * @param document the document to work on
	 * @param offset the start offset
	 * @param length the selection length which can be negative indicating right-to-left selection
	 * @return the minimal region containing the peer characters or <code>null</code> if there is no
	 *         enclosing pair
	 */
	IRegion findEnclosingPeerCharacters(IDocument document, int offset, int length);

	/**
	 * Checks whether the character is one of the characters matched by the pair matcher.
	 *
	 * @param ch the character
	 * @return <code>true</code> if the the character is one of the characters matched by the pair
	 *         matcher, and <code>false</code> otherwise
	 */
	boolean isMatchedChar(char ch);

	/**
	 * Checks whether the character is one of the characters matched by the pair matcher.
	 *
	 * <p>
	 * Clients can use this method to handle characters which may have special meaning in some
	 * situations. E.g. in Java, '<' is used as an angular bracket and as well as less-than operator.
	 * </p>
	 *
	 * @param ch the character
	 * @param document the document
	 * @param offset the offset in document
	 * @return <code>true</code> if the the character is one of the characters matched by the pair
	 *         matcher, and <code>false</code> otherwise
	 */
	boolean isMatchedChar(char ch, IDocument document, int offset);

	/**
	 * Computes whether a client needs to recompute the enclosing pair after a selection change in
	 * the document.
	 *
	 * <p>
	 * This is intended to be a quick test to determine whether a re-computation of the enclosing pair is
	 * required, as the re-computation after each selection change via a
	 * {@link #findEnclosingPeerCharacters(IDocument, int, int)} call can be expensive for some
	 * clients.
	 * </p>
	 *
	 * @param document the document to work on
	 * @param currentSelection the current selection in the document
	 * @param previousSelection the previous selection in the document
	 * @return <code>true</code> if the enclosing pair needs to be recomputed, <code>false</code>
	 *         otherwise
	 */
	boolean isRecomputationOfEnclosingPairRequired(IDocument document, IRegion currentSelection, IRegion previousSelection);
}
