root / trunk / Pithos.Client.WPF / SelectiveSynch / DirectoryRecord.cs @ 8f44fd3a
History | View | Annotate | Download (7.9 kB)
1 | 255f5f86 | Panagiotis Kanavos | #region |
---|---|---|---|
2 | 255f5f86 | Panagiotis Kanavos | /* ----------------------------------------------------------------------- |
3 | 255f5f86 | Panagiotis Kanavos | * <copyright file="DirectoryRecord.cs" company="GRNet"> |
4 | 255f5f86 | Panagiotis Kanavos | * |
5 | 255f5f86 | Panagiotis Kanavos | * Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 | 255f5f86 | Panagiotis Kanavos | * |
7 | 255f5f86 | Panagiotis Kanavos | * Redistribution and use in source and binary forms, with or |
8 | 255f5f86 | Panagiotis Kanavos | * without modification, are permitted provided that the following |
9 | 255f5f86 | Panagiotis Kanavos | * conditions are met: |
10 | 255f5f86 | Panagiotis Kanavos | * |
11 | 255f5f86 | Panagiotis Kanavos | * 1. Redistributions of source code must retain the above |
12 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
13 | 255f5f86 | Panagiotis Kanavos | * disclaimer. |
14 | 255f5f86 | Panagiotis Kanavos | * |
15 | 255f5f86 | Panagiotis Kanavos | * 2. Redistributions in binary form must reproduce the above |
16 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
17 | 255f5f86 | Panagiotis Kanavos | * disclaimer in the documentation and/or other materials |
18 | 255f5f86 | Panagiotis Kanavos | * provided with the distribution. |
19 | 255f5f86 | Panagiotis Kanavos | * |
20 | 255f5f86 | Panagiotis Kanavos | * |
21 | 255f5f86 | Panagiotis Kanavos | * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
22 | 255f5f86 | Panagiotis Kanavos | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | 255f5f86 | Panagiotis Kanavos | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | 255f5f86 | Panagiotis Kanavos | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
25 | 255f5f86 | Panagiotis Kanavos | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
26 | 255f5f86 | Panagiotis Kanavos | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
27 | 255f5f86 | Panagiotis Kanavos | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
28 | 255f5f86 | Panagiotis Kanavos | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
29 | 255f5f86 | Panagiotis Kanavos | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | 255f5f86 | Panagiotis Kanavos | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
31 | 255f5f86 | Panagiotis Kanavos | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | 255f5f86 | Panagiotis Kanavos | * POSSIBILITY OF SUCH DAMAGE. |
33 | 255f5f86 | Panagiotis Kanavos | * |
34 | 255f5f86 | Panagiotis Kanavos | * The views and conclusions contained in the software and |
35 | 255f5f86 | Panagiotis Kanavos | * documentation are those of the authors and should not be |
36 | 255f5f86 | Panagiotis Kanavos | * interpreted as representing official policies, either expressed |
37 | 255f5f86 | Panagiotis Kanavos | * or implied, of GRNET S.A. |
38 | 255f5f86 | Panagiotis Kanavos | * </copyright> |
39 | 255f5f86 | Panagiotis Kanavos | * ----------------------------------------------------------------------- |
40 | 255f5f86 | Panagiotis Kanavos | */ |
41 | 255f5f86 | Panagiotis Kanavos | #endregion |
42 | 255f5f86 | Panagiotis Kanavos | using System; |
43 | d3a13891 | Panagiotis Kanavos | using System.Collections; |
44 | d3a13891 | Panagiotis Kanavos | using System.Collections.Generic; |
45 | d3a13891 | Panagiotis Kanavos | using System.Collections.Specialized; |
46 | d3a13891 | Panagiotis Kanavos | using System.IO; |
47 | d3a13891 | Panagiotis Kanavos | using System.Linq; |
48 | d3a13891 | Panagiotis Kanavos | using System.Text; |
49 | d3a13891 | Panagiotis Kanavos | using Caliburn.Micro; |
50 | f4a72cb8 | pkanavos | using Pithos.Client.WPF.Utils; |
51 | 759bd3c4 | Panagiotis Kanavos | using Pithos.Core.Agents; |
52 | 759bd3c4 | Panagiotis Kanavos | using Pithos.Interfaces; |
53 | d3a13891 | Panagiotis Kanavos | |
54 | d3a13891 | Panagiotis Kanavos | namespace Pithos.Client.WPF.SelectiveSynch |
55 | d3a13891 | Panagiotis Kanavos | { |
56 | f4a72cb8 | pkanavos | public class DirectoryRecord :PropertyChangedBase, IEnumerable<DirectoryRecord> |
57 | d3a13891 | Panagiotis Kanavos | { |
58 | 759bd3c4 | Panagiotis Kanavos | private ObjectInfo _objectInfo; |
59 | 759bd3c4 | Panagiotis Kanavos | public ObjectInfo ObjectInfo |
60 | 759bd3c4 | Panagiotis Kanavos | { |
61 | 759bd3c4 | Panagiotis Kanavos | get { return _objectInfo; } |
62 | 759bd3c4 | Panagiotis Kanavos | set |
63 | f4a72cb8 | pkanavos | { |
64 | 759bd3c4 | Panagiotis Kanavos | _objectInfo = value; |
65 | 759bd3c4 | Panagiotis Kanavos | Uri = value.Uri; |
66 | 759bd3c4 | Panagiotis Kanavos | } |
67 | 759bd3c4 | Panagiotis Kanavos | } |
68 | d3a13891 | Panagiotis Kanavos | |
69 | 759bd3c4 | Panagiotis Kanavos | public Uri Uri { get; set; } |
70 | 759bd3c4 | Panagiotis Kanavos | //public DirectoryInfo LocalInfo { get; set; } |
71 | d3a13891 | Panagiotis Kanavos | |
72 | d3a13891 | Panagiotis Kanavos | DirectoryRecord _parent; |
73 | d3a13891 | Panagiotis Kanavos | |
74 | d3a13891 | Panagiotis Kanavos | public bool Added { get; set; } |
75 | d3a13891 | Panagiotis Kanavos | public bool Removed { get; set; } |
76 | d3a13891 | Panagiotis Kanavos | |
77 | 759bd3c4 | Panagiotis Kanavos | private bool? _isChecked=true; |
78 | d3a13891 | Panagiotis Kanavos | #region IsChecked |
79 | d3a13891 | Panagiotis Kanavos | |
80 | d3a13891 | Panagiotis Kanavos | /// <summary> |
81 | d3a13891 | Panagiotis Kanavos | /// Gets/sets the state of the associated UI toggle (ex. CheckBox). |
82 | d3a13891 | Panagiotis Kanavos | /// The return value is calculated based on the check state of all |
83 | d3a13891 | Panagiotis Kanavos | /// child FooViewModels. Setting this property to true or false |
84 | d3a13891 | Panagiotis Kanavos | /// will set all children to the same check state, and setting it |
85 | d3a13891 | Panagiotis Kanavos | /// to any value will cause the parent to verify its check state. |
86 | d3a13891 | Panagiotis Kanavos | /// </summary> |
87 | d3a13891 | Panagiotis Kanavos | public bool? IsChecked |
88 | d3a13891 | Panagiotis Kanavos | { |
89 | d3a13891 | Panagiotis Kanavos | get { return _isChecked; } |
90 | d3a13891 | Panagiotis Kanavos | set { this.SetIsChecked(value, true, true); } |
91 | d3a13891 | Panagiotis Kanavos | } |
92 | d3a13891 | Panagiotis Kanavos | |
93 | d3a13891 | Panagiotis Kanavos | void SetIsChecked(bool? value, bool updateChildren, bool updateParent) |
94 | d3a13891 | Panagiotis Kanavos | { |
95 | d3a13891 | Panagiotis Kanavos | if (value == _isChecked) |
96 | d3a13891 | Panagiotis Kanavos | return; |
97 | d3a13891 | Panagiotis Kanavos | |
98 | d3a13891 | Panagiotis Kanavos | _isChecked = value; |
99 | d3a13891 | Panagiotis Kanavos | |
100 | d3a13891 | Panagiotis Kanavos | //If the value is null both Added and Removed should be False |
101 | d3a13891 | Panagiotis Kanavos | Added = _isChecked??false; |
102 | d3a13891 | Panagiotis Kanavos | Removed = !(_isChecked??true); |
103 | d3a13891 | Panagiotis Kanavos | |
104 | d3a13891 | Panagiotis Kanavos | if (updateChildren && _isChecked.HasValue) |
105 | 759bd3c4 | Panagiotis Kanavos | this.Directories.Apply(c => c.SetIsChecked(_isChecked, true, false)); |
106 | d3a13891 | Panagiotis Kanavos | |
107 | d3a13891 | Panagiotis Kanavos | if (updateParent && _parent != null) |
108 | d3a13891 | Panagiotis Kanavos | _parent.VerifyCheckState(); |
109 | d3a13891 | Panagiotis Kanavos | |
110 | d3a13891 | Panagiotis Kanavos | this.RaisePropertyChangedEventImmediately("IsChecked"); |
111 | d3a13891 | Panagiotis Kanavos | } |
112 | d3a13891 | Panagiotis Kanavos | |
113 | d3a13891 | Panagiotis Kanavos | void VerifyCheckState() |
114 | d3a13891 | Panagiotis Kanavos | { |
115 | d3a13891 | Panagiotis Kanavos | bool? state = null; |
116 | 759bd3c4 | Panagiotis Kanavos | for (var i = 0; i < this.Directories.Count(); ++i) |
117 | d3a13891 | Panagiotis Kanavos | { |
118 | 759bd3c4 | Panagiotis Kanavos | bool? current = this.Directories.ElementAt(i).IsChecked; |
119 | d3a13891 | Panagiotis Kanavos | if (i == 0) |
120 | d3a13891 | Panagiotis Kanavos | { |
121 | d3a13891 | Panagiotis Kanavos | state = current; |
122 | d3a13891 | Panagiotis Kanavos | } |
123 | d3a13891 | Panagiotis Kanavos | else if (state != current) |
124 | d3a13891 | Panagiotis Kanavos | { |
125 | d3a13891 | Panagiotis Kanavos | state = null; |
126 | d3a13891 | Panagiotis Kanavos | break; |
127 | d3a13891 | Panagiotis Kanavos | } |
128 | d3a13891 | Panagiotis Kanavos | } |
129 | d3a13891 | Panagiotis Kanavos | this.SetIsChecked(state, false, true); |
130 | d3a13891 | Panagiotis Kanavos | } |
131 | d3a13891 | Panagiotis Kanavos | |
132 | d3a13891 | Panagiotis Kanavos | #endregion // IsChecked |
133 | d3a13891 | Panagiotis Kanavos | |
134 | d3a13891 | Panagiotis Kanavos | |
135 | d3a13891 | Panagiotis Kanavos | public bool IsInitiallySelected { get; private set; } |
136 | d3a13891 | Panagiotis Kanavos | |
137 | f4a72cb8 | pkanavos | private List<DirectoryRecord> _directories=new List<DirectoryRecord>(); |
138 | d3a13891 | Panagiotis Kanavos | public List<DirectoryRecord> Directories |
139 | d3a13891 | Panagiotis Kanavos | { |
140 | 759bd3c4 | Panagiotis Kanavos | get { return _directories; } |
141 | f4a72cb8 | pkanavos | set { _directories= value; } |
142 | d3a13891 | Panagiotis Kanavos | } |
143 | d3a13891 | Panagiotis Kanavos | |
144 | 759bd3c4 | Panagiotis Kanavos | public DirectoryRecord() |
145 | d3a13891 | Panagiotis Kanavos | { |
146 | 759bd3c4 | Panagiotis Kanavos | |
147 | 759bd3c4 | Panagiotis Kanavos | /* |
148 | 759bd3c4 | Panagiotis Kanavos | _directories = new Lazy<List<DirectoryRecord>>(() => |
149 | 759bd3c4 | Panagiotis Kanavos | new List<DirectoryRecord>()); |
150 | 759bd3c4 | Panagiotis Kanavos | */ |
151 | 759bd3c4 | Panagiotis Kanavos | /* |
152 | 759bd3c4 | Panagiotis Kanavos | _directories = new Lazy<List<DirectoryRecord>>(() => |
153 | d3a13891 | Panagiotis Kanavos | (from directory in Info.EnumerateDirectories("*", SearchOption.TopDirectoryOnly) |
154 | d3a13891 | Panagiotis Kanavos | where !directory.FullName.StartsWith(ignorePath) |
155 | d3a13891 | Panagiotis Kanavos | select new DirectoryRecord(ignorePath) { Info = directory }).ToList()); |
156 | 759bd3c4 | Panagiotis Kanavos | */ |
157 | d3a13891 | Panagiotis Kanavos | } |
158 | d3a13891 | Panagiotis Kanavos | |
159 | 759bd3c4 | Panagiotis Kanavos | private string _displayName; |
160 | f4a72cb8 | pkanavos | |
161 | 759bd3c4 | Panagiotis Kanavos | public string DisplayName |
162 | 759bd3c4 | Panagiotis Kanavos | { |
163 | 759bd3c4 | Panagiotis Kanavos | get |
164 | 759bd3c4 | Panagiotis Kanavos | { |
165 | 759bd3c4 | Panagiotis Kanavos | if (ObjectInfo != null) |
166 | 8f44fd3a | pkanavos | return ObjectInfo.Name.Split('/').Last(); |
167 | 759bd3c4 | Panagiotis Kanavos | return _displayName; |
168 | 759bd3c4 | Panagiotis Kanavos | } |
169 | 759bd3c4 | Panagiotis Kanavos | set { _displayName = value; } |
170 | 759bd3c4 | Panagiotis Kanavos | } |
171 | 759bd3c4 | Panagiotis Kanavos | |
172 | 8f44fd3a | pkanavos | public bool IsExplicitlyChecked |
173 | 8f44fd3a | pkanavos | { |
174 | 8f44fd3a | pkanavos | set { _isChecked=value; } |
175 | 8f44fd3a | pkanavos | } |
176 | 8f44fd3a | pkanavos | |
177 | f4a72cb8 | pkanavos | public DirectoryRecord(ObjectInfo info) |
178 | 759bd3c4 | Panagiotis Kanavos | { |
179 | 759bd3c4 | Panagiotis Kanavos | ObjectInfo = info; |
180 | 759bd3c4 | Panagiotis Kanavos | } |
181 | d3a13891 | Panagiotis Kanavos | |
182 | d3a13891 | Panagiotis Kanavos | |
183 | d3a13891 | Panagiotis Kanavos | /* |
184 | d3a13891 | Panagiotis Kanavos | public IEnumerable<DirectoryInfo> GetCheckedDirectories() |
185 | d3a13891 | Panagiotis Kanavos | { |
186 | d3a13891 | Panagiotis Kanavos | var q = from record in this |
187 | d3a13891 | Panagiotis Kanavos | where record.IsChecked==true |
188 | d3a13891 | Panagiotis Kanavos | select record.Info; |
189 | d3a13891 | Panagiotis Kanavos | return q; |
190 | d3a13891 | Panagiotis Kanavos | } |
191 | d3a13891 | Panagiotis Kanavos | */ |
192 | d3a13891 | Panagiotis Kanavos | |
193 | d3a13891 | Panagiotis Kanavos | /* |
194 | d3a13891 | Panagiotis Kanavos | public void SetSelections(StringCollection selections) |
195 | d3a13891 | Panagiotis Kanavos | { |
196 | d3a13891 | Panagiotis Kanavos | IsChecked=selections.Contains(Info.FullName); |
197 | d3a13891 | Panagiotis Kanavos | foreach (var children in Directories) |
198 | d3a13891 | Panagiotis Kanavos | { |
199 | d3a13891 | Panagiotis Kanavos | children.SetSelections(selections); |
200 | d3a13891 | Panagiotis Kanavos | } |
201 | d3a13891 | Panagiotis Kanavos | } |
202 | d3a13891 | Panagiotis Kanavos | */ |
203 | d3a13891 | Panagiotis Kanavos | |
204 | f4a72cb8 | pkanavos | |
205 | d3a13891 | Panagiotis Kanavos | public IEnumerator<DirectoryRecord> GetEnumerator() |
206 | d3a13891 | Panagiotis Kanavos | { |
207 | d3a13891 | Panagiotis Kanavos | yield return this; |
208 | d3a13891 | Panagiotis Kanavos | foreach (var children in Directories) |
209 | d3a13891 | Panagiotis Kanavos | foreach (var info in children) |
210 | d3a13891 | Panagiotis Kanavos | { |
211 | d3a13891 | Panagiotis Kanavos | yield return info; |
212 | d3a13891 | Panagiotis Kanavos | } |
213 | d3a13891 | Panagiotis Kanavos | } |
214 | d3a13891 | Panagiotis Kanavos | |
215 | d3a13891 | Panagiotis Kanavos | IEnumerator IEnumerable.GetEnumerator() |
216 | d3a13891 | Panagiotis Kanavos | { |
217 | d3a13891 | Panagiotis Kanavos | return GetEnumerator(); |
218 | d3a13891 | Panagiotis Kanavos | } |
219 | f4a72cb8 | pkanavos | |
220 | f4a72cb8 | pkanavos | public override int GetHashCode() |
221 | f4a72cb8 | pkanavos | { |
222 | 5c46341d | Panagiotis Kanavos | return ObjectInfo == null |
223 | 5c46341d | Panagiotis Kanavos | ? (Uri == null ? DisplayName.GetHashCode() : Uri.GetHashCode()) |
224 | 5c46341d | Panagiotis Kanavos | : ObjectInfo.GetHashCode(); |
225 | f4a72cb8 | pkanavos | } |
226 | f4a72cb8 | pkanavos | |
227 | f4a72cb8 | pkanavos | public override bool Equals(object obj) |
228 | f4a72cb8 | pkanavos | { |
229 | f4a72cb8 | pkanavos | if (!(obj is DirectoryRecord)) |
230 | f4a72cb8 | pkanavos | return false; |
231 | f4a72cb8 | pkanavos | var other = (DirectoryRecord)obj; |
232 | f4a72cb8 | pkanavos | if (Uri != other.Uri) |
233 | f4a72cb8 | pkanavos | return false; |
234 | f4a72cb8 | pkanavos | if (ObjectInfo== null ^ other.ObjectInfo== null) |
235 | f4a72cb8 | pkanavos | return false; |
236 | f4a72cb8 | pkanavos | |
237 | f4a72cb8 | pkanavos | if (ObjectInfo!= null && !ObjectInfo.Equals(other.ObjectInfo)) |
238 | f4a72cb8 | pkanavos | return false; |
239 | f4a72cb8 | pkanavos | var thisEnum = GetEnumerator(); |
240 | f4a72cb8 | pkanavos | var otherEnum = other.GetEnumerator(); |
241 | f4a72cb8 | pkanavos | //Skipt the first item, it is the current node itself |
242 | f4a72cb8 | pkanavos | thisEnum.MoveNext(); |
243 | f4a72cb8 | pkanavos | otherEnum.MoveNext(); |
244 | f4a72cb8 | pkanavos | while (true) |
245 | f4a72cb8 | pkanavos | { |
246 | f4a72cb8 | pkanavos | var thisMove = thisEnum.MoveNext(); |
247 | f4a72cb8 | pkanavos | var otherMove = otherEnum.MoveNext(); |
248 | f4a72cb8 | pkanavos | |
249 | f4a72cb8 | pkanavos | if (thisMove ^ otherMove) |
250 | f4a72cb8 | pkanavos | return false; |
251 | f4a72cb8 | pkanavos | if (!thisMove) |
252 | f4a72cb8 | pkanavos | return true; |
253 | f4a72cb8 | pkanavos | |
254 | f4a72cb8 | pkanavos | if (!thisEnum.Current.Equals(otherEnum.Current)) |
255 | f4a72cb8 | pkanavos | return false; |
256 | f4a72cb8 | pkanavos | } |
257 | f4a72cb8 | pkanavos | } |
258 | d3a13891 | Panagiotis Kanavos | } |
259 | d3a13891 | Panagiotis Kanavos | } |