root / trunk / Pithos.Client.WPF / FileProperties / ContainerPropertiesViewModel.cs @ 255f5f86
History | View | Annotate | Download (12.2 kB)
1 |
#region |
---|---|
2 |
/* ----------------------------------------------------------------------- |
3 |
* <copyright file="ContainerPropertiesViewModel.cs" company="GRNet"> |
4 |
* |
5 |
* Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 |
* |
7 |
* Redistribution and use in source and binary forms, with or |
8 |
* without modification, are permitted provided that the following |
9 |
* conditions are met: |
10 |
* |
11 |
* 1. Redistributions of source code must retain the above |
12 |
* copyright notice, this list of conditions and the following |
13 |
* disclaimer. |
14 |
* |
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. |
19 |
* |
20 |
* |
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. |
33 |
* |
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. |
38 |
* </copyright> |
39 |
* ----------------------------------------------------------------------- |
40 |
*/ |
41 |
#endregion |
42 |
using System; |
43 |
using System.Collections.Concurrent; |
44 |
using System.Collections.Generic; |
45 |
using System.Collections.ObjectModel; |
46 |
using System.ComponentModel.Composition; |
47 |
using System.Diagnostics.Contracts; |
48 |
using System.Linq; |
49 |
using System.Net; |
50 |
using System.Text; |
51 |
using System.Threading.Tasks; |
52 |
using System.Windows; |
53 |
using Caliburn.Micro; |
54 |
using Pithos.Network; |
55 |
|
56 |
namespace Pithos.Client.WPF.FileProperties |
57 |
{ |
58 |
[Export(typeof(ContainerPropertiesViewModel))] |
59 |
public class ContainerPropertiesViewModel:Screen |
60 |
{ |
61 |
private string _containerName; |
62 |
|
63 |
/// <summary> |
64 |
/// Name of the displayed container |
65 |
/// </summary> |
66 |
public string ContainerName |
67 |
{ |
68 |
get { return _containerName; } |
69 |
set |
70 |
{ |
71 |
_containerName = value; |
72 |
NotifyOfPropertyChange(()=>ContainerName); |
73 |
} |
74 |
} |
75 |
|
76 |
private string _title; |
77 |
/// <summary> |
78 |
/// Window title |
79 |
/// </summary> |
80 |
public string Title |
81 |
{ |
82 |
get { return _title; } |
83 |
set |
84 |
{ |
85 |
_title = value; |
86 |
NotifyOfPropertyChange(() => Title); |
87 |
} |
88 |
} |
89 |
|
90 |
private long _count; |
91 |
|
92 |
/// <summary> |
93 |
/// Count of files in the container |
94 |
/// </summary> |
95 |
public long Count |
96 |
{ |
97 |
get { return _count; } |
98 |
set |
99 |
{ |
100 |
_count = value; |
101 |
NotifyOfPropertyChange(() => Count); |
102 |
} |
103 |
} |
104 |
|
105 |
private DateTime _modified; |
106 |
|
107 |
/// <summary> |
108 |
/// Date of last modification |
109 |
/// </summary> |
110 |
public DateTime Modified |
111 |
{ |
112 |
get { return _modified; } |
113 |
set |
114 |
{ |
115 |
_modified = value; |
116 |
NotifyOfPropertyChange(() => Modified); |
117 |
} |
118 |
} |
119 |
|
120 |
private string _size; |
121 |
|
122 |
/// <summary> |
123 |
/// Total size of the container in bytes |
124 |
/// </summary> |
125 |
public string Size |
126 |
{ |
127 |
get { return _size; } |
128 |
set |
129 |
{ |
130 |
_size = value; |
131 |
NotifyOfPropertyChange(() => Size); |
132 |
} |
133 |
} |
134 |
|
135 |
private string _shortSize; |
136 |
|
137 |
/// <summary> |
138 |
/// Total size of the container formatted in KB,MB etc |
139 |
/// </summary> |
140 |
public string ShortSize |
141 |
{ |
142 |
get { return _shortSize; } |
143 |
set |
144 |
{ |
145 |
_shortSize = value; |
146 |
NotifyOfPropertyChange(() => ShortSize); |
147 |
} |
148 |
} |
149 |
|
150 |
private int _blockSize; |
151 |
|
152 |
/// <summary> |
153 |
/// Block size used by the container |
154 |
/// </summary> |
155 |
public int BlockSize |
156 |
{ |
157 |
get { return _blockSize; } |
158 |
set |
159 |
{ |
160 |
_blockSize = value; |
161 |
NotifyOfPropertyChange(() => BlockSize); |
162 |
} |
163 |
} |
164 |
|
165 |
private string _blockHash; |
166 |
|
167 |
/// <summary> |
168 |
/// Hash algorithm used to calculate block hashes |
169 |
/// </summary> |
170 |
public string BlockHash |
171 |
{ |
172 |
get { return _blockHash; } |
173 |
set |
174 |
{ |
175 |
_blockHash = value; |
176 |
NotifyOfPropertyChange(() => BlockHash); |
177 |
} |
178 |
} |
179 |
|
180 |
private ShellViewModel _shell; |
181 |
|
182 |
/// <summary> |
183 |
/// Reference to the parent Shell |
184 |
/// </summary> |
185 |
protected ShellViewModel Shell |
186 |
{ |
187 |
get { return _shell; } |
188 |
set |
189 |
{ |
190 |
_shell = value; |
191 |
NotifyOfPropertyChange(() => Shell); |
192 |
} |
193 |
} |
194 |
|
195 |
private ContainerInfo _container; |
196 |
/// <summary> |
197 |
/// The displayed ContainerInfo |
198 |
/// </summary> |
199 |
protected ContainerInfo Container |
200 |
{ |
201 |
get { return _container; } |
202 |
set |
203 |
{ |
204 |
_container = value; |
205 |
|
206 |
|
207 |
|
208 |
LoadFromDictionary(Tags, value.Tags); |
209 |
TagsChanged = false; |
210 |
//LoadFromDictionary(Policies, value.Policies); |
211 |
|
212 |
if (value.Policies.ContainsKey("Versioning")) |
213 |
{ |
214 |
Versioning version; |
215 |
if (Enum.TryParse(value.Policies["Versioning"], out version)) |
216 |
{ |
217 |
SelectedVersion = version; |
218 |
} |
219 |
} |
220 |
|
221 |
if (value.Policies.ContainsKey("Quota")) |
222 |
{ |
223 |
int quota; |
224 |
if (int.TryParse(value.Policies["Quota"], out quota)) |
225 |
{ |
226 |
Quota=quota; |
227 |
} |
228 |
} |
229 |
|
230 |
Title = String.Format("{0} Properties", _container.Name); |
231 |
Count = value.Count; |
232 |
ShortSize = value.Bytes.ToByteSize(); |
233 |
Size = String.Format("{0} ({1:N0} bytes)", ShortSize, value.Bytes); |
234 |
Modified = value.Last_Modified; |
235 |
BlockSize = value.BlockSize; |
236 |
BlockHash = value.BlockHash; |
237 |
ContainerName = Uri.UnescapeDataString(value.Name.Split('/').Last()); |
238 |
|
239 |
NotifyOfPropertyChange(() => Container); |
240 |
IsBusy = false; |
241 |
} |
242 |
} |
243 |
|
244 |
private int _quota; |
245 |
public int Quota |
246 |
{ |
247 |
get { return _quota; } |
248 |
set |
249 |
{ |
250 |
if (value < 0) |
251 |
throw new ArgumentOutOfRangeException("Quota"); |
252 |
|
253 |
_quota = value; |
254 |
NotifyOfPropertyChange(() => Quota); |
255 |
} |
256 |
} |
257 |
|
258 |
|
259 |
|
260 |
private Versioning[] _versions={Versioning.manual,Versioning.auto,Versioning.none}; |
261 |
public Versioning[] Versions |
262 |
{ |
263 |
get { return _versions; } |
264 |
} |
265 |
|
266 |
|
267 |
private Versioning _selectedVersion; |
268 |
public Versioning SelectedVersion |
269 |
{ |
270 |
get { return _selectedVersion; } |
271 |
set { |
272 |
_selectedVersion = value; |
273 |
NotifyOfPropertyChange(()=>SelectedVersion); |
274 |
} |
275 |
} |
276 |
|
277 |
private void LoadFromDictionary(ICollection<MetaValue> collection,Dictionary<string,string> source ) |
278 |
{ |
279 |
collection.Clear(); |
280 |
var items = from item in source |
281 |
select new MetaValue(item.Key, item.Value); |
282 |
|
283 |
items.Apply(collection.Add); |
284 |
} |
285 |
|
286 |
private readonly ObservableCollection<MetaValue> _tags; |
287 |
public ObservableCollection<MetaValue> Tags |
288 |
{ |
289 |
get { return _tags; } |
290 |
} |
291 |
|
292 |
/* private readonly ObservableCollection<MetaValue> _policies; |
293 |
public ObservableCollection<MetaValue> Policies |
294 |
{ |
295 |
get { return _policies; } |
296 |
}*/ |
297 |
|
298 |
private bool _tagsChanged; |
299 |
public bool TagsChanged |
300 |
{ |
301 |
get { return _tagsChanged; } |
302 |
private set |
303 |
{ |
304 |
_tagsChanged = value; |
305 |
NotifyOfPropertyChange(()=>TagsChanged); |
306 |
NotifyOfPropertyChange(() => CanApplyChanges); |
307 |
} |
308 |
} |
309 |
|
310 |
//public bool PoliciesChanged { get; private set; } |
311 |
|
312 |
private bool _isBusy=true; |
313 |
public bool IsBusy |
314 |
{ |
315 |
get { return _isBusy; } |
316 |
set |
317 |
{ |
318 |
_isBusy = value; |
319 |
NotifyOfPropertyChange(()=>IsBusy); |
320 |
} |
321 |
} |
322 |
|
323 |
public ContainerPropertiesViewModel(ShellViewModel shell, Task<ContainerInfo> container, string localFolderName) |
324 |
{ |
325 |
if (shell==null) |
326 |
throw new ArgumentNullException("shell"); |
327 |
if (container==null) |
328 |
throw new ArgumentNullException("container"); |
329 |
if (String.IsNullOrWhiteSpace(localFolderName)) |
330 |
throw new ArgumentNullException("localFolderName"); |
331 |
Contract.EndContractBlock(); |
332 |
|
333 |
_tags = new ObservableCollection<MetaValue>(); |
334 |
_tags.CollectionChanged += (sender, evt) => { TagsChanged = true; }; |
335 |
|
336 |
/*_policies = new ObservableCollection<MetaValue>(); |
337 |
_policies.CollectionChanged += (sender, evt) => { PoliciesChanged = true; }; |
338 |
*/ |
339 |
|
340 |
Shell = shell; |
341 |
ContainerName = localFolderName; |
342 |
container.ContinueWith(t =>{ |
343 |
if (t.IsFaulted) |
344 |
{ |
345 |
IsBusy = false; |
346 |
Execute.OnUIThread(() => ShowError(t.Exception)); |
347 |
this.TryClose(); |
348 |
|
349 |
} |
350 |
else |
351 |
Execute.OnUIThread(()=>Container = t.Result); |
352 |
}); |
353 |
} |
354 |
|
355 |
private void ShowError(AggregateException exception) |
356 |
{ |
357 |
MessageView view=null; |
358 |
if (exception.InnerException is RetryException) |
359 |
view=new MessageView(exception.InnerException as RetryException); |
360 |
else if (exception.InnerException is WebException) |
361 |
view = new MessageView(exception.InnerException as WebException); |
362 |
else |
363 |
view = new MessageView(exception.InnerException); |
364 |
view.ShowDialog(); |
365 |
} |
366 |
|
367 |
public void Reload() |
368 |
{ |
369 |
Container = Shell.RefreshContainerInfo(Container); |
370 |
} |
371 |
|
372 |
public override void CanClose(Action<bool> callback) |
373 |
{ |
374 |
base.CanClose(callback); |
375 |
} |
376 |
|
377 |
public void SaveChanges() |
378 |
{ |
379 |
DoSave(); |
380 |
TryClose(); |
381 |
} |
382 |
|
383 |
public void RejectChanges() |
384 |
{ |
385 |
TryClose(); |
386 |
} |
387 |
|
388 |
public void ApplyChanges() |
389 |
{ |
390 |
DoSave(); |
391 |
} |
392 |
|
393 |
public bool CanApplyChanges |
394 |
{ |
395 |
get { return TagsChanged; } |
396 |
} |
397 |
|
398 |
private void DoSave() |
399 |
{ |
400 |
|
401 |
if (TagsChanged) |
402 |
{ |
403 |
Container.Tags = this.Tags.ToDictionary(tag => tag.Name, tag => tag.Value); |
404 |
var monitor = Shell.Monitors[Container.Account]; |
405 |
monitor.CloudClient.UpdateMetadata(Container); |
406 |
} |
407 |
|
408 |
//Container.Policies["Quota"] = Quota.ToString(); |
409 |
//Container.Policies["Versioning"] = Enum.GetName(typeof (Versioning), SelectedVersion); |
410 |
|
411 |
/* |
412 |
if (PoliciesChanged) |
413 |
{ |
414 |
Container.Policies = this.Policies.ToDictionary(policy=> policy.Name, tag => tag.Value); |
415 |
} |
416 |
*/ |
417 |
|
418 |
|
419 |
} |
420 |
|
421 |
} |
422 |
|
423 |
|
424 |
} |