// Copyright (c) 2009-2010 by the projectusus.org contributors
// This software is released under the terms and conditions
// of the Eclipse Public License (EPL) 1.0.
// See http://www.eclipse.org/legal/epl-v10.html for details.
package org.projectusus.adapter;
import static org.eclipse.jdt.core.JavaCore.addPreProcessingResourceChangedListener;
import static org.eclipse.jdt.core.JavaCore.removePreProcessingResourceChangedListener;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.projectusus.core.UsusCorePlugin;
import org.projectusus.core.project2.IUSUSProject;
public class AutoComputeSetting {
private final IResourceChangeListener resourcelistener = new RunComputationOnResourceChange();
private final IPreferenceChangeListener preferenceChangeListener = new RunComputationOnPreferencesChange();
private final INodeChangeListener nodeListener = new RegisterPreferenceListenerForAllChildren( preferenceChangeListener );
public AutoComputeSetting() {
applyAutoCompute( UsusAdapterPlugin.getDefault().getAutocompute() );
}
public void setAutoCompute( boolean autoCompute ) {
applyAutoCompute( autoCompute );
}
public void dispose() {
removePreProcessingResourceChangedListener( resourcelistener );
}
private void applyAutoCompute( boolean autoCompute ) {
if( autoCompute ) {
addPreProcessingResourceChangedListener( resourcelistener, IResourceChangeEvent.POST_BUILD );
hookPreferenceChanges();
} else {
removePreProcessingResourceChangedListener( resourcelistener );
unhookPreferenceChanges();
}
}
private void hookPreferenceChanges() {
IEclipsePreferences preferences = getUsusProjectPreferences();
preferences.addNodeChangeListener( nodeListener );
for( IEclipsePreferences projectPreferences : collectChildren( preferences ) ) {
projectPreferences.addPreferenceChangeListener( preferenceChangeListener );
}
}
private void unhookPreferenceChanges() {
IEclipsePreferences preferences = getUsusProjectPreferences();
preferences.removeNodeChangeListener( nodeListener );
for( IEclipsePreferences projectPreferences : collectChildren( preferences ) ) {
projectPreferences.removePreferenceChangeListener( preferenceChangeListener );
}
}
private Iterable<IEclipsePreferences> collectChildren( IEclipsePreferences preferences ) {
List<IEclipsePreferences> children = new LinkedList<IEclipsePreferences>();
try {
for( String childName : preferences.childrenNames() ) {
IEclipsePreferences child = (IEclipsePreferences)preferences.node( childName );
children.add( child );
}
} catch( Exception exception ) {
log( exception );
}
return children;
}
private void log( Exception exception ) {
Status status = new Status( IStatus.ERROR, UsusAdapterPlugin.PLUGIN_ID, "Unable to read child names of Usus Project Preferences", exception ); //$NON-NLS-1$
UsusAdapterPlugin.getDefault().getLog().log( status );
}
private IEclipsePreferences getUsusProjectPreferences() {
return (IEclipsePreferences)UsusCorePlugin.getDefault().getPreferences().node( IUSUSProject.ATT_USUS_PROJECT );
}
}