Entry GetOrCreateEntry(ConfigurationAndPlatform solutionConfiguration)
		{
			Entry entry;
			if (!dict.TryGetValue(solutionConfiguration, out entry)) {
				var config = new ConfigurationAndPlatform(solutionConfiguration.Configuration, MSBuildInternals.FixPlatformNameForProject(solutionConfiguration.Platform));
				entry = new Entry(config);
				dict.Add(solutionConfiguration, entry);
			}
			return entry;
		}
		/// <summary>
		/// Gets the project configuration corresponding to the given solution configuration.
		/// </summary>
		public ConfigurationAndPlatform GetProjectConfiguration(ConfigurationAndPlatform solutionConfiguration)
		{
			lock (dict) {
				Entry entry;
				if (dict.TryGetValue(solutionConfiguration, out entry)) {
					return entry.Config;
				} else {
					return new ConfigurationAndPlatform(solutionConfiguration.Configuration, MSBuildInternals.FixPlatformNameForProject(solutionConfiguration.Platform));
				}
			}
		}
		/// <summary>
		/// Sets the project configuration corresponding to the given solution configuration.
		/// </summary>
		public void SetProjectConfiguration(ConfigurationAndPlatform solutionConfiguration, ConfigurationAndPlatform projectConfiguration)
		{
			if (string.IsNullOrEmpty(projectConfiguration.Configuration))
				throw new ArgumentException("Invalid project configuration");
			if (string.IsNullOrEmpty(projectConfiguration.Platform))
				throw new ArgumentException("Invalid project platform");
			lock (dict) {
				GetOrCreateEntry(solutionConfiguration).Config = new ConfigurationAndPlatform(
					projectConfiguration.Configuration,
					MSBuildInternals.FixPlatformNameForProject(projectConfiguration.Platform)
				);
			}
			Changed(this, EventArgs.Empty);
		}
		/// <summary>
		/// copy properties from g into a new property group for newConfiguration and newPlatform
		/// </summary>
		void CopyProperties(ProjectRootElement project, ProjectPropertyGroupElement g, ConfigurationAndPlatform newConfig)
		{
			ProjectPropertyGroupElement ng = project.AddPropertyGroup();
			ng.Condition = newConfig.ToCondition();
			foreach (var p in g.Properties) {
				ng.AddProperty(p.Name, p.Value).Condition = p.Condition;
			}
		}
		void IConfigurationOrPlatformNameCollection.Add(string newName, string copyFrom)
		{
			SD.MainThread.VerifyAccess();
			newName = ValidateName(newName);
			if (newName == null)
				throw new ArgumentException();
			lock (project.SyncRoot) {
				var projectFile = project.MSBuildProjectFile;
				var userProjectFile = project.MSBuildUserProjectFile;
				bool copiedGroupInMainFile = false;
				if (copyFrom != null) {
					copyFrom = MSBuildInternals.FixPlatformNameForProject(copyFrom);
					foreach (ProjectPropertyGroupElement g in projectFile.PropertyGroups.ToList()) {
						var gConfig = ConfigurationAndPlatform.FromCondition(g.Condition);
						if (HasName(gConfig, copyFrom)) {
							CopyProperties(projectFile, g, SetName(gConfig, newName));
							copiedGroupInMainFile = true;
						}
					}
					foreach (ProjectPropertyGroupElement g in userProjectFile.PropertyGroups.ToList()) {
						var gConfig = ConfigurationAndPlatform.FromCondition(g.Condition);
						if (HasName(gConfig, copyFrom)) {
							CopyProperties(userProjectFile, g, SetName(gConfig, newName));
						}
					}
				}
				if (!copiedGroupInMainFile) {
					projectFile.AddPropertyGroup().Condition = (isPlatform ? new ConfigurationAndPlatform(null, newName) : new ConfigurationAndPlatform(newName, null)).ToCondition();
				}
				project.LoadConfigurationPlatformNamesFromMSBuild();
				
				// Adjust mapping:
				// If the new config/platform already exists in the solution and is mapped to some old project config/platform,
				// re-map it to the new config/platform.
				var mapping = project.ConfigurationMapping;
				if (isPlatform) {
					string newNameForSolution = MSBuildInternals.FixPlatformNameForSolution(newName);
					if (project.ParentSolution.PlatformNames.Contains(newNameForSolution, ConfigurationAndPlatform.ConfigurationNameComparer)) {
						foreach (string solutionConfiguration in project.ParentSolution.ConfigurationNames) {
							var solutionConfig = new ConfigurationAndPlatform(solutionConfiguration, newNameForSolution);
							var projectConfig = mapping.GetProjectConfiguration(solutionConfig);
							mapping.SetProjectConfiguration(solutionConfig, SetName(projectConfig, newName));
						}
					}
				} else {
					if (project.ParentSolution.ConfigurationNames.Contains(newName, ConfigurationAndPlatform.ConfigurationNameComparer)) {
						foreach (string solutionPlatform in project.ParentSolution.PlatformNames) {
							var solutionConfig = new ConfigurationAndPlatform(newName, solutionPlatform);
							var projectConfig = mapping.GetProjectConfiguration(solutionConfig);
							mapping.SetProjectConfiguration(solutionConfig, SetName(projectConfig, newName));
						}
					}
				}
				project.ActiveConfiguration = mapping.GetProjectConfiguration(project.ParentSolution.ActiveConfiguration);
			}
		}
		ConfigurationAndPlatform SetName(ConfigurationAndPlatform config, string newName)
		{
			if (isPlatform)
				return new ConfigurationAndPlatform(config.Configuration, newName);
			else
				return new ConfigurationAndPlatform(newName, config.Platform);
		}
        void UpdateGrid()
        {
            inUpdate = true;

            solutionConfig = new ConfigurationAndPlatform(configurationComboBox.Text, platformComboBox.Text);

            foreach (DataGridViewRow row in grid.Rows) {
                IProject p = (IProject)row.Tag;

                var projectConfig = p.ConfigurationMapping.GetProjectConfiguration(solutionConfig);

                DataGridViewComboBoxCell c1 = (DataGridViewComboBoxCell)row.Cells[1];
                SetItemsAndSelect(c1, p.ConfigurationNames, projectConfig.Configuration);
                c1.Items.Add(EditTag.Instance);

                DataGridViewComboBoxCell c2 = (DataGridViewComboBoxCell)row.Cells[2];
                SetItemsAndSelect(c2, p.PlatformNames, projectConfig.Platform);
                c2.Items.Add(EditTag.Instance);
            }
            inUpdate = false;
        }
		/// <summary>
		/// Gets whether deploying the project is enabled in the given solution configuration.
		/// </summary>
		public bool IsDeployEnabled(ConfigurationAndPlatform solutionConfiguration)
		{
			lock (dict) {
				Entry entry;
				if (dict.TryGetValue(solutionConfiguration, out entry)) {
					return entry.Deploy;
				} else {
					return false;
				}
			}
		}
Example #9
0
		bool TryParseProjectConfigurationKey(string key, out Guid guid, out ConfigurationAndPlatform config)
		{
			guid = default(Guid);
			config = default(ConfigurationAndPlatform);
			
			int firstDot = key.IndexOf('.');
			int secondDot = key.IndexOf('.', firstDot + 1);
			if (firstDot < 0 || secondDot < 0)
				return false;
			
			string guidText = key.Substring(0, firstDot);
			if (!Guid.TryParse(guidText, out guid))
				return false;
			
			string configKey = key.Substring(firstDot + 1, secondDot - (firstDot + 1));
			config = ConfigurationAndPlatform.FromKey(configKey);
			return config != default(ConfigurationAndPlatform);
		}
		bool HasName(ConfigurationAndPlatform config, string name)
		{
			return ConfigurationAndPlatform.ConfigurationNameComparer.Equals(GetName(config), name);
		}
			public Entry(ConfigurationAndPlatform config)
			{
				this.Config = config;
			}
		/// <summary>
		/// Renames an entry.
		/// </summary>
		public void RenameSolutionConfiguration(ConfigurationAndPlatform sourceSolutionConfiguration, ConfigurationAndPlatform targetSolutionConfiguration)
		{
			lock (dict) {
				Entry entry;
				if (dict.TryGetValue(sourceSolutionConfiguration, out entry)) {
					dict.Remove(sourceSolutionConfiguration);
					dict.Add(targetSolutionConfiguration, entry);
				}
			}
			Changed(this, EventArgs.Empty);
		}
		/// <summary>
		/// Copies an entry.
		/// </summary>
		public void CopySolutionConfiguration(ConfigurationAndPlatform sourceSolutionConfiguration, ConfigurationAndPlatform targetSolutionConfiguration)
		{
			lock (dict) {
				Entry entry;
				if (dict.TryGetValue(sourceSolutionConfiguration, out entry)) {
					dict[targetSolutionConfiguration] = entry.Clone();
				}
			}
			Changed(this, EventArgs.Empty);
		}
		/// <summary>
		/// Removes all data stored about the specified solution configuration.
		/// </summary>
		public void Remove(ConfigurationAndPlatform solutionConfiguration)
		{
			bool result;
			lock (dict) {
				result = dict.Remove(solutionConfiguration);
			}
			if (result)
				Changed(this, EventArgs.Empty);
		}
		/// <summary>
		/// Sets whether deploying the project is enabled in the given solution configuration.
		/// </summary>
		public void SetDeployEnabled(ConfigurationAndPlatform solutionConfiguration, bool value)
		{
			lock (dict) {
				GetOrCreateEntry(solutionConfiguration).Deploy = value;
			}
			Changed(this, EventArgs.Empty);
		}
		void AdjustMapping(string oldName, string newName)
		{
			var mapping = project.ConfigurationMapping;
			foreach (string solutionConfiguration in project.ParentSolution.ConfigurationNames) {
				foreach (string solutionPlatform in project.ParentSolution.PlatformNames) {
					var solutionConfig = new ConfigurationAndPlatform(solutionConfiguration, solutionPlatform);
					var projectConfig = mapping.GetProjectConfiguration(solutionConfig);
					if (HasName(projectConfig, oldName))
						mapping.SetProjectConfiguration(solutionConfig, SetName(projectConfig, newName));
				}
			}
			// Adjust active configuration:
			if (HasName(project.ActiveConfiguration, oldName))
				project.ActiveConfiguration = SetName(project.ActiveConfiguration, newName);
		}
		string GetName(ConfigurationAndPlatform config)
		{
			return isPlatform ? config.Platform : config.Configuration;
		}
		/// <summary>
		/// Gets whether building the project is enabled in the given solution configuration.
		/// </summary>
		public bool IsBuildEnabled(ConfigurationAndPlatform solutionConfiguration)
		{
			lock (dict) {
				Entry entry;
				if (dict.TryGetValue(solutionConfiguration, out entry)) {
					return entry.Build;
				} else {
					return true;
				}
			}
		}
 public MSBuildItemDefinitionGroup(MSBuildBasedProject project, ConfigurationAndPlatform configuration)
     : this(project, configuration.ToCondition())
 {
 }
        void GridCellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (!inUpdate && e.RowIndex >= 0) {
                DataGridViewRow row = grid.Rows[e.RowIndex];
                IProject project = (IProject)row.Tag;

                var newConfig = new ConfigurationAndPlatform(
                    GetValue(row.Cells[configurationColumn.Index]),
                    GetValue(row.Cells[platformColumn.Index]));

                project.ConfigurationMapping.SetProjectConfiguration(solutionConfig, newConfig);
            }
        }
Example #21
0
		SolutionSection GenerateProjectConfigurationSection(ISolution solution)
		{
			SolutionSection section = new SolutionSection("ProjectConfigurationPlatforms", "postSolution");
			foreach (var project in solution.Projects) {
				foreach (var configuration in solution.ConfigurationNames) {
					foreach (var platform in solution.PlatformNames) {
						var solutionConfig = new ConfigurationAndPlatform(configuration, platform);
						var projectConfig = project.ConfigurationMapping.GetProjectConfiguration(solutionConfig);
						string key = GuidToString(project.IdGuid) + "." + solutionConfig;
						string value = projectConfig.Configuration + "|" + MSBuildInternals.FixPlatformNameForSolution(projectConfig.Platform);
						section.Add(key + ".ActiveCfg", value);
						if (project.ConfigurationMapping.IsBuildEnabled(solutionConfig))
							section.Add(key + ".Build.0", value);
						if (project.ConfigurationMapping.IsDeployEnabled(solutionConfig))
							section.Add(key + ".Deploy.0", value);
					}
				}
			}
			return section;
		}
Example #22
0
		public Task<BuildResults> BuildAsync(ISolution solution, BuildOptions options)
		{
			if (solution != null) {
				var solutionConfiguration = new ConfigurationAndPlatform(options.SolutionConfiguration ?? solution.ActiveConfiguration.Configuration,
			                                                         options.SolutionPlatform ?? solution.ActiveConfiguration.Platform);
				return BuildAsync(solution.Projects.Where(p => p.ConfigurationMapping.IsBuildEnabled(solutionConfiguration)), options);
			} else {
				return Task.FromResult(new BuildResults { Result = BuildResultCode.Error });
			}
		}