/*******************************************************************************
 * 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.internal.comment;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

/**
 * <p>Represents a Line Comment commenting strategy</p>
 */
public class LineCommentingStrategy extends CommentingStrategy {
	/** the prefix of the line comment associated with this strategy */
	private String fPrefix;
	
	/**
	 * @param prefix the prefix of the line comment associated with this strategy
	 */
	public LineCommentingStrategy(String prefix) {
		super();
		this.fPrefix = prefix;
	}
	
	/**
	 * <p>Assumes that the given offset is at the begining of a line and adds the line
	 * comment prefix there</p>
	 * 
	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#apply(
	 * 	org.eclipse.wst.sse.core.internal.provisional.IStructuredModel, int, int)
	 */
	public void apply(IStructuredDocument document, int offset, int length)
			throws BadLocationException {
		
		document.replace(offset, 0, this.fPrefix + " ");
	}

	/**
	 * <p>Assumes that the given offset is at the beginning of a line that is commented and removes
	 * the comment prefix from the beginning of the line, leading whitespace on the line will not
	 * prevent this method from finishing correctly</p>
	 * 
	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#remove(
	 * 	org.eclipse.wst.sse.core.internal.provisional.IStructuredModel, int, int, boolean)
	 */
	public void remove(IStructuredDocument document, int offset, int length, boolean removeEnclosing) throws BadLocationException{
		String content = document.get(offset, length);
		int innerOffset = content.indexOf(this.fPrefix);
		if(innerOffset > 0) {
			offset += innerOffset;
		}
		
		uncomment(document, offset, this.fPrefix, -1,  null);
	}
	
	/**
	 * <p>A region is already commented if it begins with the the associated prefix ignoring any
	 * leading whitespace</p>
	 * 
	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#alreadyCommenting(
	 * 	org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IRegion)
	 */
	public boolean alreadyCommenting(IStructuredDocument document, IRegion region)
			throws BadLocationException {
		
		String regionContent = document.get(region.getOffset(), region.getLength()).trim();
		return regionContent.startsWith(this.fPrefix);
	}
	
	/**
	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#clone()
	 */
	public Object clone() {
		return new LineCommentingStrategy(this.fPrefix);
	}
}
