/* Copyright (C) 2009 Mobile Sorcery AB
This program is free software; you can redistribute it and/or modify it
under the terms of the Eclipse Public License v1.0.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for
more details.
You should have received a copy of the Eclipse Public License v1.0 along
with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html
*/
package com.mobilesorcery.sdk.internal;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.MessageFormat;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.IBuildSession;
import com.mobilesorcery.sdk.core.IBuildVariant;
import com.mobilesorcery.sdk.core.MoSyncBuilder;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.core.NameSpacePropertyOwner;
import com.mobilesorcery.sdk.internal.cdt.MoSyncIncludePathContainer;
import com.mobilesorcery.sdk.internal.cdt.MoSyncPathInitializer;
import com.mobilesorcery.sdk.profiles.IProfile;
/**
* A listener that makes sure to rebuild a project if certain events occur.
* @author Mattias Bybro, mattias.bybro@purplescout.se
*
*/
public class RebuildListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent event) {
boolean doTouch = false;
boolean updateProjectPaths = shouldUpdatePaths(event);
if (updateProjectPaths) {
Object source = event.getSource();
if (source instanceof MoSyncProject) {
MoSyncProject project = (MoSyncProject) source;
// This line will make sure to refresh include paths and notify
// everyone about it.
ICProject cProject = CoreModel.getDefault().create(project.getWrappedProject());
try {
MoSyncPathInitializer.getInstance().initialize(MoSyncIncludePathContainer.CONTAINER_ID, cProject);
} catch (CoreException e) {
CoreMoSyncPlugin.getDefault().log(e);
}
IProfile profile = project.getTargetProfile();
doTouch = profile != null;
}
} else if (MoSyncProject.BUILD_CONFIGURATION_CHANGED == event.getPropertyName()) {
doTouch = true;
}
if (doTouch) {
// Make sure we rebuild when necessary (at a later point)
Object source = event.getSource();
if (source instanceof MoSyncProject) {
try {
((MoSyncProject) source).getWrappedProject().touch(null);
} catch (CoreException e) {
CoreMoSyncPlugin.getDefault().log(e);
}
}
}
}
private boolean shouldUpdatePaths(PropertyChangeEvent event) {
return MoSyncProject.BUILD_CONFIGURATION_CHANGED == event.getPropertyName() ||
MoSyncProject.TARGET_PROFILE_CHANGED == event.getPropertyName() ||
MoSyncBuilder.ADDITIONAL_INCLUDE_PATHS.equals(NameSpacePropertyOwner.getKey(event.getPropertyName())) ||
MoSyncBuilder.EXTENSIONS.equals(NameSpacePropertyOwner.getKey(event.getPropertyName())) ||
MoSyncBuilder.IGNORE_DEFAULT_INCLUDE_PATHS.equals(NameSpacePropertyOwner.getKey(event.getPropertyName()));
}
}