2002-07-17 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI / Control.cs
index 2714af1ae70c575a44dcc48847a62ae69415bbac..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
@@ -311,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
@@ -400,7 +401,8 @@ namespace System.Web.UI
 \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
@@ -476,11 +478,16 @@ namespace System.Web.UI
                \r
                 protected virtual object SaveViewState ()\r
                 {\r
-                        return ViewState.SaveViewState ();\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
@@ -589,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
@@ -601,38 +606,51 @@ 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
                 protected object SaveViewStateRecursive()\r
                 {\r
-                       ArrayList controlList = new ArrayList ();\r
-                       ArrayList controlStates = new ArrayList ();\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
@@ -640,10 +658,23 @@ namespace System.Web.UI
                        return new Triplet (SaveViewState (), controlList, controlStates);\r
                 }\r
                 \r
-                [MonoTODO]\r
-                protected void LoadViewStateRecursive(Object savedState)\r
-                {\r
-                       throw new NotImplementedException ();\r
+                protected void LoadViewStateRecursive (object savedState)\r
+                {\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
@@ -680,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