/*******************************************************************************
 * Copyright (c) 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.forms;

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.forms.widgets.Form;

/**
 * This interface provides for managing typed messages in a form. Typed messages
 * are messages associated with a type that indicates their severity (error,
 * warning, information). The interface is responsible for:
 * <ul>
 * <li>Bridging the concept of typed messages and control decorations</li>
 * <li>Adding one or more messages per control in a form</li>
 * <li>Rolling the local messages up to the form header</li>
 * <li>Adding one or more general messages to the form header</li>
 * </ul>
 * <p>
 * To use it in a form, do the following:
 * <ol>
 * <li>For each interactive control, add a listener to it to monitor user input</li>
 * <li>Every time the input changes, validate it. If there is a problem, add a
 * message with a unique key to the manager. If there is already a message with
 * the same key in the manager, its type and message text will be replaced (no
 * duplicates). Note that you add can messages with different keys to the same
 * control to track multiple problems with the user input.</li>
 * <li>If the problem has been cleared, remove the message using the key
 * (attempting to remove a message that is not in the manager is safe).</li>
 * <li>If something happens in the form that is not related to any control, use
 * the other <code>addMessage</code> method.</li>
 * </ol>
 * <p>
 * This interface should only be referenced. It must not be implemented or
 * extended.
 * </p>
 * 
 * @since 3.3
 * @see IMessageProvider
 * @see IManagedForm
 * @noimplement This interface is not intended to be implemented by clients.
 */

public interface IMessageManager {
	/**
	 * Adds a general message that is not associated with any decorated field.
	 * Note that subsequent calls using the same key will not result in
	 * duplicate messages. Instead, the previous message with the same key will
	 * be replaced with the new message.
	 * 
	 * @param key
	 *            a unique message key that will be used to look the message up
	 *            later
	 * 
	 * @param messageText
	 *            the message to add
	 * @param data
	 *            an object for application use (can be <code>null</code>)
	 * @param type
	 *            the message type as defined in <code>IMessageProvider</code>.
	 */
	void addMessage(Object key, String messageText, Object data, int type);

	/**
	 * Adds a message that should be associated with the provided control. Note
	 * that subsequent calls using the same key will not result in duplicate
	 * messages. Instead, the previous message with the same key will be
	 * replaced with the new message.
	 * 
	 * @param key
	 *            the unique message key
	 * @param messageText
	 *            the message to add
	 * @param data
	 *            an object for application use (can be <code>null</code>)
	 * @param type
	 *            the message type
	 * @param control
	 *            the control to associate the message with
	 */
	void addMessage(Object key, String messageText, Object data, int type,
			Control control);

	/**
	 * Removes the general message with the provided key. Does nothing if
	 * message for the key does not exist.
	 * 
	 * @param key
	 *            the key of the message to remove
	 */
	void removeMessage(Object key);

	/**
	 * Removes all the general messages. If there are local messages associated
	 * with controls, the replacement message may show up drawing user's
	 * attention to these local messages. Otherwise, the container will clear
	 * the message area.
	 */
	void removeMessages();

	/**
	 * Removes a keyed message associated with the provided control. Does
	 * nothing if the message for that key does not exist.
	 * 
	 * @param key
	 *            the id of the message to remove
	 * @param control
	 *            the control the message is associated with
	 */
	void removeMessage(Object key, Control control);

	/**
	 * Removes all the messages associated with the provided control. Does
	 * nothing if there are no messages for this control.
	 * 
	 * @param control
	 *            the control the messages are associated with
	 */
	void removeMessages(Control control);

	/**
	 * Removes all the local field messages and all the general container
	 * messages.
	 */
	void removeAllMessages();

	/**
	 * Updates the message container with the messages currently in the manager.
	 * There are two scenarios in which a client may want to use this method:
	 * <ol>
	 * <li>When controls previously managed by this manager have been disposed.</li>
	 * <li>When automatic update has been turned off.</li>
	 * </ol>
	 * In all other situations, the manager will keep the form in sync
	 * automatically.
	 * 
	 * @see #setAutoUpdate(boolean)
	 */
	void update();

	/**
	 * Controls whether the form is automatically updated when messages are
	 * added or removed. By default, auto update is on. Clients can turn it off
	 * prior to adding or removing a number of messages as a batch. Turning it
	 * back on will trigger an update.
	 * 
	 * @param enabled
	 *            sets the state of the automatic update
	 */
	void setAutoUpdate(boolean enabled);

	/**
	 * Tests whether the form will be automatically updated when messages are
	 * added or removed.
	 * 
	 * @return <code>true</code> if auto update is active, <code>false</code>
	 *         otherwise.
	 */
	boolean isAutoUpdate();

	/**
	 * Sets the alternative message prefix provider. The default prefix provider
	 * is set by the manager.
	 * 
	 * @param provider
	 *            the new prefix provider or <code>null</code> to turn the
	 *            prefix generation off.
	 */
	void setMessagePrefixProvider(IMessagePrefixProvider provider);

	/**
	 * @return the current prefix provider or <code>null</code> if prefixes
	 *         are not generated.
	 */
	IMessagePrefixProvider getMessagePrefixProvider();

	/**
	 * Message manager uses SWT.LEFT|SWT.BOTTOM for the default decoration
	 * position. Use this method to change it.
	 * 
	 * @param position
	 *            the decoration position
	 * @see ControlDecoration
	 */
	void setDecorationPosition(int position);

	/**
	 * Returns the currently used decoration position for all control messages.
	 * 
	 * @return the current decoration position
	 */

	int getDecorationPosition();

	/**
	 * When message manager is used in context of a form, and there are
	 * hyperlink listeners for messages in the header, the hyperlink event will
	 * carry an object of type <code>IMessage[]</code> as an href. You can use
	 * this method to create a summary text from this array consistent with the
	 * tool tip used by the form header.
	 * 
	 * @param messages
	 *            an array of messages
	 * @return a textual representation of the messages with one message per
	 *         line.
	 * @see Form#addMessageHyperlinkListener(org.eclipse.ui.forms.events.IHyperlinkListener)
	 */
	String createSummary(IMessage[] messages);
}