/******************************************************************************* * Copyright (c) 2007 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.themes; import java.util.Hashtable; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.themes.ColorUtil; import org.eclipse.ui.themes.IColorFactory; /** * LightColorFactory returns tab begin and end colours based on taking * a system color as input, analyzing it, and lightening it appropriately. * * @since 3.3 * */ public class LightColorFactory implements IColorFactory, IExecutableExtension { protected static final RGB white = ColorUtil.getColorValue("COLOR_WHITE"); //$NON-NLS-1$ protected static final RGB black = ColorUtil.getColorValue("COLOR_BLACK"); //$NON-NLS-1$ String baseColorName; String definitionId; /** * Return the highlight start (top of tab) color as an RGB * @return the highlight start RGB */ public static RGB createHighlightStartColor(RGB tabStartColor) { return ColorUtil.blend(white, tabStartColor); } /** * This executable extension requires parameters to be explicitly declared * via the second method described in the <code>IExecutableExtension</code> * documentation. The following parameters are parsed: * <code>base</code>, describes the base color to produce all other colours from. * This value may either be an RGB triple or an SWT constant. * <code>definitionId</code>, describes the id of color we are looking for, one of * "org.eclipse.ui.workbench.ACTIVE_TAB_BG_START" * "org.eclipse.ui.workbench.ACTIVE_TAB_BG_END" * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, * java.lang.String, java.lang.Object) */ public void setInitializationData(IConfigurationElement config, String propertyName, Object data) { if (data instanceof Hashtable) { Hashtable table = (Hashtable) data; baseColorName = (String) table.get("base"); //$NON-NLS-1$ definitionId = (String) table.get("definitionId"); //$NON-NLS-1$ } } /* * Return the number of RGB values in test that are * equal to or between lower and upper. */ protected int valuesInRange(RGB test, int lower, int upper) { int hits = 0; if(test.red >= lower && test.red <= upper) hits++; if(test.blue >= lower && test.blue <= upper) hits++; if(test.green >= lower && test.green <= upper) hits++; return hits; } /* * Return the RGB value for the bottom tab color * based on a blend of white and sample color */ private RGB getLightenedColor(RGB sample) { //Group 1 if(valuesInRange(sample, 180, 255) >= 2) return sample; //Group 2 if(valuesInRange(sample, 100, 179) >= 2) return ColorUtil.blend(white, sample, 40); //Group 3 if(valuesInRange(sample, 0, 99) >= 2) return ColorUtil.blend(white, sample, 60); //Group 4 return ColorUtil.blend(white, sample, 30); } /* * Return the Start (top of tab) color as an RGB */ private RGB getActiveFocusStartColor() { if (Display.getCurrent().getDepth() < 15) return getActiveFocusEndColor(); RGB startColor = ColorUtil.blend(white, getActiveFocusEndColor(), 75); return startColor; } /* * Return the End (top of tab) color as an RGB */ private RGB getActiveFocusEndColor() { if (Display.getCurrent().getDepth() < 15) return ColorUtil.getColorValue(baseColorName); return getLightenedColor( ColorUtil.getColorValue(baseColorName)); } /* * Return the active focus tab text color as an RGB */ private RGB getActiveFocusTextColor() { if (Display.getCurrent().getDepth() < 15) return ColorUtil.getColorValue(baseColorName); //typically TITLE_FOREGROUND return ColorUtil.getColorValue("COLOR_BLACK"); //$NON-NLS-1$ } /* * Return the RGB value for the top tab color. */ private RGB getActiveNofocusStartColor() { RGB base = ColorUtil.getColorValue(baseColorName); if (Display.getCurrent().getDepth() < 15) return base; return ColorUtil.blend(white, base, 40); } /* * (non-Javadoc) * * @see org.eclipse.ui.themes.IColorFactory#createColor() */ public RGB createColor() { //should have base, otherwise error in the xml if (baseColorName == null || definitionId == null) return white; if (definitionId.equals("org.eclipse.ui.workbench.ACTIVE_TAB_BG_START")) //$NON-NLS-1$ return getActiveFocusStartColor(); if (definitionId.equals("org.eclipse.ui.workbench.ACTIVE_TAB_BG_END")) //$NON-NLS-1$ return getActiveFocusEndColor(); if (definitionId.equals("org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR")) //$NON-NLS-1$ return getActiveFocusTextColor(); if (definitionId.equals("org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_START")) //$NON-NLS-1$ return getActiveNofocusStartColor(); //should be one of start or end, otherwise error in the xml return white; } }