/*******************************************************************************
 * 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 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.wst.sse.ui.contentassist;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.wst.sse.ui.internal.Logger;

/**
 * <p>Helpful class for passing around information about the invocation context
 * of a content assist request</p>
 * 
 * @base org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext
 */
public class CompletionProposalInvocationContext {
	/** the viewer that was used to invoke content assist */
	private final ITextViewer fViewer;
	
	/** the character offset where content assist was invoked in the viewer */
	private final int fInvocationOffset;
	
	/** the partition type where content assist was invoked */
	private String fPartitionType;
	
	/**
	 * <p>Create a new context</p>
	 * 
	 * @param viewer {@link ITextViewer} that was used to invoke content assist
	 * @param invocationOffset character offset where content assist was invoked in the viewer
	 */
	public CompletionProposalInvocationContext(ITextViewer viewer, int invocationOffset) {
		fViewer = viewer;
		fInvocationOffset = invocationOffset;
		fPartitionType = null;
	}
	
	/**
	 * @return {@link IDocument} that content assist was invoked on
	 */
	public IDocument getDocument() {
		return fViewer.getDocument();
	}
	
	/**
	 * @return {@link ITextViewer} that was used to invoke content assist
	 */
	public ITextViewer getViewer() {
		return fViewer;
	}
	
	/**
	 * @return character offset where content assist was invoked in the viewer
	 */
	public int getInvocationOffset() {
		return fInvocationOffset;
	}
	
	/**
	 * @return the partition type where content assist was invoked
	 */
	public String getInvocationPartitionType() {
		if(fPartitionType == null) {
			fPartitionType = ""; //$NON-NLS-1$
			try {
				fPartitionType = this.getDocument().getPartition(this.fInvocationOffset).getType();
			} catch (BadLocationException e) {
				// should never happen, nothing we can do about it if it does
				Logger.logException("Could not get the partition type at content assist invocation offset", e); //$NON-NLS-1$
			}
		}
		return fPartitionType;
	}
	
	/**
	 * <p>Invocation contexts are equal if they describe the same context and are of the same type.
	 * This implementation checks for <code>null</code> values and class equality. Subclasses
	 * should extend this method by adding checks for their context relevant fields (but not
	 * necessarily cached values).</p>
	 * <p>
	 * Example:
	 *
	 * <pre>
	 * class MyContext extends ContentAssistInvocationContext {
	 * 	private final Object fState;
	 * 	private Object fCachedInfo;
	 *
	 * 	...
	 *
	 * 	public boolean equals(Object obj) {
	 * 		if (!super.equals(obj))
	 * 			return false;
	 * 		MyContext other= (MyContext) obj;
	 * 		return fState.equals(other.fState);
	 * 	}
	 * }
	 * </pre>
	 *
	 * </p>
	 * <p>
	 * Subclasses should also extend {@link Object#hashCode()}.
	 * </p>
	 *
	 * @param obj {@inheritDoc}
	 * @return {@inheritDoc}
	 */
	public boolean equals(Object obj) {
		boolean equal = false;
		if(obj instanceof CompletionProposalInvocationContext) {
			CompletionProposalInvocationContext other = (CompletionProposalInvocationContext) obj;
			equal = (fViewer == null && other.fViewer == null || fViewer != null && fViewer.equals(other.fViewer)) &&
					fInvocationOffset == other.fInvocationOffset;
		}
		return equal;
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode() {
		return 23459213 << 5 | (fViewer == null ? 0 : fViewer.hashCode() << 3) | fInvocationOffset;
	}
}
