2002-07-17 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI / Control.cs
index 60878903c4b121e3da1d955f3bbb02f8a94e99db..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
@@ -236,10 +238,16 @@ namespace System.Web.UI
                         }\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
@@ -305,19 +313,18 @@ 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
@@ -329,7 +336,7 @@ namespace System.Web.UI
                                control._parent.Controls.Remove (control);\r
 \r
                        control._parent = this;\r
-                       control._page = _page;\r
+                       control._page = Page;\r
 \r
                        // Without this, DataBoundLiteralControl crashes in OnDataBound event.\r
                        Control namingContainer = NamingContainer;\r
@@ -375,14 +382,27 @@ namespace System.Web.UI
                 {\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
-                       ViewState.LoadViewState (savedState);\r
+                       if (savedState != null)\r
+                               ViewState.LoadViewState (savedState);\r
                 }\r
                 \r
                [MonoTODO]\r
@@ -455,12 +475,19 @@ 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
@@ -569,8 +596,6 @@ namespace System.Web.UI
                 {\r
                         if (_visible)\r
                         {\r
-                               // By now, PreRender is fired here.\r
-                               OnPreRender (EventArgs.Empty); //FIXME\r
                                 //TODO: Something about tracing here.\r
                                 Render(writer);\r
                         }\r
@@ -581,47 +606,80 @@ namespace System.Web.UI
                 {\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
-                [MonoTODO]\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
                 \r
-                [MonoTODO]\r
-                protected void LoadViewStateRecursive(Object savedState)\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
@@ -653,6 +711,14 @@ namespace System.Web.UI
                        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