X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Web%2FSystem.Web.UI%2FAttributeCollection.cs;h=4bcf8835302941b49c07801dfd3ff6f1d3223f20;hb=f0d2ee46f839cc3cebcdaa674b3a31d9a3e22863;hp=749a1ac918ec92655c210441d08772e79d4faca0;hpb=881f83658281916d8f0784df7c726ecb7cc289db;p=mono.git diff --git a/mcs/class/System.Web/System.Web.UI/AttributeCollection.cs b/mcs/class/System.Web/System.Web.UI/AttributeCollection.cs index 749a1ac918e..4bcf8835302 100644 --- a/mcs/class/System.Web/System.Web.UI/AttributeCollection.cs +++ b/mcs/class/System.Web/System.Web.UI/AttributeCollection.cs @@ -6,7 +6,7 @@ // Gonzalo Paniagua (gonzalo@ximian.com) // // (C) 2002 Ximian, Inc. (http://www.ximian.com -// Copyright (C) 2005 Novell, Inc (http://www.novell.com) +// Copyright (C) 2005-2010 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -31,6 +31,7 @@ using System.Collections; using System.Globalization; using System.Security.Permissions; +using System.Web.Util; namespace System.Web.UI { @@ -38,14 +39,82 @@ namespace System.Web.UI { [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public sealed class AttributeCollection { - private StateBag bag; - private CssStyleCollection styleCollection; + StateBag bag; + CssStyleCollection styleCollection; + internal const string StyleAttribute = "style"; public AttributeCollection (StateBag bag) { this.bag = bag; } + public override bool Equals (object obj) + { + AttributeCollection other = obj as AttributeCollection; + if (other == null) { + return false; + } + + if (Count != other.Count) { + return false; + } + + foreach (string key in Keys) { + if (0 == String.CompareOrdinal (key, StyleAttribute)) { + continue; + } + if (0 == String.CompareOrdinal (other [key], this [key])) { + return false; + } + } + + if ((styleCollection == null && other.styleCollection != null) || + (styleCollection != null && other.styleCollection == null)) { + return false; + } + else if (styleCollection != null){ + // other.styleCollection != null too + if (styleCollection.Count != other.styleCollection.Count){ + return false; + } + foreach (string styleKey in styleCollection.Keys){ + if (0 == String.CompareOrdinal(styleCollection [styleKey], other.styleCollection [styleKey])) { + return false; + } + } + } + + return true; + } + + public override int GetHashCode () + { + int hashValue = 0; + + foreach (string key in Keys) { + if (key == StyleAttribute) { + continue; + } + hashValue ^= key.GetHashCode (); + string value = this [key]; + if (value != null) { + hashValue ^= value.GetHashCode (); + } + } + + if (styleCollection != null) { + foreach (string styleKey in styleCollection.Keys) { + hashValue ^= styleCollection [styleKey].GetHashCode (); + string styleValue = styleCollection [styleKey]; + if (styleValue != null) { + hashValue ^= styleValue.GetHashCode (); + } + } + } + + return hashValue; + } + public int Count { get { return bag.Count; } } @@ -72,7 +141,7 @@ namespace System.Web.UI { public void Add (string key, string value) { - if (0 == String.Compare (key, "style", true, CultureInfo.InvariantCulture)) { + if (0 == String.Compare (key, StyleAttribute, true, Helpers.InvariantCulture)) { CssStyle.Value = value; return; } @@ -95,7 +164,7 @@ namespace System.Web.UI { public void Remove (string key) { - if (0 == String.Compare (key, "style", true, CultureInfo.InvariantCulture)) { + if (0 == String.Compare (key, StyleAttribute, true, Helpers.InvariantCulture)) { CssStyle.Clear (); return; } @@ -110,5 +179,14 @@ namespace System.Web.UI { writer.WriteAttribute (key, value, true); } } + + internal void CopyFrom (AttributeCollection attributeCollection) + { + if (attributeCollection == null || attributeCollection.Count == 0) + return; + + foreach (string key in attributeCollection.bag.Keys) + this.Add (key, attributeCollection [key]); + } } }