AppliedDeviceFiltersDialog.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / MIT / System / Web / UI / MobileControls / Design / AppliedDeviceFiltersDialog.cs / 1305376 / AppliedDeviceFiltersDialog.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

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.Diagnostics;
    using System.Drawing; 
    using System.Drawing.Design; 
    using System.IO;
    using System.Reflection; 
    using System.Text;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;
 
    using System.Web.UI.MobileControls;
    using System.Web.UI.Design.MobileControls.Util; 
 
    [
        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 AppliedDeviceFiltersDialog : 
        DesignerForm, IRefreshableDeviceSpecificEditor
    { 
        private bool _isDirty = true; 
        private IDeviceSpecificDesigner _designer = null;
        private WebConfigManager _webConfig = null; 
        private IDictionary _cachedDeviceSpecifics =
            new HybridDictionary(true /* make case-insensitive */ );
        private String _currentDeviceSpecificID = null;
 
        private System.Windows.Forms.Label _lblAvailableFilters;
        private System.Windows.Forms.Button _btnEditFilters; 
        private System.Windows.Forms.ComboBox _cbAvailableFilters; 
        private System.Windows.Forms.Button _btnApplyFilter;
        private System.Windows.Forms.Button _cmdCancel; 
        private System.Windows.Forms.Button _cmdOK;
        private System.Windows.Forms.Panel _pnlMain;
        private System.Windows.Forms.Label _lblArgument;
        private System.Windows.Forms.TextBox _tbArgument; 
        private EditableTreeList _appliedFiltersList;
 
        internal AppliedDeviceFiltersDialog( 
            IDeviceSpecificDesigner designer,
            int mergingContext) : base (designer.UnderlyingControl.Site) 
        {
            _designer = designer;
            _designer.SetDeviceSpecificEditor(this);
 
            // Required for Win Form Designer support
            InitializeComponent(); 
 
            _lblAvailableFilters.Text =
                SR.GetString(SR.AppliedDeviceFiltersDialog_AvailableDeviceFilters); 
            _appliedFiltersList.LblTitle.Text =
                SR.GetString(SR.AppliedDeviceFiltersDialog_AppliedDeviceFilters);
            _btnEditFilters.Text = SR.GetString(SR.GenericDialog_Edit);
            _btnApplyFilter.Text = 
                SR.GetString(SR.AppliedDeviceFiltersDialog_ApplyDeviceFilter);
            _lblArgument.Text = 
                SR.GetString(SR.AppliedDeviceFiltersDialog_Argument); 
            _cmdOK.Text = SR.GetString(SR.GenericDialog_OKBtnCaption);
            _cmdCancel.Text = SR.GetString(SR.GenericDialog_CancelBtnCaption); 

            int tabOffset = GenericUI.InitDialog(
                this,
                _designer, 
                mergingContext
            ); 
 
            this.Text = _designer.UnderlyingControl.ID
                + " - " + SR.GetString(SR.AppliedDeviceFiltersDialog_Title); 
            SetTabIndexes(tabOffset);
            _webConfig = new WebConfigManager(_designer.UnderlyingControl.Site);
            LoadAvailableFilters();
 
            // Note that the following can cause an
            // IDeviceSpecificDesigner.Refresh() to occur as a side-effect. 
            _designer.RefreshHeader(mergingContext); 

            _currentDeviceSpecificID = _designer.CurrentDeviceSpecificID; 
            if(_currentDeviceSpecificID != null)
            {
                DeviceSpecific ds;
                _designer.GetDeviceSpecific(_currentDeviceSpecificID, out ds); 
                LoadChoices(ds);
            } 
 
            // Register Event Handlers
            _cbAvailableFilters.SelectedIndexChanged += new EventHandler( 
                OnAvailableFilterSelected
            );
            _cbAvailableFilters.TextChanged += new EventHandler(
                OnAvailableFilterSelected 
            );
            _btnApplyFilter.Click += new EventHandler(OnApplyFilter); 
            _btnEditFilters.Click += new EventHandler(OnEditFilters); 
            _appliedFiltersList.TvList.AfterSelect += new TreeViewEventHandler(OnAppliedFilterSelected);
            _appliedFiltersList.TvList.AfterLabelEdit += new NodeLabelEditEventHandler(OnAfterLabelEdit); 
            _appliedFiltersList.BtnUp.Click += new EventHandler(OnAppliedFiltersReordered);
            _appliedFiltersList.BtnDown.Click += new EventHandler(OnAppliedFiltersReordered);
            _appliedFiltersList.BtnRemove.Click -= _appliedFiltersList.RemoveHandler;
            _appliedFiltersList.BtnRemove.Click += new EventHandler(OnRemove); 
            _tbArgument.TextChanged += new EventHandler(OnArgumentChanged);
            _cmdOK.Click += new EventHandler(OnOK); 
            _cmdCancel.Click += new EventHandler(OnCancel); 

            UpdateUI(); 
        }

        protected override string HelpTopic {
            get { return "net.Mobile.AppliedDeviceFiltersDialog"; } 
        }
 
        internal void SetTabIndexes(int tabOffset) 
        {
            _pnlMain.TabIndex = ++tabOffset; 
            _lblAvailableFilters.TabIndex = ++tabOffset;
            _cbAvailableFilters.TabIndex = ++tabOffset;
            _btnEditFilters.TabIndex = ++tabOffset;
            _btnApplyFilter.TabIndex = ++tabOffset; 
            _appliedFiltersList.TabIndex = ++tabOffset;
            _lblArgument.TabIndex = ++tabOffset; 
            _tbArgument.TabIndex = ++tabOffset; 
            _cmdOK.TabIndex = ++tabOffset;
            _cmdCancel.TabIndex = ++tabOffset; 
        }

        private void InitializeComponent()
        { 
            this._appliedFiltersList =
                new System.Web.UI.Design.MobileControls.Util.EditableTreeList( 
                false, true, 16 
                );
            this._btnEditFilters = new System.Windows.Forms.Button(); 
            this._cmdOK = new System.Windows.Forms.Button();
            this._pnlMain = new System.Windows.Forms.Panel();
            this._tbArgument = new System.Windows.Forms.TextBox();
            this._lblArgument = new System.Windows.Forms.Label(); 
            this._cmdCancel = new System.Windows.Forms.Button();
            this._lblAvailableFilters = new System.Windows.Forms.Label(); 
            this._cbAvailableFilters = new System.Windows.Forms.ComboBox(); 
            this._btnApplyFilter = new System.Windows.Forms.Button();
            this._pnlMain.SuspendLayout(); 
            this.SuspendLayout();
            //
            // _appliedFiltersList
            // 
            this._appliedFiltersList.Location = new System.Drawing.Point(0, 74);
            this._appliedFiltersList.Name = "_appliedFiltersList"; 
            this._appliedFiltersList.Size = new System.Drawing.Size(275, 208); 
            //
            // _btnEditFilters 
            //
            this._btnEditFilters.Location = new System.Drawing.Point(201, 15);
            this._btnEditFilters.Size = new System.Drawing.Size(75, 23);
            this._btnEditFilters.Name = "_btnEditFilters"; 
            //
            // _cmdOK 
            // 
            this._cmdOK.Location = new System.Drawing.Point(120, 334);
            this._cmdOK.Name = "_cmdOK"; 
            //
            // _pnlMain
            //
            this._pnlMain.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); 
            this._pnlMain.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                   this._tbArgument, 
                                                                                   this._lblArgument, 
                                                                                   this._appliedFiltersList,
                                                                                   this._cmdCancel, 
                                                                                   this._cmdOK,
                                                                                   this._lblAvailableFilters,
                                                                                   this._btnEditFilters,
                                                                                   this._cbAvailableFilters, 
                                                                                   this._btnApplyFilter});
            this._pnlMain.Location = new System.Drawing.Point(6, 8); 
            this._pnlMain.Name = "_pnlMain"; 
            this._pnlMain.Size = new System.Drawing.Size(276, 357);
            // 
            // _tbArgument
            //
            this._tbArgument.Location = new System.Drawing.Point(0, 306);
            this._tbArgument.Name = "_tbArgument"; 
            this._tbArgument.Size = new System.Drawing.Size(275, 20);
            this._tbArgument.Text = String.Empty; 
            // 
            // _lblArgument
            // 
            this._lblArgument.Location = new System.Drawing.Point(0, 290);
            this._lblArgument.Name = "_lblArgument";
            this._lblArgument.Size = new System.Drawing.Size(275, 16);
            // 
            // _cmdCancel
            // 
            this._cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; 
            this._cmdCancel.Location = new System.Drawing.Point(201, 334);
            this._cmdCancel.Name = "_cmdCancel"; 
            //
            // _lblAvailableFilters
            //
            this._lblAvailableFilters.Name = "_lblAvailableFilters"; 
            this._lblAvailableFilters.Size = new System.Drawing.Size(198, 16);
            // 
            // _cbAvailableFilters 
            //
            this._cbAvailableFilters.DropDownWidth = 195; 
            this._cbAvailableFilters.Location = new System.Drawing.Point(0, 16);
            this._cbAvailableFilters.Name = "_cbAvailableFilters";
            this._cbAvailableFilters.Size = new System.Drawing.Size(195, 21);
            this._cbAvailableFilters.Sorted = true; 
            //
            // _btnApplyFilter 
            // 
            this._btnApplyFilter.Location = new System.Drawing.Point(0, 44);
            this._btnApplyFilter.Name = "_btnApplyFilter"; 
            this._btnApplyFilter.Size = new System.Drawing.Size(195, 23);
            //
            // AppliedDeviceFiltersDialog
            // 
            this.AcceptButton = this._cmdOK;
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 
            this.CancelButton = this._cmdCancel; 
            this.ClientSize = new System.Drawing.Size(285, 373);
            this.Controls.AddRange(new System.Windows.Forms.Control[] { 
                                                                          this._pnlMain});
            this.Name = "AppliedDeviceFiltersDialog";
            this._pnlMain.ResumeLayout(false);
            this.ResumeLayout(false); 
        }
 
        private void LoadAvailableFilters() 
        {
            _cbAvailableFilters.Items.Clear(); 
            try
            {
                ArrayList filterList = _webConfig.ReadDeviceFilters();
                _cbAvailableFilters.Sorted = false; 
                foreach(DeviceFilterNode node in filterList)
                { 
                    _cbAvailableFilters.Items.Add(node); 
                }
            } 
            catch (Exception e)
            {
                Debug.Fail(e.ToString());
                // This is okay.  They may still apply a default or external 
                // device filter.
            } 
            _cbAvailableFilters.Sorted = true; 
            EnsureDefaultFilterAvailableXorApplied();
 
            // If there is no filter selected, or there was a filter selected
            // but that filter no longer exists
            if( _cbAvailableFilters.Text.Length == 0
                || FindAvailableFilter(_cbAvailableFilters.Text) == null) 
            {
                SelectFirstAvailableFilter(); 
            } 
        }
 
        private void CacheState(String deviceSpecificID)
        {
            _cachedDeviceSpecifics[deviceSpecificID] = new AppliedFiltersCachedState(
                _appliedFiltersList.TvList 
            );
        } 
 
        private void CacheCurrentState()
        { 
            CacheState(_currentDeviceSpecificID);
        }

        private bool RestoreState(String deviceSpecificID) 
        {
            if (null != deviceSpecificID) 
            { 
                _currentDeviceSpecificID = deviceSpecificID;
                AppliedFiltersCachedState state = 
                    (AppliedFiltersCachedState) _cachedDeviceSpecifics[
                        _currentDeviceSpecificID
                    ];
                if(state != null) 
                {
                    state.Restore(_appliedFiltersList.TvList); 
                    EnsureDefaultFilterAvailableXorApplied(); 
                    return true;
                } 
            }
            else
            {
                _currentDeviceSpecificID = null; 
            }
            return false; 
        } 

        private DeviceFilterNode CreateExternalFilter(String name) 
        {
            DeviceFilterNode externalFilter;
            externalFilter = new DeviceFilterNode(_webConfig);
            externalFilter.Name = name; 
            return externalFilter;
        } 
 
        private void LoadChoice(DeviceSpecificChoice runtimeChoice)
        { 
            DeviceFilterNode filterUsed =
                FindAvailableFilter(runtimeChoice.Filter);

            ChoiceTreeNode choice = new ChoiceTreeNode( 
                filterUsed,
                runtimeChoice, 
                _designer 
            );
            _appliedFiltersList.TvList.Nodes.Add(choice); 
        }

        private void LoadChoices(DeviceSpecific deviceSpecific)
        { 
            _appliedFiltersList.TvList.Nodes.Clear();
 
            if(deviceSpecific != null) 
            {
                foreach(DeviceSpecificChoice runtimeChoice in deviceSpecific.Choices) 
                {
                    LoadChoice(runtimeChoice);
                }
            } 
            EnsureDefaultFilterAvailableXorApplied();
        } 
 
        private void SaveChoices()
        { 
            if(_currentDeviceSpecificID != null)
            {
                CacheCurrentState();
            } 
            foreach (DictionaryEntry entry in _cachedDeviceSpecifics)
            { 
                AppliedFiltersCachedState state = 
                    (AppliedFiltersCachedState) entry.Value;
                state.SaveChoicesFromTreeView( 
                    _designer,
                    (String) entry.Key
                );
            } 
        }
 
        private void SelectFirstAvailableFilter() 
        {
            if (_cbAvailableFilters.Items.Count > 0) 
            {
                DeviceFilterNode filter =
                    (DeviceFilterNode) _cbAvailableFilters.Items[0];
                _cbAvailableFilters.SelectedItem = filter; 
            }
            else 
            { 
                _cbAvailableFilters.Text = String.Empty;
            } 
        }

        private void SelectNextAvailableFilter(DeviceFilterNode currentFilter)
        { 
            // if an externally defined filter is selected, let
            // SelectFirstAvailableFitler handle this. 
            if(currentFilter == null) 
            {
                SelectFirstAvailableFilter(); 
                return;
            }

            int index = _cbAvailableFilters.Items.IndexOf(currentFilter); 
            if((index + 1) < _cbAvailableFilters.Items.Count)
            { 
                _cbAvailableFilters.SelectedItem = 
                    _cbAvailableFilters.Items[index + 1];
            } 
            else if(index > 0)
            {
                _cbAvailableFilters.SelectedItem =
                    _cbAvailableFilters.Items[index - 1]; 
            }
            else 
            { 
                _cbAvailableFilters.SelectedItem = null;
                _cbAvailableFilters.Text = String.Empty; 
            }
        }

        private DeviceFilterNode FindAvailableFilter(String name) 
        {
            if(IsDefaultFilter(name)) 
            { 
                name = "";
            } 
            foreach(DeviceFilterNode filter in _cbAvailableFilters.Items)
            {
                if(filter.Name == name)
                { 
                    return filter;
                } 
            } 
            return null;
        } 

        private bool DefaultFilterIsApplied
        {
            get 
            {
                return FindAppliedFilter("") != null; 
            } 
        }
 
        private bool DefaultFilterIsAvailable
        {
            get
            { 
                return FindAvailableFilter("") != null;
            } 
        } 

        private ChoiceTreeNode FindAppliedFilter(String name) 
        {
            if(IsDefaultFilter(name))
            {
                name = ""; 
            }
            foreach(ChoiceTreeNode choice in _appliedFiltersList.TvList.Nodes) 
            { 
                if(choice.Name == name)
                { 
                    return choice;
                }
            }
            return null; 
        }
 
        private void EnsureDefaultFilterAvailableXorApplied() 
        {
            if(DefaultFilterIsApplied) 
            {
                DeviceFilterNode filter = FindAvailableFilter("");
                if(filter != null)
                { 
                    RemoveAvailableFilter(filter);
                } 
            } 
            else if(!DefaultFilterIsAvailable)
            { 
                _cbAvailableFilters.Items.Add(CreateExternalFilter(""));
            }
        }
 
        private bool IsDefaultFilter(String name)
        { 
            return( 
                name == null
                || name.Length == 0 
                || name == SR.GetString(SR.DeviceFilter_DefaultChoice)
            );
        }
 
        private bool AvailableFilterIsSelected
        { 
            get 
            {
                return _cbAvailableFilters.Text != null && 
                    _cbAvailableFilters.Text.Length > 0;
            }
        }
 
        private bool AppliedFilterIsSelected
        { 
            get 
            {
                return SelectedAppliedFilter != null; 
            }
        }

        private ChoiceTreeNode SelectedAppliedFilter 
        {
            get 
            { 
                return (ChoiceTreeNode) _appliedFiltersList.TvList.SelectedNode;
            } 
        }

        private void UpdateUI()
        { 
            if(AppliedFilterIsSelected
                && !IsDefaultFilter(SelectedAppliedFilter.Name)) 
            { 
                _tbArgument.Enabled = true;
                _tbArgument.Text = SelectedAppliedFilter.Argument; 
            }
            else
            {
                _tbArgument.Enabled = false; 
                _tbArgument.Text = String.Empty;
            } 
            _btnApplyFilter.Enabled = 
                AvailableFilterIsSelected && (_designer.UnderlyingObject != null);
            _cbAvailableFilters.Enabled = (_designer.UnderlyingObject != null); 
            _appliedFiltersList.UpdateButtonsEnabling();
        }

        private bool ChoiceHasContent(DeviceSpecificChoice runtimeChoice) 
        {
            return (runtimeChoice.Contents.Count > 0) || runtimeChoice.HasTemplates; 
        } 

        private void RemoveAvailableFilter(DeviceFilterNode filter) 
        {
            SelectNextAvailableFilter(filter);
            _cbAvailableFilters.Items.Remove(filter);
            UpdateUI(); 
        }
 
        private void SetDirty(bool dirty) 
        {
            if (dirty) 
            {
                if (false == _isDirty)
                {
                    _isDirty = true; 
                    _cmdCancel.Text = SR.GetString(SR.GenericDialog_CancelBtnCaption);
                } 
            } 
            else
            { 
                if (true == _isDirty)
                {
                    _isDirty = false;
                    _cmdCancel.Text = SR.GetString(SR.GenericDialog_CloseBtnCaption); 
                }
            } 
        } 

        private bool ValidateAppliedFilters() 
        {
            StringCollection duplicateChoices =
                DesignerUtility.GetDuplicateChoiceTreeNodes(
                    _appliedFiltersList.TvList.Nodes 
                );
            if(duplicateChoices.Count > 0) 
            { 
                GenericUI.ShowWarningMessage(
                    SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                    SR.GetString(SR.AppliedDeviceFiltersDialog_DuplicateChoices,
                    GenericUI.BuildCommaDelimitedList(duplicateChoices))
                );
                return false; 
            }
            return true; 
        } 

        //////////////////////////////////////////////////////////////////////// 
        //  Begin Event Handling
        ////////////////////////////////////////////////////////////////////////

        private void OnArgumentChanged(Object sender, EventArgs e) 
        {
            if(!AppliedFilterIsSelected) 
            { 
                // UpdateUI sets to empty string when no filter selected.
                Debug.Assert(_tbArgument.Text.Length == 0, 
                    "Not a side effect of clearing the argument. "
                    + "Arugment changed with no applied filter selected. "
                    + "Missing a call to UpdateUI()?");
                return; 
            }
            SelectedAppliedFilter.Argument = _tbArgument.Text; 
            SetDirty(true); 
        }
 
        private void OnAfterLabelEdit(Object sender, NodeLabelEditEventArgs e)
        {
            // null still returned if label unmodified (verified 2310)
            if(e.Label == null) 
            {
                return; 
            } 

            String oldLabel = e.Node.Text; 
            String newLabel = e.Label;

            bool labelIsLegal = true;
 
            if(!DeviceFilterEditorDialog.NewLabelIsLegal(
                _designer.UnderlyingControl.Site, 
                _appliedFiltersList, 
                oldLabel,
                newLabel, 
                SR.GetString(SR.AppliedDeviceFiltersDialog_Title)
            )) {
                labelIsLegal = false;
            } 
            else if(IsDefaultFilter(newLabel))
            { 
                GenericUI.ShowWarningMessage( 
                    SR.GetString(SR.AppliedDeviceFiltersDialog_Title),
                    SR.GetString(SR.DeviceFilterEditorDialog_IllegalDefaultName) 
                );
                labelIsLegal = false;
            }
 
            if(!labelIsLegal)
            { 
                e.CancelEdit = true; 
                return;
            } 

            ((ChoiceTreeNode)e.Node).Name = newLabel;
            EnsureDefaultFilterAvailableXorApplied();
            SetDirty(true); 
            UpdateUI();
        } 
 
        private void OnAvailableFilterSelected(Object sender, EventArgs e)
        { 
            // NOTE: This event handler is registed for both ItemSelected and
            //       TextChanged events of _cbAvailableFilters.
            UpdateUI();
        } 

        private void OnAppliedFilterSelected(Object sender, TreeViewEventArgs e) 
        { 
            UpdateUI();
        } 

        private void OnEditFilters(Object sender, EventArgs e)
        {
            if(!ValidateAppliedFilters()) 
            {
                return; 
            } 
            DeviceFilterEditorDialog dialog = null;
 
            try
            {
                try
                { 
                    dialog = new DeviceFilterEditorDialog(
                        _designer.UnderlyingControl.Site, 
                        _webConfig 
                        );
                } 
                catch (TargetInvocationException ex)
                {
                    throw ex.InnerException;
                } 
            }
            catch (CheckoutException ex) 
            { 
                if (ex == CheckoutException.Canceled)
                { 
                    return;
                }
                throw;
            } 
            catch (FileLoadException)
            { 
                // This is how the constructor tells us it failed to read 
                // web.config.
                return; 
            }

            if(AvailableFilterIsSelected)
            { 
                dialog.SelectFilterByName(_cbAvailableFilters.Text);
            } 
            if (dialog.ShowDialog() == DialogResult.OK) 
            {
                Cursor oldCursor = null; 
                try
                {
                    oldCursor = this.Cursor;
                    this.Cursor = Cursors.WaitCursor; 

                    // Fix for # 4667 
                    // if (_currentDeviceSpecificID != null) 
                    //{
                    LoadAvailableFilters(); 
                    //}
                    SaveChoices();
                    SetDirty(false);
                } 
                finally
                { 
                    this.Cursor = oldCursor; 
                }
            } 
        }

        private void OnApplyFilter(Object sender, EventArgs e)
        { 
            DeviceFilterNode filter = (DeviceFilterNode) _cbAvailableFilters.SelectedItem;
            if(filter == null) 
            { 
                String name = _cbAvailableFilters.Text;
                Debug.Assert( 
                    ((name != null) && (name.Length > 0)),
                    "Should not be trying to apply a filter with none selected. "
                    + "Missed a call to UpdateUI()?"
                ); 

                // If the user typed the name of a filter which exists in their 
                // web.config, we need to find the original rather than create 
                // a new external filter.
                filter = FindAvailableFilter(name); 
                if(filter == null)
                {
                    /* Removed for DCR 4240
                    if (!DesignerUtility.IsValidName(name)) 
                    {
                        GenericUI.ShowWarningMessage( 
                            SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                            SR.GetString(
                                SR.AppliedDeviceFiltersDialog_InvalidFilterName, 
                                _cbAvailableFilters.Text
                            )
                        );
                        return; 
                    }
                    */ 
 
                    filter = CreateExternalFilter(_cbAvailableFilters.Text);
                } 
            }
            ChoiceTreeNode choice = new ChoiceTreeNode(
                filter,
                _designer 
            );
            if(IsDefaultFilter(filter.Name)) 
            { 
                if(DefaultFilterIsApplied)
                { 
                    // Do not allow user to apply default filter if already
                    // been applied.
                    GenericUI.ShowWarningMessage(
                        SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                        SR.GetString(SR.AppliedDeviceFiltersDialog_DefaultFilterAlreadyApplied)
                    ); 
                } 
                else
                { 
                    // Add the default filter to the end of the list and
                    // remove it from list of available filters.
                    _appliedFiltersList.TvList.Nodes.Add(choice);
                    RemoveAvailableFilter(filter); 
                }
            } 
            else 
            {
                // All other filters are added to the beginning 
                _appliedFiltersList.TvList.Nodes.Insert(0, choice);
            }
            SetDirty(true);
            UpdateUI(); 
        }
 
        private void OnAppliedFiltersReordered(Object sender, EventArgs e) 
        {
            SetDirty(true); 
        }

        private void OnRemove(Object sender, EventArgs e)
        { 
            ChoiceTreeNode choice = (ChoiceTreeNode) _appliedFiltersList.TvList.SelectedNode;
            if(ChoiceHasContent(choice.RuntimeChoice)) 
            { 
                if(!GenericUI.ConfirmYesNo(
                    SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                    SR.GetString(
                        SR.AppliedDeviceFiltersDialog_AssociatedItemsWillBeLost
                    )
                )) { 
                    return;
                } 
            } 
            _appliedFiltersList.TvList.Nodes.Remove(_appliedFiltersList.TvList.SelectedNode);
 
            // If it was the default filter, and it a duplicate is not still
            // still applied (error in HTML view), return it to the list of
            // available filters.
            if(IsDefaultFilter(choice.Name)) 
            {
                EnsureDefaultFilterAvailableXorApplied(); 
            } 
            _appliedFiltersList.UpdateButtonsEnabling();
            SetDirty(true); 
            UpdateUI();
        }

        private void OnOK(Object sender, EventArgs e) 
        {
            if(!ValidateAppliedFilters()) 
            { 
                return;
            } 
            SaveChoices();
            Close();
            DialogResult = DialogResult.OK;
        } 

        private void OnCancel(Object sender, EventArgs e) 
        { 
            Close();
            DialogResult = DialogResult.Cancel; 
        }

        ////////////////////////////////////////////////////////////////////////
        //  End Event Handling 
        ////////////////////////////////////////////////////////////////////////
 
        //////////////////////////////////////////////////////////////////////// 
        //  Begin IRefreshableDeviceSpecificEditor Implementation
        //////////////////////////////////////////////////////////////////////// 

        bool IRefreshableDeviceSpecificEditor.RequestRefresh()
        {
            return ValidateAppliedFilters(); 
        }
 
        void IRefreshableDeviceSpecificEditor.Refresh( 
            String deviceSpecificID,
            DeviceSpecific deviceSpecific 
        ) {
            if (_currentDeviceSpecificID != null)
            {
                CacheCurrentState(); 
            }
            if(!RestoreState(deviceSpecificID)) 
            { 
                // If we could not restore the state, we have not edited
                // this DeviceSpecific yet and need to load choices. 
                LoadChoices(deviceSpecific);
            }
            UpdateUI();
        } 

        void IRefreshableDeviceSpecificEditor.UnderlyingObjectsChanged() 
        { 
            SaveChoices();
            SetDirty(false); 
        }

        private bool InExternalCacheEditMode
        { 
            get
            { 
                return _cacheBuffer != null; 
            }
        } 

        private IDictionary _cacheBuffer = null;

        void IRefreshableDeviceSpecificEditor.BeginExternalDeviceSpecificEdit() 
        {
            Debug.Assert(!InExternalCacheEditMode, 
                "Call to BeginExternalDeviceSpecificEdit() while already in external " 
                + "cache edit mode.");
            if(_currentDeviceSpecificID != null) 
            {
                CacheCurrentState();
                _currentDeviceSpecificID = null;
            } 
            _cacheBuffer = new HybridDictionary(
                true /* make case-insensitive*/ ); 
            foreach(DictionaryEntry entry in _cachedDeviceSpecifics) 
            {
                _cacheBuffer.Add(entry.Key, entry.Value); 
            }
        }

        void IRefreshableDeviceSpecificEditor.EndExternalDeviceSpecificEdit( 
            bool commitChanges)
        { 
            Debug.Assert(InExternalCacheEditMode, 
                "Call to EndExternalDeviceSpecificEdit() while not in external "
                + "cache edit mode."); 
            if(commitChanges)
            {
                _cachedDeviceSpecifics = _cacheBuffer;
            } 
            _cacheBuffer = null;
        } 
 
        void IRefreshableDeviceSpecificEditor.DeviceSpecificRenamed(
            String oldDeviceSpecificID, String newDeviceSpecificID) 
        {
            Debug.Assert(InExternalCacheEditMode,
                "Call to DeviceSpecificRenamed() while not in external "
                + "cache edit mode."); 
            Object value = _cacheBuffer[oldDeviceSpecificID];
            if(value != null) 
            { 
                _cacheBuffer.Remove(oldDeviceSpecificID);
                _cacheBuffer.Add(newDeviceSpecificID, value); 
            }
        }

        void IRefreshableDeviceSpecificEditor.DeviceSpecificDeleted( 
            String deviceSpecificID)
        { 
            Debug.Assert(InExternalCacheEditMode, 
                "Call to DeviceSpecificDeleted() while not in external "
                + "cache edit mode."); 
            _cacheBuffer.Remove(deviceSpecificID);
        }

        //////////////////////////////////////////////////////////////////////// 
        //  End IRefeshableComponentEditorPage Implementation
        //////////////////////////////////////////////////////////////////////// 
    } 

    //////////////////////////////////////////////////////////////////////////// 
    //  Begin Internal Class
    ////////////////////////////////////////////////////////////////////////////

    [ 
        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 class AppliedFiltersCachedState : DeviceSpecificDialogCachedState 
    {
        private TreeNode[] _cachedTreeView = null;

        internal AppliedFiltersCachedState( 
            TreeView treeView
        ) { 
            _cachedTreeView = new TreeNode[treeView.Nodes.Count]; 
            treeView.Nodes.CopyTo(_cachedTreeView, 0);
        } 

        internal TreeNode[] AppliedFilters
        {
            get 
            {
                return _cachedTreeView; 
            } 
        }
 
        internal void Restore(
            TreeView treeView
        ) {
            TreeNode selectedNode = treeView.SelectedNode; 
            treeView.Nodes.Clear();
            treeView.Nodes.AddRange(_cachedTreeView); 
            if(selectedNode != null) 
            {
                int index = treeView.Nodes.IndexOf(selectedNode); 
                if(index >= 0)
                {
                    treeView.SelectedNode = treeView.Nodes[index];
                } 
            }
        } 
 
        internal bool ChoiceExistsInTreeView(DeviceFilterNode filter)
        { 
            foreach(ChoiceTreeNode appliedFilter in _cachedTreeView)
            {
                if(appliedFilter.Name == filter.Name)
                { 
                    return true;
                } 
            } 
            return false;
        } 

        internal void SaveChoicesFromTreeView(
            IDeviceSpecificDesigner designer,
            String deviceSpecificID 
        ) {
            SaveChoices(designer, deviceSpecificID, _cachedTreeView); 
        } 
    }
 
    ////////////////////////////////////////////////////////////////////////////
    //  End Internal Class
    ////////////////////////////////////////////////////////////////////////////
 
    ////////////////////////////////////////////////////////////////////////////
    //  Begin Internal Class 
    //////////////////////////////////////////////////////////////////////////// 

    [ 
        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 class ChoiceTreeNode : TreeNode
    { 
        private IDeviceSpecificDesigner _designer; 
        private ChoicePropertyFilter _choicePropertyFilter = null;
        private DeviceSpecificChoice _runtimeChoice = null; 
        private String _filterName;
        private String _argument;
        private bool _includeArgument = false;
 
        internal ChoiceTreeNode(
            DeviceFilterNode filter, 
            IDeviceSpecificDesigner designer 
        ) : base()
        { 
            Name = filter.Name;
            _designer = designer;
            _runtimeChoice = new DeviceSpecificChoice();
            _runtimeChoice.Filter = filter.Name; 

            if( 
                // This looks like circular reasoning, but the designer is a 
                // IDeviceSpecificDesigner and we are interested in the
                // type of the designer's parent control. 
                Adapters.DesignerAdapterUtil.ControlDesigner(designer.UnderlyingControl)
                is MobileTemplatedControlDesigner
            )
            { 
                _runtimeChoice.Xmlns = SR.GetString(SR.MarkupSchema_HTML32);
            } 
        } 

        internal ChoiceTreeNode( 
            DeviceFilterNode filter,
            DeviceSpecificChoice runtimeChoice,
            IDeviceSpecificDesigner designer
        ) : base() 
        {
            _designer = designer; 
            _runtimeChoice = runtimeChoice; 
            Name = _runtimeChoice.Filter;
            Argument = _runtimeChoice.Argument; 
        }

        internal bool IncludeArgument
        { 
            get
            { 
                return _includeArgument; 
            }
 
            set
            {
                _includeArgument = value;
            } 
        }
 
        internal new String Name 
        {
            get 
            {
                return _filterName;
            }
 
            set
            { 
                Debug.Assert(value != null); 
                _filterName = value;
                base.Text = ToString(); 
            }
        }

        internal String Argument 
        {
            get 
            { 
                return _argument;
            } 

            set
            {
                _argument = value; 
            }
        } 
 
        internal ChoicePropertyFilter Choice
        { 
            get
            {
                if(_choicePropertyFilter == null)
                { 
                    _choicePropertyFilter = new ChoicePropertyFilter(
                        _runtimeChoice, 
                        _designer, 
                        _designer.UnderlyingControl.Site
                    ); 
                }
                return _choicePropertyFilter;
            }
        } 

        internal void CommitChanges() 
        { 
            RuntimeChoice.Filter = _filterName;
            RuntimeChoice.Argument = _argument; 
        }

        internal DeviceSpecificChoice RuntimeChoice
        { 
            get
            { 
                Debug.Assert( 
                    (_choicePropertyFilter == null)
                    || (_runtimeChoice == _choicePropertyFilter.RuntimeChoice), 
                    "Local runtime choice object out of [....]."
                );
                return _runtimeChoice;
            } 
        }
 
        // This done so that these TreeNodes will display correctly when 
        // inserted in a ComboBox.
        public override String ToString() 
        {
            StringBuilder name = new StringBuilder(_filterName);

            if(name == null || name.Length == 0) 
            {
                name = new StringBuilder( 
                    SR.GetString(SR.DeviceFilter_DefaultChoice) 
                );
            } 
            else if(_includeArgument)
            {
                name.Append( " (\"" + _runtimeChoice.Argument + "\")" );
            } 
            return name.ToString();
        } 
    } 

    //////////////////////////////////////////////////////////////////////////// 
    //  End Internal Class
    ////////////////////////////////////////////////////////////////////////////
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

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.Diagnostics;
    using System.Drawing; 
    using System.Drawing.Design; 
    using System.IO;
    using System.Reflection; 
    using System.Text;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;
 
    using System.Web.UI.MobileControls;
    using System.Web.UI.Design.MobileControls.Util; 
 
    [
        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 AppliedDeviceFiltersDialog : 
        DesignerForm, IRefreshableDeviceSpecificEditor
    { 
        private bool _isDirty = true; 
        private IDeviceSpecificDesigner _designer = null;
        private WebConfigManager _webConfig = null; 
        private IDictionary _cachedDeviceSpecifics =
            new HybridDictionary(true /* make case-insensitive */ );
        private String _currentDeviceSpecificID = null;
 
        private System.Windows.Forms.Label _lblAvailableFilters;
        private System.Windows.Forms.Button _btnEditFilters; 
        private System.Windows.Forms.ComboBox _cbAvailableFilters; 
        private System.Windows.Forms.Button _btnApplyFilter;
        private System.Windows.Forms.Button _cmdCancel; 
        private System.Windows.Forms.Button _cmdOK;
        private System.Windows.Forms.Panel _pnlMain;
        private System.Windows.Forms.Label _lblArgument;
        private System.Windows.Forms.TextBox _tbArgument; 
        private EditableTreeList _appliedFiltersList;
 
        internal AppliedDeviceFiltersDialog( 
            IDeviceSpecificDesigner designer,
            int mergingContext) : base (designer.UnderlyingControl.Site) 
        {
            _designer = designer;
            _designer.SetDeviceSpecificEditor(this);
 
            // Required for Win Form Designer support
            InitializeComponent(); 
 
            _lblAvailableFilters.Text =
                SR.GetString(SR.AppliedDeviceFiltersDialog_AvailableDeviceFilters); 
            _appliedFiltersList.LblTitle.Text =
                SR.GetString(SR.AppliedDeviceFiltersDialog_AppliedDeviceFilters);
            _btnEditFilters.Text = SR.GetString(SR.GenericDialog_Edit);
            _btnApplyFilter.Text = 
                SR.GetString(SR.AppliedDeviceFiltersDialog_ApplyDeviceFilter);
            _lblArgument.Text = 
                SR.GetString(SR.AppliedDeviceFiltersDialog_Argument); 
            _cmdOK.Text = SR.GetString(SR.GenericDialog_OKBtnCaption);
            _cmdCancel.Text = SR.GetString(SR.GenericDialog_CancelBtnCaption); 

            int tabOffset = GenericUI.InitDialog(
                this,
                _designer, 
                mergingContext
            ); 
 
            this.Text = _designer.UnderlyingControl.ID
                + " - " + SR.GetString(SR.AppliedDeviceFiltersDialog_Title); 
            SetTabIndexes(tabOffset);
            _webConfig = new WebConfigManager(_designer.UnderlyingControl.Site);
            LoadAvailableFilters();
 
            // Note that the following can cause an
            // IDeviceSpecificDesigner.Refresh() to occur as a side-effect. 
            _designer.RefreshHeader(mergingContext); 

            _currentDeviceSpecificID = _designer.CurrentDeviceSpecificID; 
            if(_currentDeviceSpecificID != null)
            {
                DeviceSpecific ds;
                _designer.GetDeviceSpecific(_currentDeviceSpecificID, out ds); 
                LoadChoices(ds);
            } 
 
            // Register Event Handlers
            _cbAvailableFilters.SelectedIndexChanged += new EventHandler( 
                OnAvailableFilterSelected
            );
            _cbAvailableFilters.TextChanged += new EventHandler(
                OnAvailableFilterSelected 
            );
            _btnApplyFilter.Click += new EventHandler(OnApplyFilter); 
            _btnEditFilters.Click += new EventHandler(OnEditFilters); 
            _appliedFiltersList.TvList.AfterSelect += new TreeViewEventHandler(OnAppliedFilterSelected);
            _appliedFiltersList.TvList.AfterLabelEdit += new NodeLabelEditEventHandler(OnAfterLabelEdit); 
            _appliedFiltersList.BtnUp.Click += new EventHandler(OnAppliedFiltersReordered);
            _appliedFiltersList.BtnDown.Click += new EventHandler(OnAppliedFiltersReordered);
            _appliedFiltersList.BtnRemove.Click -= _appliedFiltersList.RemoveHandler;
            _appliedFiltersList.BtnRemove.Click += new EventHandler(OnRemove); 
            _tbArgument.TextChanged += new EventHandler(OnArgumentChanged);
            _cmdOK.Click += new EventHandler(OnOK); 
            _cmdCancel.Click += new EventHandler(OnCancel); 

            UpdateUI(); 
        }

        protected override string HelpTopic {
            get { return "net.Mobile.AppliedDeviceFiltersDialog"; } 
        }
 
        internal void SetTabIndexes(int tabOffset) 
        {
            _pnlMain.TabIndex = ++tabOffset; 
            _lblAvailableFilters.TabIndex = ++tabOffset;
            _cbAvailableFilters.TabIndex = ++tabOffset;
            _btnEditFilters.TabIndex = ++tabOffset;
            _btnApplyFilter.TabIndex = ++tabOffset; 
            _appliedFiltersList.TabIndex = ++tabOffset;
            _lblArgument.TabIndex = ++tabOffset; 
            _tbArgument.TabIndex = ++tabOffset; 
            _cmdOK.TabIndex = ++tabOffset;
            _cmdCancel.TabIndex = ++tabOffset; 
        }

        private void InitializeComponent()
        { 
            this._appliedFiltersList =
                new System.Web.UI.Design.MobileControls.Util.EditableTreeList( 
                false, true, 16 
                );
            this._btnEditFilters = new System.Windows.Forms.Button(); 
            this._cmdOK = new System.Windows.Forms.Button();
            this._pnlMain = new System.Windows.Forms.Panel();
            this._tbArgument = new System.Windows.Forms.TextBox();
            this._lblArgument = new System.Windows.Forms.Label(); 
            this._cmdCancel = new System.Windows.Forms.Button();
            this._lblAvailableFilters = new System.Windows.Forms.Label(); 
            this._cbAvailableFilters = new System.Windows.Forms.ComboBox(); 
            this._btnApplyFilter = new System.Windows.Forms.Button();
            this._pnlMain.SuspendLayout(); 
            this.SuspendLayout();
            //
            // _appliedFiltersList
            // 
            this._appliedFiltersList.Location = new System.Drawing.Point(0, 74);
            this._appliedFiltersList.Name = "_appliedFiltersList"; 
            this._appliedFiltersList.Size = new System.Drawing.Size(275, 208); 
            //
            // _btnEditFilters 
            //
            this._btnEditFilters.Location = new System.Drawing.Point(201, 15);
            this._btnEditFilters.Size = new System.Drawing.Size(75, 23);
            this._btnEditFilters.Name = "_btnEditFilters"; 
            //
            // _cmdOK 
            // 
            this._cmdOK.Location = new System.Drawing.Point(120, 334);
            this._cmdOK.Name = "_cmdOK"; 
            //
            // _pnlMain
            //
            this._pnlMain.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); 
            this._pnlMain.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                   this._tbArgument, 
                                                                                   this._lblArgument, 
                                                                                   this._appliedFiltersList,
                                                                                   this._cmdCancel, 
                                                                                   this._cmdOK,
                                                                                   this._lblAvailableFilters,
                                                                                   this._btnEditFilters,
                                                                                   this._cbAvailableFilters, 
                                                                                   this._btnApplyFilter});
            this._pnlMain.Location = new System.Drawing.Point(6, 8); 
            this._pnlMain.Name = "_pnlMain"; 
            this._pnlMain.Size = new System.Drawing.Size(276, 357);
            // 
            // _tbArgument
            //
            this._tbArgument.Location = new System.Drawing.Point(0, 306);
            this._tbArgument.Name = "_tbArgument"; 
            this._tbArgument.Size = new System.Drawing.Size(275, 20);
            this._tbArgument.Text = String.Empty; 
            // 
            // _lblArgument
            // 
            this._lblArgument.Location = new System.Drawing.Point(0, 290);
            this._lblArgument.Name = "_lblArgument";
            this._lblArgument.Size = new System.Drawing.Size(275, 16);
            // 
            // _cmdCancel
            // 
            this._cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; 
            this._cmdCancel.Location = new System.Drawing.Point(201, 334);
            this._cmdCancel.Name = "_cmdCancel"; 
            //
            // _lblAvailableFilters
            //
            this._lblAvailableFilters.Name = "_lblAvailableFilters"; 
            this._lblAvailableFilters.Size = new System.Drawing.Size(198, 16);
            // 
            // _cbAvailableFilters 
            //
            this._cbAvailableFilters.DropDownWidth = 195; 
            this._cbAvailableFilters.Location = new System.Drawing.Point(0, 16);
            this._cbAvailableFilters.Name = "_cbAvailableFilters";
            this._cbAvailableFilters.Size = new System.Drawing.Size(195, 21);
            this._cbAvailableFilters.Sorted = true; 
            //
            // _btnApplyFilter 
            // 
            this._btnApplyFilter.Location = new System.Drawing.Point(0, 44);
            this._btnApplyFilter.Name = "_btnApplyFilter"; 
            this._btnApplyFilter.Size = new System.Drawing.Size(195, 23);
            //
            // AppliedDeviceFiltersDialog
            // 
            this.AcceptButton = this._cmdOK;
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 
            this.CancelButton = this._cmdCancel; 
            this.ClientSize = new System.Drawing.Size(285, 373);
            this.Controls.AddRange(new System.Windows.Forms.Control[] { 
                                                                          this._pnlMain});
            this.Name = "AppliedDeviceFiltersDialog";
            this._pnlMain.ResumeLayout(false);
            this.ResumeLayout(false); 
        }
 
        private void LoadAvailableFilters() 
        {
            _cbAvailableFilters.Items.Clear(); 
            try
            {
                ArrayList filterList = _webConfig.ReadDeviceFilters();
                _cbAvailableFilters.Sorted = false; 
                foreach(DeviceFilterNode node in filterList)
                { 
                    _cbAvailableFilters.Items.Add(node); 
                }
            } 
            catch (Exception e)
            {
                Debug.Fail(e.ToString());
                // This is okay.  They may still apply a default or external 
                // device filter.
            } 
            _cbAvailableFilters.Sorted = true; 
            EnsureDefaultFilterAvailableXorApplied();
 
            // If there is no filter selected, or there was a filter selected
            // but that filter no longer exists
            if( _cbAvailableFilters.Text.Length == 0
                || FindAvailableFilter(_cbAvailableFilters.Text) == null) 
            {
                SelectFirstAvailableFilter(); 
            } 
        }
 
        private void CacheState(String deviceSpecificID)
        {
            _cachedDeviceSpecifics[deviceSpecificID] = new AppliedFiltersCachedState(
                _appliedFiltersList.TvList 
            );
        } 
 
        private void CacheCurrentState()
        { 
            CacheState(_currentDeviceSpecificID);
        }

        private bool RestoreState(String deviceSpecificID) 
        {
            if (null != deviceSpecificID) 
            { 
                _currentDeviceSpecificID = deviceSpecificID;
                AppliedFiltersCachedState state = 
                    (AppliedFiltersCachedState) _cachedDeviceSpecifics[
                        _currentDeviceSpecificID
                    ];
                if(state != null) 
                {
                    state.Restore(_appliedFiltersList.TvList); 
                    EnsureDefaultFilterAvailableXorApplied(); 
                    return true;
                } 
            }
            else
            {
                _currentDeviceSpecificID = null; 
            }
            return false; 
        } 

        private DeviceFilterNode CreateExternalFilter(String name) 
        {
            DeviceFilterNode externalFilter;
            externalFilter = new DeviceFilterNode(_webConfig);
            externalFilter.Name = name; 
            return externalFilter;
        } 
 
        private void LoadChoice(DeviceSpecificChoice runtimeChoice)
        { 
            DeviceFilterNode filterUsed =
                FindAvailableFilter(runtimeChoice.Filter);

            ChoiceTreeNode choice = new ChoiceTreeNode( 
                filterUsed,
                runtimeChoice, 
                _designer 
            );
            _appliedFiltersList.TvList.Nodes.Add(choice); 
        }

        private void LoadChoices(DeviceSpecific deviceSpecific)
        { 
            _appliedFiltersList.TvList.Nodes.Clear();
 
            if(deviceSpecific != null) 
            {
                foreach(DeviceSpecificChoice runtimeChoice in deviceSpecific.Choices) 
                {
                    LoadChoice(runtimeChoice);
                }
            } 
            EnsureDefaultFilterAvailableXorApplied();
        } 
 
        private void SaveChoices()
        { 
            if(_currentDeviceSpecificID != null)
            {
                CacheCurrentState();
            } 
            foreach (DictionaryEntry entry in _cachedDeviceSpecifics)
            { 
                AppliedFiltersCachedState state = 
                    (AppliedFiltersCachedState) entry.Value;
                state.SaveChoicesFromTreeView( 
                    _designer,
                    (String) entry.Key
                );
            } 
        }
 
        private void SelectFirstAvailableFilter() 
        {
            if (_cbAvailableFilters.Items.Count > 0) 
            {
                DeviceFilterNode filter =
                    (DeviceFilterNode) _cbAvailableFilters.Items[0];
                _cbAvailableFilters.SelectedItem = filter; 
            }
            else 
            { 
                _cbAvailableFilters.Text = String.Empty;
            } 
        }

        private void SelectNextAvailableFilter(DeviceFilterNode currentFilter)
        { 
            // if an externally defined filter is selected, let
            // SelectFirstAvailableFitler handle this. 
            if(currentFilter == null) 
            {
                SelectFirstAvailableFilter(); 
                return;
            }

            int index = _cbAvailableFilters.Items.IndexOf(currentFilter); 
            if((index + 1) < _cbAvailableFilters.Items.Count)
            { 
                _cbAvailableFilters.SelectedItem = 
                    _cbAvailableFilters.Items[index + 1];
            } 
            else if(index > 0)
            {
                _cbAvailableFilters.SelectedItem =
                    _cbAvailableFilters.Items[index - 1]; 
            }
            else 
            { 
                _cbAvailableFilters.SelectedItem = null;
                _cbAvailableFilters.Text = String.Empty; 
            }
        }

        private DeviceFilterNode FindAvailableFilter(String name) 
        {
            if(IsDefaultFilter(name)) 
            { 
                name = "";
            } 
            foreach(DeviceFilterNode filter in _cbAvailableFilters.Items)
            {
                if(filter.Name == name)
                { 
                    return filter;
                } 
            } 
            return null;
        } 

        private bool DefaultFilterIsApplied
        {
            get 
            {
                return FindAppliedFilter("") != null; 
            } 
        }
 
        private bool DefaultFilterIsAvailable
        {
            get
            { 
                return FindAvailableFilter("") != null;
            } 
        } 

        private ChoiceTreeNode FindAppliedFilter(String name) 
        {
            if(IsDefaultFilter(name))
            {
                name = ""; 
            }
            foreach(ChoiceTreeNode choice in _appliedFiltersList.TvList.Nodes) 
            { 
                if(choice.Name == name)
                { 
                    return choice;
                }
            }
            return null; 
        }
 
        private void EnsureDefaultFilterAvailableXorApplied() 
        {
            if(DefaultFilterIsApplied) 
            {
                DeviceFilterNode filter = FindAvailableFilter("");
                if(filter != null)
                { 
                    RemoveAvailableFilter(filter);
                } 
            } 
            else if(!DefaultFilterIsAvailable)
            { 
                _cbAvailableFilters.Items.Add(CreateExternalFilter(""));
            }
        }
 
        private bool IsDefaultFilter(String name)
        { 
            return( 
                name == null
                || name.Length == 0 
                || name == SR.GetString(SR.DeviceFilter_DefaultChoice)
            );
        }
 
        private bool AvailableFilterIsSelected
        { 
            get 
            {
                return _cbAvailableFilters.Text != null && 
                    _cbAvailableFilters.Text.Length > 0;
            }
        }
 
        private bool AppliedFilterIsSelected
        { 
            get 
            {
                return SelectedAppliedFilter != null; 
            }
        }

        private ChoiceTreeNode SelectedAppliedFilter 
        {
            get 
            { 
                return (ChoiceTreeNode) _appliedFiltersList.TvList.SelectedNode;
            } 
        }

        private void UpdateUI()
        { 
            if(AppliedFilterIsSelected
                && !IsDefaultFilter(SelectedAppliedFilter.Name)) 
            { 
                _tbArgument.Enabled = true;
                _tbArgument.Text = SelectedAppliedFilter.Argument; 
            }
            else
            {
                _tbArgument.Enabled = false; 
                _tbArgument.Text = String.Empty;
            } 
            _btnApplyFilter.Enabled = 
                AvailableFilterIsSelected && (_designer.UnderlyingObject != null);
            _cbAvailableFilters.Enabled = (_designer.UnderlyingObject != null); 
            _appliedFiltersList.UpdateButtonsEnabling();
        }

        private bool ChoiceHasContent(DeviceSpecificChoice runtimeChoice) 
        {
            return (runtimeChoice.Contents.Count > 0) || runtimeChoice.HasTemplates; 
        } 

        private void RemoveAvailableFilter(DeviceFilterNode filter) 
        {
            SelectNextAvailableFilter(filter);
            _cbAvailableFilters.Items.Remove(filter);
            UpdateUI(); 
        }
 
        private void SetDirty(bool dirty) 
        {
            if (dirty) 
            {
                if (false == _isDirty)
                {
                    _isDirty = true; 
                    _cmdCancel.Text = SR.GetString(SR.GenericDialog_CancelBtnCaption);
                } 
            } 
            else
            { 
                if (true == _isDirty)
                {
                    _isDirty = false;
                    _cmdCancel.Text = SR.GetString(SR.GenericDialog_CloseBtnCaption); 
                }
            } 
        } 

        private bool ValidateAppliedFilters() 
        {
            StringCollection duplicateChoices =
                DesignerUtility.GetDuplicateChoiceTreeNodes(
                    _appliedFiltersList.TvList.Nodes 
                );
            if(duplicateChoices.Count > 0) 
            { 
                GenericUI.ShowWarningMessage(
                    SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                    SR.GetString(SR.AppliedDeviceFiltersDialog_DuplicateChoices,
                    GenericUI.BuildCommaDelimitedList(duplicateChoices))
                );
                return false; 
            }
            return true; 
        } 

        //////////////////////////////////////////////////////////////////////// 
        //  Begin Event Handling
        ////////////////////////////////////////////////////////////////////////

        private void OnArgumentChanged(Object sender, EventArgs e) 
        {
            if(!AppliedFilterIsSelected) 
            { 
                // UpdateUI sets to empty string when no filter selected.
                Debug.Assert(_tbArgument.Text.Length == 0, 
                    "Not a side effect of clearing the argument. "
                    + "Arugment changed with no applied filter selected. "
                    + "Missing a call to UpdateUI()?");
                return; 
            }
            SelectedAppliedFilter.Argument = _tbArgument.Text; 
            SetDirty(true); 
        }
 
        private void OnAfterLabelEdit(Object sender, NodeLabelEditEventArgs e)
        {
            // null still returned if label unmodified (verified 2310)
            if(e.Label == null) 
            {
                return; 
            } 

            String oldLabel = e.Node.Text; 
            String newLabel = e.Label;

            bool labelIsLegal = true;
 
            if(!DeviceFilterEditorDialog.NewLabelIsLegal(
                _designer.UnderlyingControl.Site, 
                _appliedFiltersList, 
                oldLabel,
                newLabel, 
                SR.GetString(SR.AppliedDeviceFiltersDialog_Title)
            )) {
                labelIsLegal = false;
            } 
            else if(IsDefaultFilter(newLabel))
            { 
                GenericUI.ShowWarningMessage( 
                    SR.GetString(SR.AppliedDeviceFiltersDialog_Title),
                    SR.GetString(SR.DeviceFilterEditorDialog_IllegalDefaultName) 
                );
                labelIsLegal = false;
            }
 
            if(!labelIsLegal)
            { 
                e.CancelEdit = true; 
                return;
            } 

            ((ChoiceTreeNode)e.Node).Name = newLabel;
            EnsureDefaultFilterAvailableXorApplied();
            SetDirty(true); 
            UpdateUI();
        } 
 
        private void OnAvailableFilterSelected(Object sender, EventArgs e)
        { 
            // NOTE: This event handler is registed for both ItemSelected and
            //       TextChanged events of _cbAvailableFilters.
            UpdateUI();
        } 

        private void OnAppliedFilterSelected(Object sender, TreeViewEventArgs e) 
        { 
            UpdateUI();
        } 

        private void OnEditFilters(Object sender, EventArgs e)
        {
            if(!ValidateAppliedFilters()) 
            {
                return; 
            } 
            DeviceFilterEditorDialog dialog = null;
 
            try
            {
                try
                { 
                    dialog = new DeviceFilterEditorDialog(
                        _designer.UnderlyingControl.Site, 
                        _webConfig 
                        );
                } 
                catch (TargetInvocationException ex)
                {
                    throw ex.InnerException;
                } 
            }
            catch (CheckoutException ex) 
            { 
                if (ex == CheckoutException.Canceled)
                { 
                    return;
                }
                throw;
            } 
            catch (FileLoadException)
            { 
                // This is how the constructor tells us it failed to read 
                // web.config.
                return; 
            }

            if(AvailableFilterIsSelected)
            { 
                dialog.SelectFilterByName(_cbAvailableFilters.Text);
            } 
            if (dialog.ShowDialog() == DialogResult.OK) 
            {
                Cursor oldCursor = null; 
                try
                {
                    oldCursor = this.Cursor;
                    this.Cursor = Cursors.WaitCursor; 

                    // Fix for # 4667 
                    // if (_currentDeviceSpecificID != null) 
                    //{
                    LoadAvailableFilters(); 
                    //}
                    SaveChoices();
                    SetDirty(false);
                } 
                finally
                { 
                    this.Cursor = oldCursor; 
                }
            } 
        }

        private void OnApplyFilter(Object sender, EventArgs e)
        { 
            DeviceFilterNode filter = (DeviceFilterNode) _cbAvailableFilters.SelectedItem;
            if(filter == null) 
            { 
                String name = _cbAvailableFilters.Text;
                Debug.Assert( 
                    ((name != null) && (name.Length > 0)),
                    "Should not be trying to apply a filter with none selected. "
                    + "Missed a call to UpdateUI()?"
                ); 

                // If the user typed the name of a filter which exists in their 
                // web.config, we need to find the original rather than create 
                // a new external filter.
                filter = FindAvailableFilter(name); 
                if(filter == null)
                {
                    /* Removed for DCR 4240
                    if (!DesignerUtility.IsValidName(name)) 
                    {
                        GenericUI.ShowWarningMessage( 
                            SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                            SR.GetString(
                                SR.AppliedDeviceFiltersDialog_InvalidFilterName, 
                                _cbAvailableFilters.Text
                            )
                        );
                        return; 
                    }
                    */ 
 
                    filter = CreateExternalFilter(_cbAvailableFilters.Text);
                } 
            }
            ChoiceTreeNode choice = new ChoiceTreeNode(
                filter,
                _designer 
            );
            if(IsDefaultFilter(filter.Name)) 
            { 
                if(DefaultFilterIsApplied)
                { 
                    // Do not allow user to apply default filter if already
                    // been applied.
                    GenericUI.ShowWarningMessage(
                        SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                        SR.GetString(SR.AppliedDeviceFiltersDialog_DefaultFilterAlreadyApplied)
                    ); 
                } 
                else
                { 
                    // Add the default filter to the end of the list and
                    // remove it from list of available filters.
                    _appliedFiltersList.TvList.Nodes.Add(choice);
                    RemoveAvailableFilter(filter); 
                }
            } 
            else 
            {
                // All other filters are added to the beginning 
                _appliedFiltersList.TvList.Nodes.Insert(0, choice);
            }
            SetDirty(true);
            UpdateUI(); 
        }
 
        private void OnAppliedFiltersReordered(Object sender, EventArgs e) 
        {
            SetDirty(true); 
        }

        private void OnRemove(Object sender, EventArgs e)
        { 
            ChoiceTreeNode choice = (ChoiceTreeNode) _appliedFiltersList.TvList.SelectedNode;
            if(ChoiceHasContent(choice.RuntimeChoice)) 
            { 
                if(!GenericUI.ConfirmYesNo(
                    SR.GetString(SR.AppliedDeviceFiltersDialog_Title), 
                    SR.GetString(
                        SR.AppliedDeviceFiltersDialog_AssociatedItemsWillBeLost
                    )
                )) { 
                    return;
                } 
            } 
            _appliedFiltersList.TvList.Nodes.Remove(_appliedFiltersList.TvList.SelectedNode);
 
            // If it was the default filter, and it a duplicate is not still
            // still applied (error in HTML view), return it to the list of
            // available filters.
            if(IsDefaultFilter(choice.Name)) 
            {
                EnsureDefaultFilterAvailableXorApplied(); 
            } 
            _appliedFiltersList.UpdateButtonsEnabling();
            SetDirty(true); 
            UpdateUI();
        }

        private void OnOK(Object sender, EventArgs e) 
        {
            if(!ValidateAppliedFilters()) 
            { 
                return;
            } 
            SaveChoices();
            Close();
            DialogResult = DialogResult.OK;
        } 

        private void OnCancel(Object sender, EventArgs e) 
        { 
            Close();
            DialogResult = DialogResult.Cancel; 
        }

        ////////////////////////////////////////////////////////////////////////
        //  End Event Handling 
        ////////////////////////////////////////////////////////////////////////
 
        //////////////////////////////////////////////////////////////////////// 
        //  Begin IRefreshableDeviceSpecificEditor Implementation
        //////////////////////////////////////////////////////////////////////// 

        bool IRefreshableDeviceSpecificEditor.RequestRefresh()
        {
            return ValidateAppliedFilters(); 
        }
 
        void IRefreshableDeviceSpecificEditor.Refresh( 
            String deviceSpecificID,
            DeviceSpecific deviceSpecific 
        ) {
            if (_currentDeviceSpecificID != null)
            {
                CacheCurrentState(); 
            }
            if(!RestoreState(deviceSpecificID)) 
            { 
                // If we could not restore the state, we have not edited
                // this DeviceSpecific yet and need to load choices. 
                LoadChoices(deviceSpecific);
            }
            UpdateUI();
        } 

        void IRefreshableDeviceSpecificEditor.UnderlyingObjectsChanged() 
        { 
            SaveChoices();
            SetDirty(false); 
        }

        private bool InExternalCacheEditMode
        { 
            get
            { 
                return _cacheBuffer != null; 
            }
        } 

        private IDictionary _cacheBuffer = null;

        void IRefreshableDeviceSpecificEditor.BeginExternalDeviceSpecificEdit() 
        {
            Debug.Assert(!InExternalCacheEditMode, 
                "Call to BeginExternalDeviceSpecificEdit() while already in external " 
                + "cache edit mode.");
            if(_currentDeviceSpecificID != null) 
            {
                CacheCurrentState();
                _currentDeviceSpecificID = null;
            } 
            _cacheBuffer = new HybridDictionary(
                true /* make case-insensitive*/ ); 
            foreach(DictionaryEntry entry in _cachedDeviceSpecifics) 
            {
                _cacheBuffer.Add(entry.Key, entry.Value); 
            }
        }

        void IRefreshableDeviceSpecificEditor.EndExternalDeviceSpecificEdit( 
            bool commitChanges)
        { 
            Debug.Assert(InExternalCacheEditMode, 
                "Call to EndExternalDeviceSpecificEdit() while not in external "
                + "cache edit mode."); 
            if(commitChanges)
            {
                _cachedDeviceSpecifics = _cacheBuffer;
            } 
            _cacheBuffer = null;
        } 
 
        void IRefreshableDeviceSpecificEditor.DeviceSpecificRenamed(
            String oldDeviceSpecificID, String newDeviceSpecificID) 
        {
            Debug.Assert(InExternalCacheEditMode,
                "Call to DeviceSpecificRenamed() while not in external "
                + "cache edit mode."); 
            Object value = _cacheBuffer[oldDeviceSpecificID];
            if(value != null) 
            { 
                _cacheBuffer.Remove(oldDeviceSpecificID);
                _cacheBuffer.Add(newDeviceSpecificID, value); 
            }
        }

        void IRefreshableDeviceSpecificEditor.DeviceSpecificDeleted( 
            String deviceSpecificID)
        { 
            Debug.Assert(InExternalCacheEditMode, 
                "Call to DeviceSpecificDeleted() while not in external "
                + "cache edit mode."); 
            _cacheBuffer.Remove(deviceSpecificID);
        }

        //////////////////////////////////////////////////////////////////////// 
        //  End IRefeshableComponentEditorPage Implementation
        //////////////////////////////////////////////////////////////////////// 
    } 

    //////////////////////////////////////////////////////////////////////////// 
    //  Begin Internal Class
    ////////////////////////////////////////////////////////////////////////////

    [ 
        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 class AppliedFiltersCachedState : DeviceSpecificDialogCachedState 
    {
        private TreeNode[] _cachedTreeView = null;

        internal AppliedFiltersCachedState( 
            TreeView treeView
        ) { 
            _cachedTreeView = new TreeNode[treeView.Nodes.Count]; 
            treeView.Nodes.CopyTo(_cachedTreeView, 0);
        } 

        internal TreeNode[] AppliedFilters
        {
            get 
            {
                return _cachedTreeView; 
            } 
        }
 
        internal void Restore(
            TreeView treeView
        ) {
            TreeNode selectedNode = treeView.SelectedNode; 
            treeView.Nodes.Clear();
            treeView.Nodes.AddRange(_cachedTreeView); 
            if(selectedNode != null) 
            {
                int index = treeView.Nodes.IndexOf(selectedNode); 
                if(index >= 0)
                {
                    treeView.SelectedNode = treeView.Nodes[index];
                } 
            }
        } 
 
        internal bool ChoiceExistsInTreeView(DeviceFilterNode filter)
        { 
            foreach(ChoiceTreeNode appliedFilter in _cachedTreeView)
            {
                if(appliedFilter.Name == filter.Name)
                { 
                    return true;
                } 
            } 
            return false;
        } 

        internal void SaveChoicesFromTreeView(
            IDeviceSpecificDesigner designer,
            String deviceSpecificID 
        ) {
            SaveChoices(designer, deviceSpecificID, _cachedTreeView); 
        } 
    }
 
    ////////////////////////////////////////////////////////////////////////////
    //  End Internal Class
    ////////////////////////////////////////////////////////////////////////////
 
    ////////////////////////////////////////////////////////////////////////////
    //  Begin Internal Class 
    //////////////////////////////////////////////////////////////////////////// 

    [ 
        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 class ChoiceTreeNode : TreeNode
    { 
        private IDeviceSpecificDesigner _designer; 
        private ChoicePropertyFilter _choicePropertyFilter = null;
        private DeviceSpecificChoice _runtimeChoice = null; 
        private String _filterName;
        private String _argument;
        private bool _includeArgument = false;
 
        internal ChoiceTreeNode(
            DeviceFilterNode filter, 
            IDeviceSpecificDesigner designer 
        ) : base()
        { 
            Name = filter.Name;
            _designer = designer;
            _runtimeChoice = new DeviceSpecificChoice();
            _runtimeChoice.Filter = filter.Name; 

            if( 
                // This looks like circular reasoning, but the designer is a 
                // IDeviceSpecificDesigner and we are interested in the
                // type of the designer's parent control. 
                Adapters.DesignerAdapterUtil.ControlDesigner(designer.UnderlyingControl)
                is MobileTemplatedControlDesigner
            )
            { 
                _runtimeChoice.Xmlns = SR.GetString(SR.MarkupSchema_HTML32);
            } 
        } 

        internal ChoiceTreeNode( 
            DeviceFilterNode filter,
            DeviceSpecificChoice runtimeChoice,
            IDeviceSpecificDesigner designer
        ) : base() 
        {
            _designer = designer; 
            _runtimeChoice = runtimeChoice; 
            Name = _runtimeChoice.Filter;
            Argument = _runtimeChoice.Argument; 
        }

        internal bool IncludeArgument
        { 
            get
            { 
                return _includeArgument; 
            }
 
            set
            {
                _includeArgument = value;
            } 
        }
 
        internal new String Name 
        {
            get 
            {
                return _filterName;
            }
 
            set
            { 
                Debug.Assert(value != null); 
                _filterName = value;
                base.Text = ToString(); 
            }
        }

        internal String Argument 
        {
            get 
            { 
                return _argument;
            } 

            set
            {
                _argument = value; 
            }
        } 
 
        internal ChoicePropertyFilter Choice
        { 
            get
            {
                if(_choicePropertyFilter == null)
                { 
                    _choicePropertyFilter = new ChoicePropertyFilter(
                        _runtimeChoice, 
                        _designer, 
                        _designer.UnderlyingControl.Site
                    ); 
                }
                return _choicePropertyFilter;
            }
        } 

        internal void CommitChanges() 
        { 
            RuntimeChoice.Filter = _filterName;
            RuntimeChoice.Argument = _argument; 
        }

        internal DeviceSpecificChoice RuntimeChoice
        { 
            get
            { 
                Debug.Assert( 
                    (_choicePropertyFilter == null)
                    || (_runtimeChoice == _choicePropertyFilter.RuntimeChoice), 
                    "Local runtime choice object out of [....]."
                );
                return _runtimeChoice;
            } 
        }
 
        // This done so that these TreeNodes will display correctly when 
        // inserted in a ComboBox.
        public override String ToString() 
        {
            StringBuilder name = new StringBuilder(_filterName);

            if(name == null || name.Length == 0) 
            {
                name = new StringBuilder( 
                    SR.GetString(SR.DeviceFilter_DefaultChoice) 
                );
            } 
            else if(_includeArgument)
            {
                name.Append( " (\"" + _runtimeChoice.Argument + "\")" );
            } 
            return name.ToString();
        } 
    } 

    //////////////////////////////////////////////////////////////////////////// 
    //  End Internal Class
    ////////////////////////////////////////////////////////////////////////////
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK