2 /* -----------------------------------------------------------------------
3 * <copyright file="DirectoryRecord.cs" company="GRNet">
5 * Copyright 2011-2012 GRNET S.A. All rights reserved.
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
11 * 1. Redistributions of source code must retain the above
12 * copyright notice, this list of conditions and the following
15 * 2. Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials
18 * provided with the distribution.
21 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
34 * The views and conclusions contained in the software and
35 * documentation are those of the authors and should not be
36 * interpreted as representing official policies, either expressed
37 * or implied, of GRNET S.A.
39 * -----------------------------------------------------------------------
43 using System.Collections;
44 using System.Collections.Generic;
45 using System.Collections.Specialized;
50 using Pithos.Client.WPF.Utils;
51 using Pithos.Core.Agents;
52 using Pithos.Interfaces;
54 namespace Pithos.Client.WPF.SelectiveSynch
56 public class DirectoryRecord :PropertyChangedBase, IEnumerable<DirectoryRecord>
58 private ObjectInfo _objectInfo;
59 public ObjectInfo ObjectInfo
61 get { return _objectInfo; }
69 public Uri Uri { get; set; }
70 //public DirectoryInfo LocalInfo { get; set; }
72 DirectoryRecord _parent;
74 public bool Added { get; set; }
75 public bool Removed { get; set; }
77 private bool? _isChecked=true;
81 /// Gets/sets the state of the associated UI toggle (ex. CheckBox).
82 /// The return value is calculated based on the check state of all
83 /// child FooViewModels. Setting this property to true or false
84 /// will set all children to the same check state, and setting it
85 /// to any value will cause the parent to verify its check state.
87 public bool? IsChecked
89 get { return _isChecked; }
90 set { this.SetIsChecked(value, true, true); }
93 void SetIsChecked(bool? value, bool updateChildren, bool updateParent)
95 if (value == _isChecked)
100 //If the value is null both Added and Removed should be False
101 Added = _isChecked??false;
102 Removed = !(_isChecked??true);
104 if (updateChildren && _isChecked.HasValue)
105 this.Directories.Apply(c => c.SetIsChecked(_isChecked, true, false));
107 if (updateParent && _parent != null)
108 _parent.VerifyCheckState();
110 this.RaisePropertyChangedEventImmediately("IsChecked");
113 void VerifyCheckState()
116 for (var i = 0; i < this.Directories.Count(); ++i)
118 bool? current = this.Directories.ElementAt(i).IsChecked;
123 else if (state != current)
129 this.SetIsChecked(state, false, true);
132 #endregion // IsChecked
135 public bool IsInitiallySelected { get; private set; }
137 private List<DirectoryRecord> _directories=new List<DirectoryRecord>();
138 public List<DirectoryRecord> Directories
140 get { return _directories; }
141 set { _directories= value; }
144 public DirectoryRecord()
148 _directories = new Lazy<List<DirectoryRecord>>(() =>
149 new List<DirectoryRecord>());
152 _directories = new Lazy<List<DirectoryRecord>>(() =>
153 (from directory in Info.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
154 where !directory.FullName.StartsWith(ignorePath)
155 select new DirectoryRecord(ignorePath) { Info = directory }).ToList());
159 private string _displayName;
161 public string DisplayName
165 if (ObjectInfo != null)
166 return ObjectInfo.Name;
169 set { _displayName = value; }
172 public DirectoryRecord(ObjectInfo info)
179 public IEnumerable<DirectoryInfo> GetCheckedDirectories()
181 var q = from record in this
182 where record.IsChecked==true
189 public void SetSelections(StringCollection selections)
191 IsChecked=selections.Contains(Info.FullName);
192 foreach (var children in Directories)
194 children.SetSelections(selections);
200 public IEnumerator<DirectoryRecord> GetEnumerator()
203 foreach (var children in Directories)
204 foreach (var info in children)
210 IEnumerator IEnumerable.GetEnumerator()
212 return GetEnumerator();
215 public override int GetHashCode()
217 return ObjectInfo == null
218 ? (Uri == null ? DisplayName.GetHashCode() : Uri.GetHashCode())
219 : ObjectInfo.GetHashCode();
222 public override bool Equals(object obj)
224 if (!(obj is DirectoryRecord))
226 var other = (DirectoryRecord)obj;
227 if (Uri != other.Uri)
229 if (ObjectInfo== null ^ other.ObjectInfo== null)
232 if (ObjectInfo!= null && !ObjectInfo.Equals(other.ObjectInfo))
234 var thisEnum = GetEnumerator();
235 var otherEnum = other.GetEnumerator();
236 //Skipt the first item, it is the current node itself
238 otherEnum.MoveNext();
241 var thisMove = thisEnum.MoveNext();
242 var otherMove = otherEnum.MoveNext();
244 if (thisMove ^ otherMove)
249 if (!thisEnum.Current.Equals(otherEnum.Current))