blob: dc4ef095d187084eee8f57db37f0543448107d94 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2008, 2018 Intel Corporation, Ericsson
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Intel Corporation - Initial API and implementation
* Ruslan A. Scherbakov, Intel - Initial API and implementation
* Alvaro Sanchez-Leon - Updated for TMF
* Patrick Tasse - Refactoring
*****************************************************************************/
package org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGBA;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
/**
* Color theme used by the timegraph view
*
* @version 1.0
* @author Patrick Tasse
*/
@SuppressWarnings("javadoc")
public class TimeGraphColorScheme {
// Theme Color IDs
private static final String THEME_BACKGROUND = "org.eclipse.tracecompass.tmf.ui.BACKGROUND"; //$NON-NLS-1$
private static final String THEME_FOREGROUND = "org.eclipse.tracecompass.tmf.ui.FOREGROUND"; //$NON-NLS-1$
private static final String THEME_BACKGROUND_SEL = "org.eclipse.tracecompass.tmf.ui.BACKGROUND_SEL"; //$NON-NLS-1$
private static final String THEME_FOREGROUND_SEL = "org.eclipse.tracecompass.tmf.ui.FOREGROUND_SEL"; //$NON-NLS-1$
private static final String THEME_TOOL_BACKGROUND = "org.eclipse.tracecompass.tmf.ui.TOOL_BACKGROUND"; //$NON-NLS-1$
private static final String THEME_TOOL_FOREGROUND = "org.eclipse.tracecompass.tmf.ui.TOOL_FOREGROUND"; //$NON-NLS-1$
// elements color indices
public static final int BLACK_STATE = 0;
public static final int GREEN_STATE = 1;
public static final int DARK_BLUE_STATE = 2;
public static final int ORANGE_STATE = 3;
public static final int GOLD_STATE = 4;
public static final int RED_STATE = 5;
public static final int GRAY_STATE = 6;
public static final int DARK_GREEN_STATE = 7;
public static final int DARK_YELLOW_STATE = 8;
public static final int MAGENTA3_STATE = 9;
public static final int PURPLE1_STATE = 10;
public static final int PINK1_STATE = 11;
public static final int AQUAMARINE_STATE = 12;
public static final int LIGHT_BLUE_STATE = 13;
public static final int CADET_BLUE_STATE = 14;
public static final int OLIVE_STATE = 15;
public static final int STATES0 = 0;
public static final int STATES1 = 15;
// selected state elements color indices
public static final int BLACK_STATE_SEL = 16;
public static final int GREEN_STATE_SEL = 17;
public static final int DARK_BLUE_STATE_SEL = 18;
public static final int ORANGE_STATE_SEL = 19;
public static final int GOLD_STATE_SEL = 20;
public static final int RED_STATE_SEL = 21;
public static final int GRAY_STATE_SEL = 22;
public static final int DARK_GREEN_STATE_SEL = 23;
public static final int DARK_YELLOW_STATE_SEL = 24;
public static final int MAGENTA3_STATE_SEL = 25;
public static final int PURPLE1_STATE_SEL = 26;
public static final int PINK1_STATE_SEL = 27;
public static final int AQUAMARINE_STATE_SEL = 28;
public static final int LIGHT_BLUE_STATE_SEL = 29;
public static final int CADET_BLUE_STATE_SEL = 30;
public static final int OLIVE_STATE_SEL = 31;
public static final int STATES_SEL0 = 16;
public static final int STATES_SEL1 = 31;
// colors indices for viewer controls
public static final int BACKGROUND = 32;
public static final int FOREGROUND = 33;
public static final int BACKGROUND_SEL = 34;
public static final int FOREGROUND_SEL = 35;
public static final int BACKGROUND_SEL_NOFOCUS = 36;
public static final int FOREGROUND_SEL_NOFOCUS = 37;
public static final int TOOL_BACKGROUND = 38;
public static final int TOOL_FOREGROUND = 39;
// misc colors
public static final int FIX_COLOR = 40;
public static final int WHITE = 41;
public static final int GRAY = 42;
public static final int BLACK = 43;
public static final int DARK_GRAY = 44;
// selected border color indices
public static final int BLACK_BORDER = 45;
public static final int GREEN_BORDER = 46;
public static final int DARK_BLUE_BORDER = 47;
public static final int ORANGE_BORDER = 48;
public static final int GOLD_BORDER = 49;
public static final int RED_BORDER = 50;
public static final int GRAY_BORDER = 51;
public static final int DARK_GREEN_BORDER1 = 52;
public static final int DARK_YELLOW_BORDER1 = 53;
public static final int MAGENTA3_BORDER1 = 54;
public static final int PURPLE1_BORDER1 = 55;
public static final int PINK1_BORDER1 = 56;
public static final int AQUAMARINE_BORDER1 = 57;
public static final int LIGHT_BLUE_BORDER1 = 58;
public static final int CADET_BLUE_STATE_BORDER = 59;
public static final int OLIVE_BORDER2 = 60;
public static final int STATES_BORDER0 = 45;
public static final int STATES_BORDER1 = 60;
public static final int MID_LINE = 61;
public static final int RED = 62;
public static final int GREEN = 63;
public static final int BLUE = 64;
public static final int YELLOW = 65;
public static final int CYAN = 66;
public static final int MAGENTA = 67;
public static final int SELECTED_TIME = 68;
public static final int LEGEND_BACKGROUND = 69;
public static final int LEGEND_FOREGROUND = 70;
// group items' colors
public static final int GR_BACKGROUND = 71;
public static final int GR_FOREGROUND = 72;
public static final int GR_BACKGROUND_SEL = 73;
public static final int GR_FOREGROUND_SEL = 74;
public static final int GR_BACKGROUND_SEL_NOFOCUS = 75;
public static final int GR_FOREGROUND_SEL_NOFOCUS = 76;
public static final int LIGHT_LINE = 77;
public static final int BACKGROUND_NAME = 78;
public static final int BACKGROUND_NAME_SEL = 79;
public static final int BACKGROUND_NAME_SEL_NOFOCUS = 80;
// Interraction's colors
public static final int TI_START_THREAD = BLACK;
public static final int TI_HANDOFF_LOCK = BLUE;
public static final int TI_NOTIFY_ALL = GREEN;
public static final int TI_NOTIFY = GREEN;
public static final int TI_NOTIFY_JOINED = DARK_GRAY;
public static final int TI_INTERRUPT = RED;
public static final int TI_WAIT_EXCEEDED = BLUE;
interface IColorProvider {
Color get();
}
static class SysCol implements IColorProvider {
private int syscol;
SysCol(int syscol) {
this.syscol = syscol;
}
@Override
public Color get() {
return Utils.getSysColor(syscol);
}
}
static class RGB implements IColorProvider {
private int r;
private int g;
private int b;
RGB(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
}
@Override
public Color get() {
return new Color(null, r, g, b);
}
}
static class ThemeColor implements IColorProvider {
private int syscol;
private String themeColorName;
ThemeColor(int syscol, String themeColorName) {
this.syscol = syscol;
this.themeColorName = themeColorName;
}
@Override
public Color get() {
ColorRegistry colorRegistry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry();
Color c = colorRegistry.get(themeColorName);
if (c != null) {
org.eclipse.swt.graphics.RGB rgb = c.getRGB();
return new Color(null, rgb.red, rgb.green, rgb.blue);
}
return Utils.getSysColor(syscol);
}
}
static class Mix implements IColorProvider {
private IColorProvider cp1;
private IColorProvider cp2;
private int w1;
private int w2;
Mix(IColorProvider cp1, IColorProvider cp2, int w1, int w2) {
this.cp1 = cp1;
this.cp2 = cp2;
this.w1 = w1;
this.w2 = w2;
}
Mix(IColorProvider cp1, IColorProvider cp2) {
this.cp1 = cp1;
this.cp2 = cp2;
this.w1 = 1;
this.w2 = 1;
}
@Override
public Color get() {
Color col1 = cp1.get();
Color col2 = cp2.get();
return Utils.mixColors(col1, col2, w1, w2);
}
}
private static final IColorProvider PROVIDERS_MAP[] = {
//
new RGB(100, 100, 100), // UNKNOWN
new RGB(174, 200, 124), // RUNNING
new Mix(new SysCol(SWT.COLOR_BLUE), new SysCol(SWT.COLOR_GRAY), 1, 3), // SLEEPING
new RGB(210, 150, 60), // WAITING
new RGB(242, 225, 168), // BLOCKED
new Mix(new SysCol(SWT.COLOR_RED), new SysCol(SWT.COLOR_GRAY), 1, 3), // DEADLOCK
new RGB(200, 200, 200), // STOPPED
new RGB(35, 107, 42), // STEEL BLUE
new RGB(205,205,0), // DARK YELLOW
new RGB(205, 0, 205), // MAGENTA
new RGB(171, 130, 255), // PURPLE
new RGB(255, 181, 197), // PINK
new RGB(112, 219, 147), // AQUAMARINE
new RGB(198, 226, 255), // SLATEGRAY
new RGB(95, 158, 160), // CADET BLUE
new RGB(107, 142, 35), // OLIVE
//TODO: Does not seem to be used, check during clean-up
new SysCol(SWT.COLOR_WHITE), // UNKNOWN_SEL
new SysCol(SWT.COLOR_GREEN), // RUNNING_SEL
new SysCol(SWT.COLOR_BLUE), // SLEEPING_SEL
new SysCol(SWT.COLOR_CYAN), // WAITING_SEL
new SysCol(SWT.COLOR_YELLOW), // BLOCKED_SEL
new SysCol(SWT.COLOR_RED), // DEADLOCK_SEL
new SysCol(SWT.COLOR_DARK_GRAY), // STOPPED_SEL
new SysCol(SWT.COLOR_WHITE),
new SysCol(SWT.COLOR_GREEN),
new SysCol(SWT.COLOR_BLUE),
new SysCol(SWT.COLOR_CYAN),
new SysCol(SWT.COLOR_YELLOW),
new SysCol(SWT.COLOR_RED),
new SysCol(SWT.COLOR_DARK_GRAY),
new SysCol(SWT.COLOR_WHITE),
new SysCol(SWT.COLOR_GREEN),
new ThemeColor(SWT.COLOR_LIST_BACKGROUND, THEME_BACKGROUND), // BACKGROUND
new ThemeColor(SWT.COLOR_LIST_FOREGROUND, THEME_FOREGROUND), // FOREGROUND
new RGB(232, 242, 254), // BACKGROUND_SEL
new ThemeColor(SWT.COLOR_LIST_FOREGROUND, THEME_FOREGROUND_SEL), // FOREGROUND_SEL
new ThemeColor(SWT.COLOR_WIDGET_BACKGROUND, THEME_BACKGROUND_SEL), // BACKGROUND_SEL_NOFOCUS
new ThemeColor(SWT.COLOR_WIDGET_DARK_SHADOW, THEME_FOREGROUND_SEL), // BACKGROUND_SEL_NOFOCUS
new ThemeColor(SWT.COLOR_WIDGET_BACKGROUND, THEME_TOOL_BACKGROUND), // TOOL_BACKGROUND
new ThemeColor(SWT.COLOR_WIDGET_DARK_SHADOW, THEME_TOOL_FOREGROUND), // TOOL_FOREGROUND
new SysCol(SWT.COLOR_GRAY), // FIX_COLOR
new SysCol(SWT.COLOR_WHITE), // WHITE
new SysCol(SWT.COLOR_GRAY), // GRAY
new SysCol(SWT.COLOR_BLACK), // BLACK
new SysCol(SWT.COLOR_DARK_GRAY), // DARK_GRAY
new SysCol(SWT.COLOR_DARK_GRAY), // BLACK_BORDER
new RGB(75, 115, 120), // GREEN_BORDER
new SysCol(SWT.COLOR_DARK_BLUE), // DARK_BLUE_BORDER
new RGB(242, 225, 168), // ORANGE_BORDER
new RGB(210, 150, 60), // GOLD_BORDER
new SysCol(SWT.COLOR_DARK_RED), // RED_BORDER
new SysCol(SWT.COLOR_BLACK), // GRAY_BORDER
new SysCol(SWT.COLOR_DARK_GRAY), // DARK_GREEN_BORDER
new RGB(75, 115, 120), // DARK_YELLOW_BORDER
new SysCol(SWT.COLOR_DARK_BLUE), // MAGENTA3_BORDER
new RGB(242, 225, 168), // PURPLE1_BORDER
new RGB(210, 150, 60), // PINK1_BORDER
new SysCol(SWT.COLOR_DARK_RED), // AQUAMARINE_BORDER
new SysCol(SWT.COLOR_BLACK), // LIGHT_BLUE_BORDER
new SysCol(SWT.COLOR_DARK_GRAY), // BLUE_BORDER
new RGB(75, 115, 120), // OLIVE_BORDER
new SysCol(SWT.COLOR_GRAY), // MID_LINE
new SysCol(SWT.COLOR_RED), // RED
new SysCol(SWT.COLOR_GREEN), // GREEN
new SysCol(SWT.COLOR_BLUE), // BLUE
new SysCol(SWT.COLOR_YELLOW), // YELLOW
new SysCol(SWT.COLOR_CYAN), // CYAN
new SysCol(SWT.COLOR_MAGENTA), // MAGENTA
new SysCol(SWT.COLOR_BLUE), // SELECTED_TIME
new SysCol(SWT.COLOR_WIDGET_BACKGROUND), // LEGEND_BACKGROUND
new SysCol(SWT.COLOR_WIDGET_DARK_SHADOW), // LEGEND_FOREGROUND
new Mix(new SysCol(SWT.COLOR_GRAY), new ThemeColor(SWT.COLOR_LIST_BACKGROUND, THEME_BACKGROUND)), // GR_BACKGROUND
new ThemeColor(SWT.COLOR_LIST_FOREGROUND, THEME_FOREGROUND), // GR_FOREGROUND
new Mix(new SysCol(SWT.COLOR_GRAY), new RGB(232, 242, 254)), // GR_BACKGROUND_SEL
new ThemeColor(SWT.COLOR_LIST_FOREGROUND, THEME_FOREGROUND), // GR_FOREGROUND_SEL
new Mix(new SysCol(SWT.COLOR_GRAY), new ThemeColor(SWT.COLOR_LIST_BACKGROUND, THEME_BACKGROUND)), // GR_BACKGROUND_SEL_NOFOCUS
new ThemeColor(SWT.COLOR_LIST_FOREGROUND, THEME_FOREGROUND),// GR_FOREGROUND_SEL_NOFOCUS
new Mix(new SysCol(SWT.COLOR_GRAY), new SysCol(SWT.COLOR_LIST_BACKGROUND), 1, 3), // LIGHT_LINE
new Mix(new SysCol(SWT.COLOR_GRAY), new SysCol(SWT.COLOR_LIST_BACKGROUND), 1, 6), // BACKGROUND_NAME
new Mix(new SysCol(SWT.COLOR_GRAY), new RGB(232, 242, 254), 1, 6), // BACKGROUND_NAME_SEL
new Mix(new SysCol(SWT.COLOR_GRAY), new SysCol(SWT.COLOR_WIDGET_BACKGROUND), 1, 6), // BACKGROUND_NAME_SEL_NOFOCUS
};
/** Fixed scheme colors */
private final Color fColors[];
/** Dynamic RGBA to Color map */
private final Map<RGBA, Color> fColorMap;
/**
* Default constructor
*/
public TimeGraphColorScheme() {
fColors = new Color[PROVIDERS_MAP.length];
fColorMap = new HashMap<>();
}
/**
* Dispose this color scheme
*/
public void dispose() {
for (int i = 0; i < fColors.length; i++) {
Utils.dispose(fColors[i]);
fColors[i] = null;
}
for (Color color : fColorMap.values()) {
color.dispose();
}
}
/**
* Get the color matching the given index
*
* @param idx
* The index
* @return The matching color
*/
public Color getColor(int idx) {
if (null == fColors[idx]) {
if (idx >= STATES_SEL0 && idx <= STATES_SEL1) {
Color col1 = getColor(idx - STATES_SEL0);
Color col2 = getColor(BACKGROUND_SEL);
fColors[idx] = Utils.mixColors(col1, col2, 3, 1);
} else {
fColors[idx] = PROVIDERS_MAP[idx].get();
}
}
return fColors[idx];
}
/**
* Get an entry's background color based on its status.
*
* @param selected
* If the entry is selected
* @param focused
* If the entry is focused
* @param name
* Get the color of the name column (false for other columns)
* @return The matching color
*/
public Color getBkColor(boolean selected, boolean focused, boolean name) {
if (name) {
if (selected && focused) {
return getColor(BACKGROUND_NAME_SEL);
}
if (selected) {
return getColor(BACKGROUND_NAME_SEL_NOFOCUS);
}
return getColor(BACKGROUND_NAME);
}
if (selected && focused) {
return getColor(BACKGROUND_SEL);
}
if (selected) {
return getColor(BACKGROUND_SEL_NOFOCUS);
}
return getColor(BACKGROUND);
}
/**
* Get the correct foreground color
*
* @param selected
* Is the entry selected
* @param focused
* Is the entry focused
* @return The matching color
*/
public Color getFgColor(boolean selected, boolean focused) {
if (selected && focused) {
return getColor(FOREGROUND_SEL);
}
if (selected) {
return getColor(FOREGROUND_SEL_NOFOCUS);
}
return getColor(FOREGROUND);
}
/**
* Get the correct background color group
*
* @param selected
* Is the entry selected
* @param focused
* Is the entry focused
* @return The matching color
*/
public Color getBkColorGroup(boolean selected, boolean focused) {
if (selected && focused) {
return getColor(GR_BACKGROUND_SEL);
}
if (selected) {
return getColor(GR_BACKGROUND_SEL_NOFOCUS);
}
return getColor(GR_BACKGROUND);
}
/**
* Get the correct foreground color group
*
* @param selected
* Is the entry selected
* @param focused
* Is the entry focused
* @return The matching color
*/
public Color getFgColorGroup(boolean selected, boolean focused) {
if (selected && focused) {
return getColor(GR_FOREGROUND_SEL);
}
if (selected) {
return getColor(GR_FOREGROUND_SEL_NOFOCUS);
}
return getColor(GR_FOREGROUND);
}
/**
* Get a color resource for the specified RGBA color descriptor
*
* @param rgba
* the color descriptor
* @return a color resource
* @since 2.0
*/
public Color getColor(RGBA rgba) {
return fColorMap.computeIfAbsent(rgba, colorRgba -> new Color(Display.getDefault(), colorRgba));
}
}