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