/*******************************************************************************
* Copyright (c) 2007, 2009 Intel Corporation and others.
* 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.settings.model;
import org.eclipse.cdt.core.settings.model.IModificationContext;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.CompositeWorkspaceRunnable;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
public final class SettingsContext implements IModificationContext{
private static final int USER_FLAGS_MASK = 0x0000ffff;
public static final int CFG_DATA_CACHED = 1 << 15;
private IProjectDescription fEDes;
private IProject fProject;
private CompositeWorkspaceRunnable fRunnable;
private int fFlags;
public SettingsContext(IProject project){
fProject = project;
}
public IProject getProject(){
return fProject;
}
void init(CConfigurationDescriptionCache cfg){
int flags = 0;
if(cfg.getBaseCache() != null)
flags |= CFG_DATA_CACHED;
fFlags = flags;
}
IProjectDescription getEclipseProjectDescription(boolean create) throws CoreException{
IProjectDescription eDes = fEDes;
if(eDes == null && create){
if(fProject == null)
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("SettingsContext.0")); //$NON-NLS-1$
eDes = fProject.getDescription();
}
return eDes;
}
public IProjectDescription getEclipseProjectDescription() throws CoreException{
return getEclipseProjectDescription(true);
}
public void setEclipseProjectDescription(IProjectDescription des)
throws CoreException {
if(fEDes == null)
fEDes = des;
else if(fEDes != des)
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("SettingsContext.1")); //$NON-NLS-1$
}
CompositeWorkspaceRunnable getCompositeWorkspaceRunnable(boolean create){
if(fRunnable == null && create)
fRunnable = new CompositeWorkspaceRunnable(null);
return fRunnable;
}
public void addWorkspaceRunnable(IWorkspaceRunnable runnable){
getCompositeWorkspaceRunnable(true).add(runnable);
}
public IWorkspaceRunnable createOperationRunnable() {
CompositeWorkspaceRunnable result = new CompositeWorkspaceRunnable(null);
IWorkspaceRunnable r = getSetEclipseProjectDescriptionRunnable();
if(r != null)
result.add(r);
r = getCompositeWorkspaceRunnable(false);
if(r != null)
result.add(r);
return result.isEmpty() ? null : result;
}
private IWorkspaceRunnable getSetEclipseProjectDescriptionRunnable(){
if(fEDes != null){
return new IWorkspaceRunnable(){
public void run(IProgressMonitor monitor)
throws CoreException {
fProject.setDescription(fEDes, monitor);
}
};
}
return null;
}
public int getAllConfigurationSettingsFlags() {
return fFlags;
}
public void setConfigurationSettingsFlags(int flags) {
//system flags are read only;
flags &= USER_FLAGS_MASK;
fFlags |= flags;
}
public boolean isBaseDataCached() {
return (fFlags & CFG_DATA_CACHED) != 0;
}
}