Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / TaskbarViewModel.cs @ f2d88248

History | View | Annotate | Download (6.9 kB)

1 5bcf6d70 Panagiotis Kanavos
// -----------------------------------------------------------------------
2 5bcf6d70 Panagiotis Kanavos
// <copyright file="StatusViewModel.cs" company="Microsoft">
3 5bcf6d70 Panagiotis Kanavos
// TODO: Update copyright text.
4 5bcf6d70 Panagiotis Kanavos
// </copyright>
5 5bcf6d70 Panagiotis Kanavos
// -----------------------------------------------------------------------
6 5bcf6d70 Panagiotis Kanavos
7 bfc13ed8 Panagiotis Kanavos
using System.Collections.Concurrent;
8 5bcf6d70 Panagiotis Kanavos
using System.ComponentModel.Composition;
9 5bcf6d70 Panagiotis Kanavos
using System.Diagnostics;
10 0eea575a Panagiotis Kanavos
using System.IO;
11 0c02aa65 Panagiotis Kanavos
using System.Threading.Tasks;
12 5bcf6d70 Panagiotis Kanavos
using System.Windows;
13 5bcf6d70 Panagiotis Kanavos
using Caliburn.Micro;
14 5bcf6d70 Panagiotis Kanavos
using Pithos.Client.WPF.Properties;
15 5bcf6d70 Panagiotis Kanavos
using Pithos.Core;
16 5bcf6d70 Panagiotis Kanavos
using Pithos.Interfaces;
17 5bcf6d70 Panagiotis Kanavos
18 5bcf6d70 Panagiotis Kanavos
namespace Pithos.Client.WPF
19 5bcf6d70 Panagiotis Kanavos
{
20 5bcf6d70 Panagiotis Kanavos
    using System;
21 5bcf6d70 Panagiotis Kanavos
    using System.Collections.Generic;
22 5bcf6d70 Panagiotis Kanavos
    using System.Linq;
23 5bcf6d70 Panagiotis Kanavos
    using System.Text;
24 5bcf6d70 Panagiotis Kanavos
25 5bcf6d70 Panagiotis Kanavos
    /// <summary>
26 5bcf6d70 Panagiotis Kanavos
    /// TODO: Update summary.
27 5bcf6d70 Panagiotis Kanavos
    /// </summary>
28 5bcf6d70 Panagiotis Kanavos
    [Export]
29 0c02aa65 Panagiotis Kanavos
    public class TaskbarViewModel:ViewAware,IStatusNotification
30 5bcf6d70 Panagiotis Kanavos
    {
31 5bcf6d70 Panagiotis Kanavos
        private IStatusChecker _statusChecker;
32 0c02aa65 Panagiotis Kanavos
        private IEventAggregator _events;
33 5bcf6d70 Panagiotis Kanavos
34 5bcf6d70 Panagiotis Kanavos
        public PithosMonitor Monitor { get; private set; }
35 5bcf6d70 Panagiotis Kanavos
36 5bcf6d70 Panagiotis Kanavos
        public IPithosSettings Settings { get; private set; }
37 5bcf6d70 Panagiotis Kanavos
38 5bcf6d70 Panagiotis Kanavos
        public IScreen Parent { get; set; }
39 5bcf6d70 Panagiotis Kanavos
40 5bcf6d70 Panagiotis Kanavos
        [ImportingConstructor]
41 0c02aa65 Panagiotis Kanavos
        public TaskbarViewModel(IEventAggregator events, IStatusChecker statusChecker,PithosMonitor monitor,IPithosSettings settings)
42 5bcf6d70 Panagiotis Kanavos
        {
43 5bcf6d70 Panagiotis Kanavos
            OpenPithosFolderCommand = new PithosCommand(OpenPithosFolder);
44 5bcf6d70 Panagiotis Kanavos
            _statusChecker = statusChecker;
45 0c02aa65 Panagiotis Kanavos
            _events = events;            
46 5bcf6d70 Panagiotis Kanavos
            Settings = settings;
47 5bcf6d70 Panagiotis Kanavos
            Monitor = monitor;
48 0c02aa65 Panagiotis Kanavos
            Monitor.StatusNotification = this;
49 0c02aa65 Panagiotis Kanavos
50 0c02aa65 Panagiotis Kanavos
            
51 5bcf6d70 Panagiotis Kanavos
52 0eea575a Panagiotis Kanavos
            var account=settings.Accounts.FirstOrDefault(act => act.IsActive);
53 0eea575a Panagiotis Kanavos
            if (account != null)
54 0eea575a Panagiotis Kanavos
            {
55 0eea575a Panagiotis Kanavos
                Monitor.UserName = account.AccountName;
56 0eea575a Panagiotis Kanavos
                Monitor.ApiKey = account.ApiKey;
57 3c43ec9b Panagiotis Kanavos
                Monitor.UsePithos = account.UsePithos;
58 79736291 Panagiotis Kanavos
                var appSettings = Properties.Settings.Default;
59 79736291 Panagiotis Kanavos
                Monitor.AuthenticationUrl = account.UsePithos
60 79736291 Panagiotis Kanavos
                                                ? appSettings.PithosAuthenticationUrl
61 79736291 Panagiotis Kanavos
                                                : appSettings.CloudfilesAuthenticationUrl;
62 0eea575a Panagiotis Kanavos
                Monitor.RootPath = Path.Combine(Settings.PithosPath, account.RootPath??"");
63 0eea575a Panagiotis Kanavos
            }
64 0eea575a Panagiotis Kanavos
65 5bcf6d70 Panagiotis Kanavos
        }
66 5bcf6d70 Panagiotis Kanavos
        #region Status Properties
67 5bcf6d70 Panagiotis Kanavos
68 5bcf6d70 Panagiotis Kanavos
        private string _statusMessage;
69 5bcf6d70 Panagiotis Kanavos
        public string StatusMessage
70 5bcf6d70 Panagiotis Kanavos
        {
71 5bcf6d70 Panagiotis Kanavos
            get { return _statusMessage; }
72 5bcf6d70 Panagiotis Kanavos
            set
73 5bcf6d70 Panagiotis Kanavos
            {
74 5bcf6d70 Panagiotis Kanavos
                _statusMessage = value;
75 5bcf6d70 Panagiotis Kanavos
                NotifyOfPropertyChange(() => StatusMessage);
76 5bcf6d70 Panagiotis Kanavos
            }
77 5bcf6d70 Panagiotis Kanavos
        }
78 5bcf6d70 Panagiotis Kanavos
79 5bcf6d70 Panagiotis Kanavos
        private string _usageMessage;
80 5bcf6d70 Panagiotis Kanavos
        public string UsageMessage
81 5bcf6d70 Panagiotis Kanavos
        {
82 5bcf6d70 Panagiotis Kanavos
            get { return _usageMessage; }
83 5bcf6d70 Panagiotis Kanavos
            set
84 5bcf6d70 Panagiotis Kanavos
            {
85 5bcf6d70 Panagiotis Kanavos
                _usageMessage = value;
86 5bcf6d70 Panagiotis Kanavos
                NotifyOfPropertyChange(() => UsageMessage);
87 5bcf6d70 Panagiotis Kanavos
            }
88 5bcf6d70 Panagiotis Kanavos
        }
89 5bcf6d70 Panagiotis Kanavos
90 5bcf6d70 Panagiotis Kanavos
91 5bcf6d70 Panagiotis Kanavos
        private string _pauseSyncCaption="Pause Syncing";
92 5bcf6d70 Panagiotis Kanavos
        public string PauseSyncCaption
93 5bcf6d70 Panagiotis Kanavos
        {
94 5bcf6d70 Panagiotis Kanavos
            get { return _pauseSyncCaption; }
95 5bcf6d70 Panagiotis Kanavos
            set
96 5bcf6d70 Panagiotis Kanavos
            {
97 5bcf6d70 Panagiotis Kanavos
                _pauseSyncCaption = value;
98 5bcf6d70 Panagiotis Kanavos
                NotifyOfPropertyChange(() => PauseSyncCaption);
99 5bcf6d70 Panagiotis Kanavos
            }
100 5bcf6d70 Panagiotis Kanavos
        }
101 5bcf6d70 Panagiotis Kanavos
102 bfc13ed8 Panagiotis Kanavos
        private readonly ObservableConcurrentCollection<FileEntry> _recentFiles = new ObservableConcurrentCollection<FileEntry>();
103 bfc13ed8 Panagiotis Kanavos
        public ObservableConcurrentCollection<FileEntry> RecentFiles
104 5bcf6d70 Panagiotis Kanavos
        {
105 5bcf6d70 Panagiotis Kanavos
            get { return _recentFiles; }
106 5bcf6d70 Panagiotis Kanavos
        }
107 5bcf6d70 Panagiotis Kanavos
108 5bcf6d70 Panagiotis Kanavos
109 5ce54458 Panagiotis Kanavos
        private string _statusIcon="Images/Tray.ico";
110 5bcf6d70 Panagiotis Kanavos
        public string StatusIcon
111 5bcf6d70 Panagiotis Kanavos
        {
112 5bcf6d70 Panagiotis Kanavos
            get { return _statusIcon; }
113 5bcf6d70 Panagiotis Kanavos
            set
114 5bcf6d70 Panagiotis Kanavos
            {
115 5bcf6d70 Panagiotis Kanavos
                _statusIcon = value;
116 5bcf6d70 Panagiotis Kanavos
                NotifyOfPropertyChange(() => StatusIcon);
117 5bcf6d70 Panagiotis Kanavos
            }
118 5bcf6d70 Panagiotis Kanavos
        }
119 5bcf6d70 Panagiotis Kanavos
120 5bcf6d70 Panagiotis Kanavos
        #endregion
121 5bcf6d70 Panagiotis Kanavos
122 5bcf6d70 Panagiotis Kanavos
        #region Commands
123 5bcf6d70 Panagiotis Kanavos
124 5bcf6d70 Panagiotis Kanavos
        public void ShowPreferences()
125 5bcf6d70 Panagiotis Kanavos
        {
126 5bcf6d70 Panagiotis Kanavos
            Settings.Reload();
127 5bcf6d70 Panagiotis Kanavos
        }
128 5bcf6d70 Panagiotis Kanavos
129 5bcf6d70 Panagiotis Kanavos
130 5bcf6d70 Panagiotis Kanavos
        public PithosCommand OpenPithosFolderCommand { get; private set; }
131 5bcf6d70 Panagiotis Kanavos
132 5bcf6d70 Panagiotis Kanavos
        public void OpenPithosFolder()
133 5bcf6d70 Panagiotis Kanavos
        {
134 5bcf6d70 Panagiotis Kanavos
            Process.Start(Settings.PithosPath);
135 5bcf6d70 Panagiotis Kanavos
        }
136 5bcf6d70 Panagiotis Kanavos
137 5bcf6d70 Panagiotis Kanavos
        public void GoToSite()
138 5bcf6d70 Panagiotis Kanavos
        {
139 5bcf6d70 Panagiotis Kanavos
            Process.Start(Properties.Settings.Default.PithosSite);
140 5bcf6d70 Panagiotis Kanavos
        }
141 5bcf6d70 Panagiotis Kanavos
142 5bcf6d70 Panagiotis Kanavos
143 5bcf6d70 Panagiotis Kanavos
        public void ToggleSynching()
144 5bcf6d70 Panagiotis Kanavos
        {
145 5bcf6d70 Panagiotis Kanavos
            Monitor.Pause = !Monitor.Pause;
146 5bcf6d70 Panagiotis Kanavos
            PauseSyncCaption = Monitor.Pause ? "Resume syncing" : "Pause syncing";
147 5bcf6d70 Panagiotis Kanavos
            var iconKey = Monitor.Pause ? "TraySyncPaused" : "TrayInSynch";
148 5bcf6d70 Panagiotis Kanavos
            StatusIcon = String.Format(@"Images/{0}.ico", iconKey);
149 5bcf6d70 Panagiotis Kanavos
        }
150 5bcf6d70 Panagiotis Kanavos
151 5bcf6d70 Panagiotis Kanavos
        public void ExitPithos()
152 5bcf6d70 Panagiotis Kanavos
        {
153 5bcf6d70 Panagiotis Kanavos
            Monitor.Stop();
154 5bcf6d70 Panagiotis Kanavos
            Parent.TryClose();
155 5bcf6d70 Panagiotis Kanavos
        }
156 5bcf6d70 Panagiotis Kanavos
        #endregion
157 5bcf6d70 Panagiotis Kanavos
158 5bcf6d70 Panagiotis Kanavos
159 5bcf6d70 Panagiotis Kanavos
        private Dictionary<PithosStatus, StatusInfo> iconNames = new List<StatusInfo>
160 5bcf6d70 Panagiotis Kanavos
            {
161 5bcf6d70 Panagiotis Kanavos
                new StatusInfo(PithosStatus.InSynch, "All files up to date", "TrayInSynch"),
162 5bcf6d70 Panagiotis Kanavos
                new StatusInfo(PithosStatus.Syncing, "Syncing Files", "TraySynching"),
163 5bcf6d70 Panagiotis Kanavos
                new StatusInfo(PithosStatus.SyncPaused, "Sync Paused", "TraySyncPaused")
164 5bcf6d70 Panagiotis Kanavos
            }.ToDictionary(s => s.Status);
165 5bcf6d70 Panagiotis Kanavos
166 5bcf6d70 Panagiotis Kanavos
        
167 5bcf6d70 Panagiotis Kanavos
        public void UpdateStatus()
168 5bcf6d70 Panagiotis Kanavos
        {
169 5bcf6d70 Panagiotis Kanavos
            var pithosStatus = _statusChecker.GetPithosStatus();
170 5bcf6d70 Panagiotis Kanavos
171 5bcf6d70 Panagiotis Kanavos
            if (iconNames.ContainsKey(pithosStatus))
172 5bcf6d70 Panagiotis Kanavos
            {
173 5bcf6d70 Panagiotis Kanavos
                var info = iconNames[pithosStatus];
174 5bcf6d70 Panagiotis Kanavos
                StatusIcon = String.Format(@"Images/{0}.ico", info.IconName);
175 5bcf6d70 Panagiotis Kanavos
                StatusMessage = String.Format("Pithos 1.0\r\n{0}", info.StatusText);
176 5bcf6d70 Panagiotis Kanavos
            }
177 0c02aa65 Panagiotis Kanavos
178 0c02aa65 Panagiotis Kanavos
            var tv=this.GetView();
179 0c02aa65 Panagiotis Kanavos
            _events.Publish(new Notification { Title = "Start", Message = "Start Monitoring", Level = TraceLevel.Info});
180 0eea575a Panagiotis Kanavos
            if (!String.IsNullOrWhiteSpace(Monitor.UserName) &&
181 0eea575a Panagiotis Kanavos
                !String.IsNullOrWhiteSpace(Monitor.ApiKey))
182 a27aa447 Panagiotis Kanavos
                StartMonitor();                
183 a27aa447 Panagiotis Kanavos
        }
184 a27aa447 Panagiotis Kanavos
185 a27aa447 Panagiotis Kanavos
        private void StartMonitor()
186 a27aa447 Panagiotis Kanavos
        {
187 a27aa447 Panagiotis Kanavos
            Task.Factory.StartNew(() =>
188 a27aa447 Panagiotis Kanavos
            {
189 a27aa447 Panagiotis Kanavos
                try
190 a27aa447 Panagiotis Kanavos
                {
191 a27aa447 Panagiotis Kanavos
                    Monitor.Start();
192 a27aa447 Panagiotis Kanavos
                }
193 a27aa447 Panagiotis Kanavos
                catch(Exception exc)
194 a27aa447 Panagiotis Kanavos
                {
195 a27aa447 Panagiotis Kanavos
                    var message = String.Format("An exception occured. Can't start monitoring\nWill retry in 10 seconds\n{0}",exc);
196 a27aa447 Panagiotis Kanavos
                    _events.Publish(new Notification{Title = "Error", Message = message, Level = TraceLevel.Error});
197 a27aa447 Panagiotis Kanavos
                    Task.Factory.StartNewDelayed(10000, StartMonitor);                    
198 a27aa447 Panagiotis Kanavos
                }
199 a27aa447 Panagiotis Kanavos
            });
200 0c02aa65 Panagiotis Kanavos
        }
201 0c02aa65 Panagiotis Kanavos
202 0c02aa65 Panagiotis Kanavos
203 0c02aa65 Panagiotis Kanavos
        public void NotifyChange(string status, TraceLevel level=TraceLevel.Info)
204 0c02aa65 Panagiotis Kanavos
        {
205 0c02aa65 Panagiotis Kanavos
            this.StatusMessage = status;
206 0c02aa65 Panagiotis Kanavos
            
207 0c02aa65 Panagiotis Kanavos
            _events.Publish(new Notification { Title = "Pithos", Message = status, Level = level });
208 5bcf6d70 Panagiotis Kanavos
        }
209 bfc13ed8 Panagiotis Kanavos
210 bfc13ed8 Panagiotis Kanavos
        public void NotifyChangedFile(string filePath)
211 bfc13ed8 Panagiotis Kanavos
        {
212 bfc13ed8 Panagiotis Kanavos
            var entry = new FileEntry {FullPath=filePath};
213 bfc13ed8 Panagiotis Kanavos
            IProducerConsumerCollection<FileEntry> files=this.RecentFiles;
214 bfc13ed8 Panagiotis Kanavos
            FileEntry popped;
215 bfc13ed8 Panagiotis Kanavos
            while (files.Count > 5)
216 bfc13ed8 Panagiotis Kanavos
                files.TryTake(out popped);
217 bfc13ed8 Panagiotis Kanavos
            files.TryAdd(entry);
218 bfc13ed8 Panagiotis Kanavos
        }
219 5bcf6d70 Panagiotis Kanavos
    }
220 5bcf6d70 Panagiotis Kanavos
}