/** * This file is part of Lapg.UI project. * * Copyright (c) 2010 Evgeny Gryaznov * 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: * Evgeny Gryaznov - initial API and implementation */ package org.textmapper.lapg.ui; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.Status; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import org.textmapper.lapg.common.ui.editor.colorer.DefaultColorManager; public class LapgUIActivator extends AbstractUIPlugin { public static final String PLUGIN_ID = "org.textmapper.lapg.ui"; public static final String PROBLEM_MARKER = PLUGIN_ID + ".lapgProblem"; private static LapgUIActivator myDefault; private ListenerList mySettingsListeners = new ListenerList(); private Map<IProject, LapgProjectSettings> myProjectSettings = new HashMap<IProject, LapgProjectSettings>(); public LapgUIActivator() { myDefault = this; } @Override public void start(BundleContext context) throws Exception { super.start(context); ResourcesPlugin.getWorkspace().addResourceChangeListener(mySettingsReloader); } @Override public void stop(BundleContext context) throws Exception { ResourcesPlugin.getWorkspace().removeResourceChangeListener(mySettingsReloader); super.stop(context); } public static LapgUIActivator getDefault() { return myDefault; } public static void log(Throwable e) { logError("Internal error", e); } public static void log(IStatus status) { getDefault().getLog().log(status); } public static void logError(String text) { log(new Status(IStatus.ERROR, PLUGIN_ID, text)); } public static void logWarning(String text, Throwable e) { log(new Status(IStatus.WARNING, PLUGIN_ID, 0, text, e)); } public static void logError(String text, Throwable e) { log(new Status(IStatus.ERROR, PLUGIN_ID, 0, text, e)); } private DefaultColorManager fColorManager; public DefaultColorManager getColorManager() { if (fColorManager == null) { fColorManager = new DefaultColorManager(true); } return fColorManager; } public void addSettingsChangedListener(LapgSettingsListener listener) { mySettingsListeners.add(listener); } public void removeSettingsChangedListener(LapgSettingsListener listener) { mySettingsListeners.remove(listener); } private void notifySettingsChanged(Set<IProject> settings) { Object[] listeners = mySettingsListeners.getListeners(); for (int i = 0; i < listeners.length; ++i) { ((LapgSettingsListener) listeners[i]).settingsChanged(settings); } } public LapgProjectSettings getProjectSettings(IProject project) { synchronized (myProjectSettings) { LapgProjectSettings result = myProjectSettings.get(project); if (result == null) { result = new LapgProjectSettings(project); myProjectSettings.put(project, result); } return result; } } private final IResourceChangeListener mySettingsReloader = new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { if (event == null || event.getDelta() == null) { return; } Set<LapgProjectSettings> affectedSettings = null; IResourceDelta rootDelta = event.getDelta(); synchronized (myProjectSettings) { for (IResourceDelta projectDelta : rootDelta.getAffectedChildren()) { IProject affectedProject = (IProject) projectDelta.getResource(); if (isRemovedOrClosed(projectDelta)) { myProjectSettings.remove(affectedProject); } else { IResourceDelta configFileDelta = projectDelta.findMember(LapgProjectSettings.SETTINGS_FILE); if (configFileDelta != null && myProjectSettings.containsKey(affectedProject) && FileUtil.affectsFile(configFileDelta)) { if (affectedSettings == null) { affectedSettings = new HashSet<LapgProjectSettings>(); } affectedSettings.add(getProjectSettings(affectedProject)); } } } } if (affectedSettings == null) { return; } Set<IProject> affectedProjects = new HashSet<IProject>(affectedSettings.size()); for (LapgProjectSettings settings : affectedSettings) { settings.reloadSettings(); affectedProjects.add(settings.getProject()); } notifySettingsChanged(affectedProjects); } private boolean isRemovedOrClosed(IResourceDelta projectDelta) { if (projectDelta.getKind() == IResourceDelta.REMOVED) { return true; } if ((projectDelta.getFlags() & IResourceDelta.OPEN) > 0) { return !projectDelta.getResource().isAccessible(); } return false; } }; public interface LapgSettingsListener { void settingsChanged(Set<IProject> settings); } }