/******************************************************************************* * Copyright (c) 2007, 2010 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.core.settings.model; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionDelta; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.core.resources.IProject; /** * Events fired for the project delats. * The ProjectDescription lifecycle looks like: * <ul> * <li> * - {@link #LOADED} - configuration is loaded and read-only * <li> * - {@link #COPY_CREATED} - Indicates new writable description has been created from * the read-only description backing store * <li> * - {@link #ABOUT_TO_APPLY} - First event in the setProjectDescription flow. New description * writable, old description represents the cache * <li> * - {@link #DATA_APPLIED} - Event indicating that configuration data has been applied by the build system * <li> * - {@link #APPLIED} - setProjectDescription finished, newDescription is read-only * </ul> */ public final class CProjectDescriptionEvent { /** Event kind indicating project description has loaded */ public static final int LOADED = 1; /** Event kind indicating we're about to set the project description */ public static final int ABOUT_TO_APPLY = 1 << 1; public static final int APPLIED = 1 << 2; /** Event kind indicating a copy of the description has been created */ public static final int COPY_CREATED = 1 << 3; public static final int DATA_APPLIED = 1 << 4; /** Event kind encapsulated ALL events */ public static final int ALL = LOADED | ABOUT_TO_APPLY | APPLIED | COPY_CREATED | DATA_APPLIED; /** The type of event this corresponds to */ private final int fType; /** A *writable* new description */ private final ICProjectDescription fNewDescription; /** The previous description should be read-only */ private final ICProjectDescription fOldDescription; private final ICProjectDescription fAppliedDescription; private final ICDescriptionDelta fProjDelta; private ICDescriptionDelta fActiveCfgDelta; private ICDescriptionDelta fIndexCfgDelta; private final IProject fProject; public CProjectDescriptionEvent(int type, ICDescriptionDelta delta, ICProjectDescription newDes, ICProjectDescription oldDes, ICProjectDescription appliedDes) { fType = type; fProjDelta = delta; fNewDescription = newDes; fOldDescription = oldDes; fAppliedDescription = appliedDes; if (fNewDescription != null) { fProject = fNewDescription.getProject(); } else if (fOldDescription != null) { fProject = fOldDescription.getProject(); } else { fProject = null; } } public IProject getProject() { return fProject; } public int getEventType() { return fType; } public ICDescriptionDelta getProjectDelta() { return fProjDelta; } public ICDescriptionDelta getActiveCfgDelta() { if (fActiveCfgDelta == null) { fActiveCfgDelta = getDelta(true); } return fActiveCfgDelta; } public ICDescriptionDelta getDefaultSettingCfgDelta() { if (fIndexCfgDelta == null) { fIndexCfgDelta = getDelta(false); } return fIndexCfgDelta; } private ICDescriptionDelta getDelta(boolean active) { ICDescriptionDelta delta = null; switch(getEventType()) { case LOADED: case ABOUT_TO_APPLY: case APPLIED: case DATA_APPLIED: if (fProjDelta != null) { ICProjectDescription oldDes = getOldCProjectDescription(); ICProjectDescription newDes = getNewCProjectDescription(); if (oldDes == null) { ICConfigurationDescription cfg = getCfg(newDes, active); if (cfg != null) { delta = findCfgDelta(fProjDelta, cfg.getId()); } } else if (newDes == null) { ICConfigurationDescription cfg = getCfg(oldDes, active); if (cfg != null) { delta = findCfgDelta(fProjDelta, cfg.getId()); } } else { ICConfigurationDescription newCfg = getCfg(newDes, active); ICConfigurationDescription oldCfg = getCfg(oldDes, active); if (oldCfg == null) { if (newCfg != null) { delta = new CProjectDescriptionDelta(newCfg, null); } } else if (newCfg == null) { delta = new CProjectDescriptionDelta(null, oldCfg); } else if (newCfg.getId().equals(oldCfg.getId())) { delta = findCfgDelta(fProjDelta, newCfg.getId()); } else { delta = CProjectDescriptionManager.getInstance().createDelta(newCfg, oldCfg); } } } break; case COPY_CREATED: break; } return delta; } private ICConfigurationDescription getCfg(ICProjectDescription des, boolean active) { return active ? des.getActiveConfiguration() : des.getDefaultSettingConfiguration(); } private ICDescriptionDelta findCfgDelta(ICDescriptionDelta delta, String id) { if (delta == null) return null; ICDescriptionDelta children[] = delta.getChildren(); for (int i = 0; i < children.length; i++) { ICSettingObject s = children[i].getNewSetting(); if (s != null && id.equals(s.getId())) return children[i]; } return null; } /** * @return return the previous project description, may be null */ public ICProjectDescription getOldCProjectDescription() { return fOldDescription; } /** * Return the new description which may be writeable (depending on the event type) * @return new project description */ public ICProjectDescription getNewCProjectDescription() { return fNewDescription; } /** * @return the applied project description, may be null */ public ICProjectDescription getAppliedCProjectDescription() { return fAppliedDescription; } }