File: UI\MobileControls\Design\ObjectListCommandsPage.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="ObjectListCommandsPage.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Web.UI.Design.MobileControls
{
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using System.Drawing;
    using System.Web.UI.MobileControls;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;
//    using System.Web.UI.Design.Util;
 
    using System.Web.UI.Design.MobileControls.Util;
 
    using ObjectList = System.Web.UI.MobileControls.ObjectList;
    using Label      = System.Windows.Forms.Label;
    using TextBox    = System.Windows.Forms.TextBox;
 
    /// <summary>
    ///   The Commands page for the ObjectList control.
    /// </summary>
    /// <internalonly/>
    [
        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 ObjectListCommandsPage : ListComponentEditorPage
    {
        private ComboBox _cmbDefaultCommand;
        private TextBox _txtText = null;
        private ObjectList _objectList = null;
 
        public ObjectListCommandsPage()
        {
            Y = 24;
            CaseSensitive = false;
            TreeViewTitle           = SR.GetString(SR.ObjectListCommandsPage_CommandNameCaption);
            AddButtonTitle          = SR.GetString(SR.ObjectListCommandsPage_NewCommandBtnCaption);
            DefaultName             = SR.GetString(SR.ObjectListCommandsPage_DefaultCommandName);
            MessageTitle            = SR.GetString(SR.ObjectListCommandsPage_ErrorMessageTitle);
            EmptyNameMessage        = SR.GetString(SR.ObjectListCommandsPage_EmptyNameError);
            // DuplicateNameMessage = SR.GetString(SR.ObjectListCommandsPage_DuplicateNameError);
            // InvalidNameMessage   = SR.GetString(SR.ObjectListCommandsPage_InvalidName);  // DCR 4240
        }
 
        protected override String HelpKeyword 
        {
            get 
            {
                return "net.Mobile.ObjectListProperties.Commands";
            }
        }
 
        protected override void InitForm()
        {
            base.InitForm();
 
            this._objectList = (ObjectList)Component;
            this.CommitOnDeactivate = true;
            this.Icon = new Icon(
                typeof(System.Web.UI.Design.MobileControls.MobileControlDesigner),
                "Commands.ico"
            );
            this.Size = new Size(402, 300);
            this.Text = SR.GetString(SR.ObjectListCommandsPage_Title);
 
            GroupLabel grplblCommandList = new GroupLabel();
            grplblCommandList.SetBounds(4, 4, 392, LabelHeight);
            grplblCommandList.Text = SR.GetString(SR.ObjectListCommandsPage_CommandListGroupLabel);
            grplblCommandList.TabIndex = 0;
            grplblCommandList.TabStop = false;
 
            TreeList.TabIndex = 1;
 
            Label lblText = new Label();
            lblText.SetBounds(X, Y, ControlWidth, LabelHeight);
            lblText.Text = SR.GetString(SR.ObjectListCommandsPage_TextCaption);
            lblText.TabStop = false;
            lblText.TabIndex = TabIndex;
 
            _txtText = new TextBox();
            Y += LabelHeight;
            _txtText.SetBounds(X, Y, ControlWidth, CmbHeight);
            _txtText.TextChanged += new EventHandler(this.OnPropertyChanged);
            _txtText.TabIndex = TabIndex + 1;
 
            GroupLabel grplblData = new GroupLabel();
            grplblData.SetBounds(4, 238, 392, LabelHeight);
            grplblData.Text = SR.GetString(SR.ObjectListCommandsPage_DataGroupLabel);
            grplblData.TabIndex = TabIndex + 2;
            grplblData.TabStop = false;
 
            Label lblDefaultCommand = new Label();
            lblDefaultCommand.SetBounds(8, 260, 182, LabelHeight);
            lblDefaultCommand.Text = SR.GetString(SR.ObjectListCommandsPage_DefaultCommandCaption);
            lblDefaultCommand.TabStop = false;
            lblDefaultCommand.TabIndex = TabIndex + 3;
 
            _cmbDefaultCommand = new ComboBox();
            _cmbDefaultCommand.SetBounds(8, 276, 182, 64);
            _cmbDefaultCommand.DropDownStyle = ComboBoxStyle.DropDown;
            _cmbDefaultCommand.Sorted = true;
            _cmbDefaultCommand.TabIndex = TabIndex + 4;
            _cmbDefaultCommand.SelectedIndexChanged += new EventHandler(this.OnSetPageDirty);
            _cmbDefaultCommand.TextChanged += new EventHandler(this.OnSetPageDirty);
 
            this.Controls.AddRange(new Control[] 
                                    {
                                        grplblCommandList,
                                        lblText,
                                        _txtText,
                                        grplblData,
                                        lblDefaultCommand,
                                        _cmbDefaultCommand
                                    });
        }
 
        protected override void InitPage() 
        {
            base.InitPage();
 
            _cmbDefaultCommand.Text = _objectList.DefaultCommand;
            _txtText.Text = String.Empty;
        }
 
        protected override void LoadItems()
        {
            using (new LoadingModeResource(this))
            {
                foreach (ObjectListCommand command in _objectList.Commands)
                {
                    CommandTreeNode newNode = new CommandTreeNode(command.Name, command);
                    TreeList.TvList.Nodes.Add(newNode);
                }
            }
            LoadDefaultCommands();
        }
 
        protected override void LoadItemProperties() 
        {
            using (new LoadingModeResource(this))
            {
                if (CurrentNode != null)
                {
                    CommandTreeNode currentCommandNode = (CommandTreeNode)CurrentNode;
                    _txtText.Text = currentCommandNode.Text;
                }
                else
                {
                    _txtText.Text = String.Empty;
                }
            }
        }
 
        private void LoadDefaultCommands()
        {
            _cmbDefaultCommand.Items.Clear();
            foreach (CommandTreeNode commandNode in TreeList.TvList.Nodes)
            {
                _cmbDefaultCommand.Items.Add(commandNode.Name);
            }
        }
 
        private void OnSetPageDirty(Object source, EventArgs e) 
        {
            if (IsLoading())
            {
                return;
            }
            SetDirty();
        }
 
        protected override void OnClickAddButton(Object source, EventArgs e)
        {
            if (IsLoading())
            {
                return;
            }
 
            CommandTreeNode newNode = new CommandTreeNode(GetNewName());
            TreeList.TvList.Nodes.Add(newNode);
 
            TreeList.TvList.SelectedNode = newNode;
            CurrentNode = newNode;
            newNode.Dirty = true;
            newNode.BeginEdit();
 
            LoadItemProperties();
            LoadDefaultCommands();
            SetDirty();
        }
 
        protected override void OnClickRemoveButton(Object source, EventArgs e)
        {
            base.OnClickRemoveButton(source, e);
            LoadDefaultCommands();
        }
 
        protected override void OnNodeRenamed()
        {
            LoadDefaultCommands();
        }
 
        protected override void OnPropertyChanged(Object source, EventArgs e)
        {
            if (IsLoading())
            {
                return;
            }
 
            // This means there are no fields yet. Do nothing
            if (CurrentNode == null)
            {
                return;
            }
 
            ((CommandTreeNode)CurrentNode).Text = _txtText.Text;
 
            SetDirty();
            CurrentNode.Dirty = true;
        }
 
        protected override void SaveComponent()
        {
            // Delegate to base implementation first!
            // This will properly close ListTreeNode editing mode.
            base.SaveComponent();
 
            _objectList.DefaultCommand = _cmbDefaultCommand.Text;
 
            _objectList.Commands.Clear();
 
            foreach (CommandTreeNode commandNode in TreeList.TvList.Nodes)
            {
                if (commandNode.Dirty)
                {
                    commandNode.RuntimeCommand.Text = commandNode.Text;
                    commandNode.RuntimeCommand.Name = commandNode.Name;
                }
 
                _objectList.Commands.AddAt(-1, commandNode.RuntimeCommand);
            }
 
            TypeDescriptor.Refresh(_objectList);
        }
 
        protected override void UpdateControlsEnabling()
        {
            TreeList.TvList.Enabled = 
                _txtText.Enabled = (TreeList.TvList.SelectedNode != null);
        }
 
        /// <summary>
        ///    Internal object used to store all command properties
        /// </summary>
        [
            System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
            Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
        ]
        private class CommandTreeNode : ListTreeNode
        {
            private ObjectListCommand   _runtimeCommand;
            private String              _text;
 
            /// <summary>
            /// </summary>
            internal CommandTreeNode(String name) : this(name, new ObjectListCommand())
            {
            }
 
            /// <summary>
            /// </summary>
            internal CommandTreeNode(String name, ObjectListCommand runtimeCommand) : base(name)
            {
                Debug.Assert(name != null, "invalid name for ObjectListCommand");
                Debug.Assert(runtimeCommand != null, "null ObjectListCommand");
 
                this._runtimeCommand = runtimeCommand;
                LoadAttributes();
            }
 
            internal void LoadAttributes()
            {
                this._text = _runtimeCommand.Text;
            }
 
            internal ObjectListCommand RuntimeCommand
            {
                get
                {
                    return _runtimeCommand;
                }
            }
 
            internal new String Text
            {
                get
                {
                    return _text;
                }
 
                set
                {
                    _text = value;
                }
            }
        }
    }
}