/******************************************************************************* * Copyright (c) 2001, 2008 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 * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.preferences.ui; import org.eclipse.jface.resource.ColorRegistry; import org.eclipse.swt.graphics.RGB; import org.eclipse.wst.sse.ui.internal.Logger; import com.ibm.icu.util.StringTokenizer; public class ColorHelper { public final static String BACKGROUND = "background";//$NON-NLS-1$ public final static String BOLD = "bold";//$NON-NLS-1$ public final static String FOREGROUND = "foreground";//$NON-NLS-1$ public final static String NAME = "name";//$NON-NLS-1$ private final static String STYLE_SEPARATOR = "|"; //$NON-NLS-1$ private final static String NULL = "null"; //$NON-NLS-1$ /** * Return an RGB String given the int r, g, b values */ public static String getColorString(int r, int g, int b) { return "#" + getHexString(r, 2) + getHexString(g, 2) + getHexString(b, 2);//$NON-NLS-1$ } private static String getHexString(int value, int minWidth) { String hexString = Integer.toHexString(value); for (int i = hexString.length(); i < minWidth; i++) { hexString = "0" + hexString;//$NON-NLS-1$ } return hexString; } /** * Generates a preference string to be placed in preferences from the * given String array. * * @param stylePrefs * assumes not null and should be in the form of String[0] = * Foreground RGB String, String[1] = Background RGB String, * String[2] = Bold true/false * * @return String in the form of Foreground RGB String | Background RGB * String | Bold true/false */ public static String packStylePreferences(String[] stylePrefs) { StringBuffer styleString = new StringBuffer(); for (int i = 0; i < stylePrefs.length; ++i) { String s = stylePrefs[i]; if (i < 2) { if (s != null) { styleString.append(s); } else { styleString.append(NULL); } } else { styleString.append(Boolean.valueOf(s)); } // add in the separator (except on last iteration) if (i < stylePrefs.length - 1) { styleString.append(" " + STYLE_SEPARATOR + " "); //$NON-NLS-1$ //$NON-NLS-2$ } } return styleString.toString(); } /** * @return org.eclipse.swt.graphics.RGB * @param anRGBString * java.lang.String */ public static RGB toRGB(String anRGBString) { RGB result = null; if (anRGBString.length() > 6 && anRGBString.charAt(0) == '#') { int r = 0; int g = 0; int b = 0; try { r = Integer.valueOf(anRGBString.substring(1, 3), 16).intValue(); g = Integer.valueOf(anRGBString.substring(3, 5), 16).intValue(); b = Integer.valueOf(anRGBString.substring(5, 7), 16).intValue(); result = new RGB(r, g, b); } catch (NumberFormatException nfExc) { Logger.logException("Could not load highlighting preference for color " + anRGBString, nfExc);//$NON-NLS-1$ } } return result; } /** * @return java.lang.String * @param anRGB * org.eclipse.swt.graphics.RGB */ public static String toRGBString(RGB anRGB) { if (anRGB == null) return "#000000";//$NON-NLS-1$ String red = Integer.toHexString(anRGB.red); while (red.length() < 2) red = "0" + red;//$NON-NLS-1$ String green = Integer.toHexString(anRGB.green); while (green.length() < 2) green = "0" + green;//$NON-NLS-1$ String blue = Integer.toHexString(anRGB.blue); while (blue.length() < 2) blue = "0" + blue;//$NON-NLS-1$ return "#" + red + green + blue;//$NON-NLS-1$ } /** * Extracts the foreground (RGB String), background (RGB String), bold * (boolean String) from the given preference string. * * @param preference * should be in the form of Foreground RGB String | Background * RGB String | Bold true/false | Italic true/false | Strikethrough true/false | Underline true/false * @return String[] where String[0] = Foreground RGB String, String[1] = * Background RGB String, String[2] = Bold true/false, 3 = Italic * true/false, 4 = Strikethrough true/false, 5 = Underline * true/false; indexes 2-4 may be null if we ran into problems * extracting */ public static String[] unpackStylePreferences(String preference) { String[] stylePrefs = new String[6]; if (preference != null) { StringTokenizer st = new StringTokenizer(preference, STYLE_SEPARATOR); if (st.hasMoreTokens()) { String foreground = st.nextToken().trim(); stylePrefs[0] = foreground; } else { stylePrefs[0] = NULL; } if (st.hasMoreTokens()) { String background = st.nextToken().trim(); stylePrefs[1] = background; } else { stylePrefs[1] = NULL; } if (st.hasMoreTokens()) { String bold = st.nextToken().trim(); stylePrefs[2] = Boolean.valueOf(bold).toString(); } else { stylePrefs[2] = Boolean.FALSE.toString(); } if (st.hasMoreTokens()) { String italic = st.nextToken().trim(); stylePrefs[3] = Boolean.valueOf(italic).toString(); } else { stylePrefs[3] = Boolean.FALSE.toString(); } if (st.hasMoreTokens()) { String strikethrough = st.nextToken().trim(); stylePrefs[4] = Boolean.valueOf(strikethrough).toString(); } else { stylePrefs[4] = Boolean.FALSE.toString(); } if (st.hasMoreTokens()) { String underline = st.nextToken().trim(); stylePrefs[5] = Boolean.valueOf(underline).toString(); } else { stylePrefs[5] = Boolean.FALSE.toString(); } } return stylePrefs; } /** * Attempts to lookup the RGB value for <code>key</code> from the color * registry. If one is not found, the <code>defaultRGB</code> is used. * @param registry The ColorRegistry to search for the RGB value * @param key The key that the RGB value is stored under in the registry * @param defaultRGB The default RGB value to return in the absence of one * from the color registry * * @return The RGB value from the color registry for a given key, if it exists. * Otherwise, return the default RGB value. */ public static RGB findRGB(ColorRegistry registry, String key, RGB defaultRGB) { if(registry.hasValueFor(key)) return registry.getRGB(key); return defaultRGB; } /** * Attempts to find the RGB string for <code>key</code> from the color registry. * If one is not found, an RGB string is generated from the parameters <code>r,g,b</code>. * * @param registry The ColorRegistry to search for the RGB value * @param key The key that the RGB value is stored under in the registry * @param r The default red value * @param g The default green value * @param b The default blue value * * @return The String RGB value from the color registry for a given key, if it exists. * Otherwise, return the string RGB value created from the default r,g,b parameters. * */ public static String findRGBString(ColorRegistry registry, String key, int r, int g, int b) { if(registry.hasValueFor(key)) return toRGBString(registry.getRGB(key)); return getColorString(r, g, b); } }