/*******************************************************************************
 * 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.ui.internal;

import org.eclipse.core.runtime.IProduct;
import org.eclipse.jface.resource.ImageDescriptor;

/**
 * Stores information about the product.  This class replaces the old AboutInfo.
 * The product information is available as strings, but is needed as URLs, etc.
 * This class manages that translation.
 * @since 3.0
 */
public class ProductInfo {
    private IProduct product;

    private String productName;

    private String appName;

    private ImageDescriptor[] windowImages;

    private ImageDescriptor aboutImage;

    private String aboutText;

    public ProductInfo(IProduct product) {
        this.product = product;
    }

    /**
     * Returns the product name or <code>null</code>.
     * This is shown in the window title and the About action.
     *
     * @return the product name, or <code>null</code>
     */
    public String getProductName() {
        if (productName == null && product != null) {
			productName = product.getName();
		}
        return productName;
    }

    /**
     * Returns the application name or <code>null</code>. Note this is never
     * shown to the user.  It is used to initialize the SWT Display.
     * <p>
     * On Motif, for example, this can be used to set the name used
     * for resource lookup.
     * </p>
     *
     * @return the application name, or <code>null</code>
     * 
     * @see org.eclipse.swt.widgets.Display#setAppName
     */
    public String getAppName() {
        if (appName == null && product != null) {
			appName = ProductProperties.getAppName(product);
		}
        return appName;
    }

    /**
     * Returns the descriptor for an image which can be shown in an "about" dialog 
     * for this product. Products designed to run "headless" typically would not 
     * have such an image.
     * 
     * @return the descriptor for an about image, or <code>null</code> if none
     */
    public ImageDescriptor getAboutImage() {
        if (aboutImage == null && product != null) {
			aboutImage = ProductProperties.getAboutImage(product);
		}
        return aboutImage;
    }

    /**
     * Return an array of image descriptors for the window images to use for
     * this product. The expectations is that the elements will be the same
     * image rendered at different sizes. Products designed to run "headless"
     * typically would not have such images.
     * 
     * @return an array of the image descriptors for the window images, or
     *         <code>null</code> if none
     */
    public ImageDescriptor[] getWindowImages() {
        if (windowImages == null && product != null) {
			windowImages = ProductProperties.getWindowImages(product);
		}
        return windowImages;
    }

    /**
     * Returns the text to show in an "about" dialog for this product.
     * Products designed to run "headless" typically would not have such text.
     * 
     * @return the about text, or <code>null</code> if none
     */
    public String getAboutText() {
        if (aboutText == null && product != null) {
			aboutText = ProductProperties.getAboutText(product);
		}
        return aboutText;
    }
}
