/*******************************************************************************
 * Copyright (c) 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.sse.ui.internal.contentassist;

import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

/**
 * <p>A {@link IContextInformationValidator} for structured documents</p>
 */
public class ContextInformationValidator implements IContextInformationValidator {

	/** the installed document position */
	private int fDocumentPosition;

	/** the installed document */
	private IStructuredDocument fDocument;
	
	/** the installed region start*/
	private IndexedRegion fRegion;
	
	/**
	 * <p>Default constructor</p>
	 */
	public ContextInformationValidator() {
		fDocumentPosition = -1;
		fDocument = null;
	}
	
	/**
	 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#install(org.eclipse.jface.text.contentassist.IContextInformation,
	 *      org.eclipse.jface.text.ITextViewer, int)
	 */
	public void install(IContextInformation info, ITextViewer viewer, int documentPosition) {
		fDocumentPosition = documentPosition;
		fDocument = (IStructuredDocument)viewer.getDocument();
	}
	
	/**
	 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#isContextInformationValid(int)
	 */
	public boolean isContextInformationValid(int documentPosition) {
		/*
		 * determine whether or not this context info should still be
		 * showing... if cursor still within the same region then it's valid
		 */
		boolean result = false;

		calculateInstalledIndexedRegion();
		
		if (fRegion != null) {
			int start = fRegion.getStartOffset();
			int end = fRegion.getEndOffset();
			result = (documentPosition < end) && (documentPosition > start + 1);
		}
		return result;
	}
	
	/**
	 * @return {@link IndexedRegion} that this validator was installed on
	 */
	private void calculateInstalledIndexedRegion() {
		if (fRegion == null) {
			IStructuredModel model = null;
			try {
				model = StructuredModelManager.getModelManager().getModelForRead(fDocument);
				if (model != null) {
					fRegion = model.getIndexedRegion(fDocumentPosition);
				}
			}
			finally {
				if (model != null)
					model.releaseFromRead();
			}
		}
	}
}
