Mercurial > silverbladetech
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 + } +}