/* * Created on 2 mai 2004 Created by Olivier Chalouhi * * Copyright (C) 2004, 2005, 2006 Aelitis SAS, All rights Reserved * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details ( * see the LICENSE file ). * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * AELITIS, SAS au capital de 46,603.30 euros, 8 Alle Lenotre, La Grille Royale, * 78600 Le Mesnil le Roi, France. */ package org.gudy.azureus2.ui.swt.mainwindow; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.config.ParameterListener; import org.gudy.azureus2.core3.logging.*; import org.gudy.azureus2.core3.util.AEMonitor; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.ui.swt.Utils; import com.aelitis.azureus.ui.swt.utils.ColorCache; /** * @author Olivier Chalouhi * @author MjrTom * 2005/Dec/08: green * */ public class Colors implements ParameterListener { private static final LogIDs LOGID = LogIDs.GUI; private static Colors instance = null; public static final int BLUES_LIGHTEST = 0; public static final int BLUES_DARKEST = 9; public static final int BLUES_MIDLIGHT = (BLUES_DARKEST + 1) / 4; public static final int BLUES_MIDDARK = ((BLUES_DARKEST + 1) / 2) + BLUES_MIDLIGHT; public static final int FADED_LIGHTEST = 0; public static final int FADED_DARKEST = 9; public static Color[] blues = new Color[BLUES_DARKEST + 1]; public static Color[] faded = new Color[FADED_DARKEST + 1]; public static Color colorProgressBar; public static Color colorInverse; public static Color colorShiftLeft; public static Color colorShiftRight; public static Color colorError; public static Color colorErrorBG; public static Color colorAltRow; public static Color colorWarning; public static Color black; public static Color light_grey; public static Color blue; public static Color green; public static Color fadedGreen; public static Color grey; public static Color red; public static Color fadedRed; public static Color yellow; public static Color fadedYellow; public static Color white; public static Color background; public static Color red_ConsoleView; private static AEMonitor class_mon = new AEMonitor( "Colors" ); public static int diffHue; public static float diffSatPct; public static float diffLumPct; static List<ParameterListener> listeners = new ArrayList<ParameterListener>(); static{ ParameterListener l = new ParameterListener() { public void parameterChanged( String parameterName) { List<ParameterListener> copy; synchronized( listeners ){ copy = new ArrayList<ParameterListener>( listeners ); } for ( ParameterListener l: copy ){ try{ l.parameterChanged(parameterName); }catch( Throwable e ){ Debug.out( e ); } } } }; COConfigurationManager.addParameterListener("Color Scheme", l); COConfigurationManager.addParameterListener("Colors.progressBar.override", l); COConfigurationManager.addParameterListener("Colors.progressBar", l); COConfigurationManager.addParameterListener("Colors.error.override", l); COConfigurationManager.addParameterListener("Colors.error", l); COConfigurationManager.addParameterListener("Colors.warning.override", l); COConfigurationManager.addParameterListener("Colors.warning", l); COConfigurationManager.addParameterListener("Colors.altRow.override", l); COConfigurationManager.addParameterListener("Colors.altRow", l); } private void allocateBlues() { int r = 0; int g = 128; int b = 255; try { r = COConfigurationManager.getIntParameter("Color Scheme.red", r); g = COConfigurationManager.getIntParameter("Color Scheme.green", g); b = COConfigurationManager.getIntParameter("Color Scheme.blue", b); boolean bGrayScale = (r == b) && (b == g); HSLColor hslDefault = new HSLColor(); hslDefault.initHSLbyRGB(0, 128, 255); HSLColor hslScheme = new HSLColor(); hslScheme.initHSLbyRGB(r, g, b); diffHue = hslScheme.getHue() - hslDefault.getHue(); diffSatPct = hslScheme.getSaturation() == 0 ? 0 : (float) hslDefault.getSaturation() / hslScheme.getSaturation(); diffLumPct = hslScheme.getLuminence() == 0 ? 0 : (float) hslDefault.getLuminence() / hslScheme.getLuminence(); HSLColor hslColor = new HSLColor(); Color colorTables = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND); int tR = colorTables.getRed(); int tG = colorTables.getGreen(); int tB = colorTables.getBlue(); // 0 == window background (white) // [blues.length-1] == rgb // in between == blend for (int i = 0; i < blues.length; i++) { hslColor.initHSLbyRGB(r, g, b); float blendBy = (i == 0) ? 1 : (float) 1.0 - ((float) i / (float) (blues.length - 1)); hslColor.blend(tR, tG, tB, blendBy); blues[i] = ColorCache.getColor(display, hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()); int iSat = hslColor.getSaturation(); int luminence = hslColor.getLuminence(); if (luminence < 20) { if (iSat > 10) { hslColor.setSaturation(iSat / 2); hslColor.brighten(1.25f); } else if (bGrayScale) { // gray hslColor.brighten(1.2f); } } else { if (iSat > 10) { hslColor.setSaturation(iSat / 2); hslColor.brighten(0.75f); } else if (bGrayScale) { // gray hslColor.brighten(0.8f); } } faded[i] = ColorCache.getColor(display, hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()); } if (bGrayScale) { if (b > 200) b -= 20; else b += 20; } hslColor.initHSLbyRGB(r, g, b); hslColor.reverseColor(); colorInverse = ColorCache.getColor(display, hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()); hslColor.initHSLbyRGB(r, g, b); hslColor.setHue(hslColor.getHue() + 25); colorShiftRight = ColorCache.getColor(display, hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()); hslColor.initHSLbyRGB(r, g, b); hslColor.setHue(hslColor.getHue() - 25); colorShiftLeft = ColorCache.getColor(display, hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()); } catch (Exception e) { Logger.log(new LogEvent(LOGID, "Error allocating colors", e)); } } private void allocateColorProgressBar() { if (display == null || display.isDisposed()) return; colorProgressBar = new AllocateColor("progressBar", colorShiftRight, colorProgressBar).getColor(); } private void allocateColorErrorBG() { if (display == null || display.isDisposed()) return; Utils.execSWTThread(new AERunnable() { public void runSupport() { Color colorTables = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND); HSLColor hslColor = new HSLColor(); hslColor.initHSLbyRGB(colorTables.getRed(), colorTables.getGreen(), colorTables.getBlue()); int lum = hslColor.getLuminence(); int sat = hslColor.getSaturation(); lum = (int)((lum > 127) ? lum * 0.8 : lum * 1.3); if (sat == 0) { sat = 80; } hslColor.initRGBbyHSL(0, sat, lum); colorErrorBG = new AllocateColor("errorBG", new RGB(hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()), colorErrorBG).getColor(); } }, false); } private void allocateColorError() { if (display == null || display.isDisposed()) return; colorError = new AllocateColor("error", new RGB(255, 68, 68), colorError) .getColor(); } private void allocateColorWarning() { if (display == null || display.isDisposed()) return; Utils.execSWTThread(new AERunnable() { public void runSupport() { Color colorTables = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND); HSLColor hslBG = new HSLColor(); hslBG.initHSLbyRGB(colorTables.getRed(), colorTables.getGreen(), colorTables.getBlue()); int lum = hslBG.getLuminence(); HSLColor hslColor = new HSLColor(); hslColor.initRGBbyHSL(25, 200, 128 + (lum < 160 ? 10 : -10)); colorWarning = new AllocateColor("warning", new RGB(hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()), colorWarning).getColor(); } }, false); } private void allocateColorAltRow() { if (display == null || display.isDisposed()) return; Utils.execSWTThread(new AERunnable() { public void runSupport() { Color colorTables = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND); HSLColor hslColor = new HSLColor(); hslColor.initHSLbyRGB(colorTables.getRed(), colorTables.getGreen(), colorTables.getBlue()); int lum = hslColor.getLuminence(); int sat = hslColor.getSaturation(); int hue = hslColor.getHue(); if (lum > 127) { lum -= 10; sat = 127; hue = 155; } else { lum += 30; // it's usually harder to see difference in darkness } hslColor.setLuminence(lum); hslColor.setHue(hue); hslColor.setSaturation(sat); //HSLColor blueHSL = new HSLColor(); //RGB rgb = blues[BLUES_DARKEST].getRGB(); //blueHSL.initHSLbyRGB(rgb.red, rgb.green, rgb.blue); //int blueHue = blueHSL.getHue(); //int altHue = hslColor.getHue(); //if (blueHue > altHue) { // altHue += 11; //} else { // altHue -= 11; //} //hslColor.setHue(blueHue); colorAltRow = new AllocateColor("altRow", new RGB(hslColor.getRed(), hslColor.getGreen(), hslColor.getBlue()), colorAltRow).getColor(); } }, false); } /** Allocates a color */ private class AllocateColor extends AERunnable { private String sName; private RGB rgbDefault; private Color newColor; public AllocateColor(String sName, RGB rgbDefault, Color colorOld) { this.sName = sName; this.rgbDefault = rgbDefault; } public AllocateColor(String sName, final Color colorDefault, Color colorOld) { this.sName = sName; Utils.execSWTThread(new AERunnable() { public void runSupport() { if (!colorDefault.isDisposed()) AllocateColor.this.rgbDefault = colorDefault.getRGB(); else AllocateColor.this.rgbDefault = new RGB(0, 0, 0); } }, false); } public Color getColor() { Utils.execSWTThread(this, false); return newColor; } public void runSupport() { if (COConfigurationManager.getBooleanParameter("Colors." + sName + ".override")) { newColor = ColorCache.getColor(display, COConfigurationManager.getIntParameter("Colors." + sName + ".red", rgbDefault.red), COConfigurationManager.getIntParameter("Colors." + sName + ".green", rgbDefault.green), COConfigurationManager.getIntParameter("Colors." + sName + ".blue", rgbDefault.blue)); } else { newColor = ColorCache.getColor(display, rgbDefault.red, rgbDefault.green, rgbDefault.blue); // Since the color is not longer overriden, reset back to default // so that the user sees the correct color in Config. COConfigurationManager.setRGBParameter("Colors." + sName, rgbDefault.red, rgbDefault.green, rgbDefault.blue); } } } private void allocateDynamicColors() { if(display == null || display.isDisposed()) return; Utils.execSWTThread(new AERunnable(){ public void runSupport() { allocateBlues(); allocateColorProgressBar(); allocateColorErrorBG(); } }, false); } private void allocateNonDynamicColors() { allocateColorWarning(); allocateColorError(); allocateColorAltRow(); black = ColorCache.getColor(display, 0, 0, 0); light_grey = ColorCache.getColor(display, 192, 192, 192); blue = ColorCache.getColor(display, 0, 0, 170); green = ColorCache.getColor(display, 0, 170, 0); fadedGreen = ColorCache.getColor(display, 96, 160, 96); grey = ColorCache.getColor(display, 170, 170, 170); red = ColorCache.getColor(display, 255, 0, 0); fadedRed = ColorCache.getColor(display, 160, 96, 96); yellow = ColorCache.getColor(display, 255, 255, 0); fadedYellow = ColorCache.getColor(display, 255, 255, 221); white = ColorCache.getColor(display, 255, 255, 255); background = ColorCache.getColor(display, 248, 248, 248); red_ConsoleView = ColorCache.getColor(display, 255, 192, 192); } private Display display; private Colors() { instance = this; try { display = SWTThread.getInstance().getDisplay(); } catch (Exception e) { display = Display.getDefault(); } allocateDynamicColors(); allocateNonDynamicColors(); addColorsChangedListener(this); } public static Colors getInstance() { try{ class_mon.enter(); if (instance == null) instance = new Colors(); return instance; }finally{ class_mon.exit(); } } public void addColorsChangedListener(ParameterListener l) { synchronized( listeners ){ listeners.add( l ); } } public void removeColorsChangedListener(ParameterListener l) { synchronized( listeners ){ listeners.remove( l ); } } public void parameterChanged(String parameterName) { if (parameterName.equals("Color Scheme")) { allocateDynamicColors(); } if(parameterName.startsWith("Colors.progressBar")) { allocateColorProgressBar(); } if(parameterName.startsWith("Colors.error")) { allocateColorError(); } if(parameterName.startsWith("Colors.warning")) { allocateColorWarning(); } if(parameterName.startsWith("Colors.altRow")) { allocateColorAltRow(); } } }