2 // System.Web.UI.AttributeCollection.cs
5 // Duncan Mak (duncan@ximian.com)
6 // Gonzalo Paniagua (gonzalo@ximian.com)
8 // (C) 2002 Ximian, Inc. (http://www.ximian.com
9 // Copyright (C) 2005-2010 Novell, Inc (http://www.novell.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Collections
;
32 using System
.Globalization
;
33 using System
.Security
.Permissions
;
34 using System
.Web
.Util
;
36 namespace System
.Web
.UI
{
38 // CAS - no InheritanceDemand here as the class is sealed
39 [AspNetHostingPermission (SecurityAction
.LinkDemand
, Level
= AspNetHostingPermissionLevel
.Minimal
)]
40 public sealed class AttributeCollection
43 CssStyleCollection styleCollection
;
44 internal const string StyleAttribute
= "style";
46 public AttributeCollection (StateBag bag
)
51 public override bool Equals (object o
)
53 AttributeCollection other
= o
as AttributeCollection
;
58 if (Count
!= other
.Count
) {
62 foreach (string key
in Keys
) {
63 if (0 == String
.CompareOrdinal (key
, StyleAttribute
)) {
66 if (0 == String
.CompareOrdinal (other
[key
], this [key
])) {
71 if ((styleCollection
== null && other
.styleCollection
!= null) ||
72 (styleCollection
!= null && other
.styleCollection
== null)) {
75 else if (styleCollection
!= null){
76 // other.styleCollection != null too
77 if (styleCollection
.Count
!= other
.styleCollection
.Count
){
80 foreach (string styleKey
in styleCollection
.Keys
){
81 if (0 == String
.CompareOrdinal(styleCollection
[styleKey
], other
.styleCollection
[styleKey
])) {
90 public override int GetHashCode ()
94 foreach (string key
in Keys
) {
95 if (key
== StyleAttribute
) {
98 hashValue ^
= key
.GetHashCode ();
99 string value = this [key
];
101 hashValue ^
= value.GetHashCode ();
105 if (styleCollection
!= null) {
106 foreach (string styleKey
in styleCollection
.Keys
) {
107 hashValue ^
= styleCollection
[styleKey
].GetHashCode ();
108 string styleValue
= styleCollection
[styleKey
];
109 if (styleValue
!= null) {
110 hashValue ^
= styleValue
.GetHashCode ();
119 get { return bag.Count; }
122 public CssStyleCollection CssStyle
{
124 if (styleCollection
== null)
125 styleCollection
= new CssStyleCollection (bag
);
126 return styleCollection
;
130 public string this [string key
] {
131 get { return bag [key] as string; }
138 public ICollection Keys
{
139 get { return bag.Keys; }
142 public void Add (string key
, string value)
144 if (0 == String
.Compare (key
, StyleAttribute
, true, Helpers
.InvariantCulture
)) {
145 CssStyle
.Value
= value;
148 bag
.Add (key
, value);
151 public void AddAttributes (HtmlTextWriter writer
)
153 foreach (string key
in bag
.Keys
) {
154 string value = bag
[key
] as string;
155 writer
.AddAttribute (key
, value);
165 public void Remove (string key
)
167 if (0 == String
.Compare (key
, StyleAttribute
, true, Helpers
.InvariantCulture
)) {
174 public void Render (HtmlTextWriter writer
)
176 foreach (string key
in bag
.Keys
) {
177 string value = bag
[key
] as string;
179 writer
.WriteAttribute (key
, value, true);
183 internal void CopyFrom (AttributeCollection attributeCollection
)
185 if (attributeCollection
== null || attributeCollection
.Count
== 0)
188 foreach (string key
in attributeCollection
.bag
.Keys
)
189 this.Add (key
, attributeCollection
[key
]);