e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
272 lines
10 KiB
C#
272 lines
10 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="LayoutEditorPart.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
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 LayoutEditorPart : EditorPart {
|
|
|
|
private DropDownList _chromeState;
|
|
private DropDownList _zone;
|
|
//
|
|
|
|
private TextBox _zoneIndex;
|
|
|
|
private string _chromeStateErrorMessage;
|
|
private string _zoneIndexErrorMessage;
|
|
|
|
private const int TextBoxColumns = 10;
|
|
private const int MinZoneIndex = 0;
|
|
|
|
private bool CanChangeChromeState {
|
|
get {
|
|
WebPart webPart = WebPartToEdit;
|
|
if (!webPart.Zone.AllowLayoutChange) {
|
|
return false;
|
|
}
|
|
else if (!webPart.AllowMinimize) {
|
|
// If AllowMinimize is false, the dropdown can be used to restore the WebPart
|
|
// but not to minimize the WebPart.
|
|
return (webPart.ChromeState == PartChromeState.Minimized);
|
|
}
|
|
else {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool CanChangeZone {
|
|
get {
|
|
WebPart webPart = WebPartToEdit;
|
|
WebPartZoneBase currentZone = webPart.Zone;
|
|
return (currentZone.AllowLayoutChange && webPart.AllowZoneChange);
|
|
}
|
|
}
|
|
|
|
private bool CanChangeZoneIndex {
|
|
get {
|
|
return WebPartToEdit.Zone.AllowLayoutChange;
|
|
}
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), Themeable(false)]
|
|
public override string DefaultButton {
|
|
get { return base.DefaultButton; }
|
|
set { base.DefaultButton = value; }
|
|
}
|
|
|
|
public override bool Display {
|
|
get {
|
|
// Don't return base.Display, since we want to show the layout editor part even
|
|
// if AllowEdit is false on the WebPartToEdit, or the WebPartToEdit is a ProxyWebPart.
|
|
return true;
|
|
}
|
|
}
|
|
|
|
private bool HasError {
|
|
get {
|
|
return (_chromeStateErrorMessage != null || _zoneIndexErrorMessage != null);
|
|
}
|
|
}
|
|
|
|
[
|
|
WebSysDefaultValue(SR.LayoutEditorPart_PartTitle),
|
|
]
|
|
public override string Title {
|
|
get {
|
|
string s = (string)ViewState["Title"];
|
|
return (s != null) ? s : SR.GetString(SR.LayoutEditorPart_PartTitle);
|
|
}
|
|
set {
|
|
ViewState["Title"] = value;
|
|
}
|
|
}
|
|
|
|
public override bool ApplyChanges() {
|
|
WebPart webPart = WebPartToEdit;
|
|
if (webPart != null) {
|
|
EnsureChildControls();
|
|
|
|
try {
|
|
if (CanChangeChromeState) {
|
|
TypeConverter chromeStateConverter = TypeDescriptor.GetConverter(typeof(PartChromeState));
|
|
webPart.ChromeState = (PartChromeState)chromeStateConverter.ConvertFromString(_chromeState.SelectedValue);
|
|
}
|
|
}
|
|
catch (Exception e) {
|
|
_chromeStateErrorMessage = CreateErrorMessage(e.Message);
|
|
}
|
|
|
|
int zoneIndex = webPart.ZoneIndex;
|
|
if (CanChangeZoneIndex) {
|
|
if (Int32.TryParse(_zoneIndex.Text, NumberStyles.Integer, CultureInfo.CurrentCulture, out zoneIndex)) {
|
|
if (zoneIndex < MinZoneIndex) {
|
|
_zoneIndexErrorMessage = SR.GetString(SR.EditorPart_PropertyMinValue, MinZoneIndex.ToString(CultureInfo.CurrentCulture));
|
|
}
|
|
}
|
|
else {
|
|
_zoneIndexErrorMessage = SR.GetString(SR.EditorPart_PropertyMustBeInteger);
|
|
}
|
|
}
|
|
|
|
WebPartZoneBase oldZone = webPart.Zone;
|
|
WebPartZoneBase newZone = oldZone;
|
|
if (CanChangeZone) {
|
|
newZone = WebPartManager.Zones[_zone.SelectedValue];
|
|
}
|
|
|
|
// Do not call MoveWebPart if the WebPart is currently in the correct position (VSWhidbey 374634)
|
|
if (_zoneIndexErrorMessage == null && oldZone.AllowLayoutChange && newZone.AllowLayoutChange &&
|
|
(webPart.Zone != newZone || webPart.ZoneIndex != zoneIndex)) {
|
|
try {
|
|
WebPartManager.MoveWebPart(webPart, newZone, zoneIndex);
|
|
}
|
|
catch (Exception e) {
|
|
// Zone and ZoneIndex are set at the same time. Use the _zoneIndexErrorMessage, since it is
|
|
// more likely that a bogus ZoneIndex would cause an error.
|
|
_zoneIndexErrorMessage = CreateErrorMessage(e.Message);
|
|
}
|
|
}
|
|
}
|
|
|
|
return !HasError;
|
|
}
|
|
|
|
protected internal override void CreateChildControls() {
|
|
ControlCollection controls = Controls;
|
|
controls.Clear();
|
|
|
|
TypeConverter chromeStateConverter = TypeDescriptor.GetConverter(typeof(PartChromeState));
|
|
_chromeState = new DropDownList();
|
|
_chromeState.Items.Add(new ListItem(SR.GetString(SR.PartChromeState_Normal),
|
|
chromeStateConverter.ConvertToString(PartChromeState.Normal)));
|
|
_chromeState.Items.Add(new ListItem(SR.GetString(SR.PartChromeState_Minimized),
|
|
chromeStateConverter.ConvertToString(PartChromeState.Minimized)));
|
|
controls.Add(_chromeState);
|
|
|
|
// Add all zones to dropdown in CreateChildControls. Items will be selected and/or disabled
|
|
// in SyncChanges. Assumes no Zones are added or removed during page execution.
|
|
_zone = new DropDownList();
|
|
WebPartManager manager = WebPartManager;
|
|
if (manager != null) {
|
|
WebPartZoneCollection zones = manager.Zones;
|
|
if (zones != null) {
|
|
foreach (WebPartZoneBase zone in zones) {
|
|
ListItem item = new ListItem(zone.DisplayTitle, zone.ID);
|
|
_zone.Items.Add(item);
|
|
}
|
|
}
|
|
}
|
|
controls.Add(_zone);
|
|
|
|
_zoneIndex = new TextBox();
|
|
_zoneIndex.Columns = TextBoxColumns;
|
|
controls.Add(_zoneIndex);
|
|
|
|
// 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();
|
|
|
|
if (DesignMode) {
|
|
// Add sample zone to dropdown
|
|
_zone.Items.Add(SR.GetString(SR.Zone_SampleHeaderText));
|
|
}
|
|
|
|
string[] propertyDisplayNames = new string[] {
|
|
SR.GetString(SR.LayoutEditorPart_ChromeState),
|
|
SR.GetString(SR.LayoutEditorPart_Zone),
|
|
SR.GetString(SR.LayoutEditorPart_ZoneIndex),
|
|
};
|
|
|
|
WebControl[] propertyEditors = new WebControl[] {
|
|
_chromeState,
|
|
_zone,
|
|
_zoneIndex,
|
|
};
|
|
|
|
string[] errorMessages = new string[] {
|
|
_chromeStateErrorMessage,
|
|
null,
|
|
_zoneIndexErrorMessage,
|
|
};
|
|
|
|
RenderPropertyEditors(writer, propertyDisplayNames, null /* propertyDescriptions */,
|
|
propertyEditors, errorMessages);
|
|
}
|
|
|
|
public override void SyncChanges() {
|
|
WebPart webPart = WebPartToEdit;
|
|
|
|
Debug.Assert(webPart != null);
|
|
if (webPart != null) {
|
|
WebPartZoneBase currentZone = webPart.Zone;
|
|
bool allowLayoutChange = currentZone.AllowLayoutChange;
|
|
|
|
EnsureChildControls();
|
|
|
|
TypeConverter chromeStateConverter = TypeDescriptor.GetConverter(typeof(PartChromeState));
|
|
_chromeState.SelectedValue = chromeStateConverter.ConvertToString(webPart.ChromeState);
|
|
_chromeState.Enabled = CanChangeChromeState;
|
|
|
|
WebPartManager manager = WebPartManager;
|
|
Debug.Assert(manager != null);
|
|
if (manager != null) {
|
|
WebPartZoneCollection zones = manager.Zones;
|
|
bool allowZoneChange = webPart.AllowZoneChange;
|
|
|
|
_zone.ClearSelection();
|
|
foreach (ListItem item in _zone.Items) {
|
|
string zoneID = item.Value;
|
|
WebPartZoneBase zone = zones[zoneID];
|
|
if (zone == currentZone || (allowZoneChange && zone.AllowLayoutChange)) {
|
|
item.Enabled = true;
|
|
}
|
|
else {
|
|
item.Enabled = false;
|
|
}
|
|
|
|
if (zone == currentZone) {
|
|
item.Selected = true;
|
|
}
|
|
}
|
|
|
|
_zone.Enabled = CanChangeZone;
|
|
}
|
|
|
|
_zoneIndex.Text = webPart.ZoneIndex.ToString(CultureInfo.CurrentCulture);
|
|
_zoneIndex.Enabled = CanChangeZoneIndex;
|
|
}
|
|
}
|
|
}
|
|
}
|