/** * This file Copyright (c) 2005-2008 Aptana, Inc. This program is * dual-licensed under both the Aptana Public License and the GNU General * Public license. You may elect to use one or the other of these licenses. * * This program is distributed in the hope that it will be useful, but * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or * NONINFRINGEMENT. Redistribution, except as permitted by whichever of * the GPL or APL you select, is prohibited. * * 1. For the GPL license (GPL), you can redistribute and/or modify this * program under the terms of the GNU General Public License, * Version 3, as published by the Free Software Foundation. You should * have received a copy of the GNU General Public License, Version 3 along * with this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Aptana provides a special exception to allow redistribution of this file * with certain other free and open source software ("FOSS") code and certain additional terms * pursuant to Section 7 of the GPL. You may view the exception and these * terms on the web at http://www.aptana.com/legal/gpl/. * * 2. For the Aptana Public License (APL), this program and the * accompanying materials are made available under the terms of the APL * v1.0 which accompanies this distribution, and is available at * http://www.aptana.com/legal/apl/. * * You may view the GPL, Aptana's exception and additional terms, and the * APL in the file titled license.html at the root of the corresponding * plugin containing this source file. * * Any modifications to this file must keep this entire header intact. */ package com.aptana.ide.debug.core; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.Preferences.IPropertyChangeListener; import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; import com.aptana.ide.debug.core.preferences.IJSDebugPreferenceNames; /** * @author Max Stepanov */ public final class JSDetailFormattersManager implements IPropertyChangeListener { /** * DETAIL_FORMATTER_IS_ENABLED */ public static final String DETAIL_FORMATTER_IS_ENABLED = IJSDebugPreferenceNames.DETAIL_FORMATTER_IS_ENABLED; /** * DETAIL_FORMATTER_IS_DISABLED */ public static final String DETAIL_FORMATTER_IS_DISABLED = IJSDebugPreferenceNames.DETAIL_FORMATTER_IS_DISABLED; private static JSDetailFormattersManager fgDefault; private ListenerList changeListeners = new ListenerList(); /** * Map of types to the associated formatter (code snippet). (<code>String</code> -> <code>String</code>) */ private HashMap<String, DetailFormatter> fDetailFormattersMap; private JSDetailFormattersManager() { populateDetailFormattersMap(); JSDebugPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(this); } /** * getDefault * * @return JSDetailFormattersManager */ public static JSDetailFormattersManager getDefault() { if (fgDefault == null) { fgDefault = new JSDetailFormattersManager(); } return fgDefault; } /** * Populate the detail formatters map with data from preferences. */ private void populateDetailFormattersMap() { String[] detailFormattersList = JSDebugOptionsManager.parseList(JSDebugPlugin.getDefault() .getPluginPreferences().getString(IJSDebugPreferenceNames.PREF_DETAIL_FORMATTERS_LIST)); fDetailFormattersMap = new HashMap<String, DetailFormatter>(detailFormattersList.length / 3); for (int i = 0, length = detailFormattersList.length; i < length;) { String typeName = detailFormattersList[i++]; String snippet = detailFormattersList[i++].replace('\u0000', ','); boolean enabled = !DETAIL_FORMATTER_IS_DISABLED.equals(detailFormattersList[i++]); fDetailFormattersMap.put(typeName, new DetailFormatter(typeName, snippet, enabled)); } } /** * getDetailFormatters * * @return Collection */ public Collection getDetailFormatters() { return fDetailFormattersMap.values(); } /** * setDetailFormatters * * @param formatters */ public void setDetailFormatters(Collection formatters) { fDetailFormattersMap.clear(); for (Iterator i = formatters.iterator(); i.hasNext();) { DetailFormatter formatter = (DetailFormatter) i.next(); fDetailFormattersMap.put(formatter.getTypeName(), formatter); } savePreference(); } /** * setAssociatedDetailFormatter * * @param detailFormatter */ public void setAssociatedDetailFormatter(DetailFormatter detailFormatter) { fDetailFormattersMap.put(detailFormatter.getTypeName(), detailFormatter); savePreference(); } /** * removeAssociatedDetailFormatter * * @param detailFormatter */ public void removeAssociatedDetailFormatter(DetailFormatter detailFormatter) { fDetailFormattersMap.remove(detailFormatter.getTypeName()); savePreference(); } /** * hasAssociatedDetailFormatter * * @param typeName * @return boolean */ public boolean hasAssociatedDetailFormatter(String typeName) { return fDetailFormattersMap.containsKey(typeName); } /** * getAssociatedDetailFormatter * * @param typeName * @return DetailFormatter */ public DetailFormatter getAssociatedDetailFormatter(String typeName) { return (DetailFormatter) fDetailFormattersMap.get(typeName); } /** * savePreference */ private void savePreference() { Collection valuesList = fDetailFormattersMap.values(); String[] values = new String[valuesList.size() * 3]; int i = 0; for (Iterator iter = valuesList.iterator(); iter.hasNext();) { DetailFormatter detailFormatter = (DetailFormatter) iter.next(); values[i++] = detailFormatter.getTypeName(); values[i++] = detailFormatter.getSnippet().replace(',', '\u0000'); values[i++] = detailFormatter.isEnabled() ? DETAIL_FORMATTER_IS_ENABLED : DETAIL_FORMATTER_IS_DISABLED; } String pref = JSDebugOptionsManager.serializeList(values); JSDebugPlugin.getDefault().getPluginPreferences().setValue(IJSDebugPreferenceNames.PREF_DETAIL_FORMATTERS_LIST, pref); JSDebugPlugin.getDefault().savePluginPreferences(); } /** * addChangeListener * * @param listener */ public void addChangeListener(IDetailFormattersChangeListener listener) { changeListeners.add(listener); } /** * removeChangeListener * * @param listener */ public void removeChangeListener(IDetailFormattersChangeListener listener) { changeListeners.remove(listener); } /** * notifyChangeListeners */ private void notifyChangeListeners() { Object[] listeners = changeListeners.getListeners(); for (int i = 0; i < listeners.length; ++i) { ((IDetailFormattersChangeListener) listeners[i]).detailFormattersChanged(); } } /** * @param event * * see org.eclipse.core.runtime.Preferences$IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent event) { if (IJSDebugPreferenceNames.PREF_DETAIL_FORMATTERS_LIST.equals(event.getProperty())) { populateDetailFormattersMap(); notifyChangeListeners(); } } }