/*******************************************************************************
 *  Copyright (c) 2008, 2011 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.intro.impl;

import org.eclipse.core.runtime.IProduct;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.osgi.service.prefs.BackingStoreException;

public class FontSelection {

	public static final String VAR_FONT_STYLE = "fontStyle";  //$NON-NLS-1$
	public static final String FONT_ABSOLUTE = "absolute";  //$NON-NLS-1$
	public static final String FONT_RELATIVE = "relative";  //$NON-NLS-1$
	private static final String SCALE_FACTOR = "scaleFactor"; //$NON-NLS-1$
	public static final String ATT_SCALABLE = "scalable"; //$NON-NLS-1$

	private static final int MIN_HEIGHT = 10;
	private static final int MAX_HEIGHT = 16;

	/*
	 * Returns the height in points of the default SWT font
	 */
	private static int getDefaultFontHeight() {
       Font defaultFont = JFaceResources.getDefaultFont();
       FontData[] fontData = defaultFont.getFontData();
       int height = MIN_HEIGHT;
		for (int i=0; i< fontData.length; i++) {
			FontData data = fontData[i];
			height = Math.max(height, data.getHeight());
		}
       return Math.min(height, MAX_HEIGHT);
	}

	public static String generatePageFontStyle() {
		int defaultFontHeight = getDefaultFontHeight();
		int scale = getScalePercentage();
		String result = getFontSizeDeclaration("", defaultFontHeight, 100, scale); //$NON-NLS-1$
		result += getFontSizeDeclaration("h1", defaultFontHeight, 200, scale); //$NON-NLS-1$
		result += getFontSizeDeclaration("h2", defaultFontHeight, 150, scale); //$NON-NLS-1$
		result += getFontSizeDeclaration("h3", defaultFontHeight, 120, scale); //$NON-NLS-1$
		result += getFontSizeDeclaration("h4", defaultFontHeight, 100, scale); //$NON-NLS-1$
		result += getFontSizeDeclaration("h5", defaultFontHeight, 80, scale); //$NON-NLS-1$
		result += getFontSizeDeclaration("h6", defaultFontHeight, 70, scale); //$NON-NLS-1$
		return result;
	}

	public static final int getScalePercentage() {
		int scale = Platform.getPreferencesService().getInt(IntroPlugin.PLUGIN_ID,  (SCALE_FACTOR), 0, null);
		return scale;
	}

	private static String getFontSizeDeclaration(String element, int baseSize, int percentage, int scale) {
		if (scale > 75) scale = 75;
		int newSize = (int) ((baseSize * percentage *1.25) / (100 - scale));
		return " body " + element  + "{  font-size : " + newSize  + "px; } ";  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
	}

	public static void setScalePercentage(int i) {
		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(IntroPlugin.PLUGIN_ID);
		prefs.putInt(SCALE_FACTOR, i);
		try {
			prefs.flush();
		} catch (BackingStoreException e) {
		}
	}

	// Set the scale factor to it's default
	public static void resetScalePercentage() {
		IEclipsePreferences iprefs = InstanceScope.INSTANCE.getNode(IntroPlugin.PLUGIN_ID);
		IEclipsePreferences dprefs = DefaultScope.INSTANCE.getNode(IntroPlugin.PLUGIN_ID);
		String defaultScale = dprefs.get(SCALE_FACTOR, "0"); //$NON-NLS-1$
		iprefs.put(SCALE_FACTOR, defaultScale);
	}

	public static String getFontStyle() {
		IProduct product = Platform.getProduct();
		if (product != null) {
		    String pid = product.getId();
	    	String style = Platform.getPreferencesService().getString
	    	    (IntroPlugin.PLUGIN_ID,  pid + "_" +FontSelection.VAR_FONT_STYLE, "", null); //$NON-NLS-1$ //$NON-NLS-2$
	    	if (style.length() > 0) {
	    		return style;
	    	}
	    	style = Platform.getPreferencesService().getString
	    	    (IntroPlugin.PLUGIN_ID,  (FontSelection.VAR_FONT_STYLE), "", null); //$NON-NLS-1$
	    	if (style.length() > 0) {
	    		return style;
	    	}
		}
		// Use default for font style if not specified
	    return FontSelection.FONT_RELATIVE;
	}
}
