/*******************************************************************************
 * Copyright (c) 2004, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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;
	}
}
