Statistics
| Branch: | Revision:

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
}