e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
1344 lines
48 KiB
C#
1344 lines
48 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="StylesEditorDialog.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Web.UI.Design.MobileControls
|
|
{
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.Design;
|
|
using System.ComponentModel.Design.Serialization;
|
|
using System.Globalization;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Drawing.Design;
|
|
using System.Reflection;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.Design;
|
|
using System.Web.UI;
|
|
using System.Web.UI.MobileControls;
|
|
using System.Web.UI.Design.MobileControls.Adapters;
|
|
using System.Web.UI.Design.MobileControls.Util;
|
|
|
|
using AttributeCollection = System.ComponentModel.AttributeCollection;
|
|
using Control = System.Windows.Forms.Control;
|
|
|
|
using Button = System.Windows.Forms.Button;
|
|
using Label = System.Windows.Forms.Label;
|
|
using TextBox = System.Windows.Forms.TextBox;
|
|
using ListView = System.Windows.Forms.ListView;
|
|
using ListBox = System.Windows.Forms.ListBox;
|
|
|
|
using FontSize = System.Web.UI.MobileControls.FontSize;
|
|
using Style = System.Web.UI.MobileControls.Style;
|
|
|
|
[
|
|
System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
|
|
Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
|
|
]
|
|
[Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
|
|
internal sealed class StylesEditorDialog : DesignerForm
|
|
{
|
|
private StyleSheet _styleSheet;
|
|
private StyleSheet _tempStyleSheet;
|
|
private StyleSheetDesigner _styleSheetDesigner;
|
|
private Style _previewStyle;
|
|
private Type _currentNewStyleType;
|
|
private bool _firstActivate = true;
|
|
|
|
private Button _btnOK;
|
|
private Button _btnCancel;
|
|
private Button _btnUp;
|
|
private Button _btnDown;
|
|
private Button _btnAdd;
|
|
private Button _btnRemove;
|
|
private TextBox _txtType;
|
|
private TreeView _tvDefinedStyles;
|
|
private ListView _lvAvailableStyles;
|
|
private PropertyGrid _propertyBrowser;
|
|
private MSHTMLHost _samplePreview;
|
|
private ContextMenu _cntxtMenu;
|
|
private MenuItem _cntxtMenuItem;
|
|
private TreeNode _editCandidateNode = null;
|
|
|
|
private StyleNode SelectedStyle
|
|
{
|
|
get
|
|
{
|
|
Debug.Assert(_tvDefinedStyles != null);
|
|
return _tvDefinedStyles.SelectedNode as StyleNode;
|
|
}
|
|
set
|
|
{
|
|
Debug.Assert(_tvDefinedStyles != null);
|
|
_tvDefinedStyles.SelectedNode = value;
|
|
}
|
|
}
|
|
|
|
protected override string HelpTopic {
|
|
get { return "net.Mobile.StylesEditorDialog"; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create a new StylesEditorDialog instance
|
|
/// </summary>
|
|
/// <internalonly/>
|
|
internal StylesEditorDialog(StyleSheet stylesheet,
|
|
StyleSheetDesigner styleSheetDesigner,
|
|
String initialStyleName) : base (stylesheet.Site)
|
|
{
|
|
if(stylesheet.DuplicateStyles.Count > 0)
|
|
{
|
|
GenericUI.ShowErrorMessage(
|
|
SR.GetString(SR.StylesEditorDialog_Title),
|
|
SR.GetString(SR.StylesEditorDialog_DuplicateStyleNames)
|
|
);
|
|
throw new ArgumentException(
|
|
SR.GetString(SR.StylesEditorDialog_DuplicateStyleException)
|
|
);
|
|
}
|
|
|
|
_tempStyleSheet = new StyleSheet();
|
|
_previewStyle = new Style();
|
|
|
|
_styleSheet = stylesheet;
|
|
_styleSheetDesigner = styleSheetDesigner;
|
|
|
|
_tempStyleSheet.Site = _styleSheet.Site;
|
|
|
|
InitializeComponent();
|
|
|
|
InitAvailableStyles();
|
|
LoadStyleItems();
|
|
|
|
if (_tvDefinedStyles.Nodes.Count > 0)
|
|
{
|
|
int initialIndex = 0;
|
|
if (initialStyleName != null)
|
|
{
|
|
initialIndex = StyleIndex(initialStyleName);
|
|
}
|
|
SelectedStyle = (StyleNode)_tvDefinedStyles.Nodes[initialIndex];
|
|
_tvDefinedStyles.Enabled = true;
|
|
UpdateTypeText();
|
|
UpdatePropertyGrid();
|
|
}
|
|
|
|
UpdateButtonsEnabling();
|
|
UpdateFieldsEnabling();
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if(disposing)
|
|
{
|
|
if (_tvDefinedStyles != null)
|
|
{
|
|
foreach (StyleNode item in _tvDefinedStyles.Nodes)
|
|
{
|
|
item.Dispose();
|
|
}
|
|
_tvDefinedStyles = null;
|
|
}
|
|
}
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
_btnOK = new Button();
|
|
_btnCancel = new Button();
|
|
_btnUp = new Button();
|
|
_btnDown = new Button();
|
|
_btnAdd = new Button();
|
|
_btnRemove = new Button();
|
|
|
|
_txtType = new TextBox();
|
|
_tvDefinedStyles = new TreeView();
|
|
_lvAvailableStyles = new ListView();
|
|
_samplePreview = new MSHTMLHost();
|
|
_propertyBrowser = new PropertyGrid();
|
|
_cntxtMenuItem = new MenuItem();
|
|
_cntxtMenu = new ContextMenu();
|
|
|
|
GroupLabel grplblStyleList = new GroupLabel();
|
|
grplblStyleList.SetBounds(6, 5, 432, 16);
|
|
grplblStyleList.Text = SR.GetString(SR.StylesEditorDialog_StyleListGroupLabel);
|
|
grplblStyleList.TabStop = false;
|
|
grplblStyleList.TabIndex = 0;
|
|
|
|
Label lblAvailableStyles = new Label();
|
|
lblAvailableStyles.SetBounds(14, 25, 180, 16);
|
|
lblAvailableStyles.Text = SR.GetString(SR.StylesEditorDialog_AvailableStylesCaption);
|
|
lblAvailableStyles.TabStop = false;
|
|
lblAvailableStyles.TabIndex = 1;
|
|
|
|
ColumnHeader chStyleType = new System.Windows.Forms.ColumnHeader();
|
|
ColumnHeader chStyleNamespace = new System.Windows.Forms.ColumnHeader();
|
|
|
|
chStyleType.Width = 16;
|
|
chStyleType.TextAlign = System.Windows.Forms.HorizontalAlignment.Left;
|
|
chStyleNamespace.Width = 16;
|
|
chStyleNamespace.TextAlign = System.Windows.Forms.HorizontalAlignment.Left;
|
|
|
|
_lvAvailableStyles.SetBounds(14, 41, 180, 95);
|
|
_lvAvailableStyles.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
|
|
_lvAvailableStyles.MultiSelect = false;
|
|
_lvAvailableStyles.HideSelection = false;
|
|
_lvAvailableStyles.FullRowSelect = true;
|
|
_lvAvailableStyles.View = System.Windows.Forms.View.Details;
|
|
_lvAvailableStyles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[2] {chStyleType, chStyleNamespace});
|
|
_lvAvailableStyles.SelectedIndexChanged += new EventHandler(this.OnNewStyleTypeChanged);
|
|
_lvAvailableStyles.DoubleClick += new EventHandler(this.OnDoubleClick);
|
|
_lvAvailableStyles.Sorting = SortOrder.Ascending;
|
|
_lvAvailableStyles.TabIndex = 2;
|
|
_lvAvailableStyles.TabStop = true;
|
|
|
|
_btnAdd.AccessibleName = SR.GetString(SR.EditableTreeList_AddName);
|
|
_btnAdd.AccessibleDescription = SR.GetString(SR.EditableTreeList_AddDescription);
|
|
_btnAdd.Name = SR.GetString(SR.EditableTreeList_AddName);
|
|
_btnAdd.SetBounds(198, 77, 32, 25);
|
|
_btnAdd.Text = SR.GetString(SR.StylesEditorDialog_AddBtnCation);
|
|
_btnAdd.Click += new EventHandler(this.OnClickAddButton);
|
|
_btnAdd.TabIndex = 3;
|
|
_btnAdd.TabStop = true;
|
|
|
|
Label lblDefinedStyles = new Label();
|
|
lblDefinedStyles.SetBounds(234, 25, 166, 16);
|
|
lblDefinedStyles.Text = SR.GetString(SR.StylesEditorDialog_DefinedStylesCaption);
|
|
lblDefinedStyles.TabStop = false;
|
|
lblDefinedStyles.TabIndex = 4;;
|
|
|
|
_tvDefinedStyles.SetBounds(234, 41, 166, 95);
|
|
_tvDefinedStyles.AfterSelect += new TreeViewEventHandler(OnStylesSelected);
|
|
_tvDefinedStyles.AfterLabelEdit += new NodeLabelEditEventHandler(OnAfterLabelEdit);
|
|
_tvDefinedStyles.LabelEdit = true;
|
|
_tvDefinedStyles.ShowPlusMinus = false;
|
|
_tvDefinedStyles.HideSelection = false;
|
|
_tvDefinedStyles.Indent = 15;
|
|
_tvDefinedStyles.ShowRootLines = false;
|
|
_tvDefinedStyles.ShowLines = false;
|
|
_tvDefinedStyles.ContextMenu = _cntxtMenu;
|
|
_tvDefinedStyles.TabIndex = 5;
|
|
_tvDefinedStyles.TabStop = true;
|
|
_tvDefinedStyles.KeyDown += new KeyEventHandler(OnKeyDown);
|
|
_tvDefinedStyles.MouseUp += new MouseEventHandler(OnListMouseUp);
|
|
_tvDefinedStyles.MouseDown += new MouseEventHandler(OnListMouseDown);
|
|
|
|
_btnUp.AccessibleName = SR.GetString(SR.EditableTreeList_MoveUpName);
|
|
_btnUp.AccessibleDescription = SR.GetString(SR.EditableTreeList_MoveUpDescription);
|
|
_btnUp.Name = SR.GetString(SR.EditableTreeList_MoveUpName);
|
|
_btnUp.SetBounds(404, 41, 28, 27);
|
|
_btnUp.Click += new EventHandler(this.OnClickUpButton);
|
|
_btnUp.Image = GenericUI.SortUpIcon;
|
|
_btnUp.TabIndex = 6;
|
|
_btnUp.TabStop = true;
|
|
|
|
_btnDown.AccessibleName = SR.GetString(SR.EditableTreeList_MoveDownName);
|
|
_btnDown.AccessibleDescription = SR.GetString(SR.EditableTreeList_MoveDownDescription);
|
|
_btnDown.Name = SR.GetString(SR.EditableTreeList_MoveDownName);
|
|
_btnDown.SetBounds(404, 72, 28, 27);
|
|
_btnDown.Click += new EventHandler(this.OnClickDownButton);
|
|
_btnDown.Image = GenericUI.SortDownIcon;
|
|
_btnDown.TabIndex = 7;
|
|
_btnDown.TabStop = true;
|
|
|
|
_btnRemove.AccessibleName = SR.GetString(SR.EditableTreeList_DeleteName);
|
|
_btnRemove.AccessibleDescription = SR.GetString(SR.EditableTreeList_DeleteDescription);
|
|
_btnRemove.Name = SR.GetString(SR.EditableTreeList_DeleteName);
|
|
_btnRemove.SetBounds(404, 109, 28, 27);
|
|
_btnRemove.Click += new EventHandler(this.OnClickRemoveButton);
|
|
_btnRemove.Image = GenericUI.DeleteIcon;
|
|
_btnRemove.TabIndex = 8;
|
|
_btnRemove.TabStop = true;
|
|
|
|
GroupLabel grplblStyleProperties = new GroupLabel();
|
|
grplblStyleProperties.SetBounds(6, 145, 432, 16);
|
|
grplblStyleProperties.Text = SR.GetString(SR.StylesEditorDialog_StylePropertiesGroupLabel);
|
|
grplblStyleProperties.TabStop = false;
|
|
grplblStyleProperties.TabIndex = 9;
|
|
|
|
Label lblType = new Label();
|
|
lblType.SetBounds(14, 165, 180, 16);
|
|
lblType.Text = SR.GetString(SR.StylesEditorDialog_TypeCaption);
|
|
lblType.TabIndex = 10;
|
|
lblType.TabStop = false;
|
|
|
|
_txtType.SetBounds(14, 181, 180, 16);
|
|
_txtType.ReadOnly = true;
|
|
_txtType.TabIndex = 11;
|
|
_txtType.TabStop = true;
|
|
|
|
Label lblSample = new Label();
|
|
lblSample.SetBounds(14, 213, 180, 16);
|
|
lblSample.Text = SR.GetString(SR.StylesEditorDialog_SampleCaption);
|
|
lblSample.TabStop = false;
|
|
lblSample.TabIndex = 12;
|
|
|
|
_samplePreview.SetBounds(14, 229, 180, 76);
|
|
_samplePreview.TabStop = false;
|
|
_samplePreview.TabIndex = 13;
|
|
|
|
Label lblProperties = new Label();
|
|
lblProperties.SetBounds(234, 165, 198, 16);
|
|
lblProperties.Text = SR.GetString(SR.StylesEditorDialog_PropertiesCaption);
|
|
lblProperties.TabIndex = 14;
|
|
lblProperties.TabStop = false;
|
|
|
|
_propertyBrowser.SetBounds(234, 181, 198, 178);
|
|
_propertyBrowser.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right;
|
|
_propertyBrowser.ToolbarVisible = false;
|
|
_propertyBrowser.HelpVisible = false;
|
|
_propertyBrowser.TabIndex = 15;
|
|
_propertyBrowser.TabStop = true;
|
|
_propertyBrowser.PropertySort = PropertySort.Alphabetical;
|
|
_propertyBrowser.PropertyValueChanged += new PropertyValueChangedEventHandler(this.OnPropertyValueChanged);
|
|
|
|
_btnOK.DialogResult = DialogResult.OK;
|
|
_btnOK.Location = new System.Drawing.Point(282, 370);
|
|
_btnOK.Size = new System.Drawing.Size(75, 23);
|
|
_btnOK.TabIndex = 16;
|
|
_btnOK.Text = SR.GetString(SR.GenericDialog_OKBtnCaption);
|
|
_btnOK.Click += new EventHandler(this.OnClickOKButton);
|
|
|
|
_btnCancel.DialogResult = DialogResult.Cancel;
|
|
_btnCancel.Location = new System.Drawing.Point(363, 370);
|
|
_btnCancel.Size = new System.Drawing.Size(75, 23);
|
|
_btnCancel.TabIndex = 17;
|
|
_btnCancel.Text = SR.GetString(SR.GenericDialog_CancelBtnCaption);
|
|
|
|
_cntxtMenuItem.Text = SR.GetString(SR.EditableTreeList_Rename);
|
|
_cntxtMenu.MenuItems.Add(_cntxtMenuItem);
|
|
_cntxtMenu.Popup += new EventHandler(OnPopup);
|
|
_cntxtMenuItem.Click += new EventHandler(OnContextMenuItemClick);
|
|
|
|
GenericUI.InitDialog(this, _styleSheet.Site);
|
|
|
|
this.Text = _styleSheet.ID + " - " + SR.GetString(SR.StylesEditorDialog_Title);
|
|
this.ClientSize = new Size(444, 401);
|
|
this.AcceptButton = _btnOK;
|
|
this.CancelButton = _btnCancel;
|
|
this.Activated += new System.EventHandler(StylesEditorDialog_Activated);
|
|
this.Controls.AddRange(new Control[]
|
|
{
|
|
grplblStyleList,
|
|
lblAvailableStyles,
|
|
_lvAvailableStyles,
|
|
_btnAdd,
|
|
lblDefinedStyles,
|
|
_tvDefinedStyles,
|
|
_btnUp,
|
|
_btnDown,
|
|
_btnRemove,
|
|
grplblStyleProperties,
|
|
lblType,
|
|
_txtType,
|
|
lblSample,
|
|
_samplePreview,
|
|
lblProperties,
|
|
_propertyBrowser,
|
|
_btnOK,
|
|
_btnCancel,
|
|
});
|
|
}
|
|
|
|
private void InitAvailableStyles()
|
|
{
|
|
//int[] colMaxWidth = { _lvAvailableStyles.Columns[0].Width, _lvAvailableStyles.Columns[1].Width };
|
|
int[] colMaxWidth = { 68, 202 };
|
|
int[] colReqWidth = { 0, 0 };
|
|
|
|
// NOTE: Currently no way for third party extenders to add their
|
|
// own styles. They'll need to specify complete name with tagprefix included.
|
|
StringCollection mobileStyles = new StringCollection();
|
|
mobileStyles.AddRange(
|
|
new String[2]{"System.Web.UI.MobileControls.PagerStyle",
|
|
"System.Web.UI.MobileControls.Style"});
|
|
|
|
foreach (String mobileStyle in mobileStyles)
|
|
{
|
|
Type type = Type.GetType(mobileStyle, true);
|
|
String[] subItems = {type.Name, type.Namespace};
|
|
ListViewItem item = new ListViewItem(subItems);
|
|
_lvAvailableStyles.Items.Add(item);
|
|
}
|
|
|
|
ICollection styles = _styleSheet.Styles;
|
|
foreach (String key in styles)
|
|
{
|
|
Style style = (Style) _styleSheet[key];
|
|
Type type = style.GetType();
|
|
if (!mobileStyles.Contains(type.FullName))
|
|
{
|
|
String[] subItems = {type.Name, type.Namespace};
|
|
ListViewItem item = new ListViewItem(subItems);
|
|
_lvAvailableStyles.Items.Add(item);
|
|
|
|
// Rectangle rcLvi = lvi.GetBounds((int) ItemBoundsPortion.Label);
|
|
// use a method like GetExtendPoint32
|
|
colReqWidth[0] = 68;
|
|
if (colReqWidth[0] > colMaxWidth[0])
|
|
{
|
|
colMaxWidth[0] = colReqWidth[0];
|
|
}
|
|
// use a method like GetExtendPoint32
|
|
colReqWidth[1] = 202;
|
|
if (colReqWidth[1] > colMaxWidth[1])
|
|
{
|
|
colMaxWidth[1] = colReqWidth[1];
|
|
}
|
|
}
|
|
}
|
|
_lvAvailableStyles.Columns[0].Width = colMaxWidth[0] + 4;
|
|
_lvAvailableStyles.Columns[1].Width = colMaxWidth[1] + 4;
|
|
|
|
Debug.Assert(_lvAvailableStyles.Items.Count > 0);
|
|
_lvAvailableStyles.Sort();
|
|
_lvAvailableStyles.Items[0].Selected = true;
|
|
_currentNewStyleType = Type.GetType((String) _lvAvailableStyles.Items[0].SubItems[1].Text + "." +
|
|
_lvAvailableStyles.Items[0].Text, true);
|
|
}
|
|
|
|
private void SaveComponent()
|
|
{
|
|
// Clear old styles
|
|
_styleSheet.Clear();
|
|
|
|
foreach (StyleNode styleNode in _tvDefinedStyles.Nodes)
|
|
{
|
|
_styleSheet[styleNode.RuntimeStyle.Name] = styleNode.RuntimeStyle;
|
|
styleNode.RuntimeStyle.SetControl(_styleSheet);
|
|
}
|
|
|
|
// Delete CurrentStyle if it does not exist any more.
|
|
if (_styleSheetDesigner.CurrentStyle != null &&
|
|
null == _styleSheet[_styleSheetDesigner.CurrentStyle.Name])
|
|
{
|
|
_styleSheetDesigner.CurrentStyle = null;
|
|
_styleSheetDesigner.CurrentChoice = null;
|
|
}
|
|
|
|
_styleSheetDesigner.OnStylesChanged();
|
|
}
|
|
|
|
private void LoadStyleItems()
|
|
{
|
|
ICollection styles = _styleSheet.Styles;
|
|
|
|
foreach (String key in styles)
|
|
{
|
|
Style style = (Style) _styleSheet[key];
|
|
Style newStyle = (Style) Activator.CreateInstance(style.GetType());
|
|
|
|
PropertyDescriptorCollection propDescs = TypeDescriptor.GetProperties(style);
|
|
|
|
for (int i = 0; i < propDescs.Count; i++)
|
|
{
|
|
if (propDescs[i].Name.Equals("Font"))
|
|
{
|
|
foreach (PropertyDescriptor desc in TypeDescriptor.GetProperties(style.Font))
|
|
{
|
|
desc.SetValue(newStyle.Font, desc.GetValue(style.Font));
|
|
}
|
|
}
|
|
else if (!propDescs[i].IsReadOnly)
|
|
{
|
|
propDescs[i].SetValue(newStyle, propDescs[i].GetValue(style));
|
|
}
|
|
}
|
|
|
|
_tempStyleSheet[newStyle.Name] = newStyle;
|
|
newStyle.SetControl(_tempStyleSheet);
|
|
|
|
StyleNode newStyleItem = new StyleNode(newStyle);
|
|
_tvDefinedStyles.Nodes.Add(newStyleItem);
|
|
}
|
|
}
|
|
|
|
private void UpdateButtonsEnabling()
|
|
{
|
|
if (SelectedStyle == null)
|
|
{
|
|
_btnUp.Enabled = false;
|
|
_btnDown.Enabled = false;
|
|
}
|
|
else
|
|
{
|
|
_btnUp.Enabled = (SelectedStyle.Index > 0);
|
|
_btnDown.Enabled = (SelectedStyle.Index < _tvDefinedStyles.Nodes.Count - 1);
|
|
}
|
|
|
|
_btnRemove.Enabled = (SelectedStyle != null);
|
|
}
|
|
|
|
private void UpdateFieldsEnabling()
|
|
{
|
|
_propertyBrowser.Enabled =
|
|
_tvDefinedStyles.Enabled = (SelectedStyle != null);
|
|
}
|
|
|
|
private String AutoIDStyle()
|
|
{
|
|
String newStyleID = _currentNewStyleType.Name;
|
|
|
|
int i = 1;
|
|
while (StyleIndex(newStyleID + i.ToString(CultureInfo.InvariantCulture)) >= 0)
|
|
{
|
|
i++;
|
|
}
|
|
return newStyleID + i.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
|
|
private int StyleIndex(String name)
|
|
{
|
|
int index = 0;
|
|
foreach (StyleNode styleNode in _tvDefinedStyles.Nodes)
|
|
{
|
|
if (String.Compare(name, styleNode.RuntimeStyle.Name, StringComparison.OrdinalIgnoreCase) == 0)
|
|
{
|
|
return index;
|
|
}
|
|
index++;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
private void UpdatePropertyGrid()
|
|
{
|
|
_propertyBrowser.SelectedObject = (SelectedStyle == null) ?
|
|
null : ((StyleNode)SelectedStyle).RuntimeStyle;
|
|
}
|
|
|
|
private void UpdateTypeText()
|
|
{
|
|
if (SelectedStyle == null)
|
|
{
|
|
_txtType.Text = String.Empty;
|
|
}
|
|
else
|
|
{
|
|
_txtType.Text = ((StyleNode)SelectedStyle).FullName;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update scheme preview
|
|
/// </summary>
|
|
/// <internalonly/>
|
|
private void UpdateSamplePreview()
|
|
{
|
|
if (_firstActivate)
|
|
{
|
|
return;
|
|
}
|
|
|
|
NativeMethods.IHTMLDocument2 tridentDocument = _samplePreview.GetDocument();
|
|
NativeMethods.IHTMLElement documentElement = tridentDocument.GetBody();
|
|
NativeMethods.IHTMLBodyElement bodyElement;
|
|
|
|
bodyElement = (NativeMethods.IHTMLBodyElement) documentElement;
|
|
bodyElement.SetScroll("no");
|
|
|
|
if (SelectedStyle == null)
|
|
{
|
|
documentElement.SetInnerHTML(String.Empty);
|
|
tridentDocument.SetBgColor("buttonface");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
tridentDocument.SetBgColor(String.Empty);
|
|
}
|
|
|
|
bool cycle = ReferencesContainCycle(SelectedStyle);
|
|
if (cycle)
|
|
{
|
|
documentElement.SetInnerHTML(String.Empty);
|
|
return;
|
|
}
|
|
|
|
// apply the current Style to label
|
|
ApplyStyle();
|
|
|
|
DesignerTextWriter tw = new DesignerTextWriter();
|
|
|
|
//ToolTip
|
|
tw.AddAttribute("title", ((StyleNode)SelectedStyle).RuntimeStyle.Name);
|
|
|
|
// ForeColor
|
|
Color c = _previewStyle.ForeColor;
|
|
if (!c.Equals(Color.Empty))
|
|
{
|
|
tw.AddStyleAttribute("color", ColorTranslator.ToHtml(c));
|
|
}
|
|
|
|
// BackColor
|
|
c = _previewStyle.BackColor;
|
|
if (!c.Equals(Color.Empty))
|
|
{
|
|
tw.AddStyleAttribute("background-color", ColorTranslator.ToHtml(c));
|
|
}
|
|
|
|
// Font Name
|
|
String name = _previewStyle.Font.Name;
|
|
if (name.Length > 0)
|
|
{
|
|
tw.AddStyleAttribute("font-family", name);
|
|
}
|
|
|
|
// Font Size
|
|
switch (_previewStyle.Font.Size)
|
|
{
|
|
case FontSize.Large :
|
|
tw.AddStyleAttribute("font-size", "Medium");
|
|
break;
|
|
case FontSize.Small :
|
|
tw.AddStyleAttribute("font-size", "X-Small");
|
|
break;
|
|
default:
|
|
tw.AddStyleAttribute("font-size", "Small");
|
|
break;
|
|
}
|
|
|
|
// Font Style
|
|
if (_previewStyle.Font.Bold == BooleanOption.True)
|
|
{
|
|
tw.AddStyleAttribute("font-weight", "bold");
|
|
}
|
|
if (_previewStyle.Font.Italic == BooleanOption.True)
|
|
{
|
|
tw.AddStyleAttribute("font-style", "italic");
|
|
}
|
|
|
|
tw.RenderBeginTag("span");
|
|
tw.Write(SR.GetString(SR.StylesEditorDialog_PreviewText));
|
|
tw.RenderEndTag();
|
|
|
|
// and show it!
|
|
String finalHTML = "<div align='center'><table width='100%' height='100%'><tr><td><p align='center'>" +
|
|
tw.ToString() + "</p></td></tr></table></div>";
|
|
documentElement.SetInnerHTML(finalHTML);
|
|
}
|
|
|
|
/*
|
|
* BEGIN EVENT HANDLING
|
|
*/
|
|
Timer _delayTimer;
|
|
private void StylesEditorDialog_Activated(Object sender, System.EventArgs e)
|
|
{
|
|
if (!_firstActivate)
|
|
{
|
|
return;
|
|
}
|
|
_firstActivate = false;
|
|
|
|
_samplePreview.CreateTrident();
|
|
_samplePreview.ActivateTrident();
|
|
|
|
UpdateSamplePreview();
|
|
|
|
_delayTimer = new Timer();
|
|
_delayTimer.Interval = 100;
|
|
_delayTimer.Tick += new EventHandler(this.OnActivateDefinedStyles);
|
|
_delayTimer.Start();
|
|
}
|
|
|
|
private void OnActivateDefinedStyles(Object sender, System.EventArgs e)
|
|
{
|
|
_delayTimer.Stop();
|
|
_delayTimer.Tick -= new EventHandler(this.OnActivateDefinedStyles);
|
|
|
|
_lvAvailableStyles.Focus();
|
|
}
|
|
|
|
internal delegate void StyleRenamedEventHandler(
|
|
Object source, StyleRenamedEventArgs e);
|
|
|
|
internal event StyleRenamedEventHandler StyleRenamed;
|
|
|
|
private void OnStyleRenamed(StyleRenamedEventArgs e)
|
|
{
|
|
if(StyleRenamed != null)
|
|
{
|
|
StyleRenamed(this, e);
|
|
}
|
|
}
|
|
|
|
private void OnAfterLabelEdit(Object source, NodeLabelEditEventArgs e)
|
|
{
|
|
Debug.Assert(null != e);
|
|
Debug.Assert(e.CancelEdit == false);
|
|
|
|
// this happens when the label is unchanged after entering and exiting
|
|
// label editing mode - bizarre behavior. this may be a bug in treeview
|
|
if (null == e.Label)
|
|
{
|
|
return;
|
|
}
|
|
|
|
String oldValue = e.Node.Text;
|
|
String newValue = e.Label;
|
|
|
|
String messageTitle = SR.GetString(SR.Style_ErrorMessageTitle);
|
|
|
|
// can't accept a style name that already exists
|
|
if (String.Compare(oldValue, newValue , StringComparison.OrdinalIgnoreCase) != 0 && StyleIndex(newValue) >= 0)
|
|
{
|
|
MessageBox.Show(
|
|
SR.GetString(SR.Style_DuplicateName),
|
|
messageTitle,
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Exclamation);
|
|
e.CancelEdit = true;
|
|
return;
|
|
}
|
|
|
|
// can't accept an empty style name
|
|
if (newValue.Length == 0)
|
|
{
|
|
MessageBox.Show(
|
|
SR.GetString(SR.StylesEditorDialog_EmptyName),
|
|
messageTitle,
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Exclamation);
|
|
e.CancelEdit = true;
|
|
return;
|
|
}
|
|
|
|
/* Removed for DCR 4240
|
|
// can't accept an illegal style name
|
|
if (!DesignerUtility.IsValidName(newValue))
|
|
{
|
|
MessageBox.Show(
|
|
SR.GetString(SR.Style_InvalidName, newValue),
|
|
messageTitle,
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Exclamation);
|
|
e.CancelEdit = true;
|
|
return;
|
|
}
|
|
*/
|
|
|
|
SelectedStyle.RuntimeStyle.Name = newValue;
|
|
_tempStyleSheet.Remove(oldValue);
|
|
_tempStyleSheet[newValue] = SelectedStyle.RuntimeStyle;
|
|
|
|
if (ReferencesContainCycle(SelectedStyle))
|
|
{
|
|
// Restore original settings
|
|
SelectedStyle.RuntimeStyle.Name = oldValue;
|
|
_tempStyleSheet.Remove(newValue);
|
|
_tempStyleSheet[oldValue] = SelectedStyle.RuntimeStyle;
|
|
|
|
MessageBox.Show(
|
|
SR.GetString(SR.Style_NameChangeCauseCircularLoop),
|
|
messageTitle,
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Exclamation);
|
|
|
|
e.CancelEdit = true;
|
|
return;
|
|
}
|
|
|
|
// Raise StyleRenamed event for any styles which vere
|
|
// renamed.
|
|
OnStyleRenamed(
|
|
new StyleRenamedEventArgs(
|
|
oldValue,
|
|
newValue
|
|
)
|
|
);
|
|
}
|
|
|
|
private void OnCreateNewStyle()
|
|
{
|
|
String newStyleAutoID = AutoIDStyle();
|
|
|
|
Style newStyle = (Style)Activator.CreateInstance(_currentNewStyleType);
|
|
Debug.Assert(newStyle != null);
|
|
newStyle.Name = newStyleAutoID;
|
|
|
|
// Add this style to StyleSheet
|
|
_tempStyleSheet[newStyle.Name] = newStyle;
|
|
newStyle.SetControl(_tempStyleSheet);
|
|
|
|
StyleNode newStyleItem = new StyleNode(newStyle);
|
|
|
|
_tvDefinedStyles.Enabled = true;
|
|
_propertyBrowser.Enabled = true;
|
|
_tvDefinedStyles.Nodes.Add(newStyleItem);
|
|
SelectedStyle = newStyleItem;
|
|
|
|
UpdateSamplePreview();
|
|
UpdateButtonsEnabling();
|
|
}
|
|
|
|
private void OnClickOKButton(Object sender, EventArgs e)
|
|
{
|
|
SaveComponent();
|
|
Close();
|
|
DialogResult = DialogResult.OK;
|
|
}
|
|
|
|
private void OnStylesSelected(Object sender, TreeViewEventArgs e)
|
|
{
|
|
UpdateTypeText();
|
|
UpdatePropertyGrid();
|
|
UpdateSamplePreview();
|
|
UpdateButtonsEnabling();
|
|
UpdateFieldsEnabling();
|
|
}
|
|
|
|
private void OnNewStyleTypeChanged(Object sender, EventArgs e)
|
|
{
|
|
if (_lvAvailableStyles.SelectedItems.Count != 0)
|
|
{
|
|
_currentNewStyleType = Type.GetType((String) _lvAvailableStyles.SelectedItems[0].SubItems[1].Text + "." +
|
|
_lvAvailableStyles.SelectedItems[0].Text, true);
|
|
//Debug.Assert(typeof(Style).IsAssignableFrom(_currentNewStyleType), "Non style object passed in.");
|
|
}
|
|
}
|
|
|
|
private void MoveSelectedNode(int direction)
|
|
{
|
|
Debug.Assert(direction == 1 || direction == -1);
|
|
|
|
StyleNode node = SelectedStyle;
|
|
Debug.Assert(node != null);
|
|
|
|
int index = node.Index;
|
|
_tvDefinedStyles.Nodes.RemoveAt(index);
|
|
_tvDefinedStyles.Nodes.Insert(index + direction, node);
|
|
SelectedStyle = node;
|
|
}
|
|
|
|
private void OnClickUpButton(Object source, EventArgs e)
|
|
{
|
|
MoveSelectedNode(-1);
|
|
UpdateButtonsEnabling();
|
|
}
|
|
|
|
private void OnClickDownButton(Object source, EventArgs e)
|
|
{
|
|
MoveSelectedNode(1);
|
|
UpdateButtonsEnabling();
|
|
}
|
|
|
|
private void OnClickAddButton(Object sender, EventArgs e)
|
|
{
|
|
OnCreateNewStyle();
|
|
}
|
|
|
|
internal delegate void StyleDeletedEventHandler(
|
|
Object source, StyleDeletedEventArgs e);
|
|
|
|
internal event StyleDeletedEventHandler StyleDeleted;
|
|
|
|
private void OnStyleDeleted(StyleDeletedEventArgs e)
|
|
{
|
|
if(StyleDeleted != null)
|
|
{
|
|
StyleDeleted(this, e);
|
|
}
|
|
}
|
|
|
|
private void OnClickRemoveButton(Object source, EventArgs e)
|
|
{
|
|
Debug.Assert(SelectedStyle != null);
|
|
|
|
String message = SR.GetString(SR.StylesEditorDialog_DeleteStyleMessage);
|
|
String caption = SR.GetString(SR.StylesEditorDialog_DeleteStyleCaption);
|
|
|
|
if (System.Windows.Forms.MessageBox.Show(message,
|
|
caption, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.No)
|
|
{
|
|
return;
|
|
}
|
|
|
|
String deletedStyle = ((StyleNode)SelectedStyle).RuntimeStyle.Name;
|
|
|
|
// Remove this style from temporary StyleSheet
|
|
_tempStyleSheet.Remove(deletedStyle);
|
|
((StyleNode)SelectedStyle).Dispose();
|
|
|
|
int selectedIndex = SelectedStyle.Index;
|
|
int stylesCount = _tvDefinedStyles.Nodes.Count;
|
|
|
|
_tvDefinedStyles.Nodes.RemoveAt(selectedIndex);
|
|
OnStyleDeleted(new StyleDeletedEventArgs(deletedStyle));
|
|
|
|
if (selectedIndex < stylesCount-1)
|
|
{
|
|
SelectedStyle = (StyleNode) _tvDefinedStyles.Nodes[selectedIndex];
|
|
}
|
|
else if (selectedIndex >= 1)
|
|
{
|
|
SelectedStyle = (StyleNode) _tvDefinedStyles.Nodes[selectedIndex-1];
|
|
}
|
|
else if (stylesCount == 1)
|
|
{
|
|
SelectedStyle = null;
|
|
UpdateTypeText();
|
|
UpdatePropertyGrid();
|
|
UpdateSamplePreview();
|
|
UpdateButtonsEnabling();
|
|
UpdateFieldsEnabling();
|
|
}
|
|
}
|
|
|
|
private void OnDoubleClick(Object sender, EventArgs e)
|
|
{
|
|
OnCreateNewStyle();
|
|
}
|
|
|
|
private void OnKeyDown(Object sender, KeyEventArgs e)
|
|
{
|
|
switch(e.KeyData)
|
|
{
|
|
case Keys.F2:
|
|
{
|
|
if(SelectedStyle != null)
|
|
{
|
|
SelectedStyle.BeginEdit();
|
|
}
|
|
break;
|
|
}
|
|
case (Keys.Control | Keys.Home):
|
|
{
|
|
if(_tvDefinedStyles.Nodes.Count > 0)
|
|
{
|
|
SelectedStyle = (StyleNode)_tvDefinedStyles.Nodes[0];
|
|
}
|
|
break;
|
|
}
|
|
case (Keys.Control | Keys.End):
|
|
{
|
|
int numNodes = _tvDefinedStyles.Nodes.Count;
|
|
if(numNodes > 0)
|
|
{
|
|
SelectedStyle = (StyleNode)_tvDefinedStyles.Nodes[numNodes - 1];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnListMouseUp(Object sender, MouseEventArgs e)
|
|
{
|
|
_editCandidateNode= null;
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
_editCandidateNode = (TreeNode)_tvDefinedStyles.GetNodeAt (e.X, e.Y);
|
|
}
|
|
}
|
|
|
|
private void OnListMouseDown(Object sender, MouseEventArgs e)
|
|
{
|
|
_editCandidateNode = null;
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
_editCandidateNode = (TreeNode)_tvDefinedStyles.GetNodeAt (e.X, e.Y);
|
|
}
|
|
}
|
|
|
|
private void OnPopup(Object sender, EventArgs e)
|
|
{
|
|
_cntxtMenuItem.Enabled = (_editCandidateNode != null ||
|
|
_tvDefinedStyles.SelectedNode != null);
|
|
}
|
|
|
|
private void OnContextMenuItemClick(Object sender, EventArgs e)
|
|
{
|
|
if(_editCandidateNode == null)
|
|
{
|
|
// context menu key pressed
|
|
if (_tvDefinedStyles.SelectedNode != null)
|
|
{
|
|
_tvDefinedStyles.SelectedNode.BeginEdit();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// right mouseclick
|
|
_editCandidateNode.BeginEdit();
|
|
}
|
|
_editCandidateNode = null;
|
|
}
|
|
|
|
private void OnPropertyValueChanged(Object sender, PropertyValueChangedEventArgs e)
|
|
{
|
|
if (SelectedStyle == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
UpdateSamplePreview();
|
|
}
|
|
|
|
/*
|
|
* END EVENT HANDLING
|
|
*/
|
|
|
|
private bool ReferencesContainCycle(StyleNode startingStyleItem)
|
|
{
|
|
StyleNode currentStyleItem = startingStyleItem;
|
|
Style currentStyle = currentStyleItem.RuntimeStyle;
|
|
String reference = currentStyle.StyleReference;
|
|
bool found = true;
|
|
bool cycle = false;
|
|
|
|
// Clear referenced boolean
|
|
foreach (StyleNode styleNode in _tvDefinedStyles.Nodes)
|
|
{
|
|
styleNode.Referenced = false;
|
|
}
|
|
|
|
// Set current style as referenced.
|
|
currentStyleItem.Referenced = true;
|
|
|
|
while ((reference != null && reference.Length > 0) && found && !cycle)
|
|
{
|
|
found = false;
|
|
foreach (StyleNode styleNode in _tvDefinedStyles.Nodes)
|
|
{
|
|
Style style = styleNode.RuntimeStyle;
|
|
if (0 == String.Compare(style.Name, reference, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
reference = style.StyleReference;
|
|
found = true;
|
|
if (styleNode.Referenced)
|
|
{
|
|
cycle = true;
|
|
}
|
|
else
|
|
{
|
|
styleNode.Referenced = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// keep on looking.
|
|
// It depends on whether a style defined in web.config can have a reference or not.
|
|
|
|
/* if we do need to keep on looking we need to store the Referenced flag
|
|
// for those styles as well.
|
|
// If not found, check default styles
|
|
if (!found)
|
|
{
|
|
if (null != StyleSheet.Default[reference])
|
|
{
|
|
Style style = StyleSheet.Default[reference];
|
|
reference = style.Reference;
|
|
found = true;
|
|
// get styleNode from other list
|
|
if (styleNode.Referenced)
|
|
{
|
|
cycle = true;
|
|
}
|
|
else
|
|
{
|
|
styleNode.Referenced = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
return cycle;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Apply the currently selected style to the preview label.
|
|
/// This function should only be called after making sure that there is no
|
|
/// cycle that starts with _tvDefinedStyles.SelectedItem
|
|
/// </summary>
|
|
private void ApplyStyle()
|
|
{
|
|
StyleNode currentStyleItem = (StyleNode)SelectedStyle;
|
|
Style currentStyle = currentStyleItem.RuntimeStyle;
|
|
|
|
Color foreColor = currentStyle.ForeColor;
|
|
Color backColor = currentStyle.BackColor;
|
|
BooleanOption fontBold = currentStyle.Font.Bold;
|
|
BooleanOption fontItalic = currentStyle.Font.Italic;
|
|
FontSize fontSize = currentStyle.Font.Size;
|
|
String fontName = currentStyle.Font.Name;
|
|
String reference = currentStyle.StyleReference;
|
|
|
|
bool found = true;
|
|
|
|
while ((reference != null && reference.Length > 0) && found)
|
|
{
|
|
found = false;
|
|
foreach (StyleNode styleNode in _tvDefinedStyles.Nodes)
|
|
{
|
|
Style style = styleNode.RuntimeStyle;
|
|
if (0 == String.Compare(style.Name, reference, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
if (foreColor == Color.Empty)
|
|
{
|
|
foreColor = style.ForeColor;
|
|
}
|
|
if (backColor == Color.Empty)
|
|
{
|
|
backColor = style.BackColor;
|
|
}
|
|
if (fontBold == BooleanOption.NotSet)
|
|
{
|
|
fontBold = style.Font.Bold;
|
|
}
|
|
if (fontItalic == BooleanOption.NotSet)
|
|
{
|
|
fontItalic = style.Font.Italic;
|
|
}
|
|
if (fontSize == FontSize.NotSet)
|
|
{
|
|
fontSize = style.Font.Size;
|
|
}
|
|
if (fontName.Length == 0)
|
|
{
|
|
fontName = style.Font.Name;
|
|
}
|
|
reference = style.StyleReference;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// If not found, check default styles
|
|
if (!found)
|
|
{
|
|
if (null != StyleSheet.Default[reference])
|
|
{
|
|
Style style = StyleSheet.Default[reference];
|
|
if (foreColor == Color.Empty)
|
|
{
|
|
foreColor = style.ForeColor;
|
|
}
|
|
if (backColor == Color.Empty)
|
|
{
|
|
backColor = style.BackColor;
|
|
}
|
|
if (fontBold == BooleanOption.NotSet)
|
|
{
|
|
fontBold = style.Font.Bold;
|
|
}
|
|
if (fontItalic == BooleanOption.NotSet)
|
|
{
|
|
fontItalic = style.Font.Italic;
|
|
}
|
|
if (fontSize == FontSize.NotSet)
|
|
{
|
|
fontSize = style.Font.Size;
|
|
}
|
|
if (fontName.Length == 0)
|
|
{
|
|
fontName = style.Font.Name;
|
|
}
|
|
reference = null;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
_previewStyle.ForeColor = foreColor;
|
|
_previewStyle.BackColor = backColor;
|
|
_previewStyle.Font.Name = fontName;
|
|
_previewStyle.Font.Size = fontSize;
|
|
_previewStyle.Font.Bold = fontBold;
|
|
_previewStyle.Font.Italic = fontItalic;
|
|
}
|
|
|
|
/*
|
|
* BEGIN INTERNAL CLASS
|
|
*/
|
|
|
|
[
|
|
System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
|
|
Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
|
|
]
|
|
private class StyleNode : TreeNode
|
|
{
|
|
private String _fullName;
|
|
private bool _referenced;
|
|
private Style _runtimeStyle;
|
|
private EventHandler _styleReferenceChanged;
|
|
private String _styleReference;
|
|
|
|
internal StyleNode(Style style)
|
|
{
|
|
_runtimeStyle = style;
|
|
_fullName = style.GetType().FullName;
|
|
_styleReference = RuntimeStyle.StyleReference;
|
|
_styleReferenceChanged = new EventHandler(this.OnStyleReferenceChanged);
|
|
base.Text = RuntimeStyle.Name;
|
|
|
|
|
|
PropertyDescriptor property;
|
|
property = TypeDescriptor.GetProperties(typeof(Style))["StyleReference"];
|
|
Debug.Assert(property != null);
|
|
property.AddValueChanged(RuntimeStyle, _styleReferenceChanged);
|
|
}
|
|
|
|
internal Style RuntimeStyle
|
|
{
|
|
get
|
|
{
|
|
return _runtimeStyle;
|
|
}
|
|
}
|
|
|
|
internal bool Referenced
|
|
{
|
|
get
|
|
{
|
|
return _referenced;
|
|
}
|
|
|
|
set
|
|
{
|
|
_referenced = value;
|
|
}
|
|
}
|
|
|
|
internal String FullName
|
|
{
|
|
get
|
|
{
|
|
return _fullName;
|
|
}
|
|
}
|
|
|
|
internal void Dispose()
|
|
{
|
|
PropertyDescriptor property;
|
|
property = TypeDescriptor.GetProperties(typeof(Style))["StyleReference"];
|
|
Debug.Assert(property != null);
|
|
property.RemoveValueChanged(RuntimeStyle, _styleReferenceChanged);
|
|
}
|
|
|
|
// Note that it return false if any of the referenced styles are already in a loop
|
|
// ie. it returns true if and only if current style is in a loop now.
|
|
private bool InCircularLoop()
|
|
{
|
|
StyleSheet styleSheet = (StyleSheet)RuntimeStyle.Control;
|
|
Debug.Assert(styleSheet != null);
|
|
|
|
String reference = RuntimeStyle.StyleReference;
|
|
int count = styleSheet.Styles.Count + 1;
|
|
|
|
while ((reference != null && reference.Length > 0) && count > 0)
|
|
{
|
|
if (0 == String.Compare(RuntimeStyle.Name, reference, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
Style style = styleSheet[reference];
|
|
if (null != style)
|
|
{
|
|
reference = style.StyleReference;
|
|
count --;
|
|
}
|
|
else
|
|
{
|
|
reference = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private void OnStyleReferenceChanged(Object sender, EventArgs e)
|
|
{
|
|
if (InCircularLoop())
|
|
{
|
|
RestoreStyleReference();
|
|
// new style reference creates a cycle
|
|
throw new Exception(SR.GetString(SR.Style_ReferenceCauseCircularLoop));
|
|
}
|
|
|
|
CacheStyleReference();
|
|
}
|
|
|
|
private void RestoreStyleReference()
|
|
{
|
|
RuntimeStyle.StyleReference = _styleReference;
|
|
}
|
|
|
|
private void CacheStyleReference()
|
|
{
|
|
_styleReference = RuntimeStyle.StyleReference;
|
|
}
|
|
}
|
|
}
|
|
|
|
[
|
|
System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
|
|
Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
|
|
]
|
|
[Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
|
|
internal sealed class StyleRenamedEventArgs : EventArgs
|
|
{
|
|
private String _oldName;
|
|
private String _newName;
|
|
|
|
internal StyleRenamedEventArgs(
|
|
String oldName,
|
|
String newName)
|
|
{
|
|
_oldName = oldName;
|
|
_newName = newName;
|
|
}
|
|
|
|
internal String OldName
|
|
{
|
|
get
|
|
{
|
|
return _oldName;
|
|
}
|
|
}
|
|
|
|
internal String NewName
|
|
{
|
|
get
|
|
{
|
|
return _newName;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
[
|
|
System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
|
|
Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
|
|
]
|
|
[Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
|
|
internal sealed class StyleDeletedEventArgs : EventArgs
|
|
{
|
|
private String _name;
|
|
|
|
internal StyleDeletedEventArgs(String name)
|
|
{
|
|
_name = name;
|
|
}
|
|
|
|
internal String Name
|
|
{
|
|
get
|
|
{
|
|
return _name;
|
|
}
|
|
}
|
|
}
|
|
}
|