root / trunk / Pithos.Client.WPF / FileProperties / FilePropertiesViewModel.cs @ 1a3dfbfd
History | View | Annotate | Download (13.5 kB)
1 |
// ----------------------------------------------------------------------- |
---|---|
2 |
// <copyright file="FilePropertiesViewModel.cs" company="GRNet"> |
3 |
// Copyright 2011-2012 GRNET S.A. All rights reserved. |
4 |
// |
5 |
// Redistribution and use in source and binary forms, with or |
6 |
// without modification, are permitted provided that the following |
7 |
// conditions are met: |
8 |
// |
9 |
// 1. Redistributions of source code must retain the above |
10 |
// copyright notice, this list of conditions and the following |
11 |
// disclaimer. |
12 |
// |
13 |
// 2. Redistributions in binary form must reproduce the above |
14 |
// copyright notice, this list of conditions and the following |
15 |
// disclaimer in the documentation and/or other materials |
16 |
// provided with the distribution. |
17 |
// |
18 |
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
19 |
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
20 |
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
21 |
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
22 |
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 |
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 |
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
25 |
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
26 |
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
27 |
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
28 |
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 |
// POSSIBILITY OF SUCH DAMAGE. |
30 |
// |
31 |
// The views and conclusions contained in the software and |
32 |
// documentation are those of the authors and should not be |
33 |
// interpreted as representing official policies, either expressed |
34 |
// or implied, of GRNET S.A. |
35 |
// </copyright> |
36 |
// ----------------------------------------------------------------------- |
37 |
|
38 |
using System.Collections; |
39 |
using System.Collections.Concurrent; |
40 |
using System.Collections.ObjectModel; |
41 |
using System.Collections.Specialized; |
42 |
using System.ComponentModel.Composition; |
43 |
using System.Diagnostics; |
44 |
using System.Diagnostics.Contracts; |
45 |
using System.Drawing; |
46 |
using System.IO; |
47 |
using System.Net; |
48 |
using System.Threading.Tasks; |
49 |
using System.Windows; |
50 |
using System.Windows.Interop; |
51 |
using System.Windows.Media.Imaging; |
52 |
using Caliburn.Micro; |
53 |
using Pithos.Client.WPF.FileProperties; |
54 |
using Pithos.Client.WPF.Properties; |
55 |
using Pithos.Core; |
56 |
using Pithos.Interfaces; |
57 |
using Pithos.Network; |
58 |
|
59 |
namespace Pithos.Client.WPF |
60 |
{ |
61 |
using System; |
62 |
using System.Collections.Generic; |
63 |
using System.Linq; |
64 |
using System.Text; |
65 |
|
66 |
/// <summary> |
67 |
/// TODO: Update summary. |
68 |
/// </summary> |
69 |
[Export(typeof(FilePropertiesViewModel))] |
70 |
public class FilePropertiesViewModel : Screen |
71 |
{ |
72 |
private string _title; |
73 |
public string Title |
74 |
{ |
75 |
get { return _title; } |
76 |
set |
77 |
{ |
78 |
_title = value; |
79 |
NotifyOfPropertyChange(()=>Title); |
80 |
} |
81 |
} |
82 |
|
83 |
|
84 |
private bool _isPublic; |
85 |
public bool IsPublic |
86 |
{ |
87 |
get { return _isPublic; } |
88 |
set |
89 |
{ |
90 |
_isPublic = value; |
91 |
NotifyOfPropertyChange(()=>IsPublic); |
92 |
} |
93 |
} |
94 |
|
95 |
private string _contentDisposition; |
96 |
public string ContentDisposition |
97 |
{ |
98 |
get { return _contentDisposition; } |
99 |
set |
100 |
{ |
101 |
_contentDisposition = value; |
102 |
NotifyOfPropertyChange(() => ContentDisposition); |
103 |
} |
104 |
} |
105 |
|
106 |
private string _contentEncoding; |
107 |
public string ContentEncoding |
108 |
{ |
109 |
get { return _contentEncoding; } |
110 |
set |
111 |
{ |
112 |
_contentEncoding = value; |
113 |
NotifyOfPropertyChange(() => ContentEncoding); |
114 |
} |
115 |
} |
116 |
|
117 |
|
118 |
private string _manifest; |
119 |
public string Manifest |
120 |
{ |
121 |
get { return _manifest; } |
122 |
set |
123 |
{ |
124 |
_manifest = value; |
125 |
NotifyOfPropertyChange(() => Manifest); |
126 |
} |
127 |
} |
128 |
|
129 |
private string _kind; |
130 |
public string Kind |
131 |
{ |
132 |
get { return _kind; } |
133 |
set |
134 |
{ |
135 |
_kind = value; |
136 |
NotifyOfPropertyChange(() => Kind); |
137 |
} |
138 |
} |
139 |
|
140 |
private string _size; |
141 |
public string Size |
142 |
{ |
143 |
get { return _size; } |
144 |
set |
145 |
{ |
146 |
_size = value; |
147 |
NotifyOfPropertyChange(() => Size); |
148 |
} |
149 |
} |
150 |
|
151 |
private string _shortSize; |
152 |
public string ShortSize |
153 |
{ |
154 |
get { return _shortSize; } |
155 |
set |
156 |
{ |
157 |
_shortSize = value; |
158 |
NotifyOfPropertyChange(() => ShortSize); |
159 |
} |
160 |
} |
161 |
|
162 |
private string _where; |
163 |
public string Where |
164 |
{ |
165 |
get { return _where; } |
166 |
set |
167 |
{ |
168 |
_where = value; |
169 |
NotifyOfPropertyChange(() => Where); |
170 |
} |
171 |
} |
172 |
|
173 |
private DateTime _modified; |
174 |
public DateTime Modified |
175 |
{ |
176 |
get { return _modified; } |
177 |
set |
178 |
{ |
179 |
_modified = value; |
180 |
NotifyOfPropertyChange(() => Modified); |
181 |
} |
182 |
} |
183 |
|
184 |
private string _modifiedBy; |
185 |
public string ModifiedBy |
186 |
{ |
187 |
get { return _modifiedBy; } |
188 |
set |
189 |
{ |
190 |
_modifiedBy = value; |
191 |
NotifyOfPropertyChange(() => ModifiedBy); |
192 |
} |
193 |
} |
194 |
|
195 |
private long _version; |
196 |
public long Version |
197 |
{ |
198 |
get { return _version; } |
199 |
set |
200 |
{ |
201 |
_version = value; |
202 |
NotifyOfPropertyChange(() => Version); |
203 |
} |
204 |
} |
205 |
|
206 |
private string _localFileName; |
207 |
protected string LocalFileName |
208 |
{ |
209 |
get { return _localFileName; } |
210 |
set |
211 |
{ |
212 |
_localFileName = value; |
213 |
NotifyOfPropertyChange(() => LocalFileName); |
214 |
} |
215 |
} |
216 |
|
217 |
private BitmapSource _fileIcon; |
218 |
public BitmapSource FileIcon |
219 |
{ |
220 |
get { return _fileIcon; } |
221 |
set |
222 |
{ |
223 |
_fileIcon = value; |
224 |
NotifyOfPropertyChange(() => FileIcon); |
225 |
} |
226 |
} |
227 |
|
228 |
private string _publicUrl; |
229 |
public string PublicUrl |
230 |
{ |
231 |
get { return _publicUrl; } |
232 |
set |
233 |
{ |
234 |
_publicUrl = value; |
235 |
NotifyOfPropertyChange(() => PublicUrl); |
236 |
} |
237 |
} |
238 |
|
239 |
private string _fileName; |
240 |
public string FileName |
241 |
{ |
242 |
get { return _fileName; } |
243 |
set |
244 |
{ |
245 |
_fileName = value; |
246 |
NotifyOfPropertyChange(() => FileName); |
247 |
} |
248 |
} |
249 |
|
250 |
private string _container; |
251 |
public string Container |
252 |
{ |
253 |
get { return _container; } |
254 |
set |
255 |
{ |
256 |
_container = value; |
257 |
NotifyOfPropertyChange(() => Container); |
258 |
} |
259 |
} |
260 |
|
261 |
private string _synchStatus; |
262 |
public string SynchStatus |
263 |
{ |
264 |
get { return _synchStatus; } |
265 |
set |
266 |
{ |
267 |
_synchStatus = value; |
268 |
NotifyOfPropertyChange(()=>SynchStatus); |
269 |
} |
270 |
} |
271 |
|
272 |
public bool TagsChanged { get; private set; } |
273 |
public bool PermissionsChanged { get; private set; } |
274 |
|
275 |
private bool _isBusy = true; |
276 |
public bool IsBusy |
277 |
{ |
278 |
get { return _isBusy; } |
279 |
set |
280 |
{ |
281 |
_isBusy = value; |
282 |
NotifyOfPropertyChange(() => IsBusy); |
283 |
} |
284 |
} |
285 |
|
286 |
|
287 |
public FilePropertiesViewModel(ShellViewModel shell,Task<ObjectInfo> pithosFile,string localFileName) |
288 |
{ |
289 |
if (shell==null) |
290 |
throw new ArgumentNullException("shell"); |
291 |
if (pithosFile==null) |
292 |
throw new ArgumentNullException("pithosFile"); |
293 |
if (String.IsNullOrWhiteSpace(localFileName)) |
294 |
throw new ArgumentNullException("localFileName"); |
295 |
Contract.EndContractBlock(); |
296 |
|
297 |
|
298 |
_tags = new ObservableCollection<MetaValue>(); |
299 |
_tags.CollectionChanged += (sender, evt) => { TagsChanged = true; }; |
300 |
_permissions = new ObservableCollection<Permission>(); |
301 |
_permissions.CollectionChanged += (sender, evt) => { PermissionsChanged = true; }; |
302 |
|
303 |
Shell = shell; |
304 |
LocalFileName = localFileName; |
305 |
pithosFile.ContinueWith(t => |
306 |
{ |
307 |
if (t.IsFaulted) |
308 |
{ |
309 |
IsBusy = false; |
310 |
Execute.OnUIThread(()=>ShowError(t.Exception)); |
311 |
this.TryClose(); |
312 |
|
313 |
} |
314 |
else |
315 |
Execute.OnUIThread(() => PithosFile = t.Result); |
316 |
}); |
317 |
|
318 |
} |
319 |
|
320 |
private void ShowError(AggregateException exception) |
321 |
{ |
322 |
MessageView view = null; |
323 |
if (exception.InnerException is RetryException) |
324 |
view = new MessageView(exception.InnerException as RetryException); |
325 |
else if (exception.InnerException is WebException) |
326 |
view = new MessageView(exception.InnerException as WebException); |
327 |
else |
328 |
view = new MessageView(exception.InnerException); |
329 |
view.ShowDialog(); |
330 |
} |
331 |
|
332 |
|
333 |
protected ShellViewModel Shell { get; set; } |
334 |
|
335 |
private ObjectInfo _pithosFile; |
336 |
public ObjectInfo PithosFile |
337 |
{ |
338 |
get { return _pithosFile; } |
339 |
set |
340 |
{ |
341 |
_pithosFile = value; |
342 |
|
343 |
Permissions.Clear(); |
344 |
Tags.Clear(); |
345 |
|
346 |
var perms=from permission in value.Permissions |
347 |
select new Permission(permission.Key, permission.Value); |
348 |
perms.Apply(perm=>Permissions.Add(perm)); |
349 |
|
350 |
var tags=from tag in value.Tags |
351 |
select new MetaValue(tag.Key, tag.Value); |
352 |
tags.Apply(tag=>Tags.Add(tag)); |
353 |
|
354 |
Title = String.Format("{0} Properties", value.Name); |
355 |
Kind=value.Content_Type; |
356 |
ShortSize = value.Bytes.ToByteSize(); |
357 |
Size = String.Format("{0} ({1:N0} bytes)", ShortSize, value.Bytes); |
358 |
Where = Uri.UnescapeDataString(value.Name); |
359 |
FileName = Uri.UnescapeDataString(value.Name.Split('/').Last()); |
360 |
Container = value.Container; |
361 |
Modified = value.Last_Modified; |
362 |
ModifiedBy = value.ModifiedBy; |
363 |
Version = value.Version??0; |
364 |
|
365 |
ContentDisposition = value.ContendDisposition; |
366 |
ContentEncoding = value.ContentEncoding; |
367 |
Manifest = value.Manifest; |
368 |
IsPublic = value.IsPublic; |
369 |
if (IsPublic) |
370 |
PublicUrl = String.Format("{0}/v1{1}", Shell.Accounts.First(account=>account.UserName==PithosFile.Account).SiteUri,value.PublicUrl); |
371 |
|
372 |
if (Directory.Exists(LocalFileName)) |
373 |
{ |
374 |
FileIcon= new BitmapImage(new Uri("../Images/Folder.ico",UriKind.Relative)); |
375 |
} |
376 |
else if (File.Exists(LocalFileName)) |
377 |
{ |
378 |
using (var icon = Icon.ExtractAssociatedIcon(LocalFileName)) |
379 |
{ |
380 |
FileIcon = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, |
381 |
BitmapSizeOptions.FromEmptyOptions()); |
382 |
} |
383 |
} |
384 |
|
385 |
var status=Shell.GetFileStatus(LocalFileName); |
386 |
SynchStatus = Enum.GetName(typeof (FileStatus), status); |
387 |
|
388 |
|
389 |
NotifyOfPropertyChange(()=>PithosFile); |
390 |
IsBusy = false; |
391 |
} |
392 |
} |
393 |
|
394 |
|
395 |
private readonly ObservableCollection<MetaValue> _tags ; |
396 |
public ObservableCollection<MetaValue> Tags |
397 |
{ |
398 |
get { return _tags;} |
399 |
} |
400 |
|
401 |
private readonly ObservableCollection<Permission> _permissions ; |
402 |
|
403 |
|
404 |
public ObservableCollection<Permission> Permissions |
405 |
{ |
406 |
get { return _permissions; } |
407 |
} |
408 |
|
409 |
public void Reload() |
410 |
{ |
411 |
PithosFile=Shell.RefreshObjectInfo(PithosFile); |
412 |
} |
413 |
|
414 |
public override void CanClose(Action<bool> callback) |
415 |
{ |
416 |
base.CanClose(callback); |
417 |
} |
418 |
|
419 |
public void SaveChanges() |
420 |
{ |
421 |
DoSave(); |
422 |
TryClose(); |
423 |
} |
424 |
|
425 |
public void RejectChanges() |
426 |
{ |
427 |
TryClose(); |
428 |
} |
429 |
|
430 |
public void ApplyChanges() |
431 |
{ |
432 |
DoSave(); |
433 |
} |
434 |
|
435 |
private void DoSave() |
436 |
{ |
437 |
if (TagsChanged) |
438 |
{ |
439 |
PithosFile.Tags = this.Tags.ToDictionary(tag => tag.Name, tag => tag.Value); |
440 |
} |
441 |
|
442 |
if (PermissionsChanged) |
443 |
{ |
444 |
PithosFile.Permissions = this.Permissions.ToDictionary(perm => perm.UserName, perm => perm.Value); |
445 |
} |
446 |
|
447 |
PithosFile.ContendDisposition = ContentDisposition; |
448 |
PithosFile.ContentEncoding = ContentEncoding; |
449 |
PithosFile.Manifest = Manifest; |
450 |
PithosFile.IsPublic = IsPublic; |
451 |
|
452 |
var monitor = Shell.Monitors[PithosFile.Account]; |
453 |
monitor.CloudClient.UpdateMetadata(PithosFile); |
454 |
|
455 |
|
456 |
TagsChanged = false; |
457 |
PermissionsChanged = false; |
458 |
} |
459 |
|
460 |
|
461 |
} |
462 |
} |