/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  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:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 *
 */
 
package org.eclipse.osbp.xtext.messagedsl.ui.labeling

import org.eclipse.osbp.xtext.basic.ui.labeling.BasicDSLLabelProvider
import com.google.inject.Inject
import org.eclipse.osbp.xtext.messagedsl.MessageModel
import org.eclipse.osbp.xtext.messagedsl.MessagePackage
import org.eclipse.osbp.xtext.messagedsl.MessageCategory
import org.eclipse.osbp.xtext.messagedsl.MessageGroup
import org.eclipse.osbp.xtext.messagedsl.MessageItem
import org.eclipse.osbp.xtext.messagedsl.MessageDefaultFormat
import org.eclipse.osbp.xtext.messagedsl.MessageParameter

/**
 * Provides labels for a EObjects.
 *
 * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
 */
class MessageDslLabelProvider extends BasicDSLLabelProvider {

	@Inject
	new(org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider delegate) {
		super(delegate);
	}

	/* ********************************************************************************************** */
	/**			Provides outline text for Message-DSL.
	 *
	 *			Uses common (default) text for package and for import element.
	 *
	 *	@see	BasicDSLLabelProvider.text(Object)
	 *
	 *	@param	o	Current outline element
	 *
	 *	@return	String instance.
	 *
	 *	@since	160802, gu
	 *	@date	yymmdd, name
	 */ /* ******************************************************************************************* */
	 override text ( Object o ) {
		switch (o) {
			MessageCategory		: generateText( o, 'category', o.name )
			MessageGroup		: generateText( o, 'group'   , o.name )
			MessageItem			: generateText( o, 'item'    , o.name )
			MessageParameter	: {
				switch (o.oftype) {
					case BOOLEAN	: generateText( o, 'boolean param'  , o.name )
					case INTEGER	: generateText( o, 'integer param'  , o.name )
					case DOUBLE		: generateText( o, 'double param'   , o.name )
					case STRING		: generateText( o, 'string param'   , o.name )
					case CLASS		: generateText( o, 'class param'    , o.name )
					case OBJECT		: generateText( o, 'object param'   , o.name )
					case EXCEPTION	: generateText( o, 'exception param', o.name )
				}
			}
			MessageDefaultFormat: {
					val item  = (o.eContainer as MessageItem)
					var desc  = 'format'

					if  (o.equals(item.logFormat)) {
						desc = 'log format'
					}
					else if (o.equals(item.showFormat)) {
						desc = 'show format'
					}

					generateText( o, desc, o.format )
			}
			default	: super.text( o )
		}
	}


	/* ********************************************************************************************** */
	/**			Provides outline images for Message-DSL.
	 *
	 *			Uses common (default) image for package and for import element.
	 *
	 *	@see	BasicDSLLabelProvider.image(Object)
	 * 
	 *	@param	o	Current outline element
	 *
	 *	@return	Image instance if requested image file was found, return value of overridden superclass
	 *			method otherwise.
	 *
	 *	@since	yymmdd, name
	 *	@date	160802, gu
	 */ /* ******************************************************************************************* */
	override image (Object o) {
		switch (o) {
			MessageModel		: getInternalImage( 'dsl_message.gif' , class )
			MessagePackage		: getInternalImage( 'package.gif'     , class )
			MessageCategory		: getInternalImage( 'category.gif'    , class )
			MessageGroup		: getInternalImage( 'group.gif'       , class )
			MessageItem			: getInternalImage( 'message_info.gif', class )
			MessageParameter	: {
				switch (o.oftype) {
					case BOOLEAN	: getInternalImage( 'boolean.gif'   , class )
					case INTEGER	: getInternalImage( 'int.gif'       , class )
					case DOUBLE		: getInternalImage( 'double.gif'    , class )
					case STRING		: getInternalImage( 'var_string.gif', class )
					case CLASS		: getInternalImage( 'class.gif'     , class )
					case OBJECT		: getInternalImage( 'object.png'    , class )
					case EXCEPTION	: getInternalImage( 'exception.gif' , class )
				}
			}
			MessageDefaultFormat: {
					val item = (o.eContainer as MessageItem)
					if  (o.equals(item.logFormat)) {
						getInternalImage('agent_log_obj.gif', class)
					}
					else if (o.equals(item.showFormat)) {
						getInternalImage('dsl_dialog.gif', class)
					}
					else {
						getInternalImage('formatbuilder.gif', class)
					}
			}
			default	: null
		}
	}
}
