/******************************************************************************
 * Copyright (c) 2004 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.gmf.runtime.common.ui.util;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;


/**
 * A Util Class: provides convinient api to write to the Eclipse Console View  
 * 
 * The client of printXXXX(String name, String msg) methods does not need to do any 
 * housekeeping work to use this method. All pre-work for example registering the console 
 * with the Eclipse console manager if neccessary, creating the message stream, setting 
 * the default color are handled ny the method if neccesary.
 * 
 * However once they are done printing all there messages and have no more requirement
 * for the console and know that the console is not shared by others they can call 
 * unregisterConsole(String name) to dispose of the console
 * 
 * Also if the client wants to have more control over the console and streams or want
 * to display addititional message types in different colors (other than error:red, 
 * info:blue and warning:yellow) they can call registerConsole(String name, 
 * ImageDescriptor image) to create/register/get the console and then use standard 
 * eclipse api to do what they want.
 * 
 * @author bagrodia 
 */
public class ConsoleUtil {
	
	/** cache for console name to actual console object mapping*/
	private static Map nameToConsole = new HashMap();
	
	/** cache for 'console name' to 'default streams for error, warining and info for that console' mapping */
	private static Map nameToDefaultStream = new HashMap();
	
	
	// Strings for error, info, warning and default message types
	private final static String ERROR = "ERROR"; //$NON-NLS-1$
	private final static String INFO = "INFO";//$NON-NLS-1$
	private final static String WARNING = "WARNING";//$NON-NLS-1$
	private final static String DEFAULT= "DEFAULT";//$NON-NLS-1$
	
	//  Colors for error , info and warning message colors: By Default
	//  error messages are red, warnings yellow and info blue.
	
	/** Default color used for logging error messages to the console. */
	public final static Color DEFAULT_ERROR =  new Color(null,255,0,0);
	
	/** Default color used for logging info messages to the console. */
	public final static Color DEFAULT_INFO =  new Color(null,0,0,255);
	
	/** Default color used for logging warning messages to the console. */
	public final static Color DEFAULT_WARNING =  new Color(null,255,255,0);

	/**
	 * Registers the console with the Eclipse Console Manager.
	 * 
	 * @param name - the name for the console
	 * @param image - the image associated with the console
	 * @return the message console 
	 */
	public static MessageConsole registerConsole(String name, ImageDescriptor image){		
		
		if(nameToConsole.get(name) == null){	
			
			MessageConsole console = new MessageConsole(name,image);
			ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{console});			
			
			nameToConsole.put(name, console );
		}
		
		return (MessageConsole) nameToConsole.get( name);
	}
	
	
	/**
	 * Registers the console with the Eclipse Console Manager
	 * 
	 * @param name - the name name for the console	 
	 * @return message console  
	 */
	public static MessageConsole registerConsole(String name){		
		return registerConsole(name,null);
	}
	
	
	/**
	 *  Unregisters the console with the Eclipse Console Manager
	 * 
	 * 	@param name - the name name for the console	   
	 */
	public static void unregisterConsole(String name){		
		if(nameToConsole.containsKey( name)){		
			ConsolePlugin.getDefault().getConsoleManager().removeConsoles( new IConsole[]{(IConsole)nameToConsole.get(name)});
			nameToConsole.remove( name);
			nameToDefaultStream.remove(name+ERROR );
			nameToDefaultStream.remove(name+INFO );
			nameToDefaultStream.remove(name+WARNING );
			
		}		
	}
	
	
	
	/**
	 * returns the default (cached) MessageConsoleStream for the specified console name of the 
	 * specified type (error, info or warning)
	 * 
	 * @param name - the specified console name
	 * @param type - the specified type (error, info or warning)
	 * @return the default MessageConsoleStream 
	 */
	private static MessageConsoleStream getDefaultStream(String name, String type){
		if(nameToDefaultStream.get(name+type)== null){
			MessageConsole console = registerConsole(name);			
			MessageConsoleStream defaultStream = console.newMessageStream();
			
			nameToDefaultStream.put(name+type, defaultStream);
			
		}
		
		return (MessageConsoleStream) nameToDefaultStream.get(name+type);
		
	}
	
		
	/**
	 * Convinient static method to print an error string on the specified console.
	 * The color of the error message printed is by red. 
	 *  
	 * The client of this method does not need to do any housekeeping work to use 
	 * this method. All pre-work for example registering the console with the Eclipse 
	 * console manager if neccessary, creating the message stream, setting the color
	 * are handled by the method if neccesary.
	 * 
	 * @param name - specifies the console
	 * @param errMsg - the error message
	 */	
	public static void printError(String name, String errMsg){		
		MessageConsoleStream defaultStream = getDefaultStream(name, ERROR);
		defaultStream.setColor(DEFAULT_ERROR);
		defaultStream.println(errMsg);		
	}
	
	/** 
	 * Convinient static method to print an info string on the specified console.
	 * The color of the info message printed is by blue. 
	 *  
	 * The client of this method does not need to do any housekeeping work to use 
	 * this method. All pre-work for example registering the console with the Eclipse 
	 * console manager if neccessary, creating the message stream, setting the color
	 * are handled by the method if neccesary.  
	 * 
	 * @param name - specifies the console
	 * @param infoMsg - the info message
	 */
	public static void printInfo(String name, String infoMsg){			
		MessageConsoleStream defaultStream = getDefaultStream(name,INFO);
		defaultStream.setColor(DEFAULT_INFO);
		defaultStream.println(infoMsg);	
	}
	
	
	
	/** 
	 * Convinient static method to print an warning string on the specified console.
	 * The color of the warning message printed is by yellow. 
	 *  
	 * The client of this method does not need to do any housekeeping work to use 
	 * this method. All pre-work for example registering the console with the Eclipse 
	 * console manager if neccessary, creating the message stream, setting the color
	 * are handled by the method if neccesary.   
	 * 
	 * @param name - specifies the console
	 * @param warnMsg  - the warning message
	 */
	public static void printWarning(String name, String warnMsg){			
		MessageConsoleStream defaultStream = getDefaultStream(name, WARNING);
		defaultStream.setColor(DEFAULT_WARNING);
		defaultStream.println(warnMsg);	
	}
	

	/** 
	 * Convinient static method to print an string on the specified console.
	 * The color of the message printed is by black. 
	 *  
	 * The client of this method does not need to do any housekeeping work to use 
	 * this method. All pre-work for example registering the console with the Eclipse 
	 * console manager if neccessary, creating the message stream, setting the color
	 * are handled by the method if neccesary.   
	 * 
	 * @param name - specifies the console
	 * @param msg  - the warning message
	 */
	public static void println(String name, String msg){
		MessageConsoleStream defaultStream = getDefaultStream(name, DEFAULT);		
		defaultStream.println(msg);			
	}
	

	
	/**
	 * Shows the Eclipse console view and brings on top the specified console.
	 * 
	 * Also creates and registers the console with the Eclipse console manager 
	 * if necessary.
	 * 
	 * @param name - specifies the console
	 */
	public static void showConsole(String name){
		MessageConsole console = registerConsole(name);	
		
		// Need to call the following Eclipse API twice as there is a bug in the 
		// API. 
		// Expected: The API method should open the console view and display given the console.
		// If the view is already open, it should be brought to the front.
		// Actual: if the view is not already open, the method opens it but does not bring it 
		// to front; A second invocation of the method is a workaround to bring to front the 
		// opened view.
		// Submitted Bugzilla Bug #70864 to track the defect
		ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
		ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
	}

	
}
