/******************************************************************************* * Copyright (c) 2016 Ericsson and others. * 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.eclipse.org/legal/epl-v10.html * * Contributors: * Marc Dumais (Ericsson) - initial implementation *******************************************************************************/ package org.eclipse.cdt.debug.ui.internal; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.cdt.debug.ui.memory.traditional.IMemorySpacePreferencesHelper; import org.eclipse.cdt.debug.ui.memory.traditional.TraditionalRenderingMessages; import org.eclipse.cdt.debug.ui.memory.traditional.TraditionalRenderingPlugin; import org.eclipse.cdt.debug.ui.memory.traditional.TraditionalRenderingPreferenceConstants; import org.eclipse.jface.preference.IPreferenceStore; /** * This class encapsulates the messy details of dealing with preferences * entries that have unpredictable key names. This is necessary because the * preference store does not allow getting a list of the keys, just a lookup * by exact key. So the work-around is to use one key to save a csv string, * containing the information necessary to reconstruct the keys for the * unpredictable entries. * * @since 1.4 */ public class MemorySpacePreferencesHelper implements IMemorySpacePreferencesHelper { /** Reference to the plugin's preference store */ private final IPreferenceStore fStore; // List of RGB colors that we can use, by default, for memory space backgrounds private static final String[] fColorPool = { "238,192,192", "250,238,195", "255,179,0", "122,245,0", "184,242,255", "166,189,215", "206,162,98", "245,138,157", "244,200,0", "255,136,56", "244,255,128" }; /** Constructor */ public MemorySpacePreferencesHelper() { fStore = TraditionalRenderingPlugin.getDefault().getPreferenceStore(); } /** * @return an array of the currently known memory spaces ids, for which * a background color preference was created. */ private String[] getMemorySpaceIds() { String csv = fStore.getString(TraditionalRenderingPreferenceConstants.MEM_KNOWN_MEMORY_SPACE_ID_LIST_CSV); return csv.isEmpty() ? new String[0] : csv.split(","); } /* (non-Javadoc) * @see org.eclipse.cdt.debug.ui.internal.IMemorySpacesPreferencesUtil#updateMemorySpaces(java.lang.String[]) */ @Override public void updateMemorySpaces(String[] ids) { List<String> inputIdList = new ArrayList<String>(Arrays.asList(ids)); List<String> knownIdList = new ArrayList<String>(Arrays.asList(getMemorySpaceIds())); int nextIdIndex = knownIdList.size(); boolean newIds; // Remove ids already known inputIdList.removeAll(knownIdList); newIds = inputIdList.size() > 0 ? true : false; // remaining ids are new for (String id : inputIdList) { knownIdList.add(id); // set default color for this memory space id setDefaultColorPreference(id, nextIdIndex); nextIdIndex++; } // Save set of known memory space ids, if new ones were added if (newIds) { setMemorySpaceIds(knownIdList.toArray(new String[knownIdList.size()])); } } /** * Saves a set of memory space ids, as a CSV string, into the * preferences store */ private void setMemorySpaceIds(String[] memorySpaces) { StringBuilder csv = new StringBuilder(); for (int i = 0; i < memorySpaces.length; i++) { csv.append(memorySpaces[i]); if (i < memorySpaces.length - 1) { csv.append(","); } } fStore.setValue(TraditionalRenderingPreferenceConstants.MEM_KNOWN_MEMORY_SPACE_ID_LIST_CSV, csv.toString()); } /* (non-Javadoc) * @see org.eclipse.cdt.debug.ui.internal.IMemorySpacesPreferencesUtil#getMemorySpaceKey(java.lang.String) */ @Override public String getMemorySpaceKey(String id) { return TraditionalRenderingPreferenceConstants.MEM_MEMORY_SPACE_ID_PREFIX + id; } /* * (non-Javadoc) * * @see org.eclipse.cdt.debug.ui.internal.IMemorySpacesPreferencesUtil#getMemorySpacesLabels() */ @Override public Map<String, String> getMemorySpaceLabels() { String prefix = TraditionalRenderingPreferenceConstants.MEM_MEMORY_SPACE_ID_PREFIX; String labelPrefix = TraditionalRenderingMessages .getString("TraditionalRenderingPreferencePage_BackgroundColorMemorySpacePrefix"); String[] ids = getMemorySpaceIds(); Map<String, String> keysToLabels = new HashMap<>(); String key, label; for (int i = 0; i < ids.length; i++) { key = prefix + ids[i]; label = labelPrefix + " " + ids[i]; keysToLabels.put(key, label); } return keysToLabels; } /* * (non-Javadoc) * * @see org.eclipse.cdt.debug.ui.internal.IMemorySpacesPreferencesUtil#getMemorySpaceDefaultColors() */ @Override public Map<String, String> getMemorySpaceDefaultColors() { String prefix = TraditionalRenderingPreferenceConstants.MEM_MEMORY_SPACE_ID_PREFIX; String[] ids = getMemorySpaceIds(); Map<String, String> mapKeyToColor = new HashMap<String, String>(); String key, color; for (int i = 0; i < ids.length; i++) { key = prefix + ids[i]; color = getColor(i); mapKeyToColor.put(key, color); } return mapKeyToColor; } /** Adds a preference for a memory space id and assign it a unique color */ private void setDefaultColorPreference(String id, int index) { String prefix = TraditionalRenderingPreferenceConstants.MEM_MEMORY_SPACE_ID_PREFIX; String key = prefix + id; fStore.setValue(key, getColor(index)); // Setting the default here prevents not having a default defined at first. fStore.setDefault(key, getColor(index)); } /** * @return a csv string representation of a color. A color array is defined * in this class. The entry returned corresponds to the index parameter, and * wraps around if the index is greater than the number of defined colors */ private String getColor(int index) { // wrap-around if we have exhausted the pool if (index >= fColorPool.length) { index = index % (fColorPool.length); } return fColorPool[index]; } }