Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / DEVDIV / depot / DevDiv / releases / whidbey / QFE / ndp / fx / src / xsp / System / Web / UI / WebParts / WebPartChrome.cs / 3 / WebPartChrome.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls.WebParts { using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Globalization; using System.Security.Permissions; using System.Web.Handlers; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Util; [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public class WebPartChrome { private const string titleSeparator = " - "; private const string descriptionSeparator = " - "; private WebPartManager _manager; private WebPartConnectionCollection _connections; private WebPartZoneBase _zone; // PERF: Cache these, since they are used on every call to FilterVerbs private Page _page; private bool _designMode; private bool _personalizationEnabled; private PersonalizationScope _personalizationScope; // PERF: Cache these, since they are needed for every WebPart in the zone private Style _chromeStyleWithBorder; private Style _chromeStyleNoBorder; private Style _titleTextStyle; private Style _titleStyleWithoutFontOrAlign; private int _cssStyleIndex; public WebPartChrome(WebPartZoneBase zone, WebPartManager manager) { if (zone == null) { throw new ArgumentNullException("zone"); } _zone = zone; _page = zone.Page; _designMode = zone.DesignMode; _manager = manager; if (_designMode) { // Consider personalization to be enabled at design-time _personalizationEnabled = true; } else { _personalizationEnabled = (manager != null && manager.Personalization.IsModifiable); } if (manager != null) { _personalizationScope = manager.Personalization.Scope; } else { // Consider scope to be shared at design-time _personalizationScope = PersonalizationScope.Shared; } } // PERF: Cache the Connections collection on demand private WebPartConnectionCollection Connections { get { if (_connections == null) { _connections = _manager.Connections; } return _connections; } } protected bool DragDropEnabled { get { return Zone.DragDropEnabled; } } protected WebPartManager WebPartManager { get { return _manager; } } protected WebPartZoneBase Zone { get { return _zone; } } private Style CreateChromeStyleNoBorder(Style partChromeStyle) { Style style = new Style(); style.CopyFrom(Zone.PartChromeStyle); if (style.BorderStyle != BorderStyle.NotSet) { style.BorderStyle = BorderStyle.NotSet; } if (style.BorderWidth != Unit.Empty) { style.BorderWidth = Unit.Empty; } if (style.BorderColor != Color.Empty) { style.BorderColor = Color.Empty; } return style; } private Style CreateChromeStyleWithBorder(Style partChromeStyle) { Style style = new Style(); style.CopyFrom(partChromeStyle); if (style.BorderStyle == BorderStyle.NotSet) { style.BorderStyle = BorderStyle.Solid; } if (style.BorderWidth == Unit.Empty) { style.BorderWidth = Unit.Pixel(1); } if (style.BorderColor == Color.Empty) { style.BorderColor = Color.Black; } return style; } private Style CreateTitleTextStyle(Style partTitleStyle) { Style style = new Style(); if (partTitleStyle.ForeColor != Color.Empty) { style.ForeColor = partTitleStyle.ForeColor; } style.Font.CopyFrom(partTitleStyle.Font); return style; } private Style CreateTitleStyleWithoutFontOrAlign(Style partTitleStyle) { // Need to remove font info from TitleStyle. We only want the font // info to apply to the title text, not the whole title bar table. // (NDPWhidbey 27755) // Use plain style so we don't copy alignment or wrap from TableItemStyle Style style = new Style(); style.CopyFrom(partTitleStyle); style.Font.Reset(); if (style.ForeColor != Color.Empty) { style.ForeColor = Color.Empty; } return style; } protected virtual Style CreateWebPartChromeStyle(WebPart webPart, PartChromeType chromeType) { if (webPart == null) { throw new ArgumentNullException("webPart"); } if ((chromeType < PartChromeType.Default) || (chromeType > PartChromeType.BorderOnly)) { throw new ArgumentOutOfRangeException("chromeType"); } // PERF: Cache these, since they are needed for every WebPart in the zone, and only vary // if one of the WebParts is selected Style webPartChromeStyle; if (chromeType == PartChromeType.BorderOnly || chromeType == PartChromeType.TitleAndBorder) { if (_chromeStyleWithBorder == null) { _chromeStyleWithBorder = CreateChromeStyleWithBorder(Zone.PartChromeStyle); } webPartChromeStyle = _chromeStyleWithBorder; } else { if (_chromeStyleNoBorder == null) { _chromeStyleNoBorder = CreateChromeStyleNoBorder(Zone.PartChromeStyle); } webPartChromeStyle = _chromeStyleNoBorder; } // add SelectedPartChromeStyle if (WebPartManager != null && webPart == WebPartManager.SelectedWebPart) { Style style = new Style(); style.CopyFrom(webPartChromeStyle); style.CopyFrom(Zone.SelectedPartChromeStyle); return style; } else { return webPartChromeStyle; } } private string GenerateDescriptionText(WebPart webPart) { string descriptionText = webPart.DisplayTitle; string description = webPart.Description; if (!String.IsNullOrEmpty(description)) { descriptionText += descriptionSeparator + description; } return descriptionText; } private string GenerateTitleText(WebPart webPart) { string titleText = webPart.DisplayTitle; string subtitle = webPart.Subtitle; if (!String.IsNullOrEmpty(subtitle)) { titleText += titleSeparator + subtitle; } return titleText; } protected string GetWebPartChromeClientID(WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } return webPart.WholePartID; } protected string GetWebPartTitleClientID(WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } return webPart.TitleBarID; } protected virtual WebPartVerbCollection GetWebPartVerbs(WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } return Zone.VerbsForWebPart(webPart); } protected virtual WebPartVerbCollection FilterWebPartVerbs(WebPartVerbCollection verbs, WebPart webPart) { if (verbs == null) { throw new ArgumentNullException("verbs"); } if (webPart == null) { throw new ArgumentNullException("webPart"); } WebPartVerbCollection filteredVerbs = new WebPartVerbCollection(); foreach (WebPartVerb verb in verbs) { if (ShouldRenderVerb(verb, webPart)) { filteredVerbs.Add(verb); } } return filteredVerbs; } private void RegisterStyle(Style style) { Debug.Assert(_page.SupportsStyleSheets); // The style should not have already been registered Debug.Assert(style.RegisteredCssClass.Length == 0); if (!style.IsEmpty) { string name = Zone.ClientID + "_" + _cssStyleIndex++.ToString(NumberFormatInfo.InvariantInfo); _page.Header.StyleSheet.CreateStyleRule(style, Zone, "." + name); style.SetRegisteredCssClass(name); } } public virtual void PerformPreRender() { if (_page != null && _page.SupportsStyleSheets) { Style partChromeStyle = Zone.PartChromeStyle; Style partTitleStyle = Zone.PartTitleStyle; _chromeStyleWithBorder = CreateChromeStyleWithBorder(partChromeStyle); RegisterStyle(_chromeStyleWithBorder); _chromeStyleNoBorder = CreateChromeStyleNoBorder(partChromeStyle); RegisterStyle(_chromeStyleNoBorder); _titleTextStyle = CreateTitleTextStyle(partTitleStyle); RegisterStyle(_titleTextStyle); _titleStyleWithoutFontOrAlign = CreateTitleStyleWithoutFontOrAlign(partTitleStyle); RegisterStyle(_titleStyleWithoutFontOrAlign); if (Zone.RenderClientScript && (Zone.WebPartVerbRenderMode == WebPartVerbRenderMode.Menu) && Zone.Menu != null) { Zone.Menu.RegisterStyles(); } } } protected virtual void RenderPartContents(HtmlTextWriter writer, WebPart webPart) { if (!String.IsNullOrEmpty(webPart.ConnectErrorMessage)) { if (!Zone.ErrorStyle.IsEmpty) { Zone.ErrorStyle.AddAttributesToRender(writer, Zone); } writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.WriteEncodedText(webPart.ConnectErrorMessage); writer.RenderEndTag(); // Div } else { webPart.RenderControl(writer); } } // Made non-virtual, since it may be confusing to override this method when it's style // is rendered by RenderWebPart. private void RenderTitleBar(HtmlTextWriter writer, WebPart webPart) { // Can't apply title style here, since the border would be inside the cell padding // of the parent td. // titleStyle.AddAttributesToRender(writer, this); writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0"); writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0"); writer.AddAttribute(HtmlTextWriterAttribute.Border, "0"); // Want table to span full width of part for drag and drop writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); int colspan = 1; bool showTitleIcons = Zone.ShowTitleIcons; string titleIconImageUrl = null; if (showTitleIcons) { titleIconImageUrl = webPart.TitleIconImageUrl; if (!String.IsNullOrEmpty(titleIconImageUrl)) { colspan++; writer.RenderBeginTag(HtmlTextWriterTag.Td); RenderTitleIcon(writer, webPart); writer.RenderEndTag(); // Td } } // title text writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); TableItemStyle titleStyle = Zone.PartTitleStyle; // Render align and wrap from the TableItemStyle (copied from TableItemStyle.cs) if (titleStyle.Wrap == false) { writer.AddStyleAttribute(HtmlTextWriterStyle.WhiteSpace, "nowrap"); } HorizontalAlign hAlign = titleStyle.HorizontalAlign; if (hAlign != HorizontalAlign.NotSet) { TypeConverter hac = TypeDescriptor.GetConverter(typeof(HorizontalAlign)); writer.AddAttribute(HtmlTextWriterAttribute.Align, hac.ConvertToString(hAlign).ToLower(CultureInfo.InvariantCulture)); } VerticalAlign vAlign = titleStyle.VerticalAlign; if (vAlign != VerticalAlign.NotSet) { TypeConverter vac = TypeDescriptor.GetConverter(typeof(VerticalAlign)); writer.AddAttribute(HtmlTextWriterAttribute.Valign, vac.ConvertToString(vAlign).ToLower(CultureInfo.InvariantCulture)); } if (Zone.RenderClientScript) { writer.AddAttribute(HtmlTextWriterAttribute.Id, GetWebPartTitleClientID(webPart)); } writer.RenderBeginTag(HtmlTextWriterTag.Td); if (showTitleIcons) { if (!String.IsNullOrEmpty(titleIconImageUrl)) { // Render so there is a space between the icon and the title text // Can't be rendered in RenderTitleIcon(), since we want the space to be a valid drag target writer.Write(" "); } } RenderTitleText(writer, webPart); writer.RenderEndTag(); // Td RenderVerbsInTitleBar(writer, webPart, colspan); writer.RenderEndTag(); // Tr writer.RenderEndTag(); // Table } private void RenderTitleIcon(HtmlTextWriter writer, WebPart webPart) { // writer.AddAttribute(HtmlTextWriterAttribute.Src, Zone.ResolveClientUrl(webPart.TitleIconImageUrl) ); // Use "DisplayTitle - Description" as the alt tag ( writer.AddAttribute(HtmlTextWriterAttribute.Alt, GenerateDescriptionText(webPart)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); // Img } // PERF: Implement RenderTitleText() without using server controls private void RenderTitleText(HtmlTextWriter writer, WebPart webPart) { // PERF: Cache this, since it is needed for every WebPart in the zone if (_titleTextStyle == null) { _titleTextStyle = CreateTitleTextStyle(Zone.PartTitleStyle); } if (!_titleTextStyle.IsEmpty) { _titleTextStyle.AddAttributesToRender(writer, Zone); } // Render "DisplayTitle - Description" as tooltip ( writer.AddAttribute(HtmlTextWriterAttribute.Title, GenerateDescriptionText(webPart), true); // string url = webPart.TitleUrl; string text = GenerateTitleText(webPart); if (!String.IsNullOrEmpty(url) && !DragDropEnabled) { writer.AddAttribute(HtmlTextWriterAttribute.Href, Zone.ResolveClientUrl(url)); writer.RenderBeginTag(HtmlTextWriterTag.A); } else { writer.RenderBeginTag(HtmlTextWriterTag.Span); } writer.WriteEncodedText(text); writer.RenderEndTag(); // A || Span // PERF: Always render even if no verbs will be rendered writer.Write(" "); } private void RenderVerb(HtmlTextWriter writer, WebPart webPart, WebPartVerb verb) { WebControl verbControl; bool isEnabled = Zone.IsEnabled && verb.Enabled; ButtonType verbButtonType = Zone.TitleBarVerbButtonType; if (verb == Zone.HelpVerb) { // string resolvedHelpUrl = Zone.ResolveClientUrl(webPart.HelpUrl); // if (verbButtonType == ButtonType.Button) { ZoneButton button = new ZoneButton(Zone, null); if (isEnabled) { if (Zone.RenderClientScript) { button.OnClientClick = "__wpm.ShowHelp('" + Util.QuoteJScriptString(resolvedHelpUrl) + "', " + ((int)webPart.HelpMode).ToString(CultureInfo.InvariantCulture) + ");return;"; } else { if (webPart.HelpMode != WebPartHelpMode.Navigate) { button.OnClientClick = "window.open('" + Util.QuoteJScriptString(resolvedHelpUrl) + "', '_blank', 'scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no');return;"; } else { button.OnClientClick = "window.location.href='" + Util.QuoteJScriptString(resolvedHelpUrl) + "';return;"; } } } button.Text = verb.Text; verbControl = button; } else { HyperLink hyperLink = new HyperLink(); switch (webPart.HelpMode) { case WebPartHelpMode.Modal: if (!Zone.RenderClientScript) { goto case WebPartHelpMode.Modeless; } hyperLink.NavigateUrl = "javascript:__wpm.ShowHelp('" + Util.QuoteJScriptString(resolvedHelpUrl) + "', 0)"; break; case WebPartHelpMode.Modeless: hyperLink.NavigateUrl = resolvedHelpUrl; hyperLink.Target = "_blank"; break; case WebPartHelpMode.Navigate: hyperLink.NavigateUrl = resolvedHelpUrl; break; } hyperLink.Text = verb.Text; if (verbButtonType == ButtonType.Image) { hyperLink.ImageUrl = verb.ImageUrl; } verbControl = hyperLink; } } else if (verb == Zone.ExportVerb) { string exportUrl = _manager.GetExportUrl(webPart); if (verbButtonType == ButtonType.Button) { ZoneButton button = new ZoneButton(Zone, String.Empty); button.Text = verb.Text; if (isEnabled) { if ((webPart.ExportMode == WebPartExportMode.All) && (_personalizationScope == PersonalizationScope.User)) { if (Zone.RenderClientScript) { button.OnClientClick = "__wpm.ExportWebPart('" + Util.QuoteJScriptString(exportUrl) + "', true, false);return false;"; } else { button.OnClientClick = "if(__wpmExportWarning.length == 0 || " + "confirm(__wpmExportWarning)){window.location='" + Util.QuoteJScriptString(exportUrl) + "';}return false;"; } } else { button.OnClientClick = "window.location='" + Util.QuoteJScriptString(exportUrl) + "';return false;"; } } verbControl = button; } else { // Special case for export which must be a plain HyperLink // (href=javascript:void(0) would ruin any redirecting script) HyperLink link = new HyperLink(); link.Text = verb.Text; if (verbButtonType == ButtonType.Image) { link.ImageUrl = verb.ImageUrl; } link.NavigateUrl = exportUrl; if (webPart.ExportMode == WebPartExportMode.All) { // Confirm before exporting if (Zone.RenderClientScript) { link.Attributes.Add("onclick", "return __wpm.ExportWebPart('', true, true)"); } else { string onclick = "return (__wpmExportWarning.length == 0 || confirm(__wpmExportWarning))"; link.Attributes.Add("onclick", onclick); } } verbControl = link; } } else { string eventArgument = verb.GetEventArgument(webPart.ID); string clientClickHandler = verb.ClientClickHandler; if (verbButtonType == ButtonType.Button) { ZoneButton button = new ZoneButton(Zone, eventArgument); button.Text = verb.Text; if (!String.IsNullOrEmpty(clientClickHandler) && isEnabled) { button.OnClientClick = clientClickHandler; } verbControl = button; } else { ZoneLinkButton linkButton = new ZoneLinkButton(Zone, eventArgument); linkButton.Text = verb.Text; if (verbButtonType == ButtonType.Image) { linkButton.ImageUrl = verb.ImageUrl; } if (!String.IsNullOrEmpty(clientClickHandler) && isEnabled) { linkButton.OnClientClick = clientClickHandler; } verbControl = linkButton; } if (_manager != null && isEnabled) { if (verb == Zone.CloseVerb) { // PERF: First ProviderConnectionPointCollection connectionPoints = _manager.GetProviderConnectionPoints(webPart); if (connectionPoints != null && connectionPoints.Count > 0 && Connections.ContainsProvider(webPart)) { string onclick = "if (__wpmCloseProviderWarning.length >= 0 && " + "!confirm(__wpmCloseProviderWarning)) { return false; }"; verbControl.Attributes.Add("onclick", onclick); } } else if (verb == Zone.DeleteVerb) { string onclick = "if (__wpmDeleteWarning.length >= 0 && !confirm(__wpmDeleteWarning)) { return false; }"; verbControl.Attributes.Add("onclick", onclick); } } } verbControl.ApplyStyle(Zone.TitleBarVerbStyle); verbControl.ToolTip = String.Format(CultureInfo.CurrentCulture, verb.Description, webPart.DisplayTitle); verbControl.Enabled = verb.Enabled; verbControl.Page = _page; verbControl.RenderControl(writer); } private void RenderVerbs(HtmlTextWriter writer, WebPart webPart, WebPartVerbCollection verbs) { if (verbs == null) { throw new ArgumentNullException("verbs"); } WebPartVerb priorVerb = null; foreach (WebPartVerb verb in verbs) { // If you are rendering as a linkbutton, OR the prior verb rendered as a linkbutton, // render an " " prior to yourself. This ensures that all linkbuttons are preceeded // and followed by a space. if (priorVerb != null && (VerbRenderedAsLinkButton(verb) || VerbRenderedAsLinkButton(priorVerb))) { writer.Write(" "); } RenderVerb(writer, webPart, verb); priorVerb = verb; } } private void RenderVerbsInTitleBar(HtmlTextWriter writer, WebPart webPart, int colspan) { WebPartVerbCollection verbs = GetWebPartVerbs(webPart); verbs = FilterWebPartVerbs(verbs, webPart); if (verbs != null && verbs.Count > 0) { writer.AddStyleAttribute(HtmlTextWriterStyle.WhiteSpace, "nowrap"); colspan++; writer.RenderBeginTag(HtmlTextWriterTag.Td); if (Zone.RenderClientScript && (Zone.WebPartVerbRenderMode == WebPartVerbRenderMode.Menu) && Zone.Menu != null) { if (_designMode) { Zone.Menu.Render(writer, webPart.WholePartID + "Verbs"); } else { // If Zone.RenderClientScript, then WebPartManager must not be null Debug.Assert(WebPartManager != null); Zone.Menu.Render(writer, verbs, webPart.WholePartID + "Verbs", webPart, WebPartManager); } } else { RenderVerbs(writer, webPart, verbs); } writer.RenderEndTag(); // Td } } public virtual void RenderWebPart(HtmlTextWriter writer, WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } bool vertical = (Zone.LayoutOrientation == Orientation.Vertical); PartChromeType chromeType = Zone.GetEffectiveChromeType(webPart); Style partChromeStyle = CreateWebPartChromeStyle(webPart, chromeType); // if (!partChromeStyle.IsEmpty) { partChromeStyle.AddAttributesToRender(writer, Zone); } // Render CellPadding=2 so there is a 2 pixel gap between the border and the title/body // of the WebPart. Can't render CellSpacing=2, since we want the backcolor of the title // bar to fill the title bar, and backcolor is not rendered in the CellSpacing. writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0"); writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Border, "0"); if (vertical) { writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); } else if (webPart.ChromeState != PartChromeState.Minimized) { writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%"); } if (Zone.RenderClientScript) { writer.AddAttribute(HtmlTextWriterAttribute.Id, GetWebPartChromeClientID(webPart)); } if (!_designMode && webPart.Hidden && WebPartManager != null && !WebPartManager.DisplayMode.ShowHiddenWebParts) { writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none"); } writer.RenderBeginTag(HtmlTextWriterTag.Table); if (chromeType == PartChromeType.TitleOnly || chromeType == PartChromeType.TitleAndBorder) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); // PERF: Cache this, since it is needed for every WebPart in the zone if (_titleStyleWithoutFontOrAlign == null) { _titleStyleWithoutFontOrAlign = CreateTitleStyleWithoutFontOrAlign(Zone.PartTitleStyle); } // Need to apply title style here (at least backcolor and border) so the backcolor // and border include the cell padding on the td. // Should not apply font style here, since we don't want verbs to use this // font style. In IE compat mode, the font style would not be inherited anyway, // But in IE strict mode the font style would be inherited. if (!_titleStyleWithoutFontOrAlign.IsEmpty) { _titleStyleWithoutFontOrAlign.AddAttributesToRender(writer, Zone); } writer.RenderBeginTag(HtmlTextWriterTag.Td); RenderTitleBar(writer, webPart); writer.RenderEndTag(); // Td writer.RenderEndTag(); // Tr } // Render the contents of minimized WebParts with display:none, instead of not rendering // the contents at all. The contents may need to be rendered for client-side connections // or other client-side features. Also allows child controls to maintain their postback // values between requests while the WebPart is minimized. if (webPart.ChromeState == PartChromeState.Minimized) { writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none"); } writer.RenderBeginTag(HtmlTextWriterTag.Tr); if (!vertical) { writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%"); writer.AddAttribute(HtmlTextWriterAttribute.Valign, "top"); } Style partStyle = Zone.PartStyle; if (!partStyle.IsEmpty) { partStyle.AddAttributesToRender(writer, Zone); } // Add some extra padding around the WebPart contents ( writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, Zone.PartChromePadding.ToString()); writer.RenderBeginTag(HtmlTextWriterTag.Td); RenderPartContents(writer, webPart); writer.RenderEndTag(); // Td writer.RenderEndTag(); // Tr writer.RenderEndTag(); // Table } private bool ShouldRenderVerb(WebPartVerb verb, WebPart webPart) { // PERF: Consider caching the Zone.*Verb properties // Can have null verbs in the CreateVerbs or WebPart.Verbs collections if (verb == null) { return false; } if (!verb.Visible) { return false; } if (verb == Zone.CloseVerb) { if (!_personalizationEnabled || !webPart.AllowClose || !Zone.AllowLayoutChange) { return false; } } if (verb == Zone.ConnectVerb) { if (WebPartManager != null) { if ((WebPartManager.DisplayMode != WebPartManager.ConnectDisplayMode) || (webPart == WebPartManager.SelectedWebPart) || !webPart.AllowConnect) { return false; } // Don't render Connect verb if web part has no connection points ConsumerConnectionPointCollection consumerConnectionPoints = WebPartManager.GetEnabledConsumerConnectionPoints(webPart); ProviderConnectionPointCollection providerConnectionPoints = WebPartManager.GetEnabledProviderConnectionPoints(webPart); if ((consumerConnectionPoints == null || consumerConnectionPoints.Count == 0) && (providerConnectionPoints == null || providerConnectionPoints.Count == 0)) { return false; } } } if (verb == Zone.DeleteVerb) { if (!_personalizationEnabled || !Zone.AllowLayoutChange || webPart.IsStatic || (webPart.IsShared && _personalizationScope == PersonalizationScope.User) || (WebPartManager != null && !WebPartManager.DisplayMode.AllowPageDesign)) { return false; } } if (verb == Zone.EditVerb) { if (WebPartManager != null && ((WebPartManager.DisplayMode != WebPartManager.EditDisplayMode) || (webPart == WebPartManager.SelectedWebPart))) { return false; } } if (verb == Zone.HelpVerb) { if (String.IsNullOrEmpty(webPart.HelpUrl)) { return false; } } if (verb == Zone.MinimizeVerb) { if (!_personalizationEnabled || webPart.ChromeState == PartChromeState.Minimized || !webPart.AllowMinimize || !Zone.AllowLayoutChange) { return false; } } if (verb == Zone.RestoreVerb) { if (!_personalizationEnabled || webPart.ChromeState == PartChromeState.Normal || !Zone.AllowLayoutChange) { return false; } } if (verb == Zone.ExportVerb) { if (!_personalizationEnabled || webPart.ExportMode == WebPartExportMode.None) { return false; } } return true; } private bool VerbRenderedAsLinkButton(WebPartVerb verb) { if (Zone.TitleBarVerbButtonType == ButtonType.Link) { return true; } if (String.IsNullOrEmpty(verb.ImageUrl)) { return true; } return false; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls.WebParts { using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Globalization; using System.Security.Permissions; using System.Web.Handlers; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Util; [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public class WebPartChrome { private const string titleSeparator = " - "; private const string descriptionSeparator = " - "; private WebPartManager _manager; private WebPartConnectionCollection _connections; private WebPartZoneBase _zone; // PERF: Cache these, since they are used on every call to FilterVerbs private Page _page; private bool _designMode; private bool _personalizationEnabled; private PersonalizationScope _personalizationScope; // PERF: Cache these, since they are needed for every WebPart in the zone private Style _chromeStyleWithBorder; private Style _chromeStyleNoBorder; private Style _titleTextStyle; private Style _titleStyleWithoutFontOrAlign; private int _cssStyleIndex; public WebPartChrome(WebPartZoneBase zone, WebPartManager manager) { if (zone == null) { throw new ArgumentNullException("zone"); } _zone = zone; _page = zone.Page; _designMode = zone.DesignMode; _manager = manager; if (_designMode) { // Consider personalization to be enabled at design-time _personalizationEnabled = true; } else { _personalizationEnabled = (manager != null && manager.Personalization.IsModifiable); } if (manager != null) { _personalizationScope = manager.Personalization.Scope; } else { // Consider scope to be shared at design-time _personalizationScope = PersonalizationScope.Shared; } } // PERF: Cache the Connections collection on demand private WebPartConnectionCollection Connections { get { if (_connections == null) { _connections = _manager.Connections; } return _connections; } } protected bool DragDropEnabled { get { return Zone.DragDropEnabled; } } protected WebPartManager WebPartManager { get { return _manager; } } protected WebPartZoneBase Zone { get { return _zone; } } private Style CreateChromeStyleNoBorder(Style partChromeStyle) { Style style = new Style(); style.CopyFrom(Zone.PartChromeStyle); if (style.BorderStyle != BorderStyle.NotSet) { style.BorderStyle = BorderStyle.NotSet; } if (style.BorderWidth != Unit.Empty) { style.BorderWidth = Unit.Empty; } if (style.BorderColor != Color.Empty) { style.BorderColor = Color.Empty; } return style; } private Style CreateChromeStyleWithBorder(Style partChromeStyle) { Style style = new Style(); style.CopyFrom(partChromeStyle); if (style.BorderStyle == BorderStyle.NotSet) { style.BorderStyle = BorderStyle.Solid; } if (style.BorderWidth == Unit.Empty) { style.BorderWidth = Unit.Pixel(1); } if (style.BorderColor == Color.Empty) { style.BorderColor = Color.Black; } return style; } private Style CreateTitleTextStyle(Style partTitleStyle) { Style style = new Style(); if (partTitleStyle.ForeColor != Color.Empty) { style.ForeColor = partTitleStyle.ForeColor; } style.Font.CopyFrom(partTitleStyle.Font); return style; } private Style CreateTitleStyleWithoutFontOrAlign(Style partTitleStyle) { // Need to remove font info from TitleStyle. We only want the font // info to apply to the title text, not the whole title bar table. // (NDPWhidbey 27755) // Use plain style so we don't copy alignment or wrap from TableItemStyle Style style = new Style(); style.CopyFrom(partTitleStyle); style.Font.Reset(); if (style.ForeColor != Color.Empty) { style.ForeColor = Color.Empty; } return style; } protected virtual Style CreateWebPartChromeStyle(WebPart webPart, PartChromeType chromeType) { if (webPart == null) { throw new ArgumentNullException("webPart"); } if ((chromeType < PartChromeType.Default) || (chromeType > PartChromeType.BorderOnly)) { throw new ArgumentOutOfRangeException("chromeType"); } // PERF: Cache these, since they are needed for every WebPart in the zone, and only vary // if one of the WebParts is selected Style webPartChromeStyle; if (chromeType == PartChromeType.BorderOnly || chromeType == PartChromeType.TitleAndBorder) { if (_chromeStyleWithBorder == null) { _chromeStyleWithBorder = CreateChromeStyleWithBorder(Zone.PartChromeStyle); } webPartChromeStyle = _chromeStyleWithBorder; } else { if (_chromeStyleNoBorder == null) { _chromeStyleNoBorder = CreateChromeStyleNoBorder(Zone.PartChromeStyle); } webPartChromeStyle = _chromeStyleNoBorder; } // add SelectedPartChromeStyle if (WebPartManager != null && webPart == WebPartManager.SelectedWebPart) { Style style = new Style(); style.CopyFrom(webPartChromeStyle); style.CopyFrom(Zone.SelectedPartChromeStyle); return style; } else { return webPartChromeStyle; } } private string GenerateDescriptionText(WebPart webPart) { string descriptionText = webPart.DisplayTitle; string description = webPart.Description; if (!String.IsNullOrEmpty(description)) { descriptionText += descriptionSeparator + description; } return descriptionText; } private string GenerateTitleText(WebPart webPart) { string titleText = webPart.DisplayTitle; string subtitle = webPart.Subtitle; if (!String.IsNullOrEmpty(subtitle)) { titleText += titleSeparator + subtitle; } return titleText; } protected string GetWebPartChromeClientID(WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } return webPart.WholePartID; } protected string GetWebPartTitleClientID(WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } return webPart.TitleBarID; } protected virtual WebPartVerbCollection GetWebPartVerbs(WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } return Zone.VerbsForWebPart(webPart); } protected virtual WebPartVerbCollection FilterWebPartVerbs(WebPartVerbCollection verbs, WebPart webPart) { if (verbs == null) { throw new ArgumentNullException("verbs"); } if (webPart == null) { throw new ArgumentNullException("webPart"); } WebPartVerbCollection filteredVerbs = new WebPartVerbCollection(); foreach (WebPartVerb verb in verbs) { if (ShouldRenderVerb(verb, webPart)) { filteredVerbs.Add(verb); } } return filteredVerbs; } private void RegisterStyle(Style style) { Debug.Assert(_page.SupportsStyleSheets); // The style should not have already been registered Debug.Assert(style.RegisteredCssClass.Length == 0); if (!style.IsEmpty) { string name = Zone.ClientID + "_" + _cssStyleIndex++.ToString(NumberFormatInfo.InvariantInfo); _page.Header.StyleSheet.CreateStyleRule(style, Zone, "." + name); style.SetRegisteredCssClass(name); } } public virtual void PerformPreRender() { if (_page != null && _page.SupportsStyleSheets) { Style partChromeStyle = Zone.PartChromeStyle; Style partTitleStyle = Zone.PartTitleStyle; _chromeStyleWithBorder = CreateChromeStyleWithBorder(partChromeStyle); RegisterStyle(_chromeStyleWithBorder); _chromeStyleNoBorder = CreateChromeStyleNoBorder(partChromeStyle); RegisterStyle(_chromeStyleNoBorder); _titleTextStyle = CreateTitleTextStyle(partTitleStyle); RegisterStyle(_titleTextStyle); _titleStyleWithoutFontOrAlign = CreateTitleStyleWithoutFontOrAlign(partTitleStyle); RegisterStyle(_titleStyleWithoutFontOrAlign); if (Zone.RenderClientScript && (Zone.WebPartVerbRenderMode == WebPartVerbRenderMode.Menu) && Zone.Menu != null) { Zone.Menu.RegisterStyles(); } } } protected virtual void RenderPartContents(HtmlTextWriter writer, WebPart webPart) { if (!String.IsNullOrEmpty(webPart.ConnectErrorMessage)) { if (!Zone.ErrorStyle.IsEmpty) { Zone.ErrorStyle.AddAttributesToRender(writer, Zone); } writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.WriteEncodedText(webPart.ConnectErrorMessage); writer.RenderEndTag(); // Div } else { webPart.RenderControl(writer); } } // Made non-virtual, since it may be confusing to override this method when it's style // is rendered by RenderWebPart. private void RenderTitleBar(HtmlTextWriter writer, WebPart webPart) { // Can't apply title style here, since the border would be inside the cell padding // of the parent td. // titleStyle.AddAttributesToRender(writer, this); writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0"); writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0"); writer.AddAttribute(HtmlTextWriterAttribute.Border, "0"); // Want table to span full width of part for drag and drop writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); int colspan = 1; bool showTitleIcons = Zone.ShowTitleIcons; string titleIconImageUrl = null; if (showTitleIcons) { titleIconImageUrl = webPart.TitleIconImageUrl; if (!String.IsNullOrEmpty(titleIconImageUrl)) { colspan++; writer.RenderBeginTag(HtmlTextWriterTag.Td); RenderTitleIcon(writer, webPart); writer.RenderEndTag(); // Td } } // title text writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); TableItemStyle titleStyle = Zone.PartTitleStyle; // Render align and wrap from the TableItemStyle (copied from TableItemStyle.cs) if (titleStyle.Wrap == false) { writer.AddStyleAttribute(HtmlTextWriterStyle.WhiteSpace, "nowrap"); } HorizontalAlign hAlign = titleStyle.HorizontalAlign; if (hAlign != HorizontalAlign.NotSet) { TypeConverter hac = TypeDescriptor.GetConverter(typeof(HorizontalAlign)); writer.AddAttribute(HtmlTextWriterAttribute.Align, hac.ConvertToString(hAlign).ToLower(CultureInfo.InvariantCulture)); } VerticalAlign vAlign = titleStyle.VerticalAlign; if (vAlign != VerticalAlign.NotSet) { TypeConverter vac = TypeDescriptor.GetConverter(typeof(VerticalAlign)); writer.AddAttribute(HtmlTextWriterAttribute.Valign, vac.ConvertToString(vAlign).ToLower(CultureInfo.InvariantCulture)); } if (Zone.RenderClientScript) { writer.AddAttribute(HtmlTextWriterAttribute.Id, GetWebPartTitleClientID(webPart)); } writer.RenderBeginTag(HtmlTextWriterTag.Td); if (showTitleIcons) { if (!String.IsNullOrEmpty(titleIconImageUrl)) { // Render so there is a space between the icon and the title text // Can't be rendered in RenderTitleIcon(), since we want the space to be a valid drag target writer.Write(" "); } } RenderTitleText(writer, webPart); writer.RenderEndTag(); // Td RenderVerbsInTitleBar(writer, webPart, colspan); writer.RenderEndTag(); // Tr writer.RenderEndTag(); // Table } private void RenderTitleIcon(HtmlTextWriter writer, WebPart webPart) { // writer.AddAttribute(HtmlTextWriterAttribute.Src, Zone.ResolveClientUrl(webPart.TitleIconImageUrl) ); // Use "DisplayTitle - Description" as the alt tag ( writer.AddAttribute(HtmlTextWriterAttribute.Alt, GenerateDescriptionText(webPart)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); // Img } // PERF: Implement RenderTitleText() without using server controls private void RenderTitleText(HtmlTextWriter writer, WebPart webPart) { // PERF: Cache this, since it is needed for every WebPart in the zone if (_titleTextStyle == null) { _titleTextStyle = CreateTitleTextStyle(Zone.PartTitleStyle); } if (!_titleTextStyle.IsEmpty) { _titleTextStyle.AddAttributesToRender(writer, Zone); } // Render "DisplayTitle - Description" as tooltip ( writer.AddAttribute(HtmlTextWriterAttribute.Title, GenerateDescriptionText(webPart), true); // string url = webPart.TitleUrl; string text = GenerateTitleText(webPart); if (!String.IsNullOrEmpty(url) && !DragDropEnabled) { writer.AddAttribute(HtmlTextWriterAttribute.Href, Zone.ResolveClientUrl(url)); writer.RenderBeginTag(HtmlTextWriterTag.A); } else { writer.RenderBeginTag(HtmlTextWriterTag.Span); } writer.WriteEncodedText(text); writer.RenderEndTag(); // A || Span // PERF: Always render even if no verbs will be rendered writer.Write(" "); } private void RenderVerb(HtmlTextWriter writer, WebPart webPart, WebPartVerb verb) { WebControl verbControl; bool isEnabled = Zone.IsEnabled && verb.Enabled; ButtonType verbButtonType = Zone.TitleBarVerbButtonType; if (verb == Zone.HelpVerb) { // string resolvedHelpUrl = Zone.ResolveClientUrl(webPart.HelpUrl); // if (verbButtonType == ButtonType.Button) { ZoneButton button = new ZoneButton(Zone, null); if (isEnabled) { if (Zone.RenderClientScript) { button.OnClientClick = "__wpm.ShowHelp('" + Util.QuoteJScriptString(resolvedHelpUrl) + "', " + ((int)webPart.HelpMode).ToString(CultureInfo.InvariantCulture) + ");return;"; } else { if (webPart.HelpMode != WebPartHelpMode.Navigate) { button.OnClientClick = "window.open('" + Util.QuoteJScriptString(resolvedHelpUrl) + "', '_blank', 'scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no');return;"; } else { button.OnClientClick = "window.location.href='" + Util.QuoteJScriptString(resolvedHelpUrl) + "';return;"; } } } button.Text = verb.Text; verbControl = button; } else { HyperLink hyperLink = new HyperLink(); switch (webPart.HelpMode) { case WebPartHelpMode.Modal: if (!Zone.RenderClientScript) { goto case WebPartHelpMode.Modeless; } hyperLink.NavigateUrl = "javascript:__wpm.ShowHelp('" + Util.QuoteJScriptString(resolvedHelpUrl) + "', 0)"; break; case WebPartHelpMode.Modeless: hyperLink.NavigateUrl = resolvedHelpUrl; hyperLink.Target = "_blank"; break; case WebPartHelpMode.Navigate: hyperLink.NavigateUrl = resolvedHelpUrl; break; } hyperLink.Text = verb.Text; if (verbButtonType == ButtonType.Image) { hyperLink.ImageUrl = verb.ImageUrl; } verbControl = hyperLink; } } else if (verb == Zone.ExportVerb) { string exportUrl = _manager.GetExportUrl(webPart); if (verbButtonType == ButtonType.Button) { ZoneButton button = new ZoneButton(Zone, String.Empty); button.Text = verb.Text; if (isEnabled) { if ((webPart.ExportMode == WebPartExportMode.All) && (_personalizationScope == PersonalizationScope.User)) { if (Zone.RenderClientScript) { button.OnClientClick = "__wpm.ExportWebPart('" + Util.QuoteJScriptString(exportUrl) + "', true, false);return false;"; } else { button.OnClientClick = "if(__wpmExportWarning.length == 0 || " + "confirm(__wpmExportWarning)){window.location='" + Util.QuoteJScriptString(exportUrl) + "';}return false;"; } } else { button.OnClientClick = "window.location='" + Util.QuoteJScriptString(exportUrl) + "';return false;"; } } verbControl = button; } else { // Special case for export which must be a plain HyperLink // (href=javascript:void(0) would ruin any redirecting script) HyperLink link = new HyperLink(); link.Text = verb.Text; if (verbButtonType == ButtonType.Image) { link.ImageUrl = verb.ImageUrl; } link.NavigateUrl = exportUrl; if (webPart.ExportMode == WebPartExportMode.All) { // Confirm before exporting if (Zone.RenderClientScript) { link.Attributes.Add("onclick", "return __wpm.ExportWebPart('', true, true)"); } else { string onclick = "return (__wpmExportWarning.length == 0 || confirm(__wpmExportWarning))"; link.Attributes.Add("onclick", onclick); } } verbControl = link; } } else { string eventArgument = verb.GetEventArgument(webPart.ID); string clientClickHandler = verb.ClientClickHandler; if (verbButtonType == ButtonType.Button) { ZoneButton button = new ZoneButton(Zone, eventArgument); button.Text = verb.Text; if (!String.IsNullOrEmpty(clientClickHandler) && isEnabled) { button.OnClientClick = clientClickHandler; } verbControl = button; } else { ZoneLinkButton linkButton = new ZoneLinkButton(Zone, eventArgument); linkButton.Text = verb.Text; if (verbButtonType == ButtonType.Image) { linkButton.ImageUrl = verb.ImageUrl; } if (!String.IsNullOrEmpty(clientClickHandler) && isEnabled) { linkButton.OnClientClick = clientClickHandler; } verbControl = linkButton; } if (_manager != null && isEnabled) { if (verb == Zone.CloseVerb) { // PERF: First ProviderConnectionPointCollection connectionPoints = _manager.GetProviderConnectionPoints(webPart); if (connectionPoints != null && connectionPoints.Count > 0 && Connections.ContainsProvider(webPart)) { string onclick = "if (__wpmCloseProviderWarning.length >= 0 && " + "!confirm(__wpmCloseProviderWarning)) { return false; }"; verbControl.Attributes.Add("onclick", onclick); } } else if (verb == Zone.DeleteVerb) { string onclick = "if (__wpmDeleteWarning.length >= 0 && !confirm(__wpmDeleteWarning)) { return false; }"; verbControl.Attributes.Add("onclick", onclick); } } } verbControl.ApplyStyle(Zone.TitleBarVerbStyle); verbControl.ToolTip = String.Format(CultureInfo.CurrentCulture, verb.Description, webPart.DisplayTitle); verbControl.Enabled = verb.Enabled; verbControl.Page = _page; verbControl.RenderControl(writer); } private void RenderVerbs(HtmlTextWriter writer, WebPart webPart, WebPartVerbCollection verbs) { if (verbs == null) { throw new ArgumentNullException("verbs"); } WebPartVerb priorVerb = null; foreach (WebPartVerb verb in verbs) { // If you are rendering as a linkbutton, OR the prior verb rendered as a linkbutton, // render an " " prior to yourself. This ensures that all linkbuttons are preceeded // and followed by a space. if (priorVerb != null && (VerbRenderedAsLinkButton(verb) || VerbRenderedAsLinkButton(priorVerb))) { writer.Write(" "); } RenderVerb(writer, webPart, verb); priorVerb = verb; } } private void RenderVerbsInTitleBar(HtmlTextWriter writer, WebPart webPart, int colspan) { WebPartVerbCollection verbs = GetWebPartVerbs(webPart); verbs = FilterWebPartVerbs(verbs, webPart); if (verbs != null && verbs.Count > 0) { writer.AddStyleAttribute(HtmlTextWriterStyle.WhiteSpace, "nowrap"); colspan++; writer.RenderBeginTag(HtmlTextWriterTag.Td); if (Zone.RenderClientScript && (Zone.WebPartVerbRenderMode == WebPartVerbRenderMode.Menu) && Zone.Menu != null) { if (_designMode) { Zone.Menu.Render(writer, webPart.WholePartID + "Verbs"); } else { // If Zone.RenderClientScript, then WebPartManager must not be null Debug.Assert(WebPartManager != null); Zone.Menu.Render(writer, verbs, webPart.WholePartID + "Verbs", webPart, WebPartManager); } } else { RenderVerbs(writer, webPart, verbs); } writer.RenderEndTag(); // Td } } public virtual void RenderWebPart(HtmlTextWriter writer, WebPart webPart) { if (webPart == null) { throw new ArgumentNullException("webPart"); } bool vertical = (Zone.LayoutOrientation == Orientation.Vertical); PartChromeType chromeType = Zone.GetEffectiveChromeType(webPart); Style partChromeStyle = CreateWebPartChromeStyle(webPart, chromeType); // if (!partChromeStyle.IsEmpty) { partChromeStyle.AddAttributesToRender(writer, Zone); } // Render CellPadding=2 so there is a 2 pixel gap between the border and the title/body // of the WebPart. Can't render CellSpacing=2, since we want the backcolor of the title // bar to fill the title bar, and backcolor is not rendered in the CellSpacing. writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0"); writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Border, "0"); if (vertical) { writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); } else if (webPart.ChromeState != PartChromeState.Minimized) { writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%"); } if (Zone.RenderClientScript) { writer.AddAttribute(HtmlTextWriterAttribute.Id, GetWebPartChromeClientID(webPart)); } if (!_designMode && webPart.Hidden && WebPartManager != null && !WebPartManager.DisplayMode.ShowHiddenWebParts) { writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none"); } writer.RenderBeginTag(HtmlTextWriterTag.Table); if (chromeType == PartChromeType.TitleOnly || chromeType == PartChromeType.TitleAndBorder) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); // PERF: Cache this, since it is needed for every WebPart in the zone if (_titleStyleWithoutFontOrAlign == null) { _titleStyleWithoutFontOrAlign = CreateTitleStyleWithoutFontOrAlign(Zone.PartTitleStyle); } // Need to apply title style here (at least backcolor and border) so the backcolor // and border include the cell padding on the td. // Should not apply font style here, since we don't want verbs to use this // font style. In IE compat mode, the font style would not be inherited anyway, // But in IE strict mode the font style would be inherited. if (!_titleStyleWithoutFontOrAlign.IsEmpty) { _titleStyleWithoutFontOrAlign.AddAttributesToRender(writer, Zone); } writer.RenderBeginTag(HtmlTextWriterTag.Td); RenderTitleBar(writer, webPart); writer.RenderEndTag(); // Td writer.RenderEndTag(); // Tr } // Render the contents of minimized WebParts with display:none, instead of not rendering // the contents at all. The contents may need to be rendered for client-side connections // or other client-side features. Also allows child controls to maintain their postback // values between requests while the WebPart is minimized. if (webPart.ChromeState == PartChromeState.Minimized) { writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none"); } writer.RenderBeginTag(HtmlTextWriterTag.Tr); if (!vertical) { writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%"); writer.AddAttribute(HtmlTextWriterAttribute.Valign, "top"); } Style partStyle = Zone.PartStyle; if (!partStyle.IsEmpty) { partStyle.AddAttributesToRender(writer, Zone); } // Add some extra padding around the WebPart contents ( writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, Zone.PartChromePadding.ToString()); writer.RenderBeginTag(HtmlTextWriterTag.Td); RenderPartContents(writer, webPart); writer.RenderEndTag(); // Td writer.RenderEndTag(); // Tr writer.RenderEndTag(); // Table } private bool ShouldRenderVerb(WebPartVerb verb, WebPart webPart) { // PERF: Consider caching the Zone.*Verb properties // Can have null verbs in the CreateVerbs or WebPart.Verbs collections if (verb == null) { return false; } if (!verb.Visible) { return false; } if (verb == Zone.CloseVerb) { if (!_personalizationEnabled || !webPart.AllowClose || !Zone.AllowLayoutChange) { return false; } } if (verb == Zone.ConnectVerb) { if (WebPartManager != null) { if ((WebPartManager.DisplayMode != WebPartManager.ConnectDisplayMode) || (webPart == WebPartManager.SelectedWebPart) || !webPart.AllowConnect) { return false; } // Don't render Connect verb if web part has no connection points ConsumerConnectionPointCollection consumerConnectionPoints = WebPartManager.GetEnabledConsumerConnectionPoints(webPart); ProviderConnectionPointCollection providerConnectionPoints = WebPartManager.GetEnabledProviderConnectionPoints(webPart); if ((consumerConnectionPoints == null || consumerConnectionPoints.Count == 0) && (providerConnectionPoints == null || providerConnectionPoints.Count == 0)) { return false; } } } if (verb == Zone.DeleteVerb) { if (!_personalizationEnabled || !Zone.AllowLayoutChange || webPart.IsStatic || (webPart.IsShared && _personalizationScope == PersonalizationScope.User) || (WebPartManager != null && !WebPartManager.DisplayMode.AllowPageDesign)) { return false; } } if (verb == Zone.EditVerb) { if (WebPartManager != null && ((WebPartManager.DisplayMode != WebPartManager.EditDisplayMode) || (webPart == WebPartManager.SelectedWebPart))) { return false; } } if (verb == Zone.HelpVerb) { if (String.IsNullOrEmpty(webPart.HelpUrl)) { return false; } } if (verb == Zone.MinimizeVerb) { if (!_personalizationEnabled || webPart.ChromeState == PartChromeState.Minimized || !webPart.AllowMinimize || !Zone.AllowLayoutChange) { return false; } } if (verb == Zone.RestoreVerb) { if (!_personalizationEnabled || webPart.ChromeState == PartChromeState.Normal || !Zone.AllowLayoutChange) { return false; } } if (verb == Zone.ExportVerb) { if (!_personalizationEnabled || webPart.ExportMode == WebPartExportMode.None) { return false; } } return true; } private bool VerbRenderedAsLinkButton(WebPartVerb verb) { if (Zone.TitleBarVerbButtonType == ButtonType.Link) { return true; } if (String.IsNullOrEmpty(verb.ImageUrl)) { return true; } return false; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- QilPatternFactory.cs
- _TransmitFileOverlappedAsyncResult.cs
- NativeMethods.cs
- AccessDataSource.cs
- GuidelineSet.cs
- ColumnMapVisitor.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- TransactionManager.cs
- DataGridViewTextBoxCell.cs
- RouteItem.cs
- BamlLocalizableResource.cs
- ListItemCollection.cs
- ActivitySurrogate.cs
- Int32CAMarshaler.cs
- HttpConfigurationSystem.cs
- BufferModesCollection.cs
- TemplateInstanceAttribute.cs
- InheritanceAttribute.cs
- AjaxFrameworkAssemblyAttribute.cs
- ResourcePart.cs
- XmlEntity.cs
- UrlUtility.cs
- PathSegmentCollection.cs
- SecurityResources.cs
- NavigationExpr.cs
- RemotingConfiguration.cs
- DesignerWithHeader.cs
- ClockController.cs
- XmlSchemaDocumentation.cs
- Zone.cs
- AutomationPatternInfo.cs
- SQLSingleStorage.cs
- CodeTypeMemberCollection.cs
- XmlDomTextWriter.cs
- XmlDocumentSerializer.cs
- Attributes.cs
- CompositeFontParser.cs
- DeflateStream.cs
- ConfigurationProperty.cs
- ToolboxItem.cs
- ObjectIDGenerator.cs
- LicFileLicenseProvider.cs
- validationstate.cs
- Constants.cs
- NotFiniteNumberException.cs
- SqlUdtInfo.cs
- ReturnValue.cs
- AutomationPatternInfo.cs
- CustomCategoryAttribute.cs
- SqlBooleanizer.cs
- EventLogPermissionEntry.cs
- MemberAccessException.cs
- OleDbWrapper.cs
- Transform3DCollection.cs
- HandlerWithFactory.cs
- ReadOnlyCollection.cs
- AutoSizeToolBoxItem.cs
- MimeParameter.cs
- ErrorsHelper.cs
- DesignerRegion.cs
- BevelBitmapEffect.cs
- DescendantBaseQuery.cs
- _ChunkParse.cs
- BitVector32.cs
- DispatchRuntime.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- BindingManagerDataErrorEventArgs.cs
- CacheSection.cs
- XmlEncodedRawTextWriter.cs
- _LazyAsyncResult.cs
- ExpandCollapseProviderWrapper.cs
- EncoderBestFitFallback.cs
- PublisherMembershipCondition.cs
- ApplicationSecurityManager.cs
- WebReferenceOptions.cs
- DataSourceControl.cs
- LassoSelectionBehavior.cs
- SafeUserTokenHandle.cs
- XslCompiledTransform.cs
- HopperCache.cs
- AssertSection.cs
- FixedBufferAttribute.cs
- HttpProxyTransportBindingElement.cs
- RegexMatchCollection.cs
- datacache.cs
- CodeTypeMember.cs
- XmlSchemaImporter.cs
- _Win32.cs
- AnonymousIdentificationSection.cs
- InvokeProviderWrapper.cs
- AnnotationAuthorChangedEventArgs.cs
- ContentElementAutomationPeer.cs
- DataGridRelationshipRow.cs
- ObjectListSelectEventArgs.cs
- EntityStoreSchemaGenerator.cs
- ItemCheckedEvent.cs
- HttpCookiesSection.cs
- ObjectDataSourceFilteringEventArgs.cs
- DataSysAttribute.cs
- FlowLayoutPanelDesigner.cs