File: AttributeCollection.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (218 lines) | stat: -rw-r--r-- 6,674 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
//------------------------------------------------------------------------------
// <copyright file="AttributeCollection.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------

/*
 * AttributeCollection.cs
 *
 * Copyright (c) 2000 Microsoft Corporation
 */

namespace System.Web.UI {
    using System.IO;
    using System.Collections;
    using System.Reflection;
    using System.Web.UI;
    using System.Globalization;
    using System.Security.Permissions;
    using System.Web.Util;
    
/*
 * The AttributeCollection represents Attributes on an Html control.
 */

/// <devdoc>
///    <para>
///       The <see langword='AttributeCollection'/> class provides object-model access
///       to all attributes declared on an HTML server control element.
///    </para>
/// </devdoc>
    public sealed class AttributeCollection {
        private StateBag _bag;
        private CssStyleCollection _styleColl;

        /*
         *      Constructs an AttributeCollection given a StateBag.
         */

        /// <devdoc>
        /// </devdoc>
        public AttributeCollection(StateBag bag) {
            _bag = bag;
        }

        /*
         * Automatically adds new keys.
         */

        /// <devdoc>
        ///    <para>
        ///       Gets or sets a specified attribute value.
        ///    </para>
        /// </devdoc>
        public string this[string key]
        {
            get {
                if (_styleColl != null && StringUtil.EqualsIgnoreCase(key, "style"))
                    return _styleColl.Value;
                else
                    return _bag[key] as string;
            }
            set { 
                Add(key, value); 
            }
        }

        /*
         * Returns a collection of keys.
         */

        /// <devdoc>
        ///    <para>
        ///       Gets a collection of keys to all the attributes in the
        ///    <see langword='AttributeCollection'/>.
        ///    </para>
        /// </devdoc>
        public ICollection Keys {
            get { 
                return _bag.Keys;
            }
        }


        /// <devdoc>
        ///    <para>
        ///       Gets the number of items in the <see langword='AttributeCollection'/>.
        ///    </para>
        /// </devdoc>
        public int Count {
            get { 
                return _bag.Count; 
            }
        }


        /// <devdoc>
        /// </devdoc>
        public CssStyleCollection CssStyle {
            get {
                if (_styleColl == null) {
                    _styleColl = new CssStyleCollection(_bag);
                }
                return _styleColl;
            }
        }


        /// <devdoc>
        ///    <para>
        ///       Adds an item to the <see langword='AttributeCollection'/>.
        ///    </para>
        /// </devdoc>
        public void Add(string key, string value) {
            if (_styleColl != null && StringUtil.EqualsIgnoreCase(key, "style"))
                _styleColl.Value = value;
            else
                _bag[key] = value;
        }

        public override bool Equals(object o) {
            // This implementation of Equals relies on mutable properties and is therefore broken,
            // but we shipped it this way in V1 so it will be a breaking change to fix it.
            AttributeCollection attrs = o as AttributeCollection;

            if (attrs != null) {
                if (attrs.Count != _bag.Count) {
                    return false;
                }
                foreach (DictionaryEntry attr in _bag) {
                    if (this[(string)attr.Key] != attrs[(string)attr.Key]) {
                        return false;
                    }
                }
                return true;
            }
            return false;
        }

        public override int GetHashCode() {
            // This implementation of GetHashCode uses mutable properties but matches the V1 implementation
            // of Equals.
            HashCodeCombiner hashCodeCombiner = new HashCodeCombiner();
            foreach (DictionaryEntry attr in _bag) {
                hashCodeCombiner.AddObject(attr.Key);
                hashCodeCombiner.AddObject(attr.Value);
            }
            return hashCodeCombiner.CombinedHash32;
        }
        

        /// <devdoc>
        ///    <para>
        ///       Removes an attribute from the <see langword='AttributeCollection'/>.
        ///    </para>
        /// </devdoc>
        public void Remove(string key) {
            if (_styleColl != null && StringUtil.EqualsIgnoreCase(key, "style"))
                _styleColl.Clear();
            else
                _bag.Remove(key);
        }


        /// <devdoc>
        ///    <para>
        ///       Removes all attributes from the <see langword='AttributeCollection'/>.
        ///    </para>
        /// </devdoc>
        public void Clear() {
            _bag.Clear();
            if (_styleColl != null)
                _styleColl.Clear();
        }


        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public void Render(HtmlTextWriter writer) {
            if (_bag.Count > 0) {
                IDictionaryEnumerator e = _bag.GetEnumerator();

                while (e.MoveNext()) {
                    StateItem item = e.Value as StateItem;
                    if (item != null) {
                        string value = item.Value as string;
                        string key = e.Key as string;
                        if (key != null && value != null) {
                            writer.WriteAttribute(key, value, true /*fEncode*/);
                        }
                    }
                }
            }
        }


        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public void AddAttributes(HtmlTextWriter writer) {
            if (_bag.Count > 0) {
                IDictionaryEnumerator e = _bag.GetEnumerator();

                while (e.MoveNext()) {
                    StateItem item = e.Value as StateItem;
                    if (item != null) {
                        string value = item.Value as string;
                        string key = e.Key as string;
                        if (key != null && value != null) {
                            writer.AddAttribute(key, value, true /*fEncode*/);
                        }
                    }
                }
            }
        }
    }
}