/*****************************************************************************
 * Copyright (c) 2014, 2017 CEA LIST.
 *
 *
 * 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:
 *  Patrick Tessier (CEA LIST) patrick.tessier@cea.fr - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.papyrus.revision.tool.ui;

import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.papyrus.revision.tool.core.I_ReviewStereotype;
import org.eclipse.papyrus.revision.tool.core.I_VersioningStereotype;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.uml2.uml.Actor;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.util.UMLUtil;

/**
 * 
 * This is the label provider to display reviews for the review editor
 *
 */
public class ReviewsTreeLabelProvider extends StyledCellLabelProvider  {
	protected Font italicFont;
	protected Font boldFont;
	private  Styler fBoldStyler;
	private  Styler fItalicStyler;
	/**
	 * constructor
	 * @param boldFont
	 * @param italicFont
	 */
	public ReviewsTreeLabelProvider( final Font boldFont, final Font italicFont ) {
		this.boldFont= boldFont;
		this.italicFont= italicFont;
		// Multi-font support only works in JFace 3.5 and above (specifically, 3.5 M4 and above).
		// With JFace 3.4, the font information (bold in this example) will be ignored.

		fBoldStyler= new Styler() {

			@Override
			public void applyStyles(TextStyle textStyle) {
				textStyle.font= boldFont;

			}
		};
		fItalicStyler= new Styler() {

			@Override
			public void applyStyles(TextStyle textStyle) {
				textStyle.font= italicFont;

			}
		};
	}


	/**
	 * get the color from a author
	 * @param author
	 * @return color
	 */
	public Color getColorFromAuthor(Actor author){
		Device device = Display.getCurrent ();
		if(author!=null){
			String colorRGB= (String)author.getValue(author.getApplicableStereotype(I_VersioningStereotype.AUTHOR_STEREOTYPE), I_VersioningStereotype.AUTHOR_COLOR_ATT);
			if(colorRGB!=null){
				String R=colorRGB.substring(0, colorRGB.indexOf(":"));
				colorRGB=colorRGB.substring(colorRGB.indexOf(":")+1);
				String G=colorRGB.substring(0, colorRGB.indexOf(":"));
				colorRGB=colorRGB.substring(colorRGB.indexOf(":")+1);
				String B=colorRGB;
				return new Color(device,new Integer(R) , new Integer(G), new Integer(B));
			}
		}
		return new Color(device,255 , 255, 255);
	}

	/**
	 * update visual appearance of a cell
	 */
	public void update(ViewerCell cell) {
		Object obj = cell.getElement();

		if(obj instanceof Comment) {
			Comment cmt=(Comment)obj;
			Stereotype theReviewStereotype=cmt.getApplicableStereotype(I_ReviewStereotype.COMMENT_STEREOTYPE);
			Stereotype reviewStereotype=null;
			List<Stereotype> stereotypes= cmt.getAppliedStereotypes();
			System.out.println(cmt);
			for (Stereotype stereotype : stereotypes) {
				if(stereotype.getGenerals().contains(theReviewStereotype)){
					reviewStereotype=stereotype;
				}
			}
			
			if(reviewStereotype!=null){
				StyledString styledString = new StyledString("");
				EObject stereotypeApplicationAuthor=(EObject)cmt.getValue(reviewStereotype, I_VersioningStereotype.VERSIONINGELEMENT_AUTHOR_ATT);
				if(stereotypeApplicationAuthor!=null){
					Actor author=(Actor)UMLUtil.getBaseElement(stereotypeApplicationAuthor);
					if( author!=null){
						styledString.append( author.getName(), fBoldStyler);
					}
					cell.setBackground(getColorFromAuthor(author) );
				}
				else{
					styledString.append( "No author", fBoldStyler);
				}
				if(cmt.getValue(reviewStereotype, I_ReviewStereotype.COMMENT_SUBJECT_ATT)!=null){
					styledString.append( " "+cmt.getValue(reviewStereotype, I_ReviewStereotype.COMMENT_SUBJECT_ATT),fItalicStyler );
				}
				else{
					styledString.append( " No subject",fItalicStyler );
				}

				if(cmt.getValue(reviewStereotype, I_VersioningStereotype.VERSIONINGELEMENT_DATE_ATT)!=null){
					styledString.append( " "+cmt.getValue(reviewStereotype,  I_VersioningStereotype.VERSIONINGELEMENT_DATE_ATT),fBoldStyler );
				}
				styledString.append(" (" +	cmt.getOwnedComments().size() +")", StyledString.COUNTER_STYLER);
				styledString.append("\n" +	cmt.getBody() , StyledString.DECORATIONS_STYLER);

				cell.setText(styledString.toString());
				cell.setStyleRanges(styledString.getStyleRanges());

			}
			else{
				//no stereotype
				StyledString styledString = new StyledString("");
				styledString.append("" +cmt.getBody() , StyledString.DECORATIONS_STYLER);
				cell.setText(styledString.toString());
				cell.setStyleRanges(styledString.getStyleRanges());
			}
		}
		super.update(cell);
	}

}
