blob: 42d021179b910688d89dcb3c1bb8c46cdc3fcffd [file] [log] [blame]
/*****************************************************************
* Copyright (c) 2011 Texas Instruments and others
*
* 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:
* Patrick Chuong (Texas Instruments) - Add support for icon overlay in the debug view (Bug 334566)
*****************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.cdt.debug.ui.IPinProvider.IPinElementColorDescriptor;
/**
* This class tracks the color for the pinned context.
*/
class GdbPinColorTracker {
private class Pair {
Integer refCount;
String context;
Pair(String context, Integer refCount) {
this.context = context;
this.refCount = refCount;
}
}
private static List<Pair> gsColorBuckets = Collections.synchronizedList(new ArrayList<Pair>());
/**
* The static instance.
*/
static GdbPinColorTracker INSTANCE = new GdbPinColorTracker();
/**
* Singleton object - make constructor private.
*/
private GdbPinColorTracker() {
}
int addRef(String context) {
if (context == null)
return IPinElementColorDescriptor.UNDEFINED;
// look in the buckets and see if it is already exist
for (int i = 0; i < gsColorBuckets.size(); ++i) {
Pair pair = gsColorBuckets.get(i);
if (pair.context.equals(context) && pair.refCount > 0) {
pair.refCount++;
return i % IPinElementColorDescriptor.DEFAULT_COLOR_COUNT;
}
}
// if not exist in the buckets, then add to the bucket collection
int size = gsColorBuckets.size();
int index = size;
for (int i = 0; i < size; ++i) {
Pair pair = gsColorBuckets.get(i);
if (pair.refCount <= 0) {
index = i;
gsColorBuckets.remove(index);
break;
}
}
gsColorBuckets.add(index, new Pair(context, 1));
return (index) % IPinElementColorDescriptor.DEFAULT_COLOR_COUNT;
}
void removeRef(String context) {
if (context == null)
return;
for (int i = 0; i < gsColorBuckets.size(); ++i) {
Pair pair = gsColorBuckets.get(i);
if (pair.context.equals(context)) {
pair.refCount--;
return;
}
}
}
}