diff Chronosv2/source/Presentation/Windows/SelectionService.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/Windows/SelectionService.cs	Tue Feb 21 17:25:44 2012 +0700
@@ -0,0 +1,182 @@
+/*
+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.Linq;
+using Chronos.Presentation.Windows.Controls;
+
+namespace Chronos.Presentation.Windows
+{
+    internal sealed class SelectionService
+    {
+        #region · Fields ·
+
+        private Desktop             canvas;
+        private List<ISelectable>   currentSelection;
+
+        #endregion
+
+        #region · Internal Properties ·
+
+        internal List<ISelectable> CurrentSelection
+        {
+            get
+            {
+                if (currentSelection == null)
+                {
+                    currentSelection = new List<ISelectable>();
+                }
+
+                return currentSelection;
+            }
+        }
+
+        #endregion
+
+        #region · Constructors ·
+
+        public SelectionService(Desktop canvas)
+        {
+            this.canvas = canvas;
+        }
+
+        #endregion
+
+        #region · Internal Methods ·
+
+        internal void SelectItem(ISelectable item)
+        {
+            this.ClearSelection();
+            this.AddToSelection(item);
+        }
+
+        internal void AddToSelection(ISelectable item)
+        {
+            if (item is IGroupable)
+            {
+                List<IGroupable> groupItems = this.GetGroupMembers(item as IGroupable);
+
+                foreach (ISelectable groupItem in groupItems)
+                {
+                    groupItem.IsSelected = true;
+                    this.CurrentSelection.Add(groupItem);
+                }
+            }
+            else
+            {
+                item.IsSelected = true;
+                this.CurrentSelection.Add(item);
+            }
+        }
+
+        internal void RemoveFromSelection(ISelectable item)
+        {
+            if (item is IGroupable)
+            {
+                List<IGroupable> groupItems = GetGroupMembers(item as IGroupable);
+
+                foreach (ISelectable groupItem in groupItems)
+                {
+                    groupItem.IsSelected = false;
+                    this.CurrentSelection.Remove(groupItem);
+                }
+            }
+            else
+            {
+                item.IsSelected = false;
+                this.CurrentSelection.Remove(item);
+            }
+        }
+
+        internal void ClearSelection()
+        {
+            this.CurrentSelection.ForEach(item => item.IsSelected = false);
+            this.CurrentSelection.Clear();
+        }
+
+        internal void SelectAll()
+        {
+            this.ClearSelection();
+            this.CurrentSelection.AddRange(canvas.Children.OfType<ISelectable>());
+            this.CurrentSelection.ForEach(item => item.IsSelected = true);
+        }
+
+        internal List<IGroupable> GetGroupMembers(IGroupable item)
+        {
+            IEnumerable<IGroupable> list        = canvas.Children.OfType<IGroupable>();
+            IGroupable              rootItem    = this.GetRoot(list, item);
+
+            return GetGroupMembers(list, rootItem);
+        }
+
+        internal IGroupable GetGroupRoot(IGroupable item)
+        {
+            IEnumerable<IGroupable> list = this.canvas.Children.OfType<IGroupable>();
+
+            return this.GetRoot(list, item);
+        }
+
+        #endregion
+
+        #region · Private Methods ·
+
+        private IGroupable GetRoot(IEnumerable<IGroupable> list, IGroupable node)
+        {
+            if (node == null || node.ParentId == Guid.Empty)
+            {
+                return node;
+            }
+            else
+            {
+                foreach (IGroupable item in list)
+                {
+                    if (item.Id == node.ParentId)
+                    {
+                        return this.GetRoot(list, item);
+                    }
+                }
+
+                return null;
+            }
+        }
+
+        private List<IGroupable> GetGroupMembers(IEnumerable<IGroupable> list, IGroupable parent)
+        {
+            List<IGroupable> groupMembers = new List<IGroupable>();
+            groupMembers.Add(parent);
+
+            var children = list.Where(node => node.ParentId == parent.Id);
+
+            foreach (IGroupable child in children)
+            {
+                groupMembers.AddRange(this.GetGroupMembers(list, child));
+            }
+
+            return groupMembers;
+        }
+
+        #endregion
+    }
+}