//------------------------------------------------------------------------------ // <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%'>" + tw.ToString() + "</p></td>