/*******************************************************************************
 * Copyright (c) 2000, 2010 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.gef;

import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.NumberFormat;

import org.eclipse.swt.widgets.Text;

/**
 * This is an internal class used for debugging
 * 
 * @deprecated in 3.1 This class will be removed in future releases.
 */
public final class GEF {

	static final String TAB = "  ";//$NON-NLS-1$

	static Text text;
	static int msgCount;
	static int tab;
	static NumberFormat formatter = new DecimalFormat();

	/**
	 * @deprecated
	 */
	public static boolean DebugTools = false;
	/**
	 * @deprecated
	 */
	public static boolean DebugEvents = false;
	/**
	 * @deprecated
	 */
	public static boolean DebugEditParts = false;
	/**
	 * @deprecated
	 */
	public static boolean DebugPainting = false;
	/**
	 * @deprecated
	 */
	public static boolean DebugFeedback = false;
	/**
	 * @deprecated
	 */
	public static boolean GlobalDebug = false;
	/**
	 * @deprecated
	 */
	public static boolean DebugToolStates = false;
	/**
	 * @deprecated
	 */
	public static boolean DebugDND = false;

	/**
	 * Clears the trace console if active
	 * 
	 * @since 1.0
	 */
	public static void clearConsole() {
		if (text == null)
			return;
		text.setText("");//$NON-NLS-1$
	}

	/**
	 * Sets a text control to be used as a console.
	 * 
	 * @since 1.0
	 * @param textBox
	 *            the text control for streaming
	 */
	public static void setConsole(Text textBox) {
		msgCount = 0;
		formatter.setMinimumIntegerDigits(2);
		formatter.setMaximumFractionDigits(0);
		text = textBox;
	}

	/**
	 * decrements the tracing indentation
	 * 
	 * @since 2.0
	 */
	public static void debugPop() {
		tab--;
	}

	/**
	 * Prints the given string to a trace window and increments indentation.
	 * 
	 * @since 2.0
	 * @param heading
	 *            the message describing the indented text to follow
	 */
	public static void debugPush(String heading) {
		debug(heading);
		tab++;
	}

	/**
	 * Prints the given message to a trace window if available.
	 * 
	 * @since 1.0
	 * @param message
	 *            a debug message
	 */
	public static void debug(String message) {
		String lineNumber = formatter.format(new Long(msgCount++));
		msgCount %= 100;
		String indent = "";//$NON-NLS-1$
		for (int i = 0; i < tab; i++)
			indent += TAB;
		if (text != null)
			text.append('\n' + lineNumber + '\t' + indent + message);
	}

}
