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

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.eclipse.jface.util.Assert;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;

/**
 * Utility methods to access JFace-specific resources.
 * <p>
 * All methods declared on this class are static. This
 * class cannot be instantiated.
 * </p>
 * <p>
 * The following global state is also maintained by this class:
 * <ul>
 *   <li>a font registry</li>
 *	 <li>a color registry</li>
 *   <li>an image registry</li>
 *   <li>a resource bundle</li>
 * </ul>
 * </p>
 */
public class JFaceResources {

    /**
     * Map of Display onto DeviceResourceManager. Holds all the resources for the associated display.
     */
    private static final Map registries = new HashMap();
    
    /**
     * The symbolic font name for the banner font 
     * (value <code>"org.eclipse.jface.bannerfont"</code>).
     */
    public static final String BANNER_FONT = "org.eclipse.jface.bannerfont"; //$NON-NLS-1$

    /**
     * The JFace resource bundle; eagerly initialized.
     */
    private static final ResourceBundle bundle = ResourceBundle
            .getBundle("org.eclipse.jface.messages"); //$NON-NLS-1$

    /**
     * The JFace color registry; <code>null</code> until
     * lazily initialized or explicitly set.
     */
    private static ColorRegistry colorRegistry;

    /**
     * The symbolic font name for the standard font 
     * (value <code>"org.eclipse.jface.defaultfont"</code>).
     */
    public static final String DEFAULT_FONT = "org.eclipse.jface.defaultfont"; //$NON-NLS-1$

    /**
     * The symbolic font name for the dialog font 
     * (value <code>"org.eclipse.jface.dialogfont"</code>).
     */
    public static final String DIALOG_FONT = "org.eclipse.jface.dialogfont"; //$NON-NLS-1$

    /**
     * The JFace font registry; <code>null</code> until
     * lazily initialized or explicitly set.
     */
    private static FontRegistry fontRegistry = null;

    /**
     * The symbolic font name for the header font 
     * (value <code>"org.eclipse.jface.headerfont"</code>).
     */
    public static final String HEADER_FONT = "org.eclipse.jface.headerfont"; //$NON-NLS-1$

    /**
     * The JFace image registry; <code>null</code> until
     * lazily initialized.
     */
    private static ImageRegistry imageRegistry = null;

    /**
     * The symbolic font name for the text font 
     * (value <code>"org.eclipse.jface.textfont"</code>).
     */
    public static final String TEXT_FONT = "org.eclipse.jface.textfont"; //$NON-NLS-1$

    /**
     * The symbolic font name for the viewer font 
     * (value <code>"org.eclipse.jface.viewerfont"</code>).
     * @deprecated This font is not in use
     */
    public static final String VIEWER_FONT = "org.eclipse.jface.viewerfont"; //$NON-NLS-1$

    /**
     * The symbolic font name for the window font 
     * (value <code>"org.eclipse.jface.windowfont"</code>).
     * @deprecated This font is not in use
     */
    public static final String WINDOW_FONT = "org.eclipse.jface.windowfont"; //$NON-NLS-1$

    /**
     * Returns the formatted message for the given key in
     * JFace's resource bundle. 
     *
     * @param key the resource name
     * @param args the message arguments
     * @return the string
     */
    public static String format(String key, Object[] args) {
        return MessageFormat.format(getString(key), args);
    }

    /**
     * Returns the JFace's banner font.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(JFaceResources.BANNER_FONT)
     * </pre>
     *
     * @return the font
     */
    public static Font getBannerFont() {
        return getFontRegistry().get(BANNER_FONT);
    }

    /**
     * Returns the resource bundle for JFace itself.
     * The resouble bundle is obtained from
     * <code>ResourceBundle.getBundle("org.eclipse.jface.jface_nls")</code>.
     * <p>
     * Note that several static convenience methods are 
     * also provided on this class for directly accessing
     * resources in this bundle.
     * </p>
     *
     * @return the resource bundle
     */
    public static ResourceBundle getBundle() {
        return bundle;
    }

    /**
     * Returns the color registry for JFace itself.
     * <p>
     * @return the <code>ColorRegistry</code>.
     * @since 3.0
     */
    public static ColorRegistry getColorRegistry() {
        if (colorRegistry == null)
            colorRegistry = new ColorRegistry();
        return colorRegistry;
    }

    /**
     * Returns the global resource manager for the given display
     * 
     * @since 3.1
     *
     * @param toQuery display to query
     * @return the global resource manager for the given display
     */
    public static ResourceManager getResources(final Display toQuery) {
        ResourceManager reg = (ResourceManager)registries.get(toQuery); 
        
        if (reg == null) {
            final DeviceResourceManager mgr = new DeviceResourceManager(toQuery);
            reg = mgr;
            registries.put(toQuery, reg);
            toQuery.disposeExec(new Runnable() {
                /* (non-Javadoc)
                 * @see java.lang.Runnable#run()
                 */
                public void run() {
                    mgr.dispose();
                    registries.remove(toQuery);
                }
            });
        }
        
        return reg;
    }
    
    /**
     * Returns the ResourceManager for the current display. May only
     * be called from a UI thread.
     * 
     * @since 3.1
     *
     * @return the global ResourceManager for the current display
     */
    public static ResourceManager getResources() {
        return getResources(Display.getCurrent());
    }
    
    /**
     * Returns the JFace's standard font.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT)
     * </pre>
     *
     * @return the font
     */
    public static Font getDefaultFont() {
        return getFontRegistry().defaultFont();
    }

    /**
     * Returns the JFace's dialog font.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT)
     * </pre>
     *
     * @return the font
     */
    public static Font getDialogFont() {
        return getFontRegistry().get(DIALOG_FONT);
    }

    /**
     * Returns the font in JFace's font registry with the given
     * symbolic font name.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(symbolicName)
     * </pre>
     *
     * If an error occurs, return the default font.
     *
     * @param symbolicName the symbolic font name
     * @return the font
     */
    public static Font getFont(String symbolicName) {
        return getFontRegistry().get(symbolicName);
    }

    /**
     * Returns the font registry for JFace itself.
     * If the value has not been established by an earlier
     * call to <code>setFontRegistry</code>, is it
     * initialized to
     * <code>new FontRegistry("org.eclipse.jface.resource.jfacefonts")</code>.
     * <p>
     * Note that several static convenience methods are 
     * also provided on this class for directly accessing
     * JFace's standard fonts.
     * </p>
     */
    public static FontRegistry getFontRegistry() {
        if (fontRegistry == null) {
            fontRegistry = new FontRegistry(
                    "org.eclipse.jface.resource.jfacefonts"); //$NON-NLS-1$
        }
        return fontRegistry;
    }

    /**
     * Returns the JFace's header font.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(JFaceResources.HEADER_FONT)
     * </pre>
     *
     * @return the font
     */
    public static Font getHeaderFont() {
        return getFontRegistry().get(HEADER_FONT);
    }

    /**
     * Returns the image in JFace's image registry with the given key, 
     * or <code>null</code> if none.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getImageRegistry().get(key)
     * </pre>
     *
     * @param key the key
     * @return the image, or <code>null</code> if none
     */
    public static Image getImage(String key) {
        return getImageRegistry().get(key);
    }

    /**
     * Returns the image registry for JFace itself.
     * <p>
     * Note that the static convenience method <code>getImage</code>
     * is also provided on this class.
     * </p>
     */
    public static ImageRegistry getImageRegistry() {
        if (imageRegistry == null)
            imageRegistry = new ImageRegistry(getResources(Display.getCurrent()));
        return imageRegistry;
    }

    /**
     * Returns the resource object with the given key in
     * JFace's resource bundle. If there isn't any value under
     * the given key, the key is returned.
     *
     * @param key the resource name
     * @return the string
     */
    public static String getString(String key) {
        try {
            return bundle.getString(key);
        } catch (MissingResourceException e) {
            return key;
        }
    }

    /**
     * Returns a list of string values corresponding to the
     * given list of keys. The lookup is done with <code>getString</code>.
     * The values are in the same order as the keys.
     *
     * @param keys a list of keys
     * @return a list of corresponding string values
     */
    public static String[] getStrings(String[] keys) {
        Assert.isNotNull(keys);
        int length = keys.length;
        String[] result = new String[length];
        for (int i = 0; i < length; i++)
            result[i] = getString(keys[i]);
        return result;
    }

    /**
     * Returns the JFace's text font.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT)
     * </pre>
     *
     * @return the font
     */
    public static Font getTextFont() {
        return getFontRegistry().get(TEXT_FONT);
    }

    /**
     * Returns the JFace's viewer font.
     * Convenience method equivalent to
     * <pre>
     * JFaceResources.getFontRegistry().get(JFaceResources.VIEWER_FONT)
     * </pre>
     *
     * @return the font
     * @deprecated This font is not in use
     */
    public static Font getViewerFont() {
        return getFontRegistry().get(VIEWER_FONT);
    }

    /**
     * Sets JFace's font registry to the given value.
     * This method may only be called once; the call must occur
     * before <code>JFaceResources.getFontRegistry</code>
     * is invoked (either directly or indirectly). 
     *
     * @param registry a font registry
     */
    public static void setFontRegistry(FontRegistry registry) {
        Assert.isTrue(fontRegistry == null,
                "Font registry can only be set once."); //$NON-NLS-1$
        fontRegistry = registry;
    }

    /* (non-Javadoc)
     * Declare a private constructor to block instantiation.
     */
    private JFaceResources() {
        //no-op
    }
}
