Package org.rssowl.ui.internal.notifier

Source Code of org.rssowl.ui.internal.notifier.NotifierColors

/*   **********************************************************************  **
**   Copyright notice                                                       **
**                                                                          **
**   (c) 2005-2006 RSSOwl Development Team                                  **
**   http://www.rssowl.org/                                                 **
**                                                                          **
**   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.rssowl.org/legal/epl-v10.html                               **
**                                                                          **
**   A copy is found in the file epl-v10.html and important notices to the  **
**   license from the team is found in the textfile LICENSE.txt distributed **
**   in this package.                                                       **
**                                                                          **
**   This copyright notice MUST APPEAR in all copies of the file!           **
**                                                                          **
**   Contributors:                                                          **
**     RSSOwl Development Team - initial API and implementation             **
**                                                                          **
**  **********************************************************************  */

package org.rssowl.ui.internal.notifier;

import org.eclipse.jface.resource.ResourceManager;
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.rssowl.ui.internal.OwlUI;

/**
* Helper Class to create the colors for the Notifier.
* <p>
* Note: Copied from FormColors of UI Forms.
* </p>
*
* @author bpasero
*/
public class NotifierColors {
  private Display fDisplay;
  private Color fGradientBegin;
  private Color fGradientEnd;
  private Color fBorder;
  private ResourceManager fResources;

  NotifierColors(Display display, ResourceManager resources) {
    fDisplay = display;
    fResources = resources;

    createColors();
  }

  private void createColors() {

    /* Notifier Border */
    createBorderColor();

    /* Notifier Gradient */
    createGradientColors();
  }

  Color getGradientBegin() {
    return fGradientBegin;
  }

  Color getGradientEnd() {
    return fGradientEnd;
  }

  Color getBorder() {
    return fBorder;
  }

  private void createBorderColor() {
    RGB tbBorder = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
    RGB bg = getImpliedBackground().getRGB();

    // Group 1
    // Rule: If at least 2 of the RGB values are equal to or between 180 and
    // 255, then apply specified opacity for Group 1
    // Examples: Vista, XP Silver, Wn High Con #2
    // Keyline = TITLE_BACKGROUND @ 70% Opacity over LIST_BACKGROUND
    if (testTwoPrimaryColors(tbBorder, 179, 256))
      tbBorder = blend(tbBorder, bg, 70);

    // Group 2
    // Rule: If at least 2 of the RGB values are equal to or between 121 and
    // 179, then apply specified opacity for Group 2
    // Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
    // Keyline = TITLE_BACKGROUND @ 50% Opacity over LIST_BACKGROUND
    else if (testTwoPrimaryColors(tbBorder, 120, 180))
      tbBorder = blend(tbBorder, bg, 50);

    // Group 3
    // Rule: Everything else
    // Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
    // Aqua, Wn High Con White, Wn High Con #1
    // Keyline = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
    else {
      tbBorder = blend(tbBorder, bg, 30);
    }

    fBorder = OwlUI.getColor(fResources, tbBorder);
  }

  private void createGradientColors() {
    RGB titleBg = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
    Color bgColor = getImpliedBackground();
    RGB bg = bgColor.getRGB();
    RGB bottom, top;

    // Group 1
    // Rule: If at least 2 of the RGB values are equal to or between 180 and
    // 255, then apply specified opacity for Group 1
    // Examples: Vista, XP Silver, Wn High Con #2
    // Gradient Bottom = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
    // Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
    if (testTwoPrimaryColors(titleBg, 179, 256)) {
      bottom = blend(titleBg, bg, 30);
      top = bg;
    }

    // Group 2
    // Rule: If at least 2 of the RGB values are equal to or between 121 and
    // 179, then apply specified opacity for Group 2
    // Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
    // Gradient Bottom = TITLE_BACKGROUND @ 20% Opacity over LIST_BACKGROUND
    // Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
    else if (testTwoPrimaryColors(titleBg, 120, 180)) {
      bottom = blend(titleBg, bg, 20);
      top = bg;
    }

    // Group 3
    // Rule: If at least 2 of the RGB values are equal to or between 0 and
    // 120, then apply specified opacity for Group 3
    // Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
    // Aqua, Wn High Con White, Wn High Con #1
    // Gradient Bottom = TITLE_BACKGROUND @ 10% Opacity over LIST_BACKGROUND
    // Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
    else {
      bottom = blend(titleBg, bg, 10);
      top = bg;
    }

    fGradientBegin = OwlUI.getColor(fResources, top);
    fGradientEnd = OwlUI.getColor(fResources, bottom);
  }

  private RGB blend(RGB c1, RGB c2, int ratio) {
    int r = blend(c1.red, c2.red, ratio);
    int g = blend(c1.green, c2.green, ratio);
    int b = blend(c1.blue, c2.blue, ratio);
    return new RGB(r, g, b);
  }

  private int blend(int v1, int v2, int ratio) {
    int b = (ratio * v1 + (100 - ratio) * v2) / 100;
    return Math.min(255, b);
  }

  private boolean testTwoPrimaryColors(RGB rgb, int from, int to) {
    int total = 0;
    if (testPrimaryColor(rgb.red, from, to))
      total++;
    if (testPrimaryColor(rgb.green, from, to))
      total++;
    if (testPrimaryColor(rgb.blue, from, to))
      total++;
    return total >= 2;
  }

  private boolean testPrimaryColor(int value, int from, int to) {
    return value > from && value < to;
  }

  private RGB getSystemColor(int code) {
    return getDisplay().getSystemColor(code).getRGB();
  }

  private Color getImpliedBackground() {
    return fDisplay.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
  }

  private Display getDisplay() {
    return fDisplay;
  }
}
TOP

Related Classes of org.rssowl.ui.internal.notifier.NotifierColors

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.