1 /*****************************************************************************
2 * Copyright (c) 2008, 2016 Intel Corporation, Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * Intel Corporation - Initial API and implementation
10 * Ruslan A. Scherbakov, Intel - Initial API and implementation
11 * Alvaro Sanchez-Leon - Updated for TMF
12 * Patrick Tasse - Refactoring
13 *****************************************************************************/
15 package org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.widgets
;
17 import java
.util
.HashMap
;
20 import org
.eclipse
.swt
.SWT
;
21 import org
.eclipse
.swt
.graphics
.Color
;
22 import org
.eclipse
.swt
.graphics
.RGBA
;
23 import org
.eclipse
.swt
.widgets
.Display
;
26 * Color theme used by the timegraph view
29 * @author Patrick Tasse
31 @SuppressWarnings("javadoc")
32 public class TimeGraphColorScheme
{
34 // elements color indices
35 public static final int BLACK_STATE
= 0;
36 public static final int GREEN_STATE
= 1;
37 public static final int DARK_BLUE_STATE
= 2;
38 public static final int ORANGE_STATE
= 3;
39 public static final int GOLD_STATE
= 4;
40 public static final int RED_STATE
= 5;
41 public static final int GRAY_STATE
= 6;
42 public static final int DARK_GREEN_STATE
= 7;
43 public static final int DARK_YELLOW_STATE
= 8;
44 public static final int MAGENTA3_STATE
= 9;
45 public static final int PURPLE1_STATE
= 10;
46 public static final int PINK1_STATE
= 11;
47 public static final int AQUAMARINE_STATE
= 12;
48 public static final int LIGHT_BLUE_STATE
= 13;
49 public static final int CADET_BLUE_STATE
= 14;
50 public static final int OLIVE_STATE
= 15;
52 public static final int STATES0
= 0;
53 public static final int STATES1
= 15;
55 // selected state elements color indices
56 public static final int BLACK_STATE_SEL
= 16;
57 public static final int GREEN_STATE_SEL
= 17;
58 public static final int DARK_BLUE_STATE_SEL
= 18;
59 public static final int ORANGE_STATE_SEL
= 19;
60 public static final int GOLD_STATE_SEL
= 20;
61 public static final int RED_STATE_SEL
= 21;
62 public static final int GRAY_STATE_SEL
= 22;
63 public static final int DARK_GREEN_STATE_SEL
= 23;
64 public static final int DARK_YELLOW_STATE_SEL
= 24;
65 public static final int MAGENTA3_STATE_SEL
= 25;
66 public static final int PURPLE1_STATE_SEL
= 26;
67 public static final int PINK1_STATE_SEL
= 27;
68 public static final int AQUAMARINE_STATE_SEL
= 28;
69 public static final int LIGHT_BLUE_STATE_SEL
= 29;
70 public static final int CADET_BLUE_STATE_SEL
= 30;
71 public static final int OLIVE_STATE_SEL
= 31;
73 public static final int STATES_SEL0
= 16;
74 public static final int STATES_SEL1
= 31;
76 // colors indices for viewer controls
77 public static final int BACKGROUND
= 32;
78 public static final int FOREGROUND
= 33;
79 public static final int BACKGROUND_SEL
= 34;
80 public static final int FOREGROUND_SEL
= 35;
81 public static final int BACKGROUND_SEL_NOFOCUS
= 36;
82 public static final int FOREGROUND_SEL_NOFOCUS
= 37;
83 public static final int TOOL_BACKGROUND
= 38;
84 public static final int TOOL_FOREGROUND
= 39;
87 public static final int FIX_COLOR
= 40;
88 public static final int WHITE
= 41;
89 public static final int GRAY
= 42;
90 public static final int BLACK
= 43;
91 public static final int DARK_GRAY
= 44;
93 // selected border color indices
94 public static final int BLACK_BORDER
= 45;
95 public static final int GREEN_BORDER
= 46;
96 public static final int DARK_BLUE_BORDER
= 47;
97 public static final int ORANGE_BORDER
= 48;
98 public static final int GOLD_BORDER
= 49;
99 public static final int RED_BORDER
= 50;
100 public static final int GRAY_BORDER
= 51;
101 public static final int DARK_GREEN_BORDER1
= 52;
102 public static final int DARK_YELLOW_BORDER1
= 53;
103 public static final int MAGENTA3_BORDER1
= 54;
104 public static final int PURPLE1_BORDER1
= 55;
105 public static final int PINK1_BORDER1
= 56;
106 public static final int AQUAMARINE_BORDER1
= 57;
107 public static final int LIGHT_BLUE_BORDER1
= 58;
108 public static final int CADET_BLUE_STATE_BORDER
= 59;
109 public static final int OLIVE_BORDER2
= 60;
111 public static final int STATES_BORDER0
= 45;
112 public static final int STATES_BORDER1
= 60;
114 public static final int MID_LINE
= 61;
115 public static final int RED
= 62;
116 public static final int GREEN
= 63;
117 public static final int BLUE
= 64;
118 public static final int YELLOW
= 65;
119 public static final int CYAN
= 66;
120 public static final int MAGENTA
= 67;
122 public static final int SELECTED_TIME
= 68;
123 public static final int LEGEND_BACKGROUND
= 69;
124 public static final int LEGEND_FOREGROUND
= 70;
126 // group items' colors
127 public static final int GR_BACKGROUND
= 71;
128 public static final int GR_FOREGROUND
= 72;
129 public static final int GR_BACKGROUND_SEL
= 73;
130 public static final int GR_FOREGROUND_SEL
= 74;
131 public static final int GR_BACKGROUND_SEL_NOFOCUS
= 75;
132 public static final int GR_FOREGROUND_SEL_NOFOCUS
= 76;
134 public static final int LIGHT_LINE
= 77;
135 public static final int BACKGROUND_NAME
= 78;
136 public static final int BACKGROUND_NAME_SEL
= 79;
137 public static final int BACKGROUND_NAME_SEL_NOFOCUS
= 80;
139 // Interraction's colors
140 public static final int TI_START_THREAD
= BLACK
;
141 public static final int TI_HANDOFF_LOCK
= BLUE
;
142 public static final int TI_NOTIFY_ALL
= GREEN
;
143 public static final int TI_NOTIFY
= GREEN
;
144 public static final int TI_NOTIFY_JOINED
= DARK_GRAY
;
145 public static final int TI_INTERRUPT
= RED
;
146 public static final int TI_WAIT_EXCEEDED
= BLUE
;
148 interface IColorProvider
{
152 static class SysCol
implements IColorProvider
{
156 this.syscol
= syscol
;
161 return Utils
.getSysColor(syscol
);
165 static class RGB
implements IColorProvider
{
170 RGB(int r
, int g
, int b
) {
178 return new Color(null, r
, g
, b
);
182 static class Mix
implements IColorProvider
{
183 private IColorProvider cp1
;
184 private IColorProvider cp2
;
188 Mix(IColorProvider cp1
, IColorProvider cp2
, int w1
, int w2
) {
195 Mix(IColorProvider cp1
, IColorProvider cp2
) {
204 Color col1
= cp1
.get();
205 Color col2
= cp2
.get();
206 return Utils
.mixColors(col1
, col2
, w1
, w2
);
210 private static final IColorProvider PROVIDERS_MAP
[] = {
212 new RGB(100, 100, 100), // UNKNOWN
213 new RGB(174, 200, 124), // RUNNING
214 new Mix(new SysCol(SWT
.COLOR_BLUE
), new SysCol(SWT
.COLOR_GRAY
), 1, 3), // SLEEPING
215 new RGB(210, 150, 60), // WAITING
216 new RGB(242, 225, 168), // BLOCKED
217 new Mix(new SysCol(SWT
.COLOR_RED
), new SysCol(SWT
.COLOR_GRAY
), 1, 3), // DEADLOCK
218 new RGB(200, 200, 200), // STOPPED
219 new RGB(35, 107, 42), // STEEL BLUE
220 new RGB(205,205,0), // DARK YELLOW
221 new RGB(205, 0, 205), // MAGENTA
222 new RGB(171, 130, 255), // PURPLE
223 new RGB(255, 181, 197), // PINK
224 new RGB(112, 219, 147), // AQUAMARINE
225 new RGB(198, 226, 255), // SLATEGRAY
226 new RGB(95, 158, 160), // CADET BLUE
227 new RGB(107, 142, 35), // OLIVE
230 //TODO: Does not seem to be used, check during clean-up
231 new SysCol(SWT
.COLOR_WHITE
), // UNKNOWN_SEL
232 new SysCol(SWT
.COLOR_GREEN
), // RUNNING_SEL
233 new SysCol(SWT
.COLOR_BLUE
), // SLEEPING_SEL
234 new SysCol(SWT
.COLOR_CYAN
), // WAITING_SEL
235 new SysCol(SWT
.COLOR_YELLOW
), // BLOCKED_SEL
236 new SysCol(SWT
.COLOR_RED
), // DEADLOCK_SEL
237 new SysCol(SWT
.COLOR_DARK_GRAY
), // STOPPED_SEL
238 new SysCol(SWT
.COLOR_WHITE
),
239 new SysCol(SWT
.COLOR_GREEN
),
240 new SysCol(SWT
.COLOR_BLUE
),
241 new SysCol(SWT
.COLOR_CYAN
),
242 new SysCol(SWT
.COLOR_YELLOW
),
243 new SysCol(SWT
.COLOR_RED
),
244 new SysCol(SWT
.COLOR_DARK_GRAY
),
245 new SysCol(SWT
.COLOR_WHITE
),
246 new SysCol(SWT
.COLOR_GREEN
),
249 new SysCol(SWT
.COLOR_LIST_BACKGROUND
), // BACKGROUND
250 new SysCol(SWT
.COLOR_LIST_FOREGROUND
), // FOREGROUND
251 new RGB(232, 242, 254), // BACKGROUND_SEL
252 new SysCol(SWT
.COLOR_LIST_FOREGROUND
), // FOREGROUND_SEL
253 new SysCol(SWT
.COLOR_WIDGET_BACKGROUND
), // BACKGROUND_SEL_NOFOCUS
254 new SysCol(SWT
.COLOR_WIDGET_FOREGROUND
), // FOREGROUND_SEL_NOFOCUS
255 new SysCol(SWT
.COLOR_WIDGET_BACKGROUND
), // TOOL_BACKGROUND
256 new SysCol(SWT
.COLOR_WIDGET_DARK_SHADOW
), // TOOL_FOREGROUND
258 new SysCol(SWT
.COLOR_GRAY
), // FIX_COLOR
259 new SysCol(SWT
.COLOR_WHITE
), // WHITE
260 new SysCol(SWT
.COLOR_GRAY
), // GRAY
261 new SysCol(SWT
.COLOR_BLACK
), // BLACK
262 new SysCol(SWT
.COLOR_DARK_GRAY
), // DARK_GRAY
264 new SysCol(SWT
.COLOR_DARK_GRAY
), // BLACK_BORDER
265 new RGB(75, 115, 120), // GREEN_BORDER
266 new SysCol(SWT
.COLOR_DARK_BLUE
), // DARK_BLUE_BORDER
267 new RGB(242, 225, 168), // ORANGE_BORDER
268 new RGB(210, 150, 60), // GOLD_BORDER
269 new SysCol(SWT
.COLOR_DARK_RED
), // RED_BORDER
270 new SysCol(SWT
.COLOR_BLACK
), // GRAY_BORDER
271 new SysCol(SWT
.COLOR_DARK_GRAY
), // DARK_GREEN_BORDER
272 new RGB(75, 115, 120), // DARK_YELLOW_BORDER
273 new SysCol(SWT
.COLOR_DARK_BLUE
), // MAGENTA3_BORDER
274 new RGB(242, 225, 168), // PURPLE1_BORDER
275 new RGB(210, 150, 60), // PINK1_BORDER
276 new SysCol(SWT
.COLOR_DARK_RED
), // AQUAMARINE_BORDER
277 new SysCol(SWT
.COLOR_BLACK
), // LIGHT_BLUE_BORDER
278 new SysCol(SWT
.COLOR_DARK_GRAY
), // BLUE_BORDER
279 new RGB(75, 115, 120), // OLIVE_BORDER
282 new SysCol(SWT
.COLOR_GRAY
), // MID_LINE
283 new SysCol(SWT
.COLOR_RED
), // RED
284 new SysCol(SWT
.COLOR_GREEN
), // GREEN
285 new SysCol(SWT
.COLOR_BLUE
), // BLUE
286 new SysCol(SWT
.COLOR_YELLOW
), // YELLOW
287 new SysCol(SWT
.COLOR_CYAN
), // CYAN
288 new SysCol(SWT
.COLOR_MAGENTA
), // MAGENTA
290 new SysCol(SWT
.COLOR_BLUE
), // SELECTED_TIME
291 new SysCol(SWT
.COLOR_WIDGET_BACKGROUND
), // LEGEND_BACKGROUND
292 new SysCol(SWT
.COLOR_WIDGET_DARK_SHADOW
), // LEGEND_FOREGROUND
294 new Mix(new RGB(150, 200, 240), new SysCol(SWT
.COLOR_LIST_BACKGROUND
)), // GR_BACKGROUND
295 new RGB(0, 0, 50), // GR_FOREGROUND
296 new Mix(new RGB(150, 200, 240), new SysCol(SWT
.COLOR_WHITE
), 6, 1), // GR_BACKGROUND_SEL
297 new RGB(0, 0, 50), // GR_FOREGROUND_SEL
298 new Mix(new RGB(150, 200, 240), new SysCol(SWT
.COLOR_WHITE
), 6, 1), // GR_BACKGROUND_SEL_NOFOCUS
299 new RGB(0, 0, 50), // GR_FOREGROUND_SEL_NOFOCUS
301 new Mix(new SysCol(SWT
.COLOR_GRAY
), new SysCol(SWT
.COLOR_LIST_BACKGROUND
), 1, 3), // LIGHT_LINE
303 new Mix(new SysCol(SWT
.COLOR_GRAY
), new SysCol(SWT
.COLOR_LIST_BACKGROUND
), 1, 6), // BACKGROUND_NAME
304 new Mix(new SysCol(SWT
.COLOR_GRAY
), new RGB(232, 242, 254), 1, 6), // BACKGROUND_NAME_SEL
305 new Mix(new SysCol(SWT
.COLOR_GRAY
), new SysCol(SWT
.COLOR_WIDGET_BACKGROUND
), 1, 6), // BACKGROUND_NAME_SEL_NOFOCUS
308 /** Fixed scheme colors */
309 private final Color fColors
[];
310 /** Dynamic RGBA to Color map */
311 private final Map
<RGBA
, Color
> fColorMap
;
314 * Default constructor
316 public TimeGraphColorScheme() {
317 fColors
= new Color
[PROVIDERS_MAP
.length
];
318 fColorMap
= new HashMap
<>();
322 * Dispose this color scheme
324 public void dispose() {
325 for (int i
= 0; i
< fColors
.length
; i
++) {
326 Utils
.dispose(fColors
[i
]);
329 for (Color color
: fColorMap
.values()) {
335 * Get the color matching the given index
339 * @return The matching color
341 public Color
getColor(int idx
) {
342 if (null == fColors
[idx
]) {
343 if (idx
>= STATES_SEL0
&& idx
<= STATES_SEL1
) {
344 Color col1
= getColor(idx
- STATES_SEL0
);
345 Color col2
= getColor(BACKGROUND_SEL
);
346 fColors
[idx
] = Utils
.mixColors(col1
, col2
, 3, 1);
348 fColors
[idx
] = PROVIDERS_MAP
[idx
].get();
355 * Get an entry's background color based on its status.
358 * If the entry is selected
360 * If the entry is focused
362 * Get the color of the name column (false for other columns)
363 * @return The matching color
365 public Color
getBkColor(boolean selected
, boolean focused
, boolean name
) {
367 if (selected
&& focused
) {
368 return getColor(BACKGROUND_NAME_SEL
);
371 return getColor(BACKGROUND_NAME_SEL_NOFOCUS
);
373 return getColor(BACKGROUND_NAME
);
375 if (selected
&& focused
) {
376 return getColor(BACKGROUND_SEL
);
379 return getColor(BACKGROUND_SEL_NOFOCUS
);
381 return getColor(BACKGROUND
);
385 * Get the correct foreground color
388 * Is the entry selected
390 * Is the entry focused
391 * @return The matching color
393 public Color
getFgColor(boolean selected
, boolean focused
) {
394 if (selected
&& focused
) {
395 return getColor(FOREGROUND_SEL
);
398 return getColor(FOREGROUND_SEL_NOFOCUS
);
400 return getColor(FOREGROUND
);
404 * Get the correct background color group
407 * Is the entry selected
409 * Is the entry focused
410 * @return The matching color
412 public Color
getBkColorGroup(boolean selected
, boolean focused
) {
413 if (selected
&& focused
) {
414 return getColor(GR_BACKGROUND_SEL
);
417 return getColor(GR_BACKGROUND_SEL_NOFOCUS
);
419 return getColor(GR_BACKGROUND
);
423 * Get the correct foreground color group
426 * Is the entry selected
428 * Is the entry focused
429 * @return The matching color
431 public Color
getFgColorGroup(boolean selected
, boolean focused
) {
432 if (selected
&& focused
) {
433 return getColor(GR_FOREGROUND_SEL
);
436 return getColor(GR_FOREGROUND_SEL_NOFOCUS
);
438 return getColor(GR_FOREGROUND
);
442 * Get a color resource for the specified RGBA color descriptor
445 * the color descriptor
446 * @return a color resource
449 public Color
getColor(RGBA rgba
) {
450 Color color
= fColorMap
.get(rgba
);
452 color
= new Color(Display
.getDefault(), rgba
);
453 fColorMap
.put(rgba
, color
);