/********************************************************************** * Copyright (c) 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html  * * Contributors: * IBM - Initial API and implementation **********************************************************************/ package net.sourceforge.phpeclipse.wiki.internal; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sourceforge.phpeclipse.webbrowser.internal.Trace; import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin; import org.eclipse.core.runtime.Preferences; /** * */ public class ConfigurationManager { private static final int ADD = 0; private static final int CHANGE = 1; private static final int REMOVE = 2; // configurations protected List configurations; protected Map threads = new HashMap(); protected List monitorListeners = new ArrayList(); private Preferences.IPropertyChangeListener pcl; protected boolean ignorePreferenceChanges = false; protected static ConfigurationManager instance; public static ConfigurationManager getInstance() { if (instance == null) instance = new ConfigurationManager(); return instance; } private ConfigurationManager() { loadConfigurations(); pcl = new Preferences.IPropertyChangeListener() { public void propertyChange(Preferences.PropertyChangeEvent event) { if (ignorePreferenceChanges) return; String property = event.getProperty(); if (property.equals("configurations")) { loadConfigurations(); } } }; WikiEditorPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(pcl); } protected void dispose() { WikiEditorPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(pcl); } public IConfigurationWorkingCopy createConfiguration() { return new ConfigurationWorkingCopy(); } public List getConfigurations() { return new ArrayList(configurations); } protected void addConfiguration(IConfiguration configuration) { if (!configurations.contains(configuration)) configurations.add(configuration); fireConfigurationEvent(configuration, ADD); saveConfigurations(); } protected boolean isActive(IConfiguration configuration) { return (threads.get(configuration) != null); } protected void removeConfiguration(IConfiguration configuration) { configurations.remove(configuration); fireConfigurationEvent(configuration, REMOVE); saveConfigurations(); } protected void configurationChanged(IConfiguration configuration) { fireConfigurationEvent(configuration, CHANGE); saveConfigurations(); } /** * Add monitor listener. * * @param listener */ public void addConfigurationListener(IConfigurationListener listener) { monitorListeners.add(listener); } /** * Remove monitor listener. * * @param listener */ public void removeConfigurationListener(IConfigurationListener listener) { monitorListeners.remove(listener); } /** * Fire a monitor event. * @param rr * @param fType */ protected void fireConfigurationEvent(IConfiguration monitor, int type) { Object[] obj = monitorListeners.toArray(); int size = obj.length; for (int i = 0; i < size; i++) { IConfigurationListener listener = (IConfigurationListener) obj[i]; if (type == ADD) listener.monitorAdded(monitor); else if (type == CHANGE) listener.monitorChanged(monitor); else if (type == REMOVE) listener.monitorRemoved(monitor); } } protected void loadConfigurations() { Trace.trace(Trace.FINEST, "Loading Configurations"); configurations = new ArrayList(); Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences(); String xmlString = prefs.getString("configurations"); if (xmlString != null && xmlString.length() > 0) { try { ByteArrayInputStream in = new ByteArrayInputStream(xmlString.getBytes()); IMemento memento = XMLMemento.loadMemento(in); IMemento[] children = memento.getChildren("config"); if (children != null) { int size = children.length; for (int i = 0; i < size; i++) { Configuration monitor = new Configuration(); monitor.load(children[i]); configurations.add(monitor); } } } catch (Exception e) { Trace.trace(Trace.WARNING, "Could not load configurations: " + e.getMessage()); } } } protected void saveConfigurations() { try { ignorePreferenceChanges = true; XMLMemento memento = XMLMemento.createWriteRoot("configurations"); Iterator iterator = configurations.iterator(); while (iterator.hasNext()) { Configuration monitor = (Configuration) iterator.next(); IMemento child = memento.createChild("config"); monitor.save(child); } String xmlString = memento.saveToString(); Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences(); prefs.setValue("configurations", xmlString); WikiEditorPlugin.getDefault().savePluginPreferences(); } catch (Exception e) { Trace.trace(Trace.SEVERE, "Could not save Configurations", e); } ignorePreferenceChanges = false; } }