//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web.UI.WebControls.WebParts { using System; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Web.UI; using System.Web.UI.WebControls; public sealed class BehaviorEditorPart : EditorPart { private CheckBox _allowClose; private CheckBox _allowConnect; private CheckBox _allowHide; private CheckBox _allowMinimize; private CheckBox _allowZoneChange; private DropDownList _exportMode; private DropDownList _helpMode; private TextBox _description; private TextBox _titleUrl; private TextBox _titleIconImageUrl; private TextBox _catalogIconImageUrl; private TextBox _helpUrl; private TextBox _importErrorMessage; private TextBox _authorizationFilter; private CheckBox _allowEdit; private string _allowCloseErrorMessage; private string _allowConnectErrorMessage; private string _allowHideErrorMessage; private string _allowMinimizeErrorMessage; private string _allowZoneChangeErrorMessage; private string _exportModeErrorMessage; private string _helpModeErrorMessage; private string _descriptionErrorMessage; private string _titleUrlErrorMessage; private string _titleIconImageUrlErrorMessage; private string _catalogIconImageUrlErrorMessage; private string _helpUrlErrorMessage; private string _importErrorMessageErrorMessage; private string _authorizationFilterErrorMessage; private string _allowEditErrorMessage; private const int TextBoxColumns = 30; [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), Themeable(false)] public override string DefaultButton { get { return base.DefaultButton; } set { base.DefaultButton = value; } } public override bool Display { get { if (WebPartToEdit != null && WebPartToEdit.IsShared && WebPartManager != null && (WebPartManager.Personalization.Scope == PersonalizationScope.User)) { return false; } return base.Display; } } private bool HasError { get { return (_allowCloseErrorMessage != null || _allowConnectErrorMessage != null || _allowHideErrorMessage != null || _allowMinimizeErrorMessage != null || _allowZoneChangeErrorMessage != null || _exportModeErrorMessage != null || _helpModeErrorMessage != null || _descriptionErrorMessage != null || _titleUrlErrorMessage != null || _titleIconImageUrlErrorMessage != null || _catalogIconImageUrlErrorMessage != null || _helpUrlErrorMessage != null || _importErrorMessageErrorMessage != null || _authorizationFilterErrorMessage != null || _allowEditErrorMessage != null); } } [ WebSysDefaultValue(SR.BehaviorEditorPart_PartTitle), ] public override string Title { get { string s = (string)ViewState["Title"]; return (s != null) ? s : SR.GetString(SR.BehaviorEditorPart_PartTitle); } set { ViewState["Title"] = value; } } public override bool ApplyChanges() { WebPart webPart = WebPartToEdit; Debug.Assert(webPart != null); if (webPart != null) { EnsureChildControls(); bool allowLayoutChange = webPart.Zone.AllowLayoutChange; if (allowLayoutChange) { try { webPart.AllowClose = _allowClose.Checked; } catch (Exception e) { _allowCloseErrorMessage = CreateErrorMessage(e.Message); } } try { webPart.AllowConnect = _allowConnect.Checked; } catch (Exception e) { _allowConnectErrorMessage = CreateErrorMessage(e.Message); } if (allowLayoutChange) { try { webPart.AllowHide = _allowHide.Checked; } catch (Exception e) { _allowHideErrorMessage = CreateErrorMessage(e.Message); } } if (allowLayoutChange) { try { webPart.AllowMinimize = _allowMinimize.Checked; } catch (Exception e) { _allowMinimizeErrorMessage = CreateErrorMessage(e.Message); } } if (allowLayoutChange) { try { webPart.AllowZoneChange = _allowZoneChange.Checked; } catch (Exception e) { _allowZoneChangeErrorMessage = CreateErrorMessage(e.Message); } } try { TypeConverter exportModeConverter = TypeDescriptor.GetConverter(typeof(WebPartExportMode)); webPart.ExportMode = (WebPartExportMode)exportModeConverter.ConvertFromString(_exportMode.SelectedValue); } catch (Exception e) { _exportModeErrorMessage = CreateErrorMessage(e.Message); } try { TypeConverter helpModeConverter = TypeDescriptor.GetConverter(typeof(WebPartHelpMode)); webPart.HelpMode = (WebPartHelpMode)helpModeConverter.ConvertFromString(_helpMode.SelectedValue); } catch (Exception e) { _helpModeErrorMessage = CreateErrorMessage(e.Message); } try { webPart.Description = _description.Text; } catch (Exception e) { _descriptionErrorMessage = CreateErrorMessage(e.Message); } string value = _titleUrl.Text; if (CrossSiteScriptingValidation.IsDangerousUrl(value)) { _titleUrlErrorMessage = SR.GetString(SR.EditorPart_ErrorBadUrl); } else { try { webPart.TitleUrl = value; } catch (Exception e) { _titleUrlErrorMessage = CreateErrorMessage(e.Message); } } value = _titleIconImageUrl.Text; if (CrossSiteScriptingValidation.IsDangerousUrl(value)) { _titleIconImageUrlErrorMessage = SR.GetString(SR.EditorPart_ErrorBadUrl); } else { try { webPart.TitleIconImageUrl = value; } catch (Exception e) { _titleIconImageUrlErrorMessage = CreateErrorMessage(e.Message); } } value = _catalogIconImageUrl.Text; if (CrossSiteScriptingValidation.IsDangerousUrl(value)) { _catalogIconImageUrlErrorMessage = SR.GetString(SR.EditorPart_ErrorBadUrl); } else { try { webPart.CatalogIconImageUrl = value; } catch (Exception e) { _catalogIconImageUrlErrorMessage = CreateErrorMessage(e.Message); } } value = _helpUrl.Text; if (CrossSiteScriptingValidation.IsDangerousUrl(value)) { _helpUrlErrorMessage = SR.GetString(SR.EditorPart_ErrorBadUrl); } else { try { webPart.HelpUrl = value; } catch (Exception e) { _helpUrlErrorMessage = CreateErrorMessage(e.Message); } } try { webPart.ImportErrorMessage = _importErrorMessage.Text; } catch (Exception e) { _importErrorMessageErrorMessage = CreateErrorMessage(e.Message); } try { webPart.AuthorizationFilter = _authorizationFilter.Text; } catch (Exception e) { _authorizationFilterErrorMessage = CreateErrorMessage(e.Message); } try { webPart.AllowEdit = _allowEdit.Checked; } catch (Exception e) { _allowEditErrorMessage = CreateErrorMessage(e.Message); } } return !HasError; } protected internal override void CreateChildControls() { ControlCollection controls = Controls; controls.Clear(); _allowClose = new CheckBox(); controls.Add(_allowClose); _allowConnect = new CheckBox(); controls.Add(_allowConnect); _allowHide = new CheckBox(); controls.Add(_allowHide); _allowMinimize = new CheckBox(); controls.Add(_allowMinimize); _allowZoneChange = new CheckBox(); controls.Add(_allowZoneChange); TypeConverter exportModeConverter = TypeDescriptor.GetConverter(typeof(WebPartExportMode)); _exportMode = new DropDownList(); _exportMode.Items.AddRange(new ListItem[] { new ListItem(SR.GetString(SR.BehaviorEditorPart_ExportModeNone), exportModeConverter.ConvertToString(WebPartExportMode.None)), new ListItem(SR.GetString(SR.BehaviorEditorPart_ExportModeAll), exportModeConverter.ConvertToString(WebPartExportMode.All)), new ListItem(SR.GetString(SR.BehaviorEditorPart_ExportModeNonSensitiveData), exportModeConverter.ConvertToString(WebPartExportMode.NonSensitiveData)), }); controls.Add(_exportMode); TypeConverter helpModeConverter = TypeDescriptor.GetConverter(typeof(WebPartHelpMode)); _helpMode = new DropDownList(); _helpMode.Items.AddRange(new ListItem[] { new ListItem(SR.GetString(SR.BehaviorEditorPart_HelpModeModal), helpModeConverter.ConvertToString(WebPartHelpMode.Modal)), new ListItem(SR.GetString(SR.BehaviorEditorPart_HelpModeModeless), helpModeConverter.ConvertToString(WebPartHelpMode.Modeless)), new ListItem(SR.GetString(SR.BehaviorEditorPart_HelpModeNavigate), helpModeConverter.ConvertToString(WebPartHelpMode.Navigate)), }); controls.Add(_helpMode); _description = new TextBox(); _description.Columns = TextBoxColumns; controls.Add(_description); _titleUrl = new TextBox(); _titleUrl.Columns = TextBoxColumns; controls.Add(_titleUrl); _titleIconImageUrl = new TextBox(); _titleIconImageUrl.Columns = TextBoxColumns; controls.Add(_titleIconImageUrl); _catalogIconImageUrl = new TextBox(); _catalogIconImageUrl.Columns = TextBoxColumns; controls.Add(_catalogIconImageUrl); _helpUrl = new TextBox(); _helpUrl.Columns = TextBoxColumns; controls.Add(_helpUrl); _importErrorMessage = new TextBox(); _importErrorMessage.Columns = TextBoxColumns; controls.Add(_importErrorMessage); _authorizationFilter = new TextBox(); _authorizationFilter.Columns = TextBoxColumns; controls.Add(_authorizationFilter); _allowEdit = new CheckBox(); controls.Add(_allowEdit); // We don't need viewstate enabled on our child controls. Disable for perf. foreach (Control c in controls) { c.EnableViewState = false; } } protected internal override void OnPreRender(EventArgs e) { base.OnPreRender(e); // We want to synchronize the EditorPart to the state of the WebPart on every page load, // so we stay current if the WebPart changes in the background. if (Display && Visible && !HasError) { SyncChanges(); } } protected internal override void RenderContents(HtmlTextWriter writer) { if (Page != null) { Page.VerifyRenderingInServerForm(this); } // HACK: Need this for child controls to be created at design-time when control is inside template EnsureChildControls(); string[] propertyDisplayNames = new string[] { SR.GetString(SR.BehaviorEditorPart_Description), SR.GetString(SR.BehaviorEditorPart_TitleLink), SR.GetString(SR.BehaviorEditorPart_TitleIconImageLink), SR.GetString(SR.BehaviorEditorPart_CatalogIconImageLink), SR.GetString(SR.BehaviorEditorPart_HelpLink), SR.GetString(SR.BehaviorEditorPart_HelpMode), SR.GetString(SR.BehaviorEditorPart_ImportErrorMessage), SR.GetString(SR.BehaviorEditorPart_ExportMode), SR.GetString(SR.BehaviorEditorPart_AuthorizationFilter), SR.GetString(SR.BehaviorEditorPart_AllowClose), SR.GetString(SR.BehaviorEditorPart_AllowConnect), SR.GetString(SR.BehaviorEditorPart_AllowEdit), SR.GetString(SR.BehaviorEditorPart_AllowHide), SR.GetString(SR.BehaviorEditorPart_AllowMinimize), SR.GetString(SR.BehaviorEditorPart_AllowZoneChange), }; WebControl[] propertyEditors = new WebControl[] { _description, _titleUrl, _titleIconImageUrl, _catalogIconImageUrl, _helpUrl, _helpMode, _importErrorMessage, _exportMode, _authorizationFilter, _allowClose, _allowConnect, _allowEdit, _allowHide, _allowMinimize, _allowZoneChange, }; string[] errorMessages = new string[] { _descriptionErrorMessage, _titleUrlErrorMessage, _titleIconImageUrlErrorMessage, _catalogIconImageUrlErrorMessage, _helpUrlErrorMessage, _helpModeErrorMessage, _importErrorMessageErrorMessage, _exportModeErrorMessage, _authorizationFilterErrorMessage, _allowCloseErrorMessage, _allowConnectErrorMessage, _allowEditErrorMessage, _allowHideErrorMessage, _allowMinimizeErrorMessage, _allowZoneChangeErrorMessage, }; RenderPropertyEditors(writer, propertyDisplayNames, null /* propertyDescriptions */, propertyEditors, errorMessages); } public override void SyncChanges() { WebPart webPart = WebPartToEdit; Debug.Assert(webPart != null); if (webPart != null) { bool allowLayoutChange = webPart.Zone.AllowLayoutChange; EnsureChildControls(); _allowClose.Checked = webPart.AllowClose; _allowClose.Enabled = allowLayoutChange; _allowConnect.Checked = webPart.AllowConnect; _allowHide.Checked = webPart.AllowHide; _allowHide.Enabled = allowLayoutChange; _allowMinimize.Checked = webPart.AllowMinimize; _allowMinimize.Enabled = allowLayoutChange; _allowZoneChange.Checked = webPart.AllowZoneChange; _allowZoneChange.Enabled = allowLayoutChange; TypeConverter exportModeConverter = TypeDescriptor.GetConverter(typeof(WebPartExportMode)); _exportMode.SelectedValue = exportModeConverter.ConvertToString(webPart.ExportMode); TypeConverter helpModeConverter = TypeDescriptor.GetConverter(typeof(WebPartHelpMode)); _helpMode.SelectedValue = helpModeConverter.ConvertToString(webPart.HelpMode); _description.Text = webPart.Description; _titleUrl.Text = webPart.TitleUrl; _titleIconImageUrl.Text = webPart.TitleIconImageUrl; _catalogIconImageUrl.Text = webPart.CatalogIconImageUrl; _helpUrl.Text = webPart.HelpUrl; _importErrorMessage.Text = webPart.ImportErrorMessage; _authorizationFilter.Text = webPart.AuthorizationFilter; _allowEdit.Checked = webPart.AllowEdit; } } } }