| /******************************************************************************* |
| * Copyright (c) 2009, 2010 Nokia 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: |
| * Nokia - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.cdt.debug.edc.internal.formatter; |
| |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.Set; |
| |
| import org.eclipse.cdt.debug.edc.formatter.ITypeContentProvider; |
| import org.eclipse.cdt.debug.edc.formatter.IVariableFormatProvider; |
| import org.eclipse.cdt.debug.edc.formatter.IVariableValueConverter; |
| import org.eclipse.cdt.debug.edc.internal.EDCDebugger; |
| import org.eclipse.cdt.debug.edc.symbols.IType; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; |
| |
| /** |
| * Manages format extensions |
| */ |
| public class FormatExtensionManager implements IVariableFormatManager { |
| |
| // Preferences |
| public static final String VARIABLE_FORMATS_ENABLED = "variable_formats_enabled"; |
| public static final boolean VARIABLE_FORMATS_ENABLED_DEFAULT = true; |
| |
| /** |
| * A chooser implementation that always defers to any formatter that is not one of the default formatters |
| */ |
| private static final class DefaultFormatProviderChooser implements IVariableFormatProviderChooser { |
| private static final String DEFAULT_COMPOSITE = |
| "org.eclipse.cdt.debug.edc.formatter.default.composite"; //$NON-NLS-1$ |
| private static final String DEFAULT_ARRAY = |
| "org.eclipse.cdt.debug.edc.formatter.default.array"; //$NON-NLS-1$ |
| |
| public String chooseDetailValueConverter(IType type, Collection<String> ids) { |
| return chooseAnyBeforeDefault(ids); |
| } |
| |
| public String chooseTypeContentProvider(IType type, Collection<String> ids) { |
| return chooseAnyBeforeDefault(ids); |
| } |
| |
| public String chooseVariableValueConverter(IType type, Collection<String> ids) { |
| return chooseAnyBeforeDefault(ids); |
| } |
| |
| private String chooseAnyBeforeDefault(Collection<String> ids) { |
| if (ids.size() > 1) { |
| for (String id : ids) { |
| if (!id.equals(DEFAULT_COMPOSITE) && !id.equals(DEFAULT_ARRAY)) |
| return id; |
| } |
| } |
| else if (ids.size() == 1) |
| return ids.iterator().next(); |
| |
| return null; |
| } |
| } |
| |
| public class FormatProviderExtension { |
| private String label; |
| private IVariableFormatProvider formatProvider; |
| |
| public FormatProviderExtension(String label, IVariableFormatProvider formatProvider) { |
| this.label = label; |
| this.formatProvider = formatProvider; |
| } |
| |
| public String getLabel() { |
| return label; |
| } |
| |
| public IVariableFormatProvider getFormatProvider() { |
| return formatProvider; |
| } |
| } |
| |
| private static IVariableFormatManager instance = |
| new FormatExtensionManager(new DefaultFormatProviderChooser()); |
| |
| private Map<String, FormatProviderExtension> formatProviders; |
| private IVariableFormatProviderChooser chooser; |
| private boolean enabled = FormatExtensionManager.VARIABLE_FORMATS_ENABLED_DEFAULT; |
| |
| public static IVariableFormatManager instance() { |
| return instance; |
| } |
| |
| private FormatExtensionManager(IVariableFormatProviderChooser chooser) { |
| readProviders(); |
| setFormatProviderChooser(chooser); |
| IEclipsePreferences scope = EDCDebugger.getPrefs(EDCDebugger.PLUGIN_ID); |
| enabled = scope.getBoolean(VARIABLE_FORMATS_ENABLED, FormatExtensionManager.VARIABLE_FORMATS_ENABLED_DEFAULT); |
| } |
| |
| private void readProviders() { |
| if (formatProviders != null) |
| return; |
| IConfigurationElement[] elements = |
| Platform.getExtensionRegistry().getConfigurationElementsFor(EDCDebugger.PLUGIN_ID + ".variableFormatProvider"); //$NON-NLS-1$ |
| for (IConfigurationElement element : elements) { |
| try { |
| String id = element.getAttribute("id"); //$NON-NLS-1$ |
| String label = element.getAttribute("label"); //$NON-NLS-1$ |
| IVariableFormatProvider formatProvider = |
| (IVariableFormatProvider) element.createExecutableExtension("class"); //$NON-NLS-1$ |
| if (formatProviders == null) |
| formatProviders = new HashMap<String, FormatProviderExtension>(); |
| formatProviders.put(id, new FormatProviderExtension(label, formatProvider)); |
| } catch (Exception e) { |
| EDCDebugger.getMessageLogger().logError("Could not create formatting extension", e); |
| } |
| } |
| } |
| |
| private interface Getter <T> { |
| T get(IVariableFormatProvider fp, IType type); |
| String choose(IType type, Collection<String> ids); |
| } |
| |
| private<T> T getProvider(IType type, Getter<T> getter) { |
| if (!enabled) |
| return null; |
| Map<String, T> providers = new HashMap<String, T>(); |
| for (Entry<String, FormatProviderExtension> entry : formatProviders.entrySet()) { |
| IVariableFormatProvider fp = entry.getValue().getFormatProvider(); |
| T t = getter.get(fp, type); |
| if (t != null) |
| providers.put(entry.getKey(), t); |
| } |
| String id = getter.choose(type, providers.keySet()); |
| return providers.get(id); |
| } |
| |
| |
| public ITypeContentProvider getTypeContentProvider(IType type) { |
| return getProvider(type, new Getter<ITypeContentProvider>() { |
| public ITypeContentProvider get(IVariableFormatProvider fp, IType type) { |
| return fp.getTypeContentProvider(type); |
| } |
| public String choose(IType type, Collection<String> ids) { |
| return chooser.chooseTypeContentProvider(type, ids); |
| } |
| }); |
| } |
| |
| public IVariableValueConverter getVariableValueConverter(IType type) { |
| return getProvider(type, new Getter<IVariableValueConverter>() { |
| public IVariableValueConverter get(IVariableFormatProvider fp, IType type) { |
| return fp.getVariableValueConverter(type); |
| } |
| public String choose(IType type, Collection<String> ids) { |
| return chooser.chooseVariableValueConverter(type, ids); |
| } |
| }); |
| } |
| |
| public IVariableValueConverter getDetailValueConverter(IType type) { |
| return getProvider(type, new Getter<IVariableValueConverter>() { |
| public IVariableValueConverter get(IVariableFormatProvider fp, IType type) { |
| return fp.getDetailValueConverter(type); |
| } |
| public String choose(IType type, Collection<String> ids) { |
| return chooser.chooseDetailValueConverter(type, ids); |
| } |
| }); |
| } |
| |
| public void setFormatProviderChooser(IVariableFormatProviderChooser chooser) { |
| this.chooser = chooser; |
| } |
| |
| public String[] getVariableFormatProviderIds() { |
| Set<String> keySet = formatProviders.keySet(); |
| return keySet.toArray(new String[keySet.size()]); |
| } |
| |
| public String getFormatProviderLabel(String id) { |
| return formatProviders.get(id).getLabel(); |
| } |
| |
| public void setEnabled(boolean enabled) { |
| this.enabled = enabled; |
| } |
| |
| public boolean isEnabled() { |
| return enabled; |
| } |
| |
| } |