2007-02-03 Marek Sieradzki <marek.sieradzki@gmail.com>
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / BuildItemGroup.cs
index e511661558336b11d2182bec41464901178332b7..2e39a9dcd466ea7311a376e66715ff76dedf14f2 100644 (file)
@@ -68,6 +68,7 @@ namespace Microsoft.Build.BuildEngine {
                                XmlElement xe = (XmlElement) xn;
                                BuildItem bi = new BuildItem (xe, this);
                                buildItems.Add (bi);
+                               project.LastItemGroupContaining [bi.Name] = this;
                        }
                }
 
@@ -82,17 +83,31 @@ namespace Microsoft.Build.BuildEngine {
                                             string itemInclude,
                                             bool treatItemIncludeAsLiteral)
                {
+                       BuildItem item;
+
                        if (treatItemIncludeAsLiteral)
                                itemInclude = Utilities.Escape (itemInclude);
 
-                       BuildItem bi = new BuildItem (itemName, itemInclude);
+                       if (FromXml) {
+                               XmlElement element = itemGroupElement.OwnerDocument.CreateElement (itemName, Project.XmlNamespace);
+                               itemGroupElement.AppendChild (element);
+                               element.SetAttribute ("Include", itemInclude);
+                               item = new BuildItem (element, this);
+                       } else {
+                               item = new BuildItem (itemName, itemInclude);
+                       }
 
-                       bi.Evaluate (null, true);
+                       item.Evaluate (null, true);
 
                        if (!read_only)
-                               buildItems.Add (bi);
+                               buildItems.Add (item);
+
+                       if (parentProject != null) {
+                               parentProject.MarkProjectAsDirty ();
+                               parentProject.NeedToReevaluate ();
+                       }
 
-                       return bi;
+                       return item;
                }
                
                public void Clear ()
@@ -101,6 +116,11 @@ namespace Microsoft.Build.BuildEngine {
                                itemGroupElement.RemoveAll ();
                        
                        buildItems = new List <BuildItem> ();
+
+                       if (parentProject != null) {
+                               parentProject.MarkProjectAsDirty ();
+                               parentProject.NeedToReevaluate ();
+                       }
                }
 
                [MonoTODO]
@@ -126,12 +146,19 @@ namespace Microsoft.Build.BuildEngine {
 
                public void RemoveItem (BuildItem itemToRemove)
                {
+                       if (itemToRemove == null)
+                               return;
+
+                       itemToRemove.Detach ();
+
                        buildItems.Remove (itemToRemove);
                }
 
                public void RemoveItemAt (int index)
                {
-                       buildItems.RemoveAt (index);
+                       BuildItem item = buildItems [index];
+
+                       RemoveItem (item);
                }
 
                public BuildItem[] ToArray ()
@@ -177,6 +204,14 @@ namespace Microsoft.Build.BuildEngine {
                        return array;
                }
 
+               internal void Detach ()
+               {
+                       if (!FromXml)
+                               throw new InvalidOperationException ();
+
+                       itemGroupElement.ParentNode.RemoveChild (itemGroupElement);
+               }
+
                internal void Evaluate ()
                {
                        foreach (BuildItem bi in buildItems) {
@@ -196,8 +231,6 @@ namespace Microsoft.Build.BuildEngine {
                        buildItems.InsertRange (index, list);
                }
                
-               [MonoTODO]
-               // FIXME: whether we can invoke get_Condition on BuildItemGroup not based on XML
                public string Condition {
                        get {
                                if (FromXml)
@@ -234,7 +267,7 @@ namespace Microsoft.Build.BuildEngine {
                        set { parentCollection = value; }
                }
                
-               internal Project Project {
+               internal Project ParentProject {
                        get { return parentProject; }
                }
 
@@ -243,6 +276,12 @@ namespace Microsoft.Build.BuildEngine {
                                return itemGroupElement != null;
                        }
                }
+
+               internal XmlElement XmlElement {
+                       get {
+                               return itemGroupElement;
+                       }       
+               }
        }
 }