File: AutoFieldsGenerator.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 (150 lines) | stat: -rw-r--r-- 5,563 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
using System.Collections;
using System.Collections.Generic;
using System.Web.Util;

namespace System.Web.UI.WebControls {
    public abstract class AutoFieldsGenerator : IAutoFieldGenerator, IStateManager {
        private List<AutoGeneratedFieldProperties> _autoGeneratedFieldProperties;
        private bool _tracking;

        internal bool InDataBinding {
            get;
            set;
        }

        internal object DataItem {
            get;
            set;
        }

        private ICollection CreateAutoGeneratedFieldsFromFieldProperties() {
            List<AutoGeneratedField> autoFields = new List<AutoGeneratedField>();

            foreach (AutoGeneratedFieldProperties fieldProperties in AutoGeneratedFieldProperties) {
                autoFields.Add(CreateAutoGeneratedFieldFromFieldProperties(fieldProperties));
            }

            return autoFields;
        }

        //internal for unit testing.
        protected internal List<AutoGeneratedFieldProperties> AutoGeneratedFieldProperties {
            get {
                if (_autoGeneratedFieldProperties == null) {
                    _autoGeneratedFieldProperties = new List<AutoGeneratedFieldProperties>();
                }
                return _autoGeneratedFieldProperties;
            }
        }

        /// <devdoc>
        /// Create a single autogenerated field.  This function can be overridden to create a different AutoGeneratedField.
        /// </devdoc>
        protected virtual AutoGeneratedField CreateAutoGeneratedFieldFromFieldProperties(AutoGeneratedFieldProperties fieldProperties) {
            AutoGeneratedField field = new AutoGeneratedField(fieldProperties.DataField);
            string name = fieldProperties.Name;
            ((IStateManager)field).TrackViewState();

            field.HeaderText = name;
            field.SortExpression = name;
            field.ReadOnly = fieldProperties.IsReadOnly;
            field.DataType = fieldProperties.Type;

            return field;
        }

        protected bool IsTrackingViewState {
            get {
                return _tracking;
            }
        }

        protected virtual void TrackViewState() {
            _tracking = true;
            foreach (object fieldProps in AutoGeneratedFieldProperties) {
                ((IStateManager)fieldProps).TrackViewState();
            }
        }

        protected virtual void LoadViewState(object savedState) {
            if (savedState != null) {
                object[] autoGenFieldStateArray = (object[])savedState;
                int fieldCount = autoGenFieldStateArray.Length;
                AutoGeneratedFieldProperties.Clear();

                for (int i = 0; i < fieldCount; i++) {
                    AutoGeneratedFieldProperties fieldProps = new AutoGeneratedFieldProperties();
                    ((IStateManager)fieldProps).TrackViewState();
                    ((IStateManager)fieldProps).LoadViewState(autoGenFieldStateArray[i]);
                    AutoGeneratedFieldProperties.Add(fieldProps);
                }
            }
        }

        protected virtual object SaveViewState() {
            // pack up the auto gen'd field properties
            int autoGenFieldPropsCount = AutoGeneratedFieldProperties.Count;
            object[] autoGenFieldState = new object[autoGenFieldPropsCount];

            for (int i = 0; i < autoGenFieldPropsCount; i++) {
                autoGenFieldState[i] = ((IStateManager)AutoGeneratedFieldProperties[i]).SaveViewState();
            }
            return autoGenFieldState;
        }

        /// <summary>
        /// Method that creates the AutoGeneratedFields. This would also typically populate the AutoGeneratedFieldProperties collection
        /// which are tracked by view state.
        /// </summary>
        /// <returns></returns>
        public abstract List<AutoGeneratedField> CreateAutoGeneratedFields(object dataItem, Control control);

        /// <summary>
        /// A flag to indicate whether Enum fields should be generated by this FieldGenerator.
        /// If this flag is not set, the FieldGenerator uses <see cref='System.Web.UI.WebControls.Control.RenderingCompatibility'/> of
        /// <see cref='System.Web.UI.WebControls.Control'/> to determine the default behavior which is 
        /// true when RenderingCompatibility is greater than or equal to 4.5 and false in older versions.
        /// </summary>
        public bool? AutoGenerateEnumFields {
            get;
            set;
        }

        #region Implementation of IAutoFieldGenerator

        public virtual ICollection GenerateFields(Control control) {
            if (InDataBinding) {
                //Reset this collection as this would be populated by CreateAutoGenerateFields.
                _autoGeneratedFieldProperties = null;
                return CreateAutoGeneratedFields(DataItem, control);
            }
            else {
                return CreateAutoGeneratedFieldsFromFieldProperties();
            }
        }

        #endregion

        #region Implementation of IStateManager

        bool IStateManager.IsTrackingViewState {
            get {
                return IsTrackingViewState;
            }
        }

        void IStateManager.LoadViewState(object savedState) {
            LoadViewState(savedState);
        }

        object IStateManager.SaveViewState() {
            return SaveViewState();
        }

        void IStateManager.TrackViewState() {
            TrackViewState();
        }

        #endregion
    }
}