2002-07-17 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI / Control.cs
index fde93160d3fa0bfaa5ff2913b6d81aab56f3823d..1820dc33dad5cf267e63fd878f8ee95b95a3ff99 100644 (file)
@@ -1,10 +1,12 @@
 //\r
 // System.Web.UI.Control.cs\r
 //\r
-// Author:\r
-//   Bob Smith <bob@thestuff.net>\r
+// Authors:\r
+//     Bob Smith <bob@thestuff.net>\r
+//     Gonzalo Paniagua Javier (gonzalo@ximian.com)\r
 //\r
 // (C) Bob Smith\r
+// (c) 2002 Ximian, Inc. (http://www.ximian.com)\r
 //\r
 \r
 /*\r
@@ -110,6 +112,8 @@ namespace System.Web.UI
                 private bool _trackViewState = false;\r
                 private EventHandlerList _events = new EventHandlerList();\r
                 private RenderMethod _renderMethodDelegate = null;\r
+               private bool autoID = true;\r
+               private bool creatingControls = false;\r
                \r
                    private DataBindingCollection dataBindings = null;\r
 \r
@@ -117,6 +121,17 @@ namespace System.Web.UI
                 {\r
                         if (this is INamingContainer) _isNamingContainer = true;\r
                 }\r
+\r
+               public Control BindingContainer\r
+               {\r
+                       get {\r
+                               Control container = NamingContainer;\r
+                               if (_isNamingContainer)\r
+                                       container = container.BindingContainer;\r
+                               return container;\r
+                       }\r
+               }\r
+               \r
                 public virtual string ClientID //DIT\r
                 {\r
                         get\r
@@ -211,20 +226,28 @@ namespace System.Web.UI
                                 return Context.Request.ApplicationPath; //TODO: Dont think this is right.\r
                         }\r
                 }\r
+\r
+                               [MonoTODO]\r
                 public virtual string UniqueID\r
                 {\r
                         get\r
                         {\r
                                 //TODO: Some Naming container methods here. What are they? Why arnt they declared?\r
                                 //Note: Nuked the old stuff here. Was total crap. :)\r
-                                throw new NotImplementedException();\r
+                                return ID;\r
                         }\r
                 }\r
                 public virtual bool Visible\r
-                { //TODO: Are children visible when parents are not?\r
+                {\r
                         get\r
                         {\r
-                                return _visible;\r
+                               if (_visible == false)\r
+                                       return false;\r
+\r
+                               if (_parent != null)\r
+                                       return _parent.Visible;\r
+\r
+                                return true;\r
                         }\r
                         set\r
                         {\r
@@ -290,21 +313,40 @@ namespace System.Web.UI
                         get\r
                         {\r
                                if(_viewState == null)\r
-                               {\r
-                                       _viewState = new StateBag(ViewStateIgnoresCase);\r
-                               if(IsTrackingViewState)\r
-                                               _viewState.TrackViewState();\r
-                               }\r
+                                       _viewState = new StateBag (ViewStateIgnoresCase);\r
+\r
+                               if (IsTrackingViewState)\r
+                                       _viewState.TrackViewState ();\r
+\r
                                return _viewState;\r
                         }\r
                 }\r
-                protected virtual bool ViewStateIgnoresCase //DIT\r
+                protected virtual bool ViewStateIgnoresCase\r
                 {\r
-                        get\r
-                        {\r
-                                return true;\r
+                        get {\r
+                                return false;\r
                         }\r
                 }\r
+\r
+               private int defaultNumberID;\r
+               protected internal virtual void AddedControl (Control control, int index)\r
+               {\r
+                       /* Ensure the control don't have more than 1 parent */\r
+                       if (control._parent != null)\r
+                               control._parent.Controls.Remove (control);\r
+\r
+                       control._parent = this;\r
+                       control._page = Page;\r
+\r
+                       // Without this, DataBoundLiteralControl crashes in OnDataBound event.\r
+                       Control namingContainer = NamingContainer;\r
+                       if (namingContainer != null)\r
+                               control._namingContainer = namingContainer;\r
+                       \r
+                       if (control.AutoID == true && control.ID == null)\r
+                               control.ID = "_ctrl_" + defaultNumberID++;\r
+               }\r
+\r
                 protected virtual void AddParsedSubObject(object obj) //DIT\r
                 {\r
                         Control c = (Control)obj;\r
@@ -325,30 +367,50 @@ namespace System.Web.UI
                 {\r
                         return new ControlCollection(this);\r
                 }\r
-                protected virtual void EnsureChildControls() //DIT\r
+\r
+                protected virtual void EnsureChildControls () //DIT\r
                 {\r
-                        if (_childControlsCreated == false)\r
-                        {\r
+                        if (ChildControlsCreated == false && !creatingControls) {\r
+                               creatingControls = true;\r
                                 CreateChildControls();\r
                                 ChildControlsCreated = true;\r
+                               creatingControls = false;\r
                         }\r
                 }\r
+\r
                 protected virtual Control FindControl(string id, int pathOffset)\r
                 {\r
                         //TODO: I think there is Naming Container stuff here. Redo.\r
                         int i;\r
-                        for (i = pathOffset; i < _controls.Count; i++)\r
-                                if (_controls[i].ID == id) return _controls[i];\r
+                       Control ctrl;\r
+                        for (i = pathOffset; i < _controls.Count; i++){\r
+                               ctrl = _controls [i];\r
+                               \r
+                                if (ctrl.ID == id)\r
+                                       return ctrl;\r
+\r
+                               if (ctrl.Controls.Count > 0){\r
+                                       Control other = ctrl.FindControl (id);\r
+                                       if (other != null)\r
+                                               return other;\r
+                               }\r
+                               \r
+                       }\r
                         return null;\r
                 }\r
+\r
                 protected virtual void LoadViewState(object savedState)\r
                 {\r
-                        //TODO: What should I do by default?\r
+                       if (savedState != null)\r
+                               ViewState.LoadViewState (savedState);\r
                 }\r
+                \r
+               [MonoTODO]\r
                 protected string MapPathSecure(string virtualPath)\r
                 {\r
-                        throw new NotImplementedException();\r
                         //TODO: Need to read up on security+web.\r
+                       //Return the same path. So AdRotator can read its config file.\r
+                       return virtualPath;\r
                 }\r
                 protected virtual bool OnBubbleEvent(object source, EventArgs args) //DIT\r
                 {\r
@@ -394,6 +456,8 @@ namespace System.Web.UI
                                 if (eh != null) eh(this, e);\r
                         }\r
                 }\r
+                \r
+                               [MonoTODO]\r
                 protected void RaiseBubbleEvent(object source, EventArgs args)\r
                 {\r
                         throw new NotImplementedException();\r
@@ -411,14 +475,23 @@ namespace System.Web.UI
                                 foreach (Control c in _controls)\r
                                         c.RenderControl(writer);\r
                 }\r
-                protected virtual object SaveViewState()\r
+               \r
+                protected virtual object SaveViewState ()\r
                 {\r
-                        return ViewState;\r
+                       if (_viewState == null)\r
+                               return null;\r
+\r
+                       return _viewState.SaveViewState ();\r
                 }\r
+\r
                 protected virtual void TrackViewState()\r
                 {\r
+                       if (_viewState != null)\r
+                               _viewState.TrackViewState ();\r
                         _trackViewState = true;\r
                 }\r
+                \r
+                               [MonoTODO]\r
                 public virtual void Dispose()\r
                 {\r
                         //TODO: nuke stuff.\r
@@ -431,6 +504,12 @@ namespace System.Web.UI
                         }\r
                     */\r
                 }\r
+\r
+               public bool HasChildren\r
+               {\r
+                       get { return (_controls != null && _controls.Count > 0); }\r
+               }\r
+\r
                 public event EventHandler DataBinding //DIT\r
                 {\r
                         add\r
@@ -521,47 +600,86 @@ namespace System.Web.UI
                                 Render(writer);\r
                         }\r
                 }\r
+                \r
+                [MonoTODO]\r
                 public string ResolveUrl(string relativeUrl)\r
                 {\r
-                       throw new NotImplementedException();\r
+                       return relativeUrl;\r
                 }\r
+\r
                 public void SetRenderMethodDelegate(RenderMethod renderMethod) //DIT\r
                 {\r
                         _renderMethodDelegate = renderMethod;\r
                 }\r
+\r
                 protected void LoadRecursive()\r
                 {\r
                         OnLoad(EventArgs.Empty);\r
                         if (_controls != null) foreach (Control c in _controls) c.LoadRecursive();\r
                 }\r
+\r
                 protected void UnloadRecursive(Boolean dispose)\r
                 {\r
                         OnUnload(EventArgs.Empty);\r
                         if (_controls != null) foreach (Control c in _controls) c.UnloadRecursive(dispose);\r
                         if (dispose) Dispose();\r
                 }\r
+\r
                 protected void PreRenderRecursiveInternal()\r
                 {\r
                         OnPreRender(EventArgs.Empty);\r
                         if (_controls != null) foreach (Control c in _controls) c.PreRenderRecursiveInternal();\r
                 }\r
+\r
                 protected void InitRecursive(Control namingContainer)\r
                 {\r
                         if (_controls != null) foreach (Control c in _controls) c.InitRecursive(namingContainer);\r
                         OnInit(EventArgs.Empty);\r
+                       TrackViewState ();\r
                 }\r
+                \r
                 protected object SaveViewStateRecursive()\r
                 {\r
-                        throw new NotImplementedException();\r
+                       if (!EnableViewState || !Visible)\r
+                               return null;\r
+\r
+                       ArrayList controlList = null;\r
+                       ArrayList controlStates = null;\r
+\r
+                       foreach (Control ctrl in Controls){\r
+                               if (controlList == null) {\r
+                                       controlList = new ArrayList ();\r
+                                       controlStates = new ArrayList ();\r
+                               }\r
+                               controlList.Add (ctrl);\r
+                               controlStates.Add (ctrl.SaveViewStateRecursive ());\r
+                       }\r
+                               \r
+                       return new Triplet (SaveViewState (), controlList, controlStates);\r
                 }\r
-                protected void LoadViewStateRecursive(Object savedState)\r
+                \r
+                protected void LoadViewStateRecursive (object savedState)\r
                 {\r
-                        throw new NotImplementedException();\r
+                       if (!EnableViewState || !Visible || savedState == null)\r
+                               return;\r
+\r
+                       Triplet savedInfo = (Triplet) savedState;\r
+                       LoadViewState (savedInfo.First);\r
+\r
+                       ArrayList controlList = savedInfo.Second as ArrayList;\r
+                       if (controlList == null)\r
+                               return;\r
+                       ArrayList controlStates = savedInfo.Third as ArrayList;\r
+                       int nControls = controlList.Count;\r
+                       for (int i = 0; i < nControls; i++) {\r
+                               if (controlStates != null)\r
+                                       Controls [i].LoadViewStateRecursive (controlStates [i]);\r
+                       }\r
                 }\r
                 \r
                 void IParserAccessor.AddParsedSubObject(object obj)\r
                 {\r
-                       this.AddParsedSubObject(obj);\r
+                       AddParsedSubObject(obj);\r
                 }\r
                 \r
                 DataBindingCollection IDataBindingsAccessor.DataBindings\r
@@ -582,6 +700,25 @@ namespace System.Web.UI
                        }\r
                 }\r
                 \r
+               internal bool AutoID\r
+               {\r
+                       get { return autoID; }\r
+                       set { autoID = value; }\r
+               }\r
+\r
+                internal void PreventAutoID()\r
+                {\r
+                       AutoID = false;\r
+                }\r
+                \r
+               protected internal virtual void RemovedControl (Control control)\r
+               {\r
+                       control.UnloadRecursive (false);\r
+                       control._parent = null;\r
+                       control._page = null;\r
+                       control._namingContainer = null;\r
+               }\r
+\r
                 //TODO: I think there are some needed Interface implementations to do here.\r
                 //TODO: Find api for INamingContainer.\r
         }\r