Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / xsp / System / Web / UI / WebControls / PasswordRecovery.cs / 1 / PasswordRecovery.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls { using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Globalization; using System.Security.Permissions; using System.Text; using System.Web.Configuration; using System.Web.Security; using System.Web.Management; ////// Displays UI that allows a user to recover his/her password. Prompts for username and possibly answer /// to security question. If successful, the user's password is sent to him/her via email. Uses /// a Membership provider. UI can be customized using control properties or a template. /// [ Bindable(false), DefaultEvent("SendingMail"), Designer("System.Web.UI.Design.WebControls.PasswordRecoveryDesigner, " + AssemblyRef.SystemDesign) ] [AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class PasswordRecovery : CompositeControl { public static readonly string SubmitButtonCommandName = "Submit"; // Needed for user template feature private const string _userNameID = "UserName"; private const string _questionID = "Question"; private const string _answerID = "Answer"; private const string _failureTextID = "FailureText"; // Needed only for "convert to template" feature, otherwise unnecessary private const string _userNameRequiredID = "UserNameRequired"; private const string _answerRequiredID = "AnswerRequired"; private const string _pushButtonID = "SubmitButton"; private const string _imageButtonID = "SubmitImageButton"; private const string _linkButtonID = "SubmitLinkButton"; private const string _helpLinkID = "HelpLink"; private const string _userNameContainerID = "UserNameContainerID"; private const string _questionContainerID = "QuestionContainerID"; private const string _successContainerID = "SuccessContainerID"; private const ValidatorDisplay _requiredFieldValidatorDisplay = ValidatorDisplay.Static; private const string _userNameReplacementKey = "<%\\s*UserName\\s*%>"; private const string _passwordReplacementKey = "<%\\s*Password\\s*%>"; private string _answer; private View _currentView = View.UserName; private string _question; private string _userName; private bool _convertingToTemplate = false; private bool _renderDesignerRegion = false; private ITemplate _userNameTemplate; private UserNameContainer _userNameContainer; private ITemplate _questionTemplate; private QuestionContainer _questionContainer; private ITemplate _successTemplate; private SuccessContainer _successContainer; private const int _viewStateArrayLength = 11; private Style _submitButtonStyle; private TableItemStyle _labelStyle; private Style _textBoxStyle; private TableItemStyle _hyperLinkStyle; private TableItemStyle _instructionTextStyle; private TableItemStyle _titleTextStyle; private TableItemStyle _failureTextStyle; private TableItemStyle _successTextStyle; private MailDefinition _mailDefinition; private Style _validatorTextStyle; private static readonly object EventVerifyingUser = new object(); private static readonly object EventUserLookupError = new object(); private static readonly object EventVerifyingAnswer = new object(); private static readonly object EventAnswerLookupError = new object(); private static readonly object EventSendMailError = new object(); private static readonly object EventSendingMail = new object(); ////// Answer to the security question. /// [ Browsable(false), Filterable(false), Themeable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public virtual string Answer { get { return (_answer == null) ? String.Empty : _answer; } } private string AnswerInternal { get { string answer = Answer; if (String.IsNullOrEmpty(answer) && _questionContainer != null) { ITextControl answerTextBox = (ITextControl)_questionContainer.AnswerTextBox; if (answerTextBox != null && answerTextBox.Text != null) { return answerTextBox.Text; } } return answer; } } ////// The text that identifies the answer textbox. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultAnswerLabelText), WebSysDescription(SR.PasswordRecovery_AnswerLabelText) ] public virtual string AnswerLabelText { get { object obj = ViewState["AnswerLabelText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultAnswerLabelText) : (string)obj; } set { ViewState["AnswerLabelText"] = value; } } ////// The text to be shown in the validation summary when the answer is empty. /// [ Localizable(true), WebCategory("Validation"), WebSysDefaultValue(SR.PasswordRecovery_DefaultAnswerRequiredErrorMessage), WebSysDescription(SR.LoginControls_AnswerRequiredErrorMessage) ] public virtual string AnswerRequiredErrorMessage { get { object obj = ViewState["AnswerRequiredErrorMessage"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultAnswerRequiredErrorMessage) : (string)obj; } set { ViewState["AnswerRequiredErrorMessage"] = value; } } [ WebCategory("Appearance"), DefaultValue(1), WebSysDescription(SR.Login_BorderPadding) ] public virtual int BorderPadding { get { object obj = ViewState["BorderPadding"]; return (obj == null) ? 1 : (int)obj; } set { if (value < -1) { throw new ArgumentOutOfRangeException("value", SR.GetString(SR.PasswordRecovery_InvalidBorderPadding)); } ViewState["BorderPadding"] = value; } } ////// The style of the submit button. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.PasswordRecovery_SubmitButtonStyle) ] public Style SubmitButtonStyle { get { if (_submitButtonStyle == null) { _submitButtonStyle = new Style(); if (IsTrackingViewState) { ((IStateManager)_submitButtonStyle).TrackViewState(); } } return _submitButtonStyle; } } ////// The type of the submit button. /// [ WebCategory("Appearance"), DefaultValue(ButtonType.Button), WebSysDescription(SR.PasswordRecovery_SubmitButtonType) ] public virtual ButtonType SubmitButtonType { get { object obj = ViewState["SubmitButtonType"]; return (obj == null) ? ButtonType.Button : (ButtonType)obj; } set { if (value < ButtonType.Button || value > ButtonType.Link) { throw new ArgumentOutOfRangeException("value"); } ViewState["SubmitButtonType"] = value; } } private bool ConvertingToTemplate { get { return (DesignMode && _convertingToTemplate); } } ////// Internal because used from PasswordRecoveryAdapter. /// internal View CurrentView { get { return _currentView; } set { if (value < View.UserName || value > View.Success) { throw new ArgumentOutOfRangeException("value"); } if (value != CurrentView) { _currentView = value; UpdateValidators(); } } } ////// The style of the failure text. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.WebControl_FailureTextStyle) ] public TableItemStyle FailureTextStyle { get { if (_failureTextStyle == null) { _failureTextStyle = new ErrorTableItemStyle(); if (IsTrackingViewState) { ((IStateManager)_failureTextStyle).TrackViewState(); } } return _failureTextStyle; } } ////// The text to be shown when there is an unexpected failure. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultGeneralFailureText), WebSysDescription(SR.PasswordRecovery_GeneralFailureText) ] public virtual string GeneralFailureText { get { object obj = ViewState["GeneralFailureText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultGeneralFailureText) : (string)obj; } set { ViewState["GeneralFailureText"] = value; } } ////// The text to be shown for the help link. /// [ Localizable(true), WebCategory("Links"), DefaultValue(""), WebSysDescription(SR.ChangePassword_HelpPageText) ] public virtual string HelpPageText { get { object obj = ViewState["HelpPageText"]; return (obj == null) ? String.Empty : (string)obj; } set { ViewState["HelpPageText"] = value; } } [ WebCategory("Links"), DefaultValue(""), WebSysDescription(SR.LoginControls_HelpPageIconUrl), Editor("System.Web.UI.Design.ImageUrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)), UrlProperty() ] public virtual string HelpPageIconUrl { get { object obj = ViewState["HelpPageIconUrl"]; return (obj == null) ? String.Empty : (string)obj; } set { ViewState["HelpPageIconUrl"] = value; } } ////// The URL of the help page. /// [ WebCategory("Links"), DefaultValue(""), WebSysDescription(SR.LoginControls_HelpPageUrl), Editor("System.Web.UI.Design.UrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)), UrlProperty() ] public virtual string HelpPageUrl { get { object obj = ViewState["HelpPageUrl"]; return (obj == null) ? String.Empty : (string)obj; } set { ViewState["HelpPageUrl"] = value; } } ////// The style of the hyperlinks. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.WebControl_HyperLinkStyle) ] public TableItemStyle HyperLinkStyle { get { if (_hyperLinkStyle == null) { _hyperLinkStyle = new TableItemStyle(); if (IsTrackingViewState) { ((IStateManager)_hyperLinkStyle).TrackViewState(); } } return _hyperLinkStyle; } } ////// The style of the instructions. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.WebControl_InstructionTextStyle) ] public TableItemStyle InstructionTextStyle { get { if (_instructionTextStyle == null) { _instructionTextStyle = new TableItemStyle(); if (IsTrackingViewState) { ((IStateManager)_instructionTextStyle).TrackViewState(); } } return _instructionTextStyle; } } ////// The style of the textbox labels. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.LoginControls_LabelStyle) ] public TableItemStyle LabelStyle { get { if (_labelStyle == null) { _labelStyle = new TableItemStyle(); if (IsTrackingViewState) { ((IStateManager)_labelStyle).TrackViewState(); } } return _labelStyle; } } ////// The content and format of the e-mail message that contains the new password. /// [ WebCategory("Behavior"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), Themeable(false), WebSysDescription(SR.PasswordRecovery_MailDefinition) ] public MailDefinition MailDefinition { get { if (_mailDefinition == null) { _mailDefinition = new MailDefinition(); if (IsTrackingViewState) { ((IStateManager)_mailDefinition).TrackViewState(); } } return _mailDefinition; } } ////// Gets or sets the name of the membership provider. If null or empty, the default provider is used. /// [ WebCategory("Data"), DefaultValue(""), Themeable(false), WebSysDescription(SR.MembershipProvider_Name) ] public virtual string MembershipProvider { get { object obj = ViewState["MembershipProvider"]; return (obj == null) ? String.Empty : (string)obj; } set { ViewState["MembershipProvider"] = value; } } ////// The security question. /// [ Browsable(false), Filterable(false), Themeable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public virtual string Question { get { return (_question != null) ? _question : String.Empty; } private set { _question = value; } } ////// The text to be shown when the answer is incorrect. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultQuestionFailureText), WebSysDescription(SR.PasswordRecovery_QuestionFailureText) ] public virtual string QuestionFailureText { get { object obj = ViewState["QuestionFailureText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultQuestionFailureText) : (string)obj; } set { ViewState["QuestionFailureText"] = value; } } ////// Text that is displayed to give instructions for answering the question. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultQuestionInstructionText), WebSysDescription(SR.PasswordRecovery_QuestionInstructionText) ] public virtual string QuestionInstructionText { get { object obj = ViewState["QuestionInstructionText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultQuestionInstructionText) : (string)obj; } set { ViewState["QuestionInstructionText"] = value; } } ////// The text that identifies the question. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultQuestionLabelText), WebSysDescription(SR.PasswordRecovery_QuestionLabelText) ] public virtual string QuestionLabelText { get { object obj = ViewState["QuestionLabelText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultQuestionLabelText) : (string)obj; } set { ViewState["QuestionLabelText"] = value; } } ////// The text to be shown for the title when answering the question. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultQuestionTitleText), WebSysDescription(SR.PasswordRecovery_QuestionTitleText) ] public virtual string QuestionTitleText { get { object obj = ViewState["QuestionTitleText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultQuestionTitleText) : (string)obj; } set { ViewState["QuestionTitleText"] = value; } } ////// Template rendered to prompt the user for an answer to the security question. /// [ Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(PasswordRecovery)), WebSysDescription(SR.PasswordRecovery_QuestionTemplate) ] public virtual ITemplate QuestionTemplate { get { return _questionTemplate; } set { _questionTemplate = value; ChildControlsCreated = false; } } ////// Internal because used from PasswordRecoveryAdapter. /// [ Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription(SR.PasswordRecovery_QuestionTemplateContainer) ] public Control QuestionTemplateContainer { get { EnsureChildControls(); return _questionContainer; } } ////// The URL of an image to be displayed for the submit button. /// [ WebCategory("Appearance"), DefaultValue(""), WebSysDescription(SR.ChangePassword_ChangePasswordButtonImageUrl), Editor("System.Web.UI.Design.ImageUrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)), UrlProperty() ] public virtual string SubmitButtonImageUrl { get { object obj = ViewState["SubmitButtonImageUrl"]; return (obj == null) ? String.Empty : (string)obj; } set { ViewState["SubmitButtonImageUrl"] = value; } } ////// The text to be shown for the submit button. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultSubmitButtonText), WebSysDescription(SR.ChangePassword_ChangePasswordButtonText) ] public virtual string SubmitButtonText { get { object obj = ViewState["SubmitButtonText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultSubmitButtonText) : (string)obj; } set { ViewState["SubmitButtonText"] = value; } } ////// The URL that the user is directed to after the password e-mail has been sent. /// If non-null, always redirect the user to this page after successful password recovery. Else, perform the refresh action. /// [ WebCategory("Behavior"), DefaultValue(""), WebSysDescription(SR.LoginControls_SuccessPageUrl), Editor("System.Web.UI.Design.UrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)), Themeable(false), UrlProperty() ] public virtual string SuccessPageUrl { get { object obj = ViewState["SuccessPageUrl"]; return (obj == null) ? String.Empty : (string)obj; } set { ViewState["SuccessPageUrl"] = value; } } ////// Template rendered after the e-mail is sent. /// [ Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.PasswordRecovery_SuccessTemplate), TemplateContainer(typeof(PasswordRecovery)) ] public virtual ITemplate SuccessTemplate { get { return _successTemplate; } set { _successTemplate = value; ChildControlsCreated = false; } } ////// Internal because used from PasswordRecoveryAdapter. /// [ Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription(SR.PasswordRecovery_SuccessTemplateContainer) ] public Control SuccessTemplateContainer { get { EnsureChildControls(); return _successContainer; } } ////// The text to be shown after the password e-mail has been sent. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultSuccessText), WebSysDescription(SR.PasswordRecovery_SuccessText) ] public virtual string SuccessText { get { object obj = ViewState["SuccessText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultSuccessText) : (string)obj; } set { ViewState["SuccessText"] = value; } } ////// The style of the success text. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.PasswordRecovery_SuccessTextStyle) ] public TableItemStyle SuccessTextStyle { get { if (_successTextStyle == null) { _successTextStyle = new TableItemStyle(); if (IsTrackingViewState) { ((IStateManager)_successTextStyle).TrackViewState(); } } return _successTextStyle; } } protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Table; } } ////// The style of the textboxes. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.LoginControls_TextBoxStyle) ] public Style TextBoxStyle { get { if (_textBoxStyle == null) { _textBoxStyle = new Style(); if (IsTrackingViewState) { ((IStateManager)_textBoxStyle).TrackViewState(); } } return _textBoxStyle; } } ////// The layout of the labels in relation to the textboxes. /// [ WebCategory("Layout"), DefaultValue(LoginTextLayout.TextOnLeft), WebSysDescription(SR.LoginControls_TextLayout) ] public virtual LoginTextLayout TextLayout { get { object obj = ViewState["TextLayout"]; return (obj == null) ? LoginTextLayout.TextOnLeft : (LoginTextLayout)obj; } set { if (value < LoginTextLayout.TextOnLeft || value > LoginTextLayout.TextOnTop) { throw new ArgumentOutOfRangeException("value"); } ViewState["TextLayout"] = value; ChildControlsCreated = false; } } ////// The style of the title. /// [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.LoginControls_TitleTextStyle) ] public TableItemStyle TitleTextStyle { get { if (_titleTextStyle == null) { _titleTextStyle = new TableItemStyle(); if (IsTrackingViewState) { ((IStateManager)_titleTextStyle).TrackViewState(); } } return _titleTextStyle; } } ////// The initial value in the user name textbox. /// [ Localizable(true), WebCategory("Appearance"), DefaultValue(""), WebSysDescription(SR.UserName_InitialValue) ] public virtual string UserName { get { return (_userName == null) ? String.Empty : _userName; } set { _userName = value; } } internal string UserNameInternal { get { string userName = UserName; if (String.IsNullOrEmpty(userName) && _userNameContainer != null) { ITextControl textbox = _userNameContainer.UserNameTextBox as ITextControl; if (textbox != null) { return textbox.Text; } } return userName; } } ////// The text to be shown when the user name is invalid. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultUserNameFailureText), WebSysDescription(SR.PasswordRecovery_UserNameFailureText) ] public virtual string UserNameFailureText { get { object obj = ViewState["UserNameFailureText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultUserNameFailureText) : (string)obj; } set { ViewState["UserNameFailureText"] = value; } } ////// Text that is displayed to give instructions for entering the user name. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultUserNameInstructionText), WebSysDescription(SR.PasswordRecovery_UserNameInstructionText) ] public virtual string UserNameInstructionText { get { object obj = ViewState["UserNameInstructionText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultUserNameInstructionText) : (string)obj; } set { ViewState["UserNameInstructionText"] = value; } } ////// The text that identifies the user name. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultUserNameLabelText), WebSysDescription(SR.PasswordRecovery_UserNameLabelText) ] public virtual string UserNameLabelText { get { object obj = ViewState["UserNameLabelText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultUserNameLabelText) : (string)obj; } set { ViewState["UserNameLabelText"] = value; } } ////// The text to be shown in the validation summary when the user name is empty. /// [ Localizable(true), WebCategory("Validation"), WebSysDefaultValue(SR.PasswordRecovery_DefaultUserNameRequiredErrorMessage), WebSysDescription(SR.ChangePassword_UserNameRequiredErrorMessage) ] public virtual string UserNameRequiredErrorMessage { get { object obj = ViewState["UserNameRequiredErrorMessage"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultUserNameRequiredErrorMessage) : (string)obj; } set { ViewState["UserNameRequiredErrorMessage"] = value; } } ////// Template rendered to prompt the user to enter a user name. /// [ Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(PasswordRecovery)), WebSysDescription(SR.PasswordRecovery_UserNameTemplate) ] public virtual ITemplate UserNameTemplate { get { return _userNameTemplate; } set { _userNameTemplate = value; ChildControlsCreated = false; } } ////// Internal because used from PasswordRecoveryAdapter. /// [ Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription(SR.PasswordRecovery_UserNameTemplateContainer) ] public Control UserNameTemplateContainer { get { EnsureChildControls(); return _userNameContainer; } } ////// The text to be shown for the title when entering the user name. /// [ Localizable(true), WebCategory("Appearance"), WebSysDefaultValue(SR.PasswordRecovery_DefaultUserNameTitleText), WebSysDescription(SR.PasswordRecovery_UserNameTitleText) ] public virtual string UserNameTitleText { get { object obj = ViewState["UserNameTitleText"]; return (obj == null) ? SR.GetString(SR.PasswordRecovery_DefaultUserNameTitleText) : (string)obj; } set { ViewState["UserNameTitleText"] = value; } } [ WebCategory("Styles"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.ChangePassword_ValidatorTextStyle) ] public Style ValidatorTextStyle { get { if (_validatorTextStyle == null) { _validatorTextStyle = new ErrorStyle(); if (IsTrackingViewState) { ((IStateManager)_validatorTextStyle).TrackViewState(); } } return _validatorTextStyle; } } ////// Raised when the answer provided is incorrect. /// [ WebCategory("Action"), WebSysDescription(SR.PasswordRecovery_AnswerLookupError) ] public event EventHandler AnswerLookupError { add { Events.AddHandler(EventAnswerLookupError, value); } remove { Events.RemoveHandler(EventAnswerLookupError, value); } } ////// Raised before the answer is validated. /// [ WebCategory("Action"), WebSysDescription(SR.PasswordRecovery_VerifyingAnswer) ] public event LoginCancelEventHandler VerifyingAnswer { add { Events.AddHandler(EventVerifyingAnswer, value); } remove { Events.RemoveHandler(EventVerifyingAnswer, value); } } ////// Raised before the e-mail is sent. /// [ WebCategory("Action"), WebSysDescription(SR.PasswordRecovery_SendingMail) ] public event MailMessageEventHandler SendingMail { add { Events.AddHandler(EventSendingMail, value); } remove { Events.RemoveHandler(EventSendingMail, value); } } [ WebCategory("Action"), WebSysDescription(SR.CreateUserWizard_SendMailError) ] public event SendMailErrorEventHandler SendMailError { add { Events.AddHandler(EventSendMailError, value); } remove { Events.RemoveHandler(EventSendMailError, value); } } ////// Raised before the username is looked up. /// [ WebCategory("Action"), WebSysDescription(SR.PasswordRecovery_VerifyingUser) ] public event LoginCancelEventHandler VerifyingUser { add { Events.AddHandler(EventVerifyingUser, value); } remove { Events.RemoveHandler(EventVerifyingUser, value); } } ////// Raised when the user name is invalid. /// [ WebCategory("Action"), WebSysDescription(SR.PasswordRecovery_UserLookupError) ] public event EventHandler UserLookupError { add { Events.AddHandler(EventUserLookupError, value); } remove { Events.RemoveHandler(EventUserLookupError, value); } } ////// Called when the answer text box changes. /// private void AnswerTextChanged(object source, EventArgs e) { _answer = ((ITextControl)source).Text; } private void AttemptSendPassword() { if (Page != null && !Page.IsValid) { return; } if (CurrentView == View.UserName) { AttemptSendPasswordUserNameView(); } else if (CurrentView == View.Question) { AttemptSendPasswordQuestionView(); } } ////// Called when the user presses submit in the question view. /// Verifies the answer to the security question. If correct, sends password in e-mail. /// If answer is incorrect or there is any other error, a failure message is shown. /// private void AttemptSendPasswordQuestionView() { MembershipProvider provider = LoginUtil.GetProvider(MembershipProvider); MembershipUser user = provider.GetUser(UserNameInternal, /*userIsOnline*/ false, /*throwOnError*/ false); if (user != null) { if (user.IsLockedOut) { SetFailureTextLabel(_questionContainer, GeneralFailureText); return; } Question = user.PasswordQuestion; if (String.IsNullOrEmpty(Question)) { SetFailureTextLabel(_questionContainer, GeneralFailureText); return; } LoginCancelEventArgs cancelEventArgs = new LoginCancelEventArgs(); OnVerifyingAnswer(cancelEventArgs); if (cancelEventArgs.Cancel) { return; } string answer = AnswerInternal; string password = null; string email = user.Email; // If there is no email address, show the GeneralFailureText and return immediately. // We must be especially sure we do not reset the password if we do not have an // email address. (VSWhidbey 387663) if (String.IsNullOrEmpty(email)) { SetFailureTextLabel(_questionContainer, GeneralFailureText); return; } if (provider.EnablePasswordRetrieval) { password = user.GetPassword(answer, /*throwOnError*/ false); } else if (provider.EnablePasswordReset) { password = user.ResetPassword(answer, /*throwOnError*/ false); } else { throw new HttpException(SR.GetString(SR.PasswordRecovery_RecoveryNotSupported)); } if (password != null) { LoginUtil.SendPasswordMail(email, user.UserName, password, MailDefinition, SR.GetString(SR.PasswordRecovery_DefaultSubject), SR.GetString(SR.PasswordRecovery_DefaultBody), OnSendingMail, OnSendMailError, this); PerformSuccessAction(); } else { OnAnswerLookupError(EventArgs.Empty); SetFailureTextLabel(_questionContainer, QuestionFailureText); } } else { // If the user lookup fails after it succeeded in the previous view, // it is considered a general failure SetFailureTextLabel(_questionContainer, GeneralFailureText); } } ////// Called when the user presses submit in the user name view. /// If user name is valid, sends password in e-mail. /// If user name is invalid or there is any other error, a failure message is shown. /// private void AttemptSendPasswordUserNameView() { LoginCancelEventArgs cancelEventArgs = new LoginCancelEventArgs(); OnVerifyingUser(cancelEventArgs); if (cancelEventArgs.Cancel) { return; } MembershipProvider provider = LoginUtil.GetProvider(MembershipProvider); MembershipUser user = provider.GetUser(UserNameInternal, /*isUserOnline*/ false, /*throwOnError*/ false); if (user != null) { if (user.IsLockedOut) { SetFailureTextLabel(_userNameContainer, UserNameFailureText); return; } if (provider.RequiresQuestionAndAnswer) { Question = user.PasswordQuestion; if (String.IsNullOrEmpty(Question)) { SetFailureTextLabel(_userNameContainer, GeneralFailureText); return; } CurrentView = View.Question; } else { string password = null; string email = user.Email; // If there is no email address, show the GeneralFailureText and return immediately. // We must be especially sure we do not reset the password if we do not have an // email address. (VSWhidbey 387663) if (String.IsNullOrEmpty(email)) { SetFailureTextLabel(_userNameContainer, GeneralFailureText); return; } if (provider.EnablePasswordRetrieval) { password = user.GetPassword(/*throwOnError*/ false); } else if (provider.EnablePasswordReset) { password = user.ResetPassword(/*throwOnError*/ false); } else { throw new HttpException(SR.GetString(SR.PasswordRecovery_RecoveryNotSupported)); } if (password != null) { LoginUtil.SendPasswordMail(email, user.UserName, password, MailDefinition, SR.GetString(SR.PasswordRecovery_DefaultSubject), SR.GetString(SR.PasswordRecovery_DefaultBody), OnSendingMail, OnSendMailError, this); PerformSuccessAction(); } else { SetFailureTextLabel(_userNameContainer, GeneralFailureText); } } } else { OnUserLookupError(EventArgs.Empty); SetFailureTextLabel(_userNameContainer, UserNameFailureText); } } ////// Instantiates the proper template in the template container, and wires up necessary events. /// protected internal override void CreateChildControls() { Controls.Clear(); CreateUserView(); CreateQuestionView(); CreateSuccessView(); } private void CreateQuestionView() { ITemplate template = null; _questionContainer = new QuestionContainer(this); _questionContainer.ID = _questionContainerID; _questionContainer.RenderDesignerRegion = _renderDesignerRegion; if (QuestionTemplate != null) { template = QuestionTemplate; } else { // template = new DefaultQuestionTemplate(this); _questionContainer.EnableViewState = false; // Disable theming if using default template (VSWhidbey 86010) _questionContainer.EnableTheming = false; } template.InstantiateIn(_questionContainer); Controls.Add(_questionContainer); IEditableTextControl answerTextBox = _questionContainer.AnswerTextBox as IEditableTextControl; if (answerTextBox != null) { answerTextBox.TextChanged += new EventHandler(AnswerTextChanged); } } private void CreateSuccessView() { ITemplate template = null; _successContainer = new SuccessContainer(this); _successContainer.ID = _successContainerID; _successContainer.RenderDesignerRegion = _renderDesignerRegion; if (SuccessTemplate != null) { template = SuccessTemplate; } else { // template = new DefaultSuccessTemplate(this); _successContainer.EnableViewState = false; // Disable theming if using default template (VSWhidbey 86010) _successContainer.EnableTheming = false; } template.InstantiateIn(_successContainer); Controls.Add(_successContainer); } private void CreateUserView() { ITemplate template = null; _userNameContainer = new UserNameContainer(this); _userNameContainer.ID = _userNameContainerID; _userNameContainer.RenderDesignerRegion = _renderDesignerRegion; if (UserNameTemplate != null) { template = UserNameTemplate; } else { // template = new DefaultUserNameTemplate(this); _userNameContainer.EnableViewState = false; // Disable theming if using default template (VSWhidbey 86010) _userNameContainer.EnableTheming = false; } template.InstantiateIn(_userNameContainer); Controls.Add(_userNameContainer); // Set the editable child control properties here for two reasons: // - So change events will be raised if viewstate is disabled on the child controls // - Viewstate is always disabled for default template, and might be for user template // - So the controls render correctly in the designer SetUserNameEditableChildProperties(); IEditableTextControl userNameTextBox = _userNameContainer.UserNameTextBox as IEditableTextControl; if (userNameTextBox != null) { userNameTextBox.TextChanged += new EventHandler(UserNameTextChanged); } } ////// Loads the control state for those properties that should persist across postbacks /// even when EnableViewState=false. /// protected internal override void LoadControlState(object savedState) { if (savedState != null) { Triplet state = (Triplet)savedState; if (state.First != null) { base.LoadControlState(state.First); } if (state.Second != null) { CurrentView = (View)(int)state.Second; } if (state.Third != null) { _userName = (string)state.Third; } } } ////// Loads a saved state of the protected override void LoadViewState(object savedState) { if (savedState == null) { base.LoadViewState(null); } else { object[] myState = (object[])savedState; if (myState.Length != _viewStateArrayLength) { throw new ArgumentException(SR.GetString(SR.ViewState_InvalidViewState)); } base.LoadViewState(myState[0]); if (myState[1] != null) { ((IStateManager)SubmitButtonStyle).LoadViewState(myState[1]); } if (myState[2] != null) { ((IStateManager)LabelStyle).LoadViewState(myState[2]); } if (myState[3] != null) { ((IStateManager)TextBoxStyle).LoadViewState(myState[3]); } if (myState[4] != null) { ((IStateManager)HyperLinkStyle).LoadViewState(myState[4]); } if (myState[5] != null) { ((IStateManager)InstructionTextStyle).LoadViewState(myState[5]); } if (myState[6] != null) { ((IStateManager)TitleTextStyle).LoadViewState(myState[6]); } if (myState[7] != null) { ((IStateManager)FailureTextStyle).LoadViewState(myState[7]); } if (myState[8] != null) { ((IStateManager)SuccessTextStyle).LoadViewState(myState[8]); } if (myState[9] != null) { ((IStateManager)MailDefinition).LoadViewState(myState[9]); } if (myState[10] != null) { ((IStateManager)ValidatorTextStyle).LoadViewState(myState[10]); } } } ///. /// /// Raises the AnswerLookup event. /// protected virtual void OnAnswerLookupError(EventArgs e) { EventHandler handler = (EventHandler)Events[EventAnswerLookupError]; if (handler != null) { handler(this, e); } } ////// Raises the VerifyingAnswer event. /// protected virtual void OnVerifyingAnswer(LoginCancelEventArgs e) { LoginCancelEventHandler handler = (LoginCancelEventHandler)Events[EventVerifyingAnswer]; if (handler != null) { handler(this, e); } } ////// Raises the SendingMail event. /// protected virtual void OnSendingMail(MailMessageEventArgs e) { MailMessageEventHandler handler = (MailMessageEventHandler)Events[EventSendingMail]; if (handler != null) { handler(this, e); } } protected virtual void OnSendMailError(SendMailErrorEventArgs e) { SendMailErrorEventHandler handler = (SendMailErrorEventHandler)Events[EventSendMailError]; if (handler != null) { handler(this, e); } } ////// Raises the VerifyingUser event. /// protected virtual void OnVerifyingUser(LoginCancelEventArgs e) { LoginCancelEventHandler handler = (LoginCancelEventHandler)Events[EventVerifyingUser]; if (handler != null) { handler(this, e); } } ////// Called when an event is raised by a control inside one of our templates. Attempts to send /// password if the event was raised by the submit button. /// protected override bool OnBubbleEvent(object source, EventArgs e) { bool handled = false; if (e is CommandEventArgs) { CommandEventArgs ce = (CommandEventArgs)e; if (ce.CommandName.Equals(SubmitButtonCommandName, StringComparison.CurrentCultureIgnoreCase)) { AttemptSendPassword(); handled = true; } } return handled; } protected internal override void OnInit(EventArgs e) { base.OnInit(e); Page.RegisterRequiresControlState(this); Page.LoadComplete += new EventHandler(OnPageLoadComplete); } private void OnPageLoadComplete(object sender, EventArgs e) { if (CurrentView == View.Question) { // Question will be null if the page was posted back using a control outside the // PasswordRecovery (VSWhidbey 81302). Load the Question in Page.LoadComplete instead // of Control.OnPreRender(), so that the Question property is available to the page // developer earlier in the lifecycle. if (String.IsNullOrEmpty(Question)) { MembershipProvider provider = LoginUtil.GetProvider(MembershipProvider); MembershipUser user = provider.GetUser(UserNameInternal, /*isUserOnline*/ false, /*throwOnError*/ false); if (user != null) { Question = user.PasswordQuestion; if (String.IsNullOrEmpty(Question)) { SetFailureTextLabel(_questionContainer, GeneralFailureText); } } else { SetFailureTextLabel(_questionContainer, GeneralFailureText); } } } } ////// Overridden to set the editable child control properteries. /// protected internal override void OnPreRender(EventArgs e) { base.OnPreRender(e); _userNameContainer.Visible = false; _questionContainer.Visible = false; _successContainer.Visible = false; switch (CurrentView) { case View.UserName: _userNameContainer.Visible = true; // Set the editable child control properties here instead of Render, so they get into viewstate // for the user template. SetUserNameEditableChildProperties(); break; case View.Question: _questionContainer.Visible = true; break; case View.Success: _successContainer.Visible = true; break; } } ////// Raises the UserLookupError event /// protected virtual void OnUserLookupError(EventArgs e) { EventHandler handler = (EventHandler)Events[EventUserLookupError]; if (handler != null) { handler(this, e); } } private void PerformSuccessAction() { string successPageUrl = SuccessPageUrl; if (!String.IsNullOrEmpty(successPageUrl)) { // [....] suggested that we should not terminate execution of current page, to give // page a chance to cleanup its resources. This may be less performant though. // [....] suggested that we need to call ResolveClientUrl before redirecting. // Example is this control inside user control, want redirect relative to user control dir. Page.Response.Redirect(ResolveClientUrl(successPageUrl), false); } else { CurrentView = View.Success; } } ////// Adds the ClientID and renders contents, because we don't want the outer . /// protected internal override void Render(HtmlTextWriter writer) { if (Page != null) { Page.VerifyRenderingInServerForm(this); } EnsureChildControls(); if (DesignMode) { // Need to redo this for the designer as there's no PreRender(sigh) _userNameContainer.Visible = false; _questionContainer.Visible = false; _successContainer.Visible = false; switch (CurrentView) { case View.UserName: _userNameContainer.Visible = true; break; case View.Question: _questionContainer.Visible = true; break; case View.Success: _successContainer.Visible = true; break; } } switch (CurrentView) { case View.UserName: SetUserNameChildProperties(); break; case View.Question: SetQuestionChildProperties(); break; case View.Success: SetSuccessChildProperties(); break; } RenderContents(writer); } ////// Saves the control state for those properties that should persist across postbacks /// even when EnableViewState=false. /// protected internal override object SaveControlState() { object baseState = base.SaveControlState(); if (baseState != null || _currentView != 0 || _userName != null) { // Save the int value of the enum (instead of the enum value itself) // to save space in ControlState object currentViewState = null; object userNameState = null; if (_currentView != 0) { currentViewState = (int)_currentView; } // Don't save _userName once we have reached the success view (VSWhidbey 81327) if (_userName != null && _currentView != View.Success) { userNameState = _userName; } return new Triplet(baseState, currentViewState, userNameState); } return null; } ////// /// Saves the state of the protected override object SaveViewState() { object[] myState = new object[_viewStateArrayLength]; myState[0] = base.SaveViewState(); myState[1] = (_submitButtonStyle != null) ? ((IStateManager)_submitButtonStyle).SaveViewState() : null; myState[2] = (_labelStyle != null) ? ((IStateManager)_labelStyle).SaveViewState() : null; myState[3] = (_textBoxStyle != null) ? ((IStateManager)_textBoxStyle).SaveViewState() : null; myState[4] = (_hyperLinkStyle != null) ? ((IStateManager)_hyperLinkStyle).SaveViewState() : null; myState[5] = (_instructionTextStyle != null) ? ((IStateManager)_instructionTextStyle).SaveViewState() : null; myState[6] = (_titleTextStyle != null) ? ((IStateManager)_titleTextStyle).SaveViewState() : null; myState[7] = (_failureTextStyle != null) ? ((IStateManager)_failureTextStyle).SaveViewState() : null; myState[8] = (_successTextStyle != null) ? ((IStateManager)_successTextStyle).SaveViewState() : null; myState[9] = (_mailDefinition != null) ? ((IStateManager)_mailDefinition).SaveViewState() : null; myState[10] = (_validatorTextStyle != null) ? ((IStateManager)_validatorTextStyle).SaveViewState() : null; for (int i = 0; i < _viewStateArrayLength; i++) { if (myState[i] != null) { return myState; } } // More performant to return null than an array of null values return null; } ///. /// /// /// Allows the designer to set the CurrentView, so the different templates can be shown in the designer. /// [SecurityPermission(SecurityAction.Demand, Unrestricted = true)] protected override void SetDesignModeState(IDictionary data) { if (data != null) { object o = data["CurrentView"]; if (o != null) { CurrentView = (View)o; } o = data["ConvertToTemplate"]; if (o != null) { _convertingToTemplate = (bool)o; } o = data["RegionEditing"]; if (o != null) { _renderDesignerRegion = (bool)o; } } } ////// Used frequently, so extracted into method. /// private void SetFailureTextLabel(QuestionContainer container, string failureText) { ITextControl failureTextLabel = (ITextControl)container.FailureTextLabel; if (failureTextLabel != null) { failureTextLabel.Text = failureText; } } ////// Used frequently, so extracted into method. /// private void SetFailureTextLabel(UserNameContainer container, string failureText) { ITextControl failureTextLabel = (ITextControl)container.FailureTextLabel; if (failureTextLabel != null) { failureTextLabel.Text = failureText; } } ////// Internal because called from PasswordRecoveryAdapter. /// internal void SetQuestionChildProperties() { SetQuestionCommonChildProperties(); if (QuestionTemplate == null) { SetQuestionDefaultChildProperties(); } } ////// Properties that apply to both default and user templates. /// private void SetQuestionCommonChildProperties() { QuestionContainer container = _questionContainer; // Clear out the tab index so it doesn't get applied to the tables in the container Util.CopyBaseAttributesToInnerControl(this, container); container.ApplyStyle(ControlStyle); // We need to use UserNameInternal for the DropDownList case where it won't fire a TextChanged for the first item ITextControl userName = (ITextControl)container.UserName; if (userName != null) { // VSWhidbey 304890 - Encode the user name userName.Text = HttpUtility.HtmlEncode(UserNameInternal); } ITextControl question = (ITextControl)container.Question; if (question != null) { // VSWhidbey 385802 - Encode the question question.Text = HttpUtility.HtmlEncode(Question); } ITextControl answerTextBox = (ITextControl)container.AnswerTextBox; if (answerTextBox != null) { answerTextBox.Text = String.Empty; } } ////// Properties that apply to only the default template. /// private void SetQuestionDefaultChildProperties() { QuestionContainer container = _questionContainer; // Need to set the BorderPadding on the BorderTable instead of the LayoutTable, since // setting it on the LayoutTable would cause all of the controls inside the Login to be // separated by the BorderPadding amount. container.BorderTable.CellPadding = BorderPadding; container.BorderTable.CellSpacing = 0; Literal title = container.Title; string titleText = QuestionTitleText; if (titleText.Length > 0) { title.Text = titleText; if (_titleTextStyle != null) { LoginUtil.SetTableCellStyle(title, TitleTextStyle); } LoginUtil.SetTableCellVisible(title, true); } else { LoginUtil.SetTableCellVisible(title, false); } Literal instruction = container.Instruction; string instructionText = QuestionInstructionText; if (instructionText.Length > 0) { instruction.Text = instructionText; if (_instructionTextStyle != null) { LoginUtil.SetTableCellStyle(instruction, InstructionTextStyle); } LoginUtil.SetTableCellVisible(instruction, true); } else { LoginUtil.SetTableCellVisible(instruction, false); } Literal userNameLabel = container.UserNameLabel; string userNameLabelText = UserNameLabelText; if (userNameLabelText.Length > 0) { userNameLabel.Text = userNameLabelText; if (_labelStyle != null) { LoginUtil.SetTableCellStyle(userNameLabel, LabelStyle); } userNameLabel.Visible = true; } else { // DO NOT make the whole table cell invisible, because in some layouts it must exist for things // to align correctly. Uncommon that this property will be empty anyway. userNameLabel.Visible = false; } // Do not make this control invisible if its text is empty, because it must be present in the created // template in the designer. Uncommon that the text will be empty anyway. Control userName = container.UserName; if (UserNameInternal.Length > 0) { userName.Visible = true; } else { userName.Visible = false; } if (userName is WebControl) ((WebControl)userName).TabIndex = TabIndex; Literal questionLabel = container.QuestionLabel; string questionLabelText = QuestionLabelText; if (questionLabelText.Length > 0) { questionLabel.Text = questionLabelText; if (_labelStyle != null) { LoginUtil.SetTableCellStyle(questionLabel, LabelStyle); } questionLabel.Visible = true; } else { // DO NOT make the whole table cell invisible, because in some layouts it must exist for things // to align correctly. Uncommon that this property will be empty anyway. questionLabel.Visible = false; } // Do not make this control invisible if its text is empty, because it must be present in the created // template in the designer. Uncommon that the text will be empty anyway. Control question = container.Question; if (Question.Length > 0) { question.Visible = true; } else { question.Visible = false; } Literal answerLabel = container.AnswerLabel; string answerLabelText = AnswerLabelText; if (answerLabelText.Length > 0) { answerLabel.Text = answerLabelText; if (_labelStyle != null) { LoginUtil.SetTableCellStyle(answerLabel, LabelStyle); } answerLabel.Visible = true; } else { // DO NOT make the whole table cell invisible, because in some layouts it must exist for things // to align correctly. Uncommon that this property will be empty anyway. answerLabel.Visible = false; } WebControl answerTextBox = (WebControl)container.AnswerTextBox; Debug.Assert(answerTextBox != null, "AnswerTextBox cannot be null for the DefaultTemplate"); if (_textBoxStyle != null) { answerTextBox.ApplyStyle(TextBoxStyle); } answerTextBox.TabIndex = TabIndex; answerTextBox.AccessKey = AccessKey; bool enableValidation = (CurrentView == View.Question); RequiredFieldValidator answerRequired = container.AnswerRequired; answerRequired.ErrorMessage = AnswerRequiredErrorMessage; answerRequired.ToolTip = AnswerRequiredErrorMessage; answerRequired.Enabled = enableValidation; answerRequired.Visible = enableValidation; if (_validatorTextStyle != null) { answerRequired.ApplyStyle(_validatorTextStyle); } LinkButton linkButton = container.LinkButton; ImageButton imageButton = container.ImageButton; Button pushButton = container.PushButton; WebControl button = null; switch (SubmitButtonType) { case ButtonType.Link: linkButton.Text = SubmitButtonText; button = linkButton; break; case ButtonType.Image: imageButton.ImageUrl = SubmitButtonImageUrl; imageButton.AlternateText = SubmitButtonText; button = imageButton; break; case ButtonType.Button: pushButton.Text = SubmitButtonText; button = pushButton; break; } // Set all buttons to nonvisible, then set the selected button to visible linkButton.Visible = false; imageButton.Visible = false; pushButton.Visible = false; button.Visible = true; button.TabIndex = TabIndex; if (_submitButtonStyle != null) { button.ApplyStyle(SubmitButtonStyle); } HyperLink helpPageLink = container.HelpPageLink; string helpPageText = HelpPageText; Image helpPageIcon = container.HelpPageIcon; if (helpPageText.Length > 0) { helpPageLink.Text = helpPageText; helpPageLink.NavigateUrl = HelpPageUrl; helpPageLink.TabIndex = TabIndex; helpPageLink.Visible = true; } else { helpPageLink.Visible = false; } string helpPageIconUrl = HelpPageIconUrl; bool helpPageIconVisible = (helpPageIconUrl.Length > 0); helpPageIcon.Visible = helpPageIconVisible; if (helpPageIconVisible) { helpPageIcon.ImageUrl = helpPageIconUrl; helpPageIcon.AlternateText = helpPageText; } if (helpPageLink.Visible || helpPageIcon.Visible) { if (_hyperLinkStyle != null) { // Apply style except font to table cell, then apply font and forecolor to HyperLinks // VSWhidbey 81289 TableItemStyle hyperLinkStyleExceptFont = new TableItemStyle(); hyperLinkStyleExceptFont.CopyFrom(HyperLinkStyle); hyperLinkStyleExceptFont.Font.Reset(); LoginUtil.SetTableCellStyle(helpPageLink, hyperLinkStyleExceptFont); helpPageLink.Font.CopyFrom(HyperLinkStyle.Font); helpPageLink.ForeColor = HyperLinkStyle.ForeColor; } LoginUtil.SetTableCellVisible(helpPageLink, true); } else { LoginUtil.SetTableCellVisible(helpPageLink, false); } Control failureTextLabel = container.FailureTextLabel; if (((ITextControl)failureTextLabel).Text.Length > 0) { LoginUtil.SetTableCellStyle(failureTextLabel, FailureTextStyle); LoginUtil.SetTableCellVisible(failureTextLabel, true); } else { LoginUtil.SetTableCellVisible(failureTextLabel, false); } } ////// Internal because called from PasswordRecoveryAdapter. /// internal void SetSuccessChildProperties() { SuccessContainer container = _successContainer; // Clear out the tab index so it doesn't get applied to the tables in the container Util.CopyBaseAttributesToInnerControl(this, container); container.ApplyStyle(ControlStyle); if (SuccessTemplate == null) { container.BorderTable.CellPadding = BorderPadding; container.BorderTable.CellSpacing = 0; Literal successTextLabel = container.SuccessTextLabel; string successText = SuccessText; if (successText.Length > 0) { successTextLabel.Text = successText; if (_successTextStyle != null) { LoginUtil.SetTableCellStyle(successTextLabel, _successTextStyle); } LoginUtil.SetTableCellVisible(successTextLabel, true); } else { LoginUtil.SetTableCellVisible(successTextLabel, false); } } } ////// Internal because called from PasswordRecoveryAdapter. /// internal void SetUserNameChildProperties() { SetUserNameCommonChildProperties(); if (UserNameTemplate == null) { SetUserNameDefaultChildProperties(); } } ////// Properties that apply to both default and user templates. /// private void SetUserNameCommonChildProperties() { // Clear out the tab index so it doesn't get applied to the tables in the container Util.CopyBaseAttributesToInnerControl(this, _userNameContainer); _userNameContainer.ApplyStyle(ControlStyle); } ////// Properties that apply to only the default template. /// private void SetUserNameDefaultChildProperties() { UserNameContainer container = _userNameContainer; if (UserNameTemplate == null) { _userNameContainer.BorderTable.CellPadding = BorderPadding; _userNameContainer.BorderTable.CellSpacing = 0; Literal title = container.Title; string titleText = UserNameTitleText; if (titleText.Length > 0) { title.Text = titleText; if (_titleTextStyle != null) { LoginUtil.SetTableCellStyle(title, TitleTextStyle); } LoginUtil.SetTableCellVisible(title, true); } else { LoginUtil.SetTableCellVisible(title, false); } Literal instruction = container.Instruction; string instructionText = UserNameInstructionText; if (instructionText.Length > 0) { instruction.Text = instructionText; if (_instructionTextStyle != null) { LoginUtil.SetTableCellStyle(instruction, InstructionTextStyle); } LoginUtil.SetTableCellVisible(instruction, true); } else { LoginUtil.SetTableCellVisible(instruction, false); } Literal userNameLabel = container.UserNameLabel; string userNameLabelText = UserNameLabelText; if (userNameLabelText.Length > 0) { userNameLabel.Text = userNameLabelText; if (_labelStyle != null) { LoginUtil.SetTableCellStyle(userNameLabel, LabelStyle); } userNameLabel.Visible = true; } else { // DO NOT make the whole table cell invisible, because in some layouts it must exist for things // to align correctly. Uncommon that this property will be empty anyway. userNameLabel.Visible = false; } WebControl userNameTextBox = (WebControl)container.UserNameTextBox; Debug.Assert(userNameTextBox != null, "UserNameTextBox cannot be null for the DefaultTemplate"); if (_textBoxStyle != null) { userNameTextBox.ApplyStyle(TextBoxStyle); } userNameTextBox.TabIndex = TabIndex; userNameTextBox.AccessKey = AccessKey; bool enableValidation = (CurrentView == View.UserName); RequiredFieldValidator userNameRequired = container.UserNameRequired; userNameRequired.ErrorMessage = UserNameRequiredErrorMessage; userNameRequired.ToolTip = UserNameRequiredErrorMessage; userNameRequired.Enabled = enableValidation; userNameRequired.Visible = enableValidation; if (_validatorTextStyle != null) { userNameRequired.ApplyStyle(_validatorTextStyle); } LinkButton linkButton = container.LinkButton; ImageButton imageButton = container.ImageButton; Button pushButton = container.PushButton; WebControl button = null; switch (SubmitButtonType) { case ButtonType.Link: linkButton.Text = SubmitButtonText; button = linkButton; break; case ButtonType.Image: imageButton.ImageUrl = SubmitButtonImageUrl; imageButton.AlternateText = SubmitButtonText; button = imageButton; break; case ButtonType.Button: pushButton.Text = SubmitButtonText; button = pushButton; break; } // Set all buttons to nonvisible, then set the selected button to visible linkButton.Visible = false; imageButton.Visible = false; pushButton.Visible = false; button.Visible = true; button.TabIndex = TabIndex; if (_submitButtonStyle != null) { button.ApplyStyle(SubmitButtonStyle); } HyperLink helpPageLink = container.HelpPageLink; string helpPageText = HelpPageText; Image helpPageIcon = container.HelpPageIcon; if (helpPageText.Length > 0) { helpPageLink.Text = helpPageText; helpPageLink.NavigateUrl = HelpPageUrl; helpPageLink.Visible = true; helpPageLink.TabIndex = TabIndex; } else { helpPageLink.Visible = false; } string helpPageIconUrl = HelpPageIconUrl; bool helpPageIconVisible = (helpPageIconUrl.Length > 0); helpPageIcon.Visible = helpPageIconVisible; if (helpPageIconVisible) { helpPageIcon.ImageUrl = helpPageIconUrl; helpPageIcon.AlternateText = helpPageText; } if (helpPageLink.Visible || helpPageIcon.Visible) { if (_hyperLinkStyle != null) { // Apply style except font to table cell, then apply font and forecolor to HyperLinks // VSWhidbey 81289 Style hyperLinkStyleExceptFont = new TableItemStyle(); hyperLinkStyleExceptFont.CopyFrom(HyperLinkStyle); hyperLinkStyleExceptFont.Font.Reset(); LoginUtil.SetTableCellStyle(helpPageLink, hyperLinkStyleExceptFont); helpPageLink.Font.CopyFrom(HyperLinkStyle.Font); helpPageLink.ForeColor = HyperLinkStyle.ForeColor; } LoginUtil.SetTableCellVisible(helpPageLink, true); } else { LoginUtil.SetTableCellVisible(helpPageLink, false); } Control failureTextLabel = container.FailureTextLabel; if (((ITextControl)failureTextLabel).Text.Length > 0) { LoginUtil.SetTableCellStyle(failureTextLabel, FailureTextStyle); LoginUtil.SetTableCellVisible(failureTextLabel, true); } else { LoginUtil.SetTableCellVisible(failureTextLabel, false); } } } ////// Called from CreateChildControls and PreRender // - So change events will be raised if viewstate is disabled on the child controls // - Viewstate is always disabled for default template, and might be for user template // - So the controls render correctly in the designer /// private void SetUserNameEditableChildProperties() { // We need to use UserNameInternal for the DropDownList case where it won't fire a TextChanged for the first item string userName = UserNameInternal; if (userName.Length > 0) { ITextControl userNameTextBox = (ITextControl)_userNameContainer.UserNameTextBox; // UserNameTextBox is a required control, but it may be null at design-time if (userNameTextBox != null) { userNameTextBox.Text = userName; } } } ////// Marks the starting point to begin tracking and saving changes to the /// control as part of the control viewstate. /// protected override void TrackViewState() { base.TrackViewState(); if (_submitButtonStyle != null) { ((IStateManager)_submitButtonStyle).TrackViewState(); } if (_labelStyle != null) { ((IStateManager)_labelStyle).TrackViewState(); } if (_textBoxStyle != null) { ((IStateManager)_textBoxStyle).TrackViewState(); } if (_hyperLinkStyle != null) { ((IStateManager)_hyperLinkStyle).TrackViewState(); } if (_instructionTextStyle != null) { ((IStateManager)_instructionTextStyle).TrackViewState(); } if (_titleTextStyle != null) { ((IStateManager)_titleTextStyle).TrackViewState(); } if (_failureTextStyle != null) { ((IStateManager)_failureTextStyle).TrackViewState(); } if (_successTextStyle != null) { ((IStateManager)_successTextStyle).TrackViewState(); } if (_mailDefinition != null) { ((IStateManager)_mailDefinition).TrackViewState(); } if (_validatorTextStyle != null) { ((IStateManager)_validatorTextStyle).TrackViewState(); } } private void UpdateValidators() { if (UserNameTemplate == null && _userNameContainer != null) { bool enabled = (CurrentView == View.UserName); _userNameContainer.UserNameRequired.Enabled = enabled; _userNameContainer.UserNameRequired.Visible = enabled; } if (QuestionTemplate == null && _questionContainer != null) { bool enabled = (CurrentView == View.Question); _questionContainer.AnswerRequired.Enabled = enabled; _questionContainer.AnswerRequired.Visible = enabled; } } ////// Called when the answer text box changes. /// private void UserNameTextChanged(object source, EventArgs e) { UserName = ((ITextControl)source).Text; } ////// The default question template for the control, used if QuestionTemplate is null. /// private sealed class DefaultQuestionTemplate : ITemplate { private PasswordRecovery _owner; public DefaultQuestionTemplate(PasswordRecovery owner) { _owner = owner; } ////// Creates the child controls, sets certain properties (mostly static properties) /// private void CreateControls(QuestionContainer questionContainer) { string validationGroup = _owner.UniqueID; questionContainer.Title = new Literal(); questionContainer.Instruction = new Literal(); questionContainer.UserNameLabel = new Literal(); questionContainer.UserName = new Literal(); questionContainer.QuestionLabel = new Literal(); questionContainer.Question = new Literal(); // Needed for "convert to template" feature questionContainer.UserName.ID = _userNameID; questionContainer.Question.ID = _questionID; TextBox answerTextBox = new TextBox(); answerTextBox.ID = _answerID; questionContainer.AnswerTextBox = answerTextBox; questionContainer.AnswerLabel = new LabelLiteral(answerTextBox); bool enableValidation = (_owner.CurrentView == View.Question); RequiredFieldValidator answerRequired = new RequiredFieldValidator(); answerRequired.ID = _answerRequiredID; answerRequired.ValidationGroup = validationGroup; answerRequired.ControlToValidate = answerTextBox.ID; answerRequired.Display = _requiredFieldValidatorDisplay; answerRequired.Text = SR.GetString(SR.LoginControls_DefaultRequiredFieldValidatorText); answerRequired.Enabled = enableValidation; answerRequired.Visible = enableValidation; questionContainer.AnswerRequired = answerRequired; LinkButton linkButton = new LinkButton(); linkButton.ID = _linkButtonID; linkButton.ValidationGroup = validationGroup; linkButton.CommandName = SubmitButtonCommandName; questionContainer.LinkButton = linkButton; ImageButton imageButton = new ImageButton(); imageButton.ID = _imageButtonID; imageButton.ValidationGroup = validationGroup; imageButton.CommandName = SubmitButtonCommandName; questionContainer.ImageButton = imageButton; Button pushButton = new Button(); pushButton.ID = _pushButtonID; pushButton.ValidationGroup = validationGroup; pushButton.CommandName = SubmitButtonCommandName; questionContainer.PushButton = pushButton; questionContainer.HelpPageLink = new HyperLink(); questionContainer.HelpPageLink.ID = _helpLinkID; questionContainer.HelpPageIcon = new Image(); Literal failureTextLabel = new Literal(); failureTextLabel.ID = _failureTextID; questionContainer.FailureTextLabel = failureTextLabel; } ////// Adds the controls to a table for layout. Layout depends on TextLayout. /// private void LayoutControls(QuestionContainer questionContainer) { LoginTextLayout textLayout = _owner.TextLayout; if (textLayout == LoginTextLayout.TextOnLeft) { LayoutTextOnLeft(questionContainer); } else { LayoutTextOnTop(questionContainer); } } private void LayoutTextOnLeft(QuestionContainer questionContainer) { Table table = new Table(); table.CellPadding = 0; TableRow r; TableCell c; r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(questionContainer.Title); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(questionContainer.Instruction); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(questionContainer.UserNameLabel); r.Cells.Add(c); c = new TableCell(); c.Controls.Add(questionContainer.UserName); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(questionContainer.QuestionLabel); r.Cells.Add(c); c = new TableCell(); c.Controls.Add(questionContainer.Question); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(questionContainer.AnswerLabel); if (_owner.ConvertingToTemplate) { questionContainer.AnswerLabel.RenderAsLabel = true; } r.Cells.Add(c); c = new TableCell(); c.Controls.Add(questionContainer.AnswerTextBox); c.Controls.Add(questionContainer.AnswerRequired); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(questionContainer.FailureTextLabel); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(questionContainer.LinkButton); c.Controls.Add(questionContainer.ImageButton); c.Controls.Add(questionContainer.PushButton); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.Controls.Add(questionContainer.HelpPageIcon); c.Controls.Add(questionContainer.HelpPageLink); r.Cells.Add(c); table.Rows.Add(r); Table table2 = LoginUtil.CreateChildTable(_owner.ConvertingToTemplate); r = new TableRow(); c = new TableCell(); c.Controls.Add(table); r.Cells.Add(c); table2.Rows.Add(r); questionContainer.LayoutTable = table; questionContainer.BorderTable = table2; questionContainer.Controls.Add(table2); } private void LayoutTextOnTop(QuestionContainer questionContainer) { Table table = new Table(); table.CellPadding = 0; TableRow r; TableCell c; r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(questionContainer.Title); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(questionContainer.Instruction); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.UserNameLabel); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.UserName); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.QuestionLabel); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.Question); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.AnswerLabel); if (_owner.ConvertingToTemplate) { questionContainer.AnswerLabel.RenderAsLabel = true; } r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.AnswerTextBox); c.Controls.Add(questionContainer.AnswerRequired); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(questionContainer.FailureTextLabel); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(questionContainer.LinkButton); c.Controls.Add(questionContainer.ImageButton); c.Controls.Add(questionContainer.PushButton); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(questionContainer.HelpPageIcon); c.Controls.Add(questionContainer.HelpPageLink); r.Cells.Add(c); table.Rows.Add(r); Table table2 = LoginUtil.CreateChildTable(_owner.ConvertingToTemplate); r = new TableRow(); c = new TableCell(); c.Controls.Add(table); r.Cells.Add(c); table2.Rows.Add(r); questionContainer.LayoutTable = table; questionContainer.BorderTable = table2; questionContainer.Controls.Add(table2); } void ITemplate.InstantiateIn(Control container) { QuestionContainer questionContainer = (QuestionContainer)container; CreateControls(questionContainer); LayoutControls(questionContainer); } } ////// The default success template for the control, used if SuccessTemplate is null. /// private sealed class DefaultSuccessTemplate : ITemplate { private PasswordRecovery _owner; public DefaultSuccessTemplate(PasswordRecovery owner) { _owner = owner; } private void CreateControls(SuccessContainer successContainer) { successContainer.SuccessTextLabel = new Literal(); } private void LayoutControls(SuccessContainer successContainer) { Table table = new Table(); table.CellPadding = 0; TableRow r = new LoginUtil.DisappearingTableRow(); TableCell c = new TableCell(); c.Controls.Add(successContainer.SuccessTextLabel); r.Cells.Add(c); table.Rows.Add(r); // Extra table for border padding Table table2 = LoginUtil.CreateChildTable(_owner.ConvertingToTemplate); r = new TableRow(); c = new TableCell(); c.Controls.Add(table); r.Cells.Add(c); table2.Rows.Add(r); successContainer.LayoutTable = table; successContainer.BorderTable = table2; successContainer.Controls.Add(table2); } void ITemplate.InstantiateIn(Control container) { SuccessContainer successContainer = (SuccessContainer)container; CreateControls(successContainer); LayoutControls(successContainer); } } ////// The default user name template for the control, used if UserNameTemplate is null. /// private sealed class DefaultUserNameTemplate : ITemplate { private PasswordRecovery _owner; public DefaultUserNameTemplate(PasswordRecovery owner) { _owner = owner; } private void CreateControls(UserNameContainer userNameContainer) { string validationGroup = _owner.UniqueID; userNameContainer.Title = new Literal(); userNameContainer.Instruction = new Literal(); TextBox userNameTextBox = new TextBox(); // Must explicitly set the ID of controls that raise postback events userNameTextBox.ID = _userNameID; userNameContainer.UserNameTextBox = userNameTextBox; userNameContainer.UserNameLabel = new LabelLiteral(userNameTextBox); bool enableValidation = (_owner.CurrentView == View.UserName); RequiredFieldValidator userNameRequired = new RequiredFieldValidator(); userNameRequired.ID = _userNameRequiredID; userNameRequired.ValidationGroup = validationGroup; userNameRequired.ControlToValidate = userNameTextBox.ID; userNameRequired.Display = _requiredFieldValidatorDisplay; userNameRequired.Text = SR.GetString(SR.LoginControls_DefaultRequiredFieldValidatorText); userNameRequired.Enabled = enableValidation; userNameRequired.Visible = enableValidation; userNameContainer.UserNameRequired = userNameRequired; LinkButton linkButton = new LinkButton(); linkButton.ID = _linkButtonID; linkButton.ValidationGroup = validationGroup; linkButton.CommandName = SubmitButtonCommandName; userNameContainer.LinkButton = linkButton; ImageButton imageButton = new ImageButton(); imageButton.ID = _imageButtonID; imageButton.ValidationGroup = validationGroup; imageButton.CommandName = SubmitButtonCommandName; userNameContainer.ImageButton = imageButton; Button pushButton = new Button(); pushButton.ID = _pushButtonID; pushButton.ValidationGroup = validationGroup; pushButton.CommandName = SubmitButtonCommandName; userNameContainer.PushButton = pushButton; userNameContainer.HelpPageLink = new HyperLink(); userNameContainer.HelpPageLink.ID = _helpLinkID; userNameContainer.HelpPageIcon = new Image(); Literal failureTextLabel = new Literal(); failureTextLabel.ID = _failureTextID; userNameContainer.FailureTextLabel = failureTextLabel; } private void LayoutControls(UserNameContainer userNameContainer) { LoginTextLayout textLayout = _owner.TextLayout; if (textLayout == LoginTextLayout.TextOnLeft) { LayoutTextOnLeft(userNameContainer); } else { LayoutTextOnTop(userNameContainer); } } private void LayoutTextOnLeft(UserNameContainer userNameContainer) { Table table = new Table(); table.CellPadding = 0; TableRow r; TableCell c; r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(userNameContainer.Title); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(userNameContainer.Instruction); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(userNameContainer.UserNameLabel); if (_owner.ConvertingToTemplate) { userNameContainer.UserNameLabel.RenderAsLabel = true; } r.Cells.Add(c); c = new TableCell(); c.Controls.Add(userNameContainer.UserNameTextBox); c.Controls.Add(userNameContainer.UserNameRequired); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(userNameContainer.FailureTextLabel); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(userNameContainer.LinkButton); c.Controls.Add(userNameContainer.ImageButton); c.Controls.Add(userNameContainer.PushButton); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.ColumnSpan = 2; c.Controls.Add(userNameContainer.HelpPageIcon); c.Controls.Add(userNameContainer.HelpPageLink); r.Cells.Add(c); table.Rows.Add(r); Table table2 = LoginUtil.CreateChildTable(_owner.ConvertingToTemplate); r = new TableRow(); c = new TableCell(); c.Controls.Add(table); r.Cells.Add(c); table2.Rows.Add(r); userNameContainer.LayoutTable = table; userNameContainer.BorderTable = table2; userNameContainer.Controls.Add(table2); } private void LayoutTextOnTop(UserNameContainer userNameContainer) { Table table = new Table(); table.CellPadding = 0; TableRow r; TableCell c; r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(userNameContainer.Title); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(userNameContainer.Instruction); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(userNameContainer.UserNameLabel); if (_owner.ConvertingToTemplate) { userNameContainer.UserNameLabel.RenderAsLabel = true; } r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(userNameContainer.UserNameTextBox); c.Controls.Add(userNameContainer.UserNameRequired); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Center; c.Controls.Add(userNameContainer.FailureTextLabel); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.HorizontalAlign = HorizontalAlign.Right; c.Controls.Add(userNameContainer.LinkButton); c.Controls.Add(userNameContainer.ImageButton); c.Controls.Add(userNameContainer.PushButton); r.Cells.Add(c); table.Rows.Add(r); r = new LoginUtil.DisappearingTableRow(); c = new TableCell(); c.Controls.Add(userNameContainer.HelpPageIcon); c.Controls.Add(userNameContainer.HelpPageLink); r.Cells.Add(c); table.Rows.Add(r); Table table2 = LoginUtil.CreateChildTable(_owner.ConvertingToTemplate); r = new TableRow(); c = new TableCell(); c.Controls.Add(table); r.Cells.Add(c); table2.Rows.Add(r); userNameContainer.LayoutTable = table; userNameContainer.BorderTable = table2; userNameContainer.Controls.Add(table2); } void ITemplate.InstantiateIn(Control container) { UserNameContainer userNameContainer = (UserNameContainer)container; CreateControls(userNameContainer); LayoutControls(userNameContainer); } } ////// Container for the question template. Contains properties that reference each child control. /// For the default template, the properties are set when the child controls are created. /// For the user template, the controls are looked up dynamically by ID. Some controls are required, /// and an exception is thrown if they are missing. Other controls are optional, and an exception is /// thrown if they have the wrong type. /// Internal instead of private because it must be used by PasswordRecoveryAdapter. /// internal sealed class QuestionContainer : LoginUtil.GenericContainer, INonBindingContainer { private LabelLiteral _answerLabel; private RequiredFieldValidator _answerRequired; private Control _answerTextBox; private Control _failureTextLabel; private HyperLink _helpPageLink; private Image _helpPageIcon; private ImageButton _imageButton; private Literal _instruction; private LinkButton _linkButton; private Button _pushButton; private Control _question; private Literal _questionLabel; private Literal _title; private Literal _userNameLabel; private Control _userName; public QuestionContainer(PasswordRecovery owner) : base(owner) { } public LabelLiteral AnswerLabel { get { return _answerLabel; } set { _answerLabel = value; } } public RequiredFieldValidator AnswerRequired { get { return _answerRequired; } set { _answerRequired = value; } } public Control AnswerTextBox { get { if (_answerTextBox != null) { return _answerTextBox; } else { return FindRequiredControl (_answerID, SR.PasswordRecovery_NoAnswerTextBox); } } set { _answerTextBox = value; } } protected override bool ConvertingToTemplate { get { return Owner.ConvertingToTemplate; } } public Control FailureTextLabel { get { if (_failureTextLabel != null) { return _failureTextLabel; } else { return FindOptionalControl (_failureTextID); } } set { _failureTextLabel = value; } } public Image HelpPageIcon { get { return _helpPageIcon; } set { _helpPageIcon = value; } } public HyperLink HelpPageLink { get { return _helpPageLink; } set { _helpPageLink = value; } } public ImageButton ImageButton { get { return _imageButton; } set { _imageButton = value; } } public Literal Instruction { get { return _instruction; } set { _instruction = value; } } public LinkButton LinkButton { get { return _linkButton; } set { _linkButton = value; } } public Button PushButton { get { return _pushButton; } set { _pushButton = value; } } public Control Question { get { if (_question != null) { return _question; } else { return FindOptionalControl (_questionID); } } set { _question = value; } } public Literal QuestionLabel { get { return _questionLabel; } set { _questionLabel = value; } } public Literal Title { get { return _title; } set { _title = value; } } public Control UserName { get { if (_userName != null) { return _userName; } else { return FindOptionalControl (_userNameID); } } set { _userName = value; } } public Literal UserNameLabel { get { return _userNameLabel; } set { _userNameLabel = value; } } } /// /// Container for the success template. /// Internal instead of private because it must be used by PasswordRecoveryAdapter. /// internal sealed class SuccessContainer : LoginUtil.GenericContainer, INonBindingContainer { private Literal _successTextLabel; public SuccessContainer(PasswordRecovery owner) : base(owner) { } protected override bool ConvertingToTemplate { get { return Owner.ConvertingToTemplate; } } public Literal SuccessTextLabel { get { return _successTextLabel; } set { _successTextLabel = value; } } } /// /// Container for the user name template. Contains properties that reference each child control. /// For the default template, the properties are set when the child controls are created. /// For the user template, the controls are looked up dynamically by ID. Some controls are required, /// and an exception is thrown if they are missing. Other controls are optional, and an exception is /// thrown if they have the wrong type. /// Internal instead of private because it must be used by PasswordRecoveryAdapter. /// internal sealed class UserNameContainer : LoginUtil.GenericContainer, INonBindingContainer { private Control _failureTextLabel; private Image _helpPageIcon; private HyperLink _helpPageLink; private ImageButton _imageButton; private Literal _instruction; private LinkButton _linkButton; private Button _pushButton; private Literal _title; private LabelLiteral _userNameLabel; private RequiredFieldValidator _userNameRequired; private Control _userNameTextBox; public UserNameContainer(PasswordRecovery owner) : base(owner) { } protected override bool ConvertingToTemplate { get { return Owner.ConvertingToTemplate; } } public Control FailureTextLabel { get { if (_failureTextLabel != null) { return _failureTextLabel; } else { return FindOptionalControl (_failureTextID); } } set { _failureTextLabel = value; } } public Image HelpPageIcon { get { return _helpPageIcon; } set { _helpPageIcon = value; } } public HyperLink HelpPageLink { get { return _helpPageLink; } set { _helpPageLink = value; } } public ImageButton ImageButton { get { return _imageButton; } set { _imageButton = value; } } public Literal Instruction { get { return _instruction; } set { _instruction = value; } } public LinkButton LinkButton { get { return _linkButton; } set { _linkButton = value; } } public Button PushButton { get { return _pushButton; } set { _pushButton = value; } } public Literal Title { get { return _title; } set { _title = value; } } public LabelLiteral UserNameLabel { get { return _userNameLabel; } set { _userNameLabel = value; } } public RequiredFieldValidator UserNameRequired { get { return _userNameRequired; } set { _userNameRequired = value; } } public Control UserNameTextBox { get { if (_userNameTextBox != null) { return _userNameTextBox; } else { return FindRequiredControl (_userNameID, SR.PasswordRecovery_NoUserNameTextBox); } } set { _userNameTextBox = value; } } } /// /// Internal because used from PasswordRecoveryAdapter /// internal enum View { UserName, Question, Success } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AxImporter.cs
- CounterCreationDataCollection.cs
- WebPartTracker.cs
- FileEnumerator.cs
- SqlCommandSet.cs
- NonVisualControlAttribute.cs
- PrintPageEvent.cs
- UriSection.cs
- SQLDoubleStorage.cs
- PassportAuthenticationModule.cs
- SectionVisual.cs
- SoapExtensionTypeElementCollection.cs
- Fx.cs
- ResourceExpression.cs
- StickyNote.cs
- CommandPlan.cs
- SqlComparer.cs
- BitmapDecoder.cs
- PeerApplication.cs
- WebPartCloseVerb.cs
- RequestCacheValidator.cs
- CounterSampleCalculator.cs
- QueryPageSettingsEventArgs.cs
- ServiceModelStringsVersion1.cs
- PropagatorResult.cs
- CorrelationService.cs
- NamespaceDecl.cs
- DataGridComboBoxColumn.cs
- SettingsAttributeDictionary.cs
- Selector.cs
- DataRow.cs
- CompiledELinqQueryState.cs
- EtwTrace.cs
- dbenumerator.cs
- GlobalAllocSafeHandle.cs
- ListControlConvertEventArgs.cs
- SystemIPGlobalStatistics.cs
- ConfigurationManager.cs
- ClonableStack.cs
- Rules.cs
- TemplateColumn.cs
- DatePickerDateValidationErrorEventArgs.cs
- RTLAwareMessageBox.cs
- HttpCapabilitiesBase.cs
- EntitySqlQueryCacheKey.cs
- _SingleItemRequestCache.cs
- UpdateProgress.cs
- ThicknessAnimation.cs
- FilterElement.cs
- ETagAttribute.cs
- HwndSourceKeyboardInputSite.cs
- XmlWriter.cs
- WebPartCloseVerb.cs
- TimeSpan.cs
- DataServiceQueryOfT.cs
- HtmlControlPersistable.cs
- SecurityKeyType.cs
- CompilerTypeWithParams.cs
- EdmToObjectNamespaceMap.cs
- XmlSchemaInfo.cs
- AssertSection.cs
- IIS7UserPrincipal.cs
- TemplateBindingExpression.cs
- SendingRequestEventArgs.cs
- DataGridViewCellErrorTextNeededEventArgs.cs
- MarkerProperties.cs
- ToolStripItemImageRenderEventArgs.cs
- MaskedTextBoxDesignerActionList.cs
- StoragePropertyMapping.cs
- AsyncOperation.cs
- CacheForPrimitiveTypes.cs
- ParameterBuilder.cs
- LocalValueEnumerator.cs
- DesignerVerbCollection.cs
- ExceptionUtil.cs
- ObjectDataProvider.cs
- RoutedEventHandlerInfo.cs
- StringValueConverter.cs
- MulticastDelegate.cs
- Size.cs
- DefaultValueAttribute.cs
- SpotLight.cs
- PropertyTab.cs
- TableRow.cs
- WebMessageEncodingBindingElement.cs
- CqlErrorHelper.cs
- mda.cs
- TimeoutValidationAttribute.cs
- AnnotationResourceCollection.cs
- MsmqBindingElementBase.cs
- ProviderConnectionPointCollection.cs
- ArrayEditor.cs
- SubpageParaClient.cs
- SqlConnectionString.cs
- TextPatternIdentifiers.cs
- CapabilitiesSection.cs
- WorkItem.cs
- SerializationSectionGroup.cs
- ExceptionHandler.cs
- DesignerActionGlyph.cs