/*******************************************************************************
 * Copyright (c) 2001, 2009 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.search;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
import org.eclipse.search.ui.text.Match;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;

import com.ibm.icu.text.MessageFormat;

/**
 * <p>The label provider designed for use with <code>BasicSearchMatchElement</code><p>
 * 
 * <p>Displays in the format of:<br/>
 * lineNum: Message (# matches)</br>
 * 1: <a></a> (2 matches)</p>
 */
public class BasicSearchLabelProvider extends LabelProvider implements IStyledLabelProvider {
	/**
	 * ID of match highlighting background color
	 */
	private static final String MATCH_BG_ID = "org.eclipse.wst.sse.ui.search.MATCH_BG";
	
	//register the match highlighting background color once
	static {
		JFaceResources.getColorRegistry().put(MATCH_BG_ID, new RGB(206, 204, 247));
	}
	
	/**
	 * Match highlighting background color styler
	 */
	private static final Styler HIGHLIGHT_WRITE_STYLE= StyledString.createColorRegistryStyler(null, MATCH_BG_ID);
	
	
	/**
	 * Need the page if want to determine the number of matches, but this can be <code>null</code>
	 */
	private AbstractTextSearchViewPage fPage;

	/**
	 * <p>Construct the provider without a <code>AbstractTextSearchViewPage</code><p>
	 * <p><b>NOTE:</b>If this constructor is used then the provider will not be able to determine
	 * the number of matches that are all on the same line for a given element</p>
	 */
	public BasicSearchLabelProvider() {
		this(null);
	}
	
	/**
	 * <p>Construct the provider with a <code>AbstractTextSearchViewPage</code> so that the
	 * number of matches that are all on the same line for a given element can be determined.</p>
	 * 
	 * @param page Will be used to determine the number of matches that are all on the same line
	 */
	public BasicSearchLabelProvider(AbstractTextSearchViewPage page) {
		fPage= page;
	}
	
	/**
	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
	 */
	public Image getImage(Object element) {
		return EditorPluginImageHelper.getInstance().getImage(EditorPluginImages.IMG_OBJ_OCC_MATCH);
	}
	
	/**
	 * <p><b>Note:</b> Because this class implements <code>IStyledLabelProvider</code> the <code>getStyledText</code>
	 * function should be being called and not this one, but better save then sorry</p>
	 * 
	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
	 * @see org.eclipse.wst.sse.ui.internal.search.BasicSearchLabelProvider#getStyledText(Object)
	 */
	public final String getText(Object element) {
		return getStyledText(element).getString();
	}
	
	/**
	 * <p>Given a <code>Match</code> object containing a <code>BasicSearchMatchElement</code> element
	 * returns a <code>StyledString</code> in the form of:</p>
	 * 
	 * <p>lineNum: Message (# matches)</br>
	 * 1: <a></a> (2 matches)</p>
	 * 
	 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
	 */
	public StyledString getStyledText(Object obj) {
		StyledString styledText = new StyledString();
		BasicSearchMatchElement element = null;
		if (obj instanceof Match) {
			Match match = (Match) obj;

			if(match.getElement() instanceof BasicSearchMatchElement) {
				element = (BasicSearchMatchElement) match.getElement();
			}
		} else if(obj instanceof BasicSearchMatchElement) {
			element = (BasicSearchMatchElement)obj;
		}
		
		//get the match count if possible
		int matchCount = 0;
		Match[] matches = new Match[0];
		if(fPage != null) {
			matches = fPage.getInput().getMatches(obj);
			matchCount = matches.length;
		}
		
		//if everything was of the right type create our formated message,
		//else use the toString of the given object for the message
		if(element != null) {
			String message = element.getLine().trim(); //$NON-NLS-1$
			int trimedAmount = element.getLine().indexOf(message);
			String lineNum = element.getLineNum() + 1 + ": "; //$NON-NLS-1$
			
			styledText.append(lineNum, StyledString.QUALIFIER_STYLER);
			styledText.append(message);
			
			//get the match count if possible
			for(int i = 0; i < matchCount; ++i) {
				int offset = matches[i].getOffset() - element.geLineOffset() + lineNum.length() - trimedAmount;
				styledText.setStyle(offset, matches[i].getLength(), HIGHLIGHT_WRITE_STYLE);
			}
			
		} else {
			styledText.append(obj.toString());
		}
		
		//append the match count if its worth appending
		if (matchCount > 1) {
			String matchesMsg = " " + MessageFormat.format(
				SSEUIMessages.TextSearchLabelProvider_matchCountFormat,
				new Object[] { new Integer(matchCount) });
			styledText.append(matchesMsg, StyledString.COUNTER_STYLER);
		}
	
		return styledText;
	}
}
