//
// Authors:
// Tim Coleman (tim@timcoleman.com)
+// Martin Baulig <martin.baulig@xamarin.com>
//
// Copyright (C) Tim Coleman, 2004
+// Copyright (c) 2012 Xamarin Inc. (http://www.xamarin.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
//
-#if NET_2_0
-
using System.Collections;
using System.Diagnostics;
using System.Xml;
namespace System.Configuration
{
[DebuggerDisplayAttribute ("Count = {Count}")]
- public abstract class ConfigurationElementCollection : ConfigurationElement, ICollection, IEnumerable
+ public abstract partial class ConfigurationElementCollection : ConfigurationElement, ICollection, IEnumerable
{
ArrayList list = new ArrayList ();
ArrayList removed;
internal override void InitFromProperty (PropertyInformation propertyInfo)
{
ConfigurationCollectionAttribute colat = propertyInfo.Property.CollectionAttribute;
+
if (colat == null)
- colat = ElementMap.GetMap (GetType ()).CollectionAttribute;
+ colat = Attribute.GetCustomAttribute (propertyInfo.Type, typeof (ConfigurationCollectionAttribute)) as ConfigurationCollectionAttribute;
+
if (colat != null) {
addElementName = colat.AddItemName;
clearElementName = colat.ClearItemsName;
}
protected virtual bool ThrowOnDuplicate {
- get { return true; }
+ get {
+ if (CollectionType != ConfigurationElementCollectionType.AddRemoveClearMap &&
+ CollectionType != ConfigurationElementCollectionType.AddRemoveClearMapAlternate)
+ return false;
+
+ return true;
+ }
}
protected internal string AddElementName {
protected void BaseAdd (ConfigurationElement element, bool throwIfExists)
{
- if (throwIfExists && BaseIndexOf (element) != -1)
- throw new ConfigurationException ("Duplicate element in collection");
if (IsReadOnly ())
throw new ConfigurationErrorsException ("Collection is read only.");
- int old_index = IndexOfKey (GetElementKey (element));
if (IsAlternate) {
list.Insert (inheritedLimitIndex, element);
inheritedLimitIndex++;
}
else {
+ int old_index = IndexOfKey (GetElementKey (element));
+ if (old_index >= 0) {
+ if (element.Equals (list [old_index]))
+ return;
+ if (throwIfExists)
+ throw new ConfigurationErrorsException ("Duplicate element in collection");
+ list.RemoveAt (old_index);
+ }
list.Add (element);
}
- if (!IsAlternate && old_index != -1)
- list.RemoveAt (old_index);
+
modified = true;
}
protected virtual void BaseAdd (int index, ConfigurationElement element)
{
if (ThrowOnDuplicate && BaseIndexOf (element) != -1)
- throw new ConfigurationException ("Duplicate element in collection");
+ throw new ConfigurationErrorsException ("Duplicate element in collection");
if (IsReadOnly ())
throw new ConfigurationErrorsException ("Collection is read only.");
throw new ConfigurationErrorsException ("Inherited items can't be removed.");
list.RemoveAt (index);
+
+ if (IsAlternate) {
+ if (inheritedLimitIndex > 0)
+ inheritedLimitIndex--;
+ }
+
modified = true;
}
protected internal override bool IsModified ()
{
+ if (modified)
+ return true;
+
+ for (int n=0; n<list.Count; n++) {
+ ConfigurationElement elem = (ConfigurationElement) list [n];
+ if (!elem.IsModified ())
+ continue;
+ modified = true;
+ break;
+ }
+
return modified;
}
return base.IsReadOnly ();
}
- internal override bool HasValues ()
+ internal override void PrepareSave (ConfigurationElement parentElement, ConfigurationSaveMode mode)
+ {
+ var parent = (ConfigurationElementCollection)parentElement;
+ base.PrepareSave (parentElement, mode);
+
+ for (int n=0; n<list.Count; n++) {
+ ConfigurationElement elem = (ConfigurationElement) list [n];
+ object key = GetElementKey (elem);
+ ConfigurationElement pitem = parent != null ? parent.BaseGet (key) as ConfigurationElement : null;
+
+ elem.PrepareSave (pitem, mode);
+ }
+ }
+
+ internal override bool HasValues (ConfigurationElement parentElement, ConfigurationSaveMode mode)
{
- return list.Count > 0;
+ var parent = (ConfigurationElementCollection)parentElement;
+
+ if (mode == ConfigurationSaveMode.Full)
+ return list.Count > 0;
+
+ for (int n=0; n<list.Count; n++) {
+ ConfigurationElement elem = (ConfigurationElement) list [n];
+ object key = GetElementKey (elem);
+ ConfigurationElement pitem = parent != null ? parent.BaseGet (key) as ConfigurationElement : null;
+
+ if (elem.HasValues (pitem, mode))
+ return true;
+ }
+
+ return false;
}
protected internal override void Reset (ConfigurationElement parentElement)
protected internal override void ResetModified ()
{
modified = false;
+ for (int n=0; n<list.Count; n++) {
+ ConfigurationElement elem = (ConfigurationElement) list [n];
+ elem.ResetModified ();
+ }
}
[MonoTODO]
return true;
}
else if (elementName == removeElementName) {
- ConfigurationElement elem = CreateNewElementInternal (removeElementName);
- elem.DeserializeElement (reader, true);
- BaseRemove (GetElementKey (elem));
+ ConfigurationElement elem = CreateNewElementInternal (null);
+ ConfigurationRemoveElement removeElem = new ConfigurationRemoveElement (elem, this);
+ removeElem.DeserializeElement (reader, true);
+ BaseRemove (removeElem.KeyValue);
modified = false;
return true;
}
return false;
}
- protected internal override void Unmerge (ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode updateMode)
+ protected internal override void Unmerge (ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode)
{
ConfigurationElementCollection source = (ConfigurationElementCollection) sourceElement;
ConfigurationElementCollection parent = (ConfigurationElementCollection) parentElement;
ConfigurationElement sitem = source.BaseGet (n);
object key = source.GetElementKey (sitem);
ConfigurationElement pitem = parent != null ? parent.BaseGet (key) as ConfigurationElement : null;
- if (pitem != null && updateMode != ConfigurationSaveMode.Full) {
- ConfigurationElement nitem = CreateNewElementInternal (null);
- nitem.Unmerge (sitem, pitem, ConfigurationSaveMode.Minimal);
- if (nitem.HasValues ())
+ ConfigurationElement nitem = CreateNewElementInternal (null);
+ if (pitem != null && saveMode != ConfigurationSaveMode.Full) {
+ nitem.Unmerge (sitem, pitem, saveMode);
+ if (nitem.HasValues (pitem, saveMode))
BaseAdd (nitem);
- }
- else {
- ConfigurationElement nitem = CreateNewElementInternal (null);
+ } else {
nitem.Unmerge (sitem, null, ConfigurationSaveMode.Full);
BaseAdd (nitem);
}
}
- if (updateMode == ConfigurationSaveMode.Full)
+ if (saveMode == ConfigurationSaveMode.Full)
EmitClear = true;
else if (parent != null) {
for (int n=0; n<parent.Count; n++) {
}
}
-#endif