/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.common.model.ui.attribute.adapter.custom;

import java.util.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Display;
import org.jboss.tools.common.model.ui.ModelUIPlugin;

public class ColoredFontData {
	public static final ColoredFontData DEFAULT = new ColoredFontData();
	
	static {
		try {
			DEFAULT.data = Display.getDefault().getSystemFont().getFontData()[0];
			DEFAULT.color = Display.getDefault().getSystemColor(SWT.COLOR_BLACK).getRGB();
		} catch (SWTException e) {
			// FIXME See How to handle thos exception in PreferenceConverter Class
			ModelUIPlugin.getPluginLog().logError(e);
		}
	}

    FontData data;
    RGB color;

	public FontData getFontData() {
		return data;
	}
	
	public RGB getColor() {
		return color;
	}
	
	public static ColoredFontData toFontData(String text) {
		if(text == null || text.length() == 0) return DEFAULT;
		StringTokenizer st = new StringTokenizer(text, ","); //$NON-NLS-1$
		int q = 0;
		FontData data = new FontData(DEFAULT.getFontData().getName(), DEFAULT.getFontData().getHeight(), DEFAULT.getFontData().getStyle());
		RGB color = DEFAULT.getColor();
		while(st.hasMoreTokens()) {
			String t = st.nextToken();
			if(q == 0) {
				if(!"default".equals(t)) data.setName(t);  //$NON-NLS-1$
			} else if(t.startsWith("size=")) { //$NON-NLS-1$
				data.setHeight(getInt(t.substring(5), data.getHeight()));
			} else if(t.startsWith("style=")) { //$NON-NLS-1$
				data.setStyle(getInt(t.substring(6), data.getStyle()));
			} else if(t.startsWith("color=")) { //$NON-NLS-1$
				String sc = t.substring(6);
				int red = color.red, green = color.green, blue = color.blue;
				int i = sc.indexOf('-');
				if(i < 0) continue;
				red = getInt(sc.substring(0, i), red);
				sc = sc.substring(i + 1);
				i = sc.indexOf('-');
				if(i < 0) continue;
				green = getInt(sc.substring(0, i), green);
				sc = sc.substring(i + 1);
				blue = getInt(sc, blue);
				color = new RGB(red, green, blue);				
			}
			++q;
		}
		ColoredFontData d = new ColoredFontData();
		d.data = data;
		d.color = color;
		return d;
	}
	
	private static int getInt(String s, int def) {
		if(s == null || s.length() == 0) return def;
		try {
			return Integer.parseInt(s);
		} catch (NumberFormatException e) {
			ModelUIPlugin.getPluginLog().logError(e);
			return def;
		}
	}
	
	public static String toString(FontData data, RGB rgb) {
		StringBuffer sb = new StringBuffer();
		if(data.getName().equals(DEFAULT.getFontData().getName()))
			sb.append("default"); //$NON-NLS-1$
		else
			sb.append(data.getName());
		sb.append(",size=" + data.getHeight()); //$NON-NLS-1$
		sb.append(",style=" + data.getStyle()); //$NON-NLS-1$
		if(!DEFAULT.color.equals(rgb)) {
			sb.append(",color=" + rgb.red + "-" + rgb.green + "-" + rgb.blue); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		} 
		return sb.toString();
	}

}
