/******************************************************************************* * Copyright (c) 2009 QNX Software Systems 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: * QNX Software Systems - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.ui.workingsets; import static org.eclipse.cdt.internal.ui.workingsets.WorkingSetConfigurationManager.ATTR_CONFIG; import static org.eclipse.cdt.internal.ui.workingsets.WorkingSetConfigurationManager.ATTR_NAME; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IMemento; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.ui.CUIPlugin; /** * Default implementation of the {@link IWorkingSetProjectConfiguration} interface. Clients may extend this * class to implement additional project configuration settings. * * @author Christian W. Damus (cdamus) * * @since 6.0 * */ public class WorkingSetProjectConfiguration implements IWorkingSetProjectConfiguration { private final IWorkingSetConfiguration workingSetConfig; private String projectName; private String selectedConfiguration; /** * Initializes me with my parent working set configuration. * * @param parent * my parent working set configuration */ protected WorkingSetProjectConfiguration(IWorkingSetConfiguration parent) { this.workingSetConfig = parent; } public IWorkingSetConfiguration getWorkingSetConfiguration() { return workingSetConfig; } public String getProjectName() { return projectName; } /** * Sets my project name. Note that this <b>does not</b> change the name of the project that I represent. * Rather, it changes <i>which</i> project I represent. * * @param projectName * my new project name */ protected void setProjectName(String projectName) { this.projectName = projectName; } public IProject resolveProject() { IProject result = ResourcesPlugin.getWorkspace().getRoot().getProject(getProjectName()); if ((result != null) && !result.isAccessible()) { result = null; } return result; } public String getSelectedConfigurationID() { return selectedConfiguration; } protected void setSelectedConfigurationID(String id) { this.selectedConfiguration = id; } public ICConfigurationDescription resolveSelectedConfiguration() { ICConfigurationDescription result = null; IProject project = resolveProject(); if (project != null) { ICProjectDescription desc = CoreModel.getDefault().getProjectDescription(project); if (desc != null) { result = desc.getConfigurationById(getSelectedConfigurationID()); } } return result; } public Collection<ICConfigurationDescription> resolveConfigurations() { ICConfigurationDescription[] result = null; IProject project = resolveProject(); if (project != null) { ICProjectDescription desc = CoreModel.getDefault().getProjectDescription(project); if (desc != null) { result = desc.getConfigurations(); } } return (result == null) ? Collections.<ICConfigurationDescription> emptyList() : Arrays .asList(result); } public boolean isActive() { ICConfigurationDescription desc = resolveSelectedConfiguration(); return (desc != null) && desc.isActive(); } public void activate() { ICConfigurationDescription config = resolveSelectedConfiguration(); if (config != null) { ICProjectDescription desc = config.getProjectDescription(); if (desc.getActiveConfiguration() != config) { try { IProject project = desc.getProject(); desc.setActiveConfiguration(config); CoreModel.getDefault().setProjectDescription(project, desc); } catch (CoreException e) { CUIPlugin.log(e); } } } } public IStatus build(IProgressMonitor monitor) { IStatus result = Status.OK_STATUS; ICConfigurationDescription config = resolveSelectedConfiguration(); if (config == null) { result = new Status(IStatus.WARNING, CUIPlugin.PLUGIN_ID, NLS.bind( WorkingSetMessages.WSProjConfig_noConfig, getProjectName())); } else { if (!isActive()) { activate(); result = new Status(IStatus.WARNING, CUIPlugin.PLUGIN_ID, NLS.bind( WorkingSetMessages.WSProjConfig_activatedWarning, config.getName(), getProjectName())); } monitor = SubMonitor.convert(monitor); try { resolveProject().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor); } catch (CoreException e) { if (result.isOK()) { result = e.getStatus(); } else { result = new MultiStatus(CUIPlugin.PLUGIN_ID, 0, new IStatus[] { result, e.getStatus() }, NLS.bind(WorkingSetMessages.WSProjConfig_buildProblem, getProjectName()), null); } } } return result; } public void saveState(IMemento memento) { memento.putString(ATTR_NAME, getProjectName()); if (getSelectedConfigurationID() != null) { memento.putString(ATTR_CONFIG, getSelectedConfigurationID()); } } public void loadState(IMemento memento) { projectName = memento.getString(ATTR_NAME); selectedConfiguration = memento.getString(ATTR_CONFIG); } public ISnapshot createSnapshot(IWorkingSetConfiguration.ISnapshot workingSetConfig, WorkspaceSnapshot workspace) { return new Snapshot(workingSetConfig, this, workspace); } // // Nested classes // /** * Default implementation of the mutable project configuration snapshot. * * @author Christian W. Damus (cdamus) * * @since 6.0 */ public static class Snapshot extends WorkingSetProjectConfiguration implements IWorkingSetProjectConfiguration.ISnapshot { private final IProject project; private final WorkspaceSnapshot workspace; /** * Initializes me with the project that I represent and the workspace snapshot. I discover the * currently defined configurations for my project and initially select the one that is currently * active, or the first available if none is active (which would be odd). * * @param parent * my parent working set configuration * @param projectConfig * the project configuration to copy * @param workspace * the current workspace snapshot */ protected Snapshot(IWorkingSetConfiguration parent, IWorkingSetProjectConfiguration projectConfig, WorkspaceSnapshot workspace) { super(parent); this.project = projectConfig.resolveProject(); this.workspace = workspace; String selected = projectConfig.getSelectedConfigurationID(); if (selected == null) { selected = workspace.getActiveConfigurationID(project); } setSelectedConfigurationID(selected); } @Override public IWorkingSetConfiguration.ISnapshot getWorkingSetConfiguration() { return (IWorkingSetConfiguration.ISnapshot) super.getWorkingSetConfiguration(); } public final WorkspaceSnapshot getWorkspaceSnapshot() { return workspace; } @Override public final IProject resolveProject() { return project; } @Override public final String getProjectName() { return resolveProject().getName(); } @Override public void setSelectedConfigurationID(String id) { super.setSelectedConfigurationID(id); } @Override public boolean isActive() { return workspace.isActive(this); } @Override public void activate() { workspace.activate(resolveProject(), getSelectedConfigurationID()); } @Override public IStatus build(IProgressMonitor monitor) { return workspace.build(resolveProject(), getSelectedConfigurationID(), monitor); } @Override public Collection<ICConfigurationDescription> resolveConfigurations() { return workspace.getConfigurations(resolveProject()); } @Override public ICConfigurationDescription resolveSelectedConfiguration() { return workspace.getConfiguration(resolveProject(), getSelectedConfigurationID()); } } }