2
// SolutionConfiguration.cs
5
// Lluis Sanchez Gual <lluis@novell.com>
7
// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30
using System.Collections;
31
using System.Collections.ObjectModel;
32
using System.Collections.Generic;
33
using System.Reflection;
34
using System.Diagnostics;
35
using System.CodeDom.Compiler;
37
using MonoDevelop.Projects;
38
using MonoDevelop.Core.Serialization;
40
using MonoDevelop.Core;
42
namespace MonoDevelop.Projects
44
public class SolutionConfiguration : ItemConfiguration
46
Solution parentSolution;
48
List<SolutionConfigurationEntry> configurations = new List<SolutionConfigurationEntry> ();
50
public SolutionConfiguration ()
54
public SolutionConfiguration (string id): base (id)
58
public SolutionConfiguration (string name, string platform): base (name, platform)
62
public override ConfigurationSelector Selector {
63
get { return new SolutionConfigurationSelector (Id); }
66
public Solution ParentSolution {
67
get { return parentSolution; }
68
internal set { parentSolution = value; }
71
public ReadOnlyCollection<SolutionConfigurationEntry> Configurations {
72
get { return configurations.AsReadOnly (); }
75
public bool BuildEnabledForItem (SolutionEntityItem item)
77
foreach (SolutionConfigurationEntry entry in configurations) {
78
if (entry.Item == item)
79
return entry.Build && item.Configurations [entry.ItemConfiguration] != null;
84
public string GetMappedConfiguration (SolutionEntityItem item)
86
foreach (SolutionConfigurationEntry entry in configurations) {
87
if (entry.Item == item)
88
return entry.ItemConfiguration;
93
public SolutionConfigurationEntry GetEntryForItem (SolutionEntityItem item)
95
foreach (SolutionConfigurationEntry entry in configurations) {
96
if (entry.Item == item)
102
public SolutionConfigurationEntry AddItem (SolutionEntityItem item)
104
string conf = FindMatchingConfiguration (item);
105
return AddItem (item, conf != null, conf);
108
string FindMatchingConfiguration (SolutionEntityItem item)
110
if (item.Configurations [Id] != null)
113
if (item.Configurations.Count == 0)
116
// This configuration is not present in the project. Try to find the best match.
117
// First of all try matching name
118
foreach (SolutionItemConfiguration iconf in item.Configurations) {
119
if (iconf.Name == Name && iconf.Platform.Length == 0)
123
if (Platform.Length > 0) {
124
// No name coincidence, now try matching the platform
125
foreach (SolutionItemConfiguration iconf in item.Configurations) {
126
if (iconf.Platform == Platform)
131
// Now match name, ignoring platform
132
foreach (SolutionItemConfiguration iconf in item.Configurations) {
133
if (iconf.Name == Name)
137
// No luck. Pick whatever.
138
return item.Configurations [0].Id;
141
public SolutionConfigurationEntry AddItem (SolutionEntityItem item, bool build, string itemConfiguration)
143
if (itemConfiguration == null)
144
itemConfiguration = Name;
145
SolutionConfigurationEntry conf = new SolutionConfigurationEntry (this, item);
147
conf.ItemConfiguration = itemConfiguration;
148
configurations.Add (conf);
149
if (parentSolution != null)
150
parentSolution.UpdateDefaultConfigurations ();
154
public void RemoveItem (SolutionEntityItem item)
156
for (int n=0; n<configurations.Count; n++) {
157
if (configurations [n].Item == item) {
158
configurations.RemoveAt (n);
164
public override void CopyFrom (ItemConfiguration configuration)
166
base.CopyFrom (configuration);
168
SolutionConfiguration conf = (SolutionConfiguration) configuration;
169
if (parentSolution == null)
170
parentSolution = conf.parentSolution;
172
configurations.Clear ();
173
foreach (SolutionConfigurationEntry entry in conf.configurations)
174
configurations.Add (new SolutionConfigurationEntry (this, entry));
176
if (parentSolution != null)
177
parentSolution.UpdateDefaultConfigurations ();
181
public class SolutionConfigurationEntry
183
SolutionEntityItem item;
184
SolutionConfiguration parentConfig;
186
[ItemProperty ("name")]
190
string configuration;
192
[ItemProperty (DefaultValue=true)]
195
internal SolutionConfigurationEntry (SolutionConfiguration parentConfig, SolutionConfigurationEntry other)
197
this.parentConfig = parentConfig;
198
this.itemId = other.itemId;
199
this.configuration = other.configuration;
200
this.build = other.build;
203
internal SolutionConfigurationEntry (SolutionConfiguration parentConfig, SolutionEntityItem item)
205
this.parentConfig = parentConfig;
207
configuration = parentConfig.Id;
208
itemId = item.ItemId;
211
public string ItemConfiguration {
212
get { return configuration; }
214
configuration = value;
215
if (parentConfig != null && parentConfig.ParentSolution != null)
216
parentConfig.ParentSolution.UpdateDefaultConfigurations ();
220
public ConfigurationSelector ItemConfigurationSelector {
221
get { return new ItemConfigurationSelector (ItemConfiguration); }
225
get { return build; }
226
set { build = value; }
229
public SolutionEntityItem Item {
231
if (item == null && parentConfig != null) {
232
Solution sol = parentConfig.ParentSolution;
234
item = sol.GetSolutionItem (itemId) as SolutionEntityItem;