/*******************************************************************************
 * Copyright (c) 2000, 2007 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.ui.console;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.internal.console.IOConsolePage;
import org.eclipse.ui.part.IPageBookViewPage;

/**
 * A console that displays messages. A message console may have one or
 * more streams connected to it (<code>MessageConsoleStream</code>).
 * Text written to streams is buffered and processed in a Job by the 
 * console's document partitioner.
 * <p>
 * Clients may instantiate this class.
 * </p>
 * @since 3.0
 * @noextend This class is not intended to be subclassed by clients.
 */
public class MessageConsole extends IOConsole {
	
	/**
	 * Property constant indicating the font of this console has changed. 
	 * 
	 * @deprecated use {@link IConsoleConstants#P_FONT} 
	 */
	public static final String P_FONT = IConsoleConstants.P_FONT;
	
	/**
	 * Property constant indicating the color of a stream has changed. 
	 * 
	 * @deprecated use {@link IConsoleConstants#P_STREAM_COLOR} 
	 */
	public static final String P_STREAM_COLOR = IConsoleConstants.P_STREAM_COLOR;
	
	/**
	 * Property constant indicating tab size has changed
	 * 
	 * @deprecated use {@link IConsoleConstants#P_TAB_SIZE}
	 */
	public static final String P_TAB_SIZE = IConsoleConstants.P_TAB_SIZE;
	
	/**
	 * The default tab size
	 * 
	 * @deprecated use {@link IConsoleConstants#DEFAULT_TAB_SIZE}
	 */
	public static final int DEFAULT_TAB_SIZE = IConsoleConstants.DEFAULT_TAB_SIZE;	

    /**
     * Constructs a message console with the given name and image.
     * 
     * @param name console name
     * @param imageDescriptor console image descriptor or <code>null</code>
     */
	public MessageConsole(String name, ImageDescriptor imageDescriptor) {
		this(name, imageDescriptor, true);
	}
	
	/**
	 * Constructs a message console.
	 * 
	 * @param name console name
	 * @param imageDescriptor console image descriptor or <code>null</code>
	 * @param autoLifecycle whether lifecycle methods should be called automatically
	 *  when added and removed from the console manager
	 * @since 3.1
	 */
	public MessageConsole(String name, ImageDescriptor imageDescriptor, boolean autoLifecycle) {
		super(name, IConsoleConstants.MESSAGE_CONSOLE_TYPE, imageDescriptor, autoLifecycle);
	}	
		
	/**
	 * Returns a new message stream connected to this console.
	 * <p>
     * Clients should avoid writing large amounts of output to this stream in the UI
     * thread. The console needs to process the output in the UI thread and if the client
     * hogs the UI thread writing output to the console, the console will not be able
     * to process the output.
     * </p>
	 * @return a new message stream connected to this console
	 */
	public MessageConsoleStream newMessageStream() {
		return new MessageConsoleStream(this);
	}

    /* (non-Javadoc)
     * @see org.eclipse.ui.console.IConsole#createPage(org.eclipse.ui.console.IConsoleView)
     */
    public IPageBookViewPage createPage(IConsoleView view) {
        IOConsolePage page = (IOConsolePage) super.createPage(view);
        page.setReadOnly();
        return page;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.ui.console.IOConsole#getInputStream()
     */
    public IOConsoleInputStream getInputStream() {
        throw new UnsupportedOperationException("Message Console does not support user input"); //$NON-NLS-1$
    }
    
	
	/** 
	 * Appends the given message to this console, from the specified stream.
	 * 
	 * @param text message
	 * @param stream stream the message belongs to
	 * @deprecated since 3.1, this method should no longer be called, and has no effect.
	 * Writing to a message console stream updates the document
	 */
	protected void appendToDocument(String text, MessageConsoleStream stream) {
	}    
}
