/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.editors.xpath;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextDoubleClickStrategy;
import org.eclipse.jface.text.ITextViewer;


/**
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Oct 25, 2006
 *
 */

 public class XPathSourceDoubleClickStrategy implements ITextDoubleClickStrategy {

	 protected XPathWordDetector fWordDetector = new XPathWordDetector();
	 
	 protected ITextViewer fText;

 	/**
 	 * Do something on double-click. For us, this means selecting the right amount of 
 	 * characters to form word or string.
 	 * 
 	 * @see org.eclipse.jface.text.ITextDoubleClickStrategy#doubleClicked(org.eclipse.jface.text.ITextViewer)
 	 */
 	public void doubleClicked (ITextViewer part) {
         
 		int pos = part.getSelectedRange().x;

 		if (pos < 0) {
 			return;
 		}

 		fText = part;

 		if (!selectComment(pos)) {
 			selectWord(pos);
 		}
 	}
 	
 	
 	protected boolean selectComment(int caretPos) {
 		IDocument doc = fText.getDocument();
 		int startPos, endPos;

 		try {
 			int pos = caretPos;
 			char c = ' ';

 			while (pos >= 0) {
 				c = doc.getChar(pos);
 				if (c == '\\') {
 					pos -= 2;
 					continue;
 				}
 				if (c == Character.LINE_SEPARATOR || c == '\"')
 					break;
 				--pos;
 			}

 			if (c != '\"')
 				return false;

 			startPos = pos;

 			pos = caretPos;
 			int length = doc.getLength();
 			c = ' ';

 			while (pos < length) {
 				c = doc.getChar(pos);
 				if (c == Character.LINE_SEPARATOR || c == '\"')
 					break;
 				++pos;
 			}
 			if (c != '\"')
 				return false;

 			endPos = pos;

 			int offset = startPos + 1;
 			int len = endPos - offset;
 			fText.setSelectedRange(offset, len);
 			return true;
 		} catch (BadLocationException x) {
 		}

 		return false;
 	}
 	
 	
 	protected boolean selectWord(int caretPos) {

 		IDocument doc = fText.getDocument();
 		int startPos, endPos;

 		try {

 			int pos = caretPos;
 			char c;

 			while (pos >= 0) {
 				c = doc.getChar(pos);
 				if (! fWordDetector.isWordPart(c))
 					break;
 				--pos;
 			}

 			startPos = pos;

 			pos = caretPos;
 			int length = doc.getLength();

 			while (pos < length) {
 				c = doc.getChar(pos);
 				if (!fWordDetector.isWordPart(c))
 					break;
 				++pos;
 			}

 			endPos = pos;
 			selectRange(startPos, endPos);
 			return true;

 		} catch (BadLocationException x) {
 		}

 		return false;
 	}

 	private void selectRange(int startPos, int stopPos) {
 		int offset = startPos + 1;
 		int length = stopPos - offset;
 		fText.setSelectedRange(offset, length);
 	}
 }
