diff Chronosv2/source/Presentation/Widgets/Navigator/NavigatorWidgetViewModel.cs @ 10:443821e55f06

Initial cleaned up add from Codeplex files
author stevenh7776 stevenhollidge@hotmail.com
date Tue, 21 Feb 2012 17:25:44 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Chronosv2/source/Presentation/Widgets/Navigator/NavigatorWidgetViewModel.cs	Tue Feb 21 17:25:44 2012 +0700
@@ -0,0 +1,205 @@
+/*
+The MIT License
+
+Copyright (c) 2009-2010. Carlos Guzmán Álvarez. http://chronoswpf.codeplex.com/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Windows.Input;
+using Chronos.Extensions;
+using Chronos.Presentation.Core.Navigation;
+using Chronos.Presentation.ViewModel;
+using Chronos.Presentation.Windows;
+using nRoute.Components;
+using nRoute.Services;
+using nRoute.SiteMaps;
+
+namespace Chronos.Presentation.Widgets
+{
+    /// <summary>
+    /// Navigator Widget ViewModel
+    /// </summary>
+    /// <remarks>
+    /// http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx
+    /// </remarks>
+    public sealed class NavigatorWidgetViewModel
+        : WidgetViewModel
+    {
+        #region · Fields ·
+
+        private readonly ReadOnlyCollection<NavigationNode> functions;
+        private readonly SiteMapNode                        rootOption;
+        private List<NavigationNode>                        filteredFunctions;
+        private string                                      filterText;
+        private ICommand                                    navigateToCommand;
+
+        #endregion
+
+        #region · Commands ·
+
+        /// <summary>
+        /// Gets the navigation command
+        /// </summary>
+        public ICommand NavigateToCommand
+        {
+            get
+            {
+                if (this.navigateToCommand == null)
+                {
+                    this.navigateToCommand = new ActionCommand<string>
+                    (
+                        x => OnNavigateTo(x),
+                        x => CanNavigate()
+                    );
+                }
+
+                return this.navigateToCommand;
+            }
+        }
+
+        #endregion
+
+        #region · Properties ·
+
+        #region · FirstGeneration ·
+
+        /// <summary>
+        /// Returns a read-only collection containing the first application option
+        /// in the tree, to which the TreeView can bind.
+        /// </summary>
+        public ReadOnlyCollection<NavigationNode> Functions
+        {
+            get
+            {
+                if (String.IsNullOrEmpty(this.filterText))
+                {
+                    return this.functions;
+                }
+                else
+                {
+                    return new ReadOnlyCollection<NavigationNode>(this.filteredFunctions);
+                }
+            }
+        }
+
+        #endregion
+
+        #region · FilterText ·
+
+        /// <summary>
+        /// Gets/sets a fragment of the name to filter for.
+        /// </summary>
+        public string FilterText
+        {
+            get { return this.filterText; }
+            set
+            {
+                if (value != filterText)
+                {
+                    this.filterText = value;
+                    this.PerformFilter();
+                }
+            }
+        }
+
+        #endregion
+
+        #endregion
+
+        #region · Constructor ·
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NavigatorWidget"/> class.
+        /// </summary>
+        public NavigatorWidgetViewModel()
+            : base()
+        {
+            if (!DesignMode.IsInDesignMode)
+            {
+                this.rootOption         = SiteMapService.SiteMap.RootNode;
+                this.filteredFunctions  = new List<NavigationNode>();
+                this.functions          = new ReadOnlyCollection<NavigationNode>(this.rootOption.ChildNodes.OfType<NavigationNode>().ToArray());
+            }
+        }
+
+        #endregion
+
+        #region · Command Actions ·
+
+        /// <summary>
+        /// Returns a value indcating whether the navigation command can be executed
+        /// </summary>
+        /// <returns></returns>
+        private bool CanNavigate()
+        {
+            return this.filteredFunctions != null && this.filteredFunctions.Count == 1;
+        }
+
+        /// <summary>
+        /// Handles the navigation command
+        /// </summary>
+        private void OnNavigateTo(string url)
+        {
+            ServiceLocator.GetService<INavigationService>().Navigate(url);
+        }
+
+        #endregion
+
+        #region · Search Logic ·
+
+        private void PerformFilter()
+        {
+            this.VerifyMatchingOptionEnumerator();
+        }
+
+        private void VerifyMatchingOptionEnumerator()
+        {
+            // Clear current matching options
+            this.filteredFunctions.Clear();
+
+            // Perform filter if needed
+            if (!String.IsNullOrEmpty(this.filterText))
+            {
+                this.filteredFunctions.AddRange(this.FindMatches(this.filterText));
+            }
+
+            // Notify changes
+            this.NotifyPropertyChanged(() => Functions);
+        }
+
+        private List<NavigationNode> FindMatches(string filterText)
+        {
+            var nodes = from node in this.rootOption
+                            .ChildNodes
+                            .OfType<NavigationNode>()
+                            .Traverse<NavigationNode>(node => ((node.ChildNodes) != null ? node.ChildNodes.OfType<NavigationNode>() : null))
+                        where node.Title.StartsWith(filterText, StringComparison.OrdinalIgnoreCase) && (node.ChildNodes == null || node.ChildNodes.Count == 0)
+                        select node;
+
+            return nodes.ToList();
+        }
+
+        #endregion
+    }
+}