/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.core; import java.util.ArrayList; import java.util.List; import net.rim.ejde.internal.model.BlackBerryProjectCoreNature; import net.rim.ejde.internal.ui.dialogs.CleanProjectsDialog; import net.rim.ejde.internal.ui.preferences.PreferenceConstants; import net.rim.ejde.internal.util.Messages; import org.apache.log4j.Logger; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.ui.PlatformUI; /** * This class is used to listen to property changes which require corresponding actions, e.g. workspace level preprocess defines * change. */ public class PropertyChangeListenerImp implements IPropertyChangeListener { static private final Logger log = Logger.getLogger( PropertyChangeListenerImp.class ); private static class PropertyChangeListenerHolder { public static PropertyChangeListenerImp propertyChangeListenerImp = new PropertyChangeListenerImp(); } /* * (non-Javadoc) * * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) */ public void propertyChange( PropertyChangeEvent event ) { log.trace( event.getProperty() + " was changed from \"" + event.getOldValue() + "\" to \"" + event.getNewValue() + "\"" ); if( event.getProperty().equalsIgnoreCase( PreferenceConstants.PREPROCESSOR_DEFINE_LIST ) ) { rebuildWorkspace( Messages.CleanProjectsDialog_PreprocessTag_description ); EJDEEventNotifier.getInstance().notifyWorkspacePreprocessorTagsChanged(); } else if( event.getProperty().equalsIgnoreCase( PreferenceConstants.RUN_SIGNATURE_TOOL_AUTOMATICALLY ) ) { Object newValue = event.getNewValue(); if( newValue instanceof Boolean ) { if( ( (Boolean) newValue ).booleanValue() ) { rebuildWorkspace( Messages.CleanProjectsDialog_CodeSigning_description ); } } else if( event.getNewValue() instanceof String ) { // Fix MKS518907: When import BlackBerry preference, the new value is a String instead of Boolean if( Boolean.parseBoolean( (String) newValue ) ) { rebuildWorkspace( Messages.CleanProjectsDialog_CodeSigning_description ); } } } } /** * Rebuild workspace. * * @param msg * the msg */ private void rebuildWorkspace( String msg ) { // if workspace level preprocess defines have been changed, ask users for a clean IProject[] projects = getProjects(); if( projects.length > 0 ) { new CleanProjectsDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow(), projects, msg ).open(); } } /** * Gets the projects. * * @return the projects */ private IProject[] getProjects() { List< IProject > bbProjects = new ArrayList< IProject >(); IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); for( IProject project : projects ) { try { if( project.hasNature( BlackBerryProjectCoreNature.NATURE_ID ) ) { bbProjects.add( project ); } } catch( CoreException e ) { log.error( e.getMessage() ); } } return bbProjects.toArray( new IProject[ bbProjects.size() ] ); } /** * Adds the listener. */ static public void addListener() { ContextManager.getDefault().getPreferenceStore() .addPropertyChangeListener( PropertyChangeListenerHolder.propertyChangeListenerImp ); log.debug( "Property change listener is enabled." ); } /** * Removes the listener. */ static public void removeListener() { ContextManager.getDefault().getPreferenceStore() .removePropertyChangeListener( PropertyChangeListenerHolder.propertyChangeListenerImp ); log.debug( "Property change listener is disabled." ); } }