From 39a554ee31c297947386c5f45b5c8f050291d356 Mon Sep 17 00:00:00 2001 From: Konstantin Triger Date: Thu, 6 Apr 2006 09:55:33 +0000 Subject: [PATCH] Login.cs: Added LayoutTemplate property support. LoginView.cs: Added LoggedInTemplate, AnonymousTemplate support, DataBind - correctly bind child controls, Implemented OnViewChanged, OnViewChanging, Render, Save/LoadControlState. svn path=/trunk/mcs/; revision=59108 --- .../System.Web.UI.WebControls/ChangeLog | 7 + .../System.Web.UI.WebControls/Login.cs | 762 ++++++++++-------- .../System.Web.UI.WebControls/LoginView.cs | 72 +- .../System.Web/System.Web_test.dll.sources | 1 + .../Test/System.Web.UI.WebControls/ChangeLog | 5 + .../System.Web.UI.WebControls/LoginTest.cs | 24 + .../LoginViewTest.cs | 73 ++ 7 files changed, 589 insertions(+), 355 deletions(-) create mode 100755 mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginViewTest.cs diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog index 4d47a3679c6..5da32801028 100644 --- a/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog +++ b/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog @@ -1,3 +1,10 @@ +2006-04-06 Konstantin Triger + + * Login.cs: Added LayoutTemplate property support. + * LoginView.cs: Added LoggedInTemplate, AnonymousTemplate support. + DataBind: correctly bind child controls. + Implemented OnViewChanged, OnViewChanging, Render, Save/LoadControlState. + 2006-03-29 Robert Jordan * DataGrid.cs: if custom paging is enabled the persisted item count diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/Login.cs b/mcs/class/System.Web/System.Web.UI.WebControls/Login.cs index 6fee3287f6a..97d5b427629 100644 --- a/mcs/class/System.Web/System.Web.UI.WebControls/Login.cs +++ b/mcs/class/System.Web/System.Web.UI.WebControls/Login.cs @@ -3,6 +3,7 @@ // // Author: // Sebastien Pouliot +// Konstantin Triger // // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // @@ -45,6 +46,374 @@ namespace System.Web.UI.WebControls { [Designer ("System.Web.UI.Design.WebControls.LoginDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")] public class Login : CompositeControl { + #region LoginContainer + + sealed class LoginContainer : WebControl { + public Control UserNameTextBox { + get { + return FindControl("UserName"); + } + } + + public Control PasswordTextBox { + get { + return FindControl("Password"); + } + } + + public Control RememberMeCheckBox { + get { + return FindControl("RememberMe"); + } + } + } + + #endregion + + #region LoginTemplate + + sealed class LoginTemplate : WebControl, ITemplate { + readonly Login _login; + + private TextBox userNameTextBox; + private RequiredFieldValidator userNameRequired; + private TextBox passwordTextBox; + private RequiredFieldValidator passwordRequired; + private CheckBox rememberMeCheckBox; + private WebControl loginButton; + + public LoginTemplate (Login login) + { + _login = login; + } + + void ITemplate.InstantiateIn(Control container) { + container.Controls.Add (this); + + userNameTextBox = new TextBox (); + userNameTextBox.ID = "UserName"; + + userNameRequired = new RequiredFieldValidator (); + userNameRequired.ID = "UserNameRequired"; + userNameRequired.ControlToValidate = userNameTextBox.ID; + userNameRequired.ErrorMessage = "*"; + userNameRequired.ValidationGroup = this.UniqueID; + + passwordTextBox = new TextBox (); + passwordTextBox.ID = "Password"; + passwordTextBox.TextMode = TextBoxMode.Password; + + passwordRequired = new RequiredFieldValidator (); + passwordRequired.ID = "PasswordRequired"; + passwordRequired.ControlToValidate = passwordTextBox.ID; + passwordRequired.ErrorMessage = "*"; + passwordRequired.ValidationGroup = this.UniqueID; + + rememberMeCheckBox = new CheckBox (); + rememberMeCheckBox.ID = "RememberMe"; + rememberMeCheckBox.Checked = _login.RememberMeSet; + + switch (_login.LoginButtonType) { + case ButtonType.Button: + loginButton = new Button (); + loginButton.ID = "LoginButton"; + break; + case ButtonType.Link: + loginButton = new LinkButton (); + loginButton.ID = "LoginLinkButton"; + break; + case ButtonType.Image: + loginButton = new ImageButton (); + loginButton.ID = "LoginImageButton"; + break; + } + IButtonControl control = (loginButton as IButtonControl); + control.Text = _login.LoginButtonText; + control.CommandName = Login.LoginButtonCommandName; + control.Command += new CommandEventHandler (_login.LoginClick); + control.ValidationGroup = this.UniqueID; + + // adds them all at the end (after setting their properties) + Controls.Add (userNameTextBox); + Controls.Add (userNameRequired); + Controls.Add (passwordTextBox); + Controls.Add (passwordRequired); + Controls.Add (rememberMeCheckBox); + Controls.Add (loginButton); + } + + [MonoTODO ("render error messages")] + [MonoTODO ("set child control properties in ITemplate.InstantiateIn and let them render themself")] + protected internal override void Render(HtmlTextWriter writer) { + userNameRequired.ToolTip = _login.UserNameRequiredErrorMessage; + passwordRequired.ToolTip = _login.PasswordRequiredErrorMessage; + + bool vertical = (_login.Orientation == Orientation.Vertical); + bool textontop = (_login.TextLayout == LoginTextLayout.TextOnTop); + string colspan = vertical ? (textontop ? String.Empty : "2") : (textontop ? "4" : "6"); + string align = (textontop ? "left" : "right"); + + // inner table + writer.AddAttribute (HtmlTextWriterAttribute.Cellpadding, "0"); + writer.AddAttribute (HtmlTextWriterAttribute.Border, "0"); + writer.RenderBeginTag (HtmlTextWriterTag.Table); + + // First row - Title + // for both Orientation.Vertical and Orientation.Horizontal + + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + writer.AddAttribute (HtmlTextWriterAttribute.Align, "center"); + if (colspan.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); + if (!_login.IsEmpty (_login.titleTextStyle)) + _login.titleTextStyle.AddAttributesToRender (writer); + writer.RenderBeginTag (HtmlTextWriterTag.Td); + writer.Write (_login.TitleText); + writer.RenderEndTag (); + writer.RenderEndTag (); + + // Second row - Instructions (optional) + // for both Orientation.Vertical and Orientation.Horizontal + + string instructions = _login.InstructionText; + if (instructions.Length > 0) { + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + writer.AddAttribute (HtmlTextWriterAttribute.Align, "center"); + if (colspan.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); + if (!_login.IsEmpty (_login.instructionTextStyle)) + _login.instructionTextStyle.AddAttributesToRender (writer); + writer.RenderBeginTag (HtmlTextWriterTag.Td); + writer.Write (instructions); + writer.RenderEndTag (); + writer.RenderEndTag (); + } + + // Third Row + // - Orientation.Vertical == Username + // - Orientation.Horizontal == Username, Password, RememberMe and LogIn button + + if (!vertical && textontop) { + RenderUserNameTextBox (writer); + RenderPasswordTextBox (writer); + } + + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + if (vertical) { + writer.AddAttribute (HtmlTextWriterAttribute.Align, align); + RenderUserNameTextBox (writer); + } else if (!textontop) { + RenderUserNameTextBox (writer); + } + if (vertical && textontop) { + writer.RenderEndTag (); + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + } + writer.RenderBeginTag (HtmlTextWriterTag.Td); + if (!_login.IsEmpty (_login.textBoxStyle)) + _login.textBoxStyle.AddAttributesToRender (writer); + userNameTextBox.RenderControl (writer); + userNameRequired.RenderControl (writer); + writer.RenderEndTag (); + if (vertical) + writer.RenderEndTag (); + + if (vertical) { + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + writer.AddAttribute (HtmlTextWriterAttribute.Align, align); + RenderPasswordTextBox (writer); + } else if (!textontop) { + RenderPasswordTextBox (writer); + } + if (vertical && textontop) { + writer.RenderEndTag (); + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + } + writer.RenderBeginTag (HtmlTextWriterTag.Td); + if (!_login.IsEmpty (_login.textBoxStyle)) + _login.textBoxStyle.AddAttributesToRender (writer); + passwordTextBox.RenderControl (writer); + passwordRequired.RenderControl (writer); + writer.RenderEndTag (); + if (vertical) + writer.RenderEndTag (); + + if (_login.DisplayRememberMe) { + if (vertical) { + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + if (colspan.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); + } + writer.RenderBeginTag (HtmlTextWriterTag.Td); + rememberMeCheckBox.RenderControl (writer); + writer.AddAttribute (HtmlTextWriterAttribute.For, rememberMeCheckBox.ClientID); + writer.RenderBeginTag (HtmlTextWriterTag.Label); + writer.Write (_login.RememberMeText); + writer.RenderEndTag (); + writer.RenderEndTag (); + if (vertical) + writer.RenderEndTag (); + } + + // TODO - detect failure + bool failed = false; + if (failed) { + if (vertical) + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + if (colspan.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); + writer.AddAttribute (HtmlTextWriterAttribute.Align, "center"); + writer.AddStyleAttribute (HtmlTextWriterStyle.Color, "red"); + if (!_login.IsEmpty (_login.failureTextStyle)) { + _login.failureTextStyle.AddAttributesToRender (writer); + } + writer.Write (_login.FailureText); + writer.RenderEndTag (); + if (vertical) + writer.RenderEndTag (); + } + + // LoginButton + if (vertical) { + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + writer.AddAttribute (HtmlTextWriterAttribute.Align, "right"); + if (colspan.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); + } + writer.RenderBeginTag (HtmlTextWriterTag.Td); + if (!_login.IsEmpty (_login.logonButtonStyle)) { + _login.logonButtonStyle.AddAttributesToRender (writer); + } + if (loginButton is ImageButton) { + (loginButton as ImageButton).ImageUrl = _login.LoginButtonImageUrl; + } + loginButton.RenderControl (writer); + writer.RenderEndTag (); + writer.RenderEndTag (); + + bool userText = (_login.CreateUserText.Length > 0); + bool userImg = (_login.CreateUserIconUrl.Length > 0); + bool passText = (_login.PasswordRecoveryText.Length > 0); + bool passImg = (_login.PasswordRecoveryIconUrl.Length > 0); + bool helpText = (_login.HelpPageText.Length > 0); + bool helpImg = (_login.HelpPageIconUrl.Length > 0); + // show row if CreateUserText or CreateUserIconUrl is set + // but not if only CreateUserUrl is set + if (userText || userImg || passText || passImg || helpText || helpImg) { + writer.RenderBeginTag (HtmlTextWriterTag.Tr); + if (colspan.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); + writer.RenderBeginTag (HtmlTextWriterTag.Td); + + if (userImg) { + writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.CreateUserIconUrl); + writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px"); + if (userText) + writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.CreateUserText); + writer.RenderBeginTag (HtmlTextWriterTag.Img); + writer.RenderEndTag (); + } + + if (userText) { + string href = _login.CreateUserUrl; + if (href.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Href, href); + if (_login.hyperLinkStyle != null) + _login.hyperLinkStyle.AddAttributesToRender (writer); + writer.RenderBeginTag (HtmlTextWriterTag.A); + writer.Write (_login.CreateUserText); + writer.RenderEndTag (); + } + + if (passText || passImg) { + if (userImg || userText) { + if (vertical) { + writer.Write ("
"); + } else { + writer.Write (" "); + } + } + + if (passImg) { + writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.PasswordRecoveryIconUrl); + writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px"); + if (passText) + writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.PasswordRecoveryText); + writer.RenderBeginTag (HtmlTextWriterTag.Img); + writer.RenderEndTag (); + } + + if (passText) { + string href = _login.PasswordRecoveryUrl; + if (href.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Href, href); + if (_login.hyperLinkStyle != null) + _login.hyperLinkStyle.AddAttributesToRender (writer); + writer.RenderBeginTag (HtmlTextWriterTag.A); + writer.Write (_login.PasswordRecoveryText); + writer.RenderEndTag (); + } + } + + if (helpText || helpImg) { + if (userImg || userText || passText || passImg) { + if (vertical) { + writer.Write ("
"); + } else { + writer.Write (" "); + } + } + + if (helpImg) { + writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.HelpPageIconUrl); + writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px"); + if (helpText) + writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.HelpPageText); + writer.RenderBeginTag (HtmlTextWriterTag.Img); + writer.RenderEndTag (); + } + + if (helpText) { + string href = _login.HelpPageUrl; + if (href.Length > 0) + writer.AddAttribute (HtmlTextWriterAttribute.Href, href); + if (_login.hyperLinkStyle != null) + _login.hyperLinkStyle.AddAttributesToRender (writer); + writer.RenderBeginTag (HtmlTextWriterTag.A); + writer.Write (_login.HelpPageText); + writer.RenderEndTag (); + } + } + + writer.RenderEndTag (); + writer.RenderEndTag (); + } + + // inner table (end) + writer.RenderEndTag (); // Table + } + + private void RenderUserNameTextBox (HtmlTextWriter writer) { + writer.RenderBeginTag (HtmlTextWriterTag.Td); + writer.AddAttribute (HtmlTextWriterAttribute.For, userNameTextBox.ClientID); + writer.RenderBeginTag (HtmlTextWriterTag.Label); + writer.Write (_login.UserNameLabelText); + writer.RenderEndTag (); + writer.RenderEndTag (); + } + + private void RenderPasswordTextBox (HtmlTextWriter writer) { + writer.RenderBeginTag (HtmlTextWriterTag.Td); + writer.AddAttribute (HtmlTextWriterAttribute.For, passwordTextBox.ClientID); + writer.RenderBeginTag (HtmlTextWriterTag.Label); + writer.Write (_login.PasswordLabelText); + writer.RenderEndTag (); + writer.RenderEndTag (); + } + } + + #endregion + public static readonly string LoginButtonCommandName = "Login"; private static readonly object authenticateEvent = new object (); @@ -64,12 +433,7 @@ namespace System.Web.UI.WebControls { private ITemplate layoutTemplate; - private TextBox userNameTextBox; - private RequiredFieldValidator userNameRequired; - private TextBox passwordTextBox; - private RequiredFieldValidator passwordRequired; - private CheckBox rememberMeCheckBox; - private WebControl loginButton; + private string _password; public Login () @@ -437,8 +801,7 @@ namespace System.Web.UI.WebControls { [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public virtual string Password { get { - object o = ViewState ["Password"]; - return (o == null) ? String.Empty : (string) o; + return _password != null ? _password : String.Empty; } } @@ -681,56 +1044,46 @@ namespace System.Web.UI.WebControls { protected internal override void CreateChildControls () { - userNameTextBox = new TextBox (); - userNameTextBox.ID = "UserName"; - - userNameRequired = new RequiredFieldValidator (); - userNameRequired.ID = "UserNameRequired"; - userNameRequired.ControlToValidate = userNameTextBox.ID; - userNameRequired.ErrorMessage = "*"; - userNameRequired.ValidationGroup = this.UniqueID; - - passwordTextBox = new TextBox (); - passwordTextBox.ID = "Password"; - passwordTextBox.TextMode = TextBoxMode.Password; - - passwordRequired = new RequiredFieldValidator (); - passwordRequired.ID = "PasswordRequired"; - passwordRequired.ControlToValidate = passwordTextBox.ID; - passwordRequired.ErrorMessage = "*"; - passwordRequired.ValidationGroup = this.UniqueID; - - rememberMeCheckBox = new CheckBox (); - rememberMeCheckBox.ID = "RememberMe"; - rememberMeCheckBox.Checked = RememberMeSet; - - switch (LoginButtonType) { - case ButtonType.Button: - loginButton = new Button (); - loginButton.ID = "LoginButton"; - break; - case ButtonType.Link: - loginButton = new LinkButton (); - loginButton.ID = "LoginLinkButton"; - break; - case ButtonType.Image: - loginButton = new ImageButton (); - loginButton.ID = "LoginImageButton"; - break; - } - IButtonControl control = (loginButton as IButtonControl); - control.Text = LoginButtonText; - control.CommandName = LoginButtonCommandName; - control.Command += new CommandEventHandler (LoginClick); - control.ValidationGroup = this.UniqueID; - - // adds them all at the end (after setting their properties) - Controls.Add (userNameTextBox); - Controls.Add (userNameRequired); - Controls.Add (passwordTextBox); - Controls.Add (passwordRequired); - Controls.Add (rememberMeCheckBox); - Controls.Add (loginButton); + Controls.Clear (); + + Table table = new Table (); + table.ID = ClientID; + table.CellSpacing = 0; + table.CellPadding = BorderPadding; + + TableRow row = new TableRow (); + table.Rows.Add (row); + TableCell cell = new TableCell (); + row.Cells.Add (cell); + + Controls.Add (table); + + LoginContainer container = new LoginContainer (); + cell.Controls.Add (container); + + ITemplate template = LayoutTemplate; + if (template == null) + template = new LoginTemplate (this); + + template.InstantiateIn (container); + + IEditableTextControl editable; + + editable = container.UserNameTextBox as IEditableTextControl; + + if (editable != null) + editable.TextChanged += new EventHandler (UserName_TextChanged); + + editable = container.PasswordTextBox as IEditableTextControl; + + if (editable != null) + editable.TextChanged += new EventHandler (Password_TextChanged); + + ICheckBoxControl checkBox = container.RememberMeCheckBox as ICheckBoxControl; + + if (checkBox != null) + checkBox.CheckedChanged += new EventHandler (RememberMe_CheckedChanged); + } protected override void LoadViewState (object savedState) @@ -774,7 +1127,7 @@ namespace System.Web.UI.WebControls { { // check for submit button CommandEventArgs cea = (e as CommandEventArgs); - if ((source == loginButton) && (cea != null) && (cea.CommandName == "Login")) { + if ((cea != null) && (cea.CommandName == LoginButtonCommandName)) { AuthenticateUser (); return true; } @@ -813,12 +1166,8 @@ namespace System.Web.UI.WebControls { // PageLoad but are during PreRender phase, so... ??? } - [MonoTODO ("render error messages")] protected internal override void Render (HtmlTextWriter writer) { - if (writer == null) - return; - // VisibleWhenLoggedIn isn't applicable to the default login page if (!VisibleWhenLoggedIn && !IsDefaultLoginPage () && IsLoggedIn ()) return; @@ -829,265 +1178,7 @@ namespace System.Web.UI.WebControls { EnsureChildControls (); - userNameRequired.ToolTip = UserNameRequiredErrorMessage; - passwordRequired.ToolTip = PasswordRequiredErrorMessage; - - bool vertical = (Orientation == Orientation.Vertical); - bool textontop = (TextLayout == LoginTextLayout.TextOnTop); - string colspan = vertical ? (textontop ? String.Empty : "2") : (textontop ? "4" : "6"); - string align = (textontop ? "left" : "right"); - - // outer table - writer.AddAttribute (HtmlTextWriterAttribute.Cellpadding, BorderPadding.ToString (CultureInfo.InvariantCulture)); - writer.AddAttribute (HtmlTextWriterAttribute.Border, "0"); - AddAttributesToRender (writer); - writer.RenderBeginTag (HtmlTextWriterTag.Table); - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - writer.RenderBeginTag (HtmlTextWriterTag.Td); - - // inner table - writer.AddAttribute (HtmlTextWriterAttribute.Cellpadding, "0"); - writer.AddAttribute (HtmlTextWriterAttribute.Border, "0"); - writer.RenderBeginTag (HtmlTextWriterTag.Table); - - // First row - Title - // for both Orientation.Vertical and Orientation.Horizontal - - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - writer.AddAttribute (HtmlTextWriterAttribute.Align, "center"); - if (colspan.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); - if (!IsEmpty (titleTextStyle)) - titleTextStyle.AddAttributesToRender (writer); - writer.RenderBeginTag (HtmlTextWriterTag.Td); - writer.Write (TitleText); - writer.RenderEndTag (); - writer.RenderEndTag (); - - // Second row - Instructions (optional) - // for both Orientation.Vertical and Orientation.Horizontal - - string instructions = InstructionText; - if (instructions.Length > 0) { - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - writer.AddAttribute (HtmlTextWriterAttribute.Align, "center"); - if (colspan.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); - if (!IsEmpty (instructionTextStyle)) - instructionTextStyle.AddAttributesToRender (writer); - writer.RenderBeginTag (HtmlTextWriterTag.Td); - writer.Write (instructions); - writer.RenderEndTag (); - writer.RenderEndTag (); - } - - // Third Row - // - Orientation.Vertical == Username - // - Orientation.Horizontal == Username, Password, RememberMe and LogIn button - - if (!vertical && textontop) { - RenderUserNameTextBox (writer); - RenderPasswordTextBox (writer); - } - - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - if (vertical) { - writer.AddAttribute (HtmlTextWriterAttribute.Align, align); - RenderUserNameTextBox (writer); - } else if (!textontop) { - RenderUserNameTextBox (writer); - } - if (vertical && textontop) { - writer.RenderEndTag (); - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - } - writer.RenderBeginTag (HtmlTextWriterTag.Td); - if (!IsEmpty (textBoxStyle)) - textBoxStyle.AddAttributesToRender (writer); - userNameTextBox.RenderControl (writer); - userNameRequired.RenderControl (writer); - writer.RenderEndTag (); - if (vertical) - writer.RenderEndTag (); - - if (vertical) { - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - writer.AddAttribute (HtmlTextWriterAttribute.Align, align); - RenderPasswordTextBox (writer); - } else if (!textontop) { - RenderPasswordTextBox (writer); - } - if (vertical && textontop) { - writer.RenderEndTag (); - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - } - writer.RenderBeginTag (HtmlTextWriterTag.Td); - if (!IsEmpty (textBoxStyle)) - textBoxStyle.AddAttributesToRender (writer); - passwordTextBox.RenderControl (writer); - passwordRequired.RenderControl (writer); - writer.RenderEndTag (); - if (vertical) - writer.RenderEndTag (); - - if (DisplayRememberMe) { - if (vertical) { - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - if (colspan.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); - } - writer.RenderBeginTag (HtmlTextWriterTag.Td); - rememberMeCheckBox.RenderControl (writer); - writer.AddAttribute (HtmlTextWriterAttribute.For, rememberMeCheckBox.ClientID); - writer.RenderBeginTag (HtmlTextWriterTag.Label); - writer.Write (RememberMeText); - writer.RenderEndTag (); - writer.RenderEndTag (); - if (vertical) - writer.RenderEndTag (); - } - - // TODO - detect failure - bool failed = false; - if (failed) { - if (vertical) - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - if (colspan.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); - writer.AddAttribute (HtmlTextWriterAttribute.Align, "center"); - writer.AddStyleAttribute (HtmlTextWriterStyle.Color, "red"); - if (!IsEmpty (failureTextStyle)) { - failureTextStyle.AddAttributesToRender (writer); - } - writer.Write (FailureText); - writer.RenderEndTag (); - if (vertical) - writer.RenderEndTag (); - } - - // LoginButton - if (vertical) { - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - writer.AddAttribute (HtmlTextWriterAttribute.Align, "right"); - if (colspan.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); - } - writer.RenderBeginTag (HtmlTextWriterTag.Td); - if (!IsEmpty (logonButtonStyle)) { - logonButtonStyle.AddAttributesToRender (writer); - } - if (loginButton is ImageButton) { - (loginButton as ImageButton).ImageUrl = LoginButtonImageUrl; - } - loginButton.RenderControl (writer); - writer.RenderEndTag (); - writer.RenderEndTag (); - - bool userText = (CreateUserText.Length > 0); - bool userImg = (CreateUserIconUrl.Length > 0); - bool passText = (PasswordRecoveryText.Length > 0); - bool passImg = (PasswordRecoveryIconUrl.Length > 0); - bool helpText = (HelpPageText.Length > 0); - bool helpImg = (HelpPageIconUrl.Length > 0); - // show row if CreateUserText or CreateUserIconUrl is set - // but not if only CreateUserUrl is set - if (userText || userImg || passText || passImg || helpText || helpImg) { - writer.RenderBeginTag (HtmlTextWriterTag.Tr); - if (colspan.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan); - writer.RenderBeginTag (HtmlTextWriterTag.Td); - - if (userImg) { - writer.AddAttribute (HtmlTextWriterAttribute.Src, CreateUserIconUrl); - writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px"); - if (userText) - writer.AddAttribute (HtmlTextWriterAttribute.Alt, CreateUserText); - writer.RenderBeginTag (HtmlTextWriterTag.Img); - writer.RenderEndTag (); - } - - if (userText) { - string href = CreateUserUrl; - if (href.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Href, href); - if (hyperLinkStyle != null) - hyperLinkStyle.AddAttributesToRender (writer); - writer.RenderBeginTag (HtmlTextWriterTag.A); - writer.Write (CreateUserText); - writer.RenderEndTag (); - } - - if (passText || passImg) { - if (userImg || userText) { - if (vertical) { - writer.Write ("
"); - } else { - writer.Write (" "); - } - } - - if (passImg) { - writer.AddAttribute (HtmlTextWriterAttribute.Src, PasswordRecoveryIconUrl); - writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px"); - if (passText) - writer.AddAttribute (HtmlTextWriterAttribute.Alt, PasswordRecoveryText); - writer.RenderBeginTag (HtmlTextWriterTag.Img); - writer.RenderEndTag (); - } - - if (passText) { - string href = PasswordRecoveryUrl; - if (href.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Href, href); - if (hyperLinkStyle != null) - hyperLinkStyle.AddAttributesToRender (writer); - writer.RenderBeginTag (HtmlTextWriterTag.A); - writer.Write (PasswordRecoveryText); - writer.RenderEndTag (); - } - } - - if (helpText || helpImg) { - if (userImg || userText || passText || passImg) { - if (vertical) { - writer.Write ("
"); - } else { - writer.Write (" "); - } - } - - if (helpImg) { - writer.AddAttribute (HtmlTextWriterAttribute.Src, HelpPageIconUrl); - writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px"); - if (helpText) - writer.AddAttribute (HtmlTextWriterAttribute.Alt, HelpPageText); - writer.RenderBeginTag (HtmlTextWriterTag.Img); - writer.RenderEndTag (); - } - - if (helpText) { - string href = HelpPageUrl; - if (href.Length > 0) - writer.AddAttribute (HtmlTextWriterAttribute.Href, href); - if (hyperLinkStyle != null) - hyperLinkStyle.AddAttributesToRender (writer); - writer.RenderBeginTag (HtmlTextWriterTag.A); - writer.Write (HelpPageText); - writer.RenderEndTag (); - } - } - - writer.RenderEndTag (); - writer.RenderEndTag (); - } - - // inner table (end) - writer.RenderEndTag (); // Table - - // outer table (end) - writer.RenderEndTag (); // Td - writer.RenderEndTag (); // Tr - writer.RenderEndTag (); // Table + RenderContents(writer); } protected override object SaveViewState () @@ -1190,12 +1281,12 @@ namespace System.Web.UI.WebControls { } AuthenticateEventArgs aea = new AuthenticateEventArgs (); - aea.Authenticated = provider.ValidateUser (userNameTextBox.Text, passwordTextBox.Text); + aea.Authenticated = provider.ValidateUser (UserName, Password); OnAuthenticate (aea); if (aea.Authenticated) { string url = DestinationPageUrl; - FormsAuthentication.SetAuthCookie (userNameTextBox.Text, RememberMeSet); + FormsAuthentication.SetAuthCookie (UserName, RememberMeSet); if (url.Length == 0) { Redirect (FormsAuthentication.LoginUrl); } else { @@ -1248,24 +1339,19 @@ namespace System.Web.UI.WebControls { Page.Response.Redirect (url); } - private void RenderUserNameTextBox (HtmlTextWriter writer) + private void UserName_TextChanged (object sender, EventArgs e) + { + UserName = ((ITextControl)sender).Text; + } + + private void Password_TextChanged (object sender, EventArgs e) { - writer.RenderBeginTag (HtmlTextWriterTag.Td); - writer.AddAttribute (HtmlTextWriterAttribute.For, userNameTextBox.ClientID); - writer.RenderBeginTag (HtmlTextWriterTag.Label); - writer.Write (UserNameLabelText); - writer.RenderEndTag (); - writer.RenderEndTag (); + _password = ((ITextControl)sender).Text; } - private void RenderPasswordTextBox (HtmlTextWriter writer) + private void RememberMe_CheckedChanged (object sender, EventArgs e) { - writer.RenderBeginTag (HtmlTextWriterTag.Td); - writer.AddAttribute (HtmlTextWriterAttribute.For, passwordTextBox.ClientID); - writer.RenderBeginTag (HtmlTextWriterTag.Label); - writer.Write (PasswordLabelText); - writer.RenderEndTag (); - writer.RenderEndTag (); + RememberMeSet = ((ICheckBoxControl)sender).Checked; } } } diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/LoginView.cs b/mcs/class/System.Web/System.Web.UI.WebControls/LoginView.cs index af147719bb8..f1c0f24b95f 100644 --- a/mcs/class/System.Web/System.Web.UI.WebControls/LoginView.cs +++ b/mcs/class/System.Web/System.Web.UI.WebControls/LoginView.cs @@ -3,6 +3,7 @@ // // Author: // Sebastien Pouliot +// Konstantin Triger // // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // @@ -51,6 +52,7 @@ namespace System.Web.UI.WebControls { private ITemplate anonymousTemplate; private ITemplate loggedInTemplate; + private bool isAuthenticated; private bool theming; private RoleGroupCollection coll; @@ -70,9 +72,11 @@ namespace System.Web.UI.WebControls { set { anonymousTemplate = value; } } - [MonoTODO] public override ControlCollection Controls { - get { return base.Controls; } + get { + EnsureChildControls(); + return base.Controls; + } } [Browsable (true)] @@ -102,24 +106,40 @@ namespace System.Web.UI.WebControls { } } - [MonoTODO] [Browsable (true)] public override string SkinID { get { return base.SkinID; } set { base.SkinID = value; } } + bool IsAuthenticated { + get { + if (Page != null && !Page.IsPostBack) + isAuthenticated = Page.Request.IsAuthenticated; + + return isAuthenticated; + } + } - [MonoTODO] + [MonoTODO("Handle RoleGroups")] protected internal override void CreateChildControls () { - base.CreateChildControls (); + Controls.Clear(); + Control c = new Control(); + if (IsAuthenticated) + LoggedInTemplate.InstantiateIn (c); + else + AnonymousTemplate.InstantiateIn (c); + + Controls.Add(c); } - [MonoTODO] public override void DataBind () { - base.DataBind (); + EventArgs args = EventArgs.Empty; + OnDataBinding (args); + EnsureChildControls (); + DataBindChildren (); } [EditorBrowsable (EditorBrowsableState.Never)] @@ -129,40 +149,58 @@ namespace System.Web.UI.WebControls { throw new NotSupportedException (); } - [MonoTODO] protected internal override void LoadControlState (object savedState) { - base.LoadControlState (savedState); + if (savedState == null) { + base.LoadControlState (savedState); + return; + } + + Pair pair = (Pair)savedState; + base.LoadControlState (pair.First); + isAuthenticated = (bool)pair.Second; } - [MonoTODO] protected internal override void OnInit (EventArgs e) { base.OnInit (e); + if (Page != null) + Page.RegisterRequiresControlState(this); } - [MonoTODO] protected internal override void OnPreRender (EventArgs e) { base.OnPreRender (e); + isAuthenticated = IsAuthenticated; + EnsureChildControls (); } - [MonoTODO] protected virtual void OnViewChanged (EventArgs e) { - throw new NotImplementedException (); + EventHandler h = (EventHandler)Events [viewChangedEvent]; + if (h != null) + h (this, e); } - [MonoTODO] protected virtual void OnViewChanging (EventArgs e) { - throw new NotImplementedException (); + EventHandler h = (EventHandler)Events [viewChangingEvent]; + if (h != null) + h (this, e); + } + + protected internal override void Render(HtmlTextWriter writer) { + EnsureChildControls(); + base.Render (writer); } - [MonoTODO] protected internal override object SaveControlState () { - return base.SaveControlState (); + object baseState = base.SaveControlState (); + if (isAuthenticated) + return new Pair (baseState, isAuthenticated); + + return baseState; } [MonoTODO ("for design-time usage - no more details available")] diff --git a/mcs/class/System.Web/System.Web_test.dll.sources b/mcs/class/System.Web/System.Web_test.dll.sources index ab12db54718..6168d61d3a3 100644 --- a/mcs/class/System.Web/System.Web_test.dll.sources +++ b/mcs/class/System.Web/System.Web_test.dll.sources @@ -130,6 +130,7 @@ System.Web.UI.WebControls/LiteralTest.cs System.Web.UI.WebControls/LoginNameTest.cs System.Web.UI.WebControls/LoginStatusTest.cs System.Web.UI.WebControls/LoginTest.cs +System.Web.UI.WebControls/LoginViewTest.cs System.Web.UI.WebControls/MonthChangedEventArgsTest.cs System.Web.UI.WebControls/PagedDataSourceTest.cs System.Web.UI.WebControls/PanelTest.cs diff --git a/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog index 1d3afd29e61..532561d46c4 100644 --- a/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog +++ b/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog @@ -1,3 +1,8 @@ +2006-04-06 Konstantin Triger + + * LoginTest.cs: Added LayoutTemplate property Test. + * LoginViewTest.cs: Added AnonymousTemplate property Test. + 2006-03-28 Alexandre Miguel Pedro Gomes * FontInfoTest.cs: Implemented ShouldSerializeNames tests diff --git a/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginTest.cs b/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginTest.cs index 1f1d3ac21f2..027cd0fe00d 100644 --- a/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginTest.cs +++ b/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginTest.cs @@ -38,6 +38,17 @@ using System.Web.UI.WebControls; using NUnit.Framework; namespace MonoTests.System.Web.UI.WebControls { + + public class LoginTemplate : WebControl, ITemplate { + public LoginTemplate() { + ID = "kuku"; + } + + void ITemplate.InstantiateIn(Control container) { + container.Controls.Add(this); + } + + } public class TestLogin : Login { @@ -183,6 +194,10 @@ namespace MonoTests.System.Web.UI.WebControls { { base.OnLoginError (e); } + + public void DoEnsureChildControls() { + base.EnsureChildControls (); + } } [TestFixture] @@ -558,6 +573,15 @@ namespace MonoTests.System.Web.UI.WebControls { TestLogin l = new TestLogin (); l.FailureAction = (LoginFailureAction) Int32.MinValue; } + + [Test] + public void LayoutTemplate () + { + TestLogin l = new TestLogin (); + l.LayoutTemplate = new LoginTemplate(); + l.DoEnsureChildControls(); + Assert.IsNotNull(l.FindControl("kuku"), "LoginTemplate"); + } [Test] public void LoginButtonType_All () diff --git a/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginViewTest.cs b/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginViewTest.cs new file mode 100755 index 00000000000..c7490e7a787 --- /dev/null +++ b/mcs/class/System.Web/Test/System.Web.UI.WebControls/LoginViewTest.cs @@ -0,0 +1,73 @@ +// +// LoginViewTest.cs - Unit tests for System.Web.UI.WebControls.LoginView +// +// Author: +// Konstantin Triger +// +// Copyright (C) 2006 Mainsoft, Inc (http://www.mainsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 + +using System; +using System.Collections; +using System.IO; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +using NUnit.Framework; + +namespace MonoTests.System.Web.UI.WebControls { + + public class LoginViewTemplate : WebControl, ITemplate { + public LoginViewTemplate() { + ID = "kuku"; + } + + void ITemplate.InstantiateIn(Control container) { + container.Controls.Add(this); + } + + } + + public class TestLoginView : LoginView { + public void DoEnsureChildControls() { + base.EnsureChildControls (); + } + } + + [TestFixture] + public class LoginViewTest { + + [Test] + public void AnonymousTemplate () + { + TestLoginView l = new TestLoginView (); + l.AnonymousTemplate = new LoginViewTemplate(); + l.DoEnsureChildControls(); + Assert.IsNotNull(l.FindControl("kuku"), "AnonymousTemplate"); + } + } +} + +#endif -- 2.25.1