//\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
}\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
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
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
{\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
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
{\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
{\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
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