Changes for directories
[pithos-ms-client] / trunk / Pithos.Client.WPF / Shell / MessageView.xaml.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Collections.ObjectModel;
4 using System.ComponentModel;
5 using System.ComponentModel.Composition;
6 using System.Linq;
7 using System.Linq.Expressions;
8 using System.Net;
9 using System.Net.Mail;
10 using System.Text;
11 using System.Windows;
12 using System.Windows.Controls;
13 using System.Windows.Data;
14 using System.Windows.Documents;
15 using System.Windows.Input;
16 using System.Windows.Media;
17 using System.Windows.Media.Imaging;
18 using System.Windows.Shapes;
19 using Caliburn.Micro;
20 using Pithos.Client.WPF.Shell;
21 using Pithos.Network;
22
23 namespace Pithos.Client.WPF
24 {
25     /// <summary>
26     /// Interaction logic for MessageView.xaml
27     /// </summary>
28     public partial class MessageView : Window, INotifyPropertyChanged
29     {
30         public ObservableCollection<UserMessage> UserMessages { get; set; }
31
32         private string _message;
33         public string Message
34         {
35             get
36             {
37                 return _message;
38             }
39             set
40             {
41                 _message = value;
42                 NotifyOfPropertyChange(()=>Message);
43             }
44         }
45
46
47         public MessageView(IEnumerable<UserMessage> userMessages)
48         {
49             UserMessages = new ObservableCollection<UserMessage>(userMessages);
50             DataContext = this;
51             InitializeComponent();            
52         }
53
54
55         
56         public MessageView(WebException exception)
57         {
58             DataContext = this;
59             InitializeComponent();
60
61             var messages = new List<UserMessage>();
62             
63             if ((exception.Response as HttpWebResponse).StatusCode == HttpStatusCode.Unauthorized)
64             {
65                 Message = "Your authorization token has expired. Please renew the token and try again ";
66                 Title = "Authorization expired";
67             }
68             else
69             {
70                 messages.Add(new UserMessage
71                 {
72                     Message = exception.InnerException.Message,
73                     Details = exception.InnerException.ToString(),
74                     Severity = Severity.Warn
75                 });
76                 Message = "There was an error while retrieving the item's information";
77                 Title = "Error";
78             }
79             UserMessages = new ObservableCollection<UserMessage>(messages);
80         }
81
82         public MessageView(RetryException exception)
83         {
84             DataContext = this;
85             InitializeComponent();
86
87             var messages = new List<UserMessage>{
88                 new UserMessage{
89                         Message = exception.InnerException.Message,
90                         Details = exception.InnerException.ToString(),
91                         Severity = Severity.Warn
92                     }
93             };
94
95             Title = "Network error";
96             Message = "The connection to the server timed out. Please check your network connection and try again later";                
97
98             UserMessages = new ObservableCollection<UserMessage>(messages);
99         }
100         
101         public MessageView(Exception exception)
102         {
103             DataContext = this;
104             InitializeComponent();
105
106             var messages = new List<UserMessage>{
107                 new UserMessage{
108                         Message = exception.InnerException.Message,
109                         Details = exception.InnerException.ToString(),
110                         Severity = Severity.Warn
111                     }
112             };
113
114             Title = "Unexpected error";
115             Message = "An unexpected error has occured";                
116
117             UserMessages = new ObservableCollection<UserMessage>(messages);
118         }
119
120         /// <summary>
121         /// Copies the messages to the clipboard
122         /// </summary>
123         private void OnCopy(object sender, ExecutedRoutedEventArgs e)
124         {
125             var text = GetLogText();
126             Clipboard.SetText(text);
127         }
128
129         private string GetLogText()
130         {
131             StringBuilder logText = new StringBuilder()
132                 .Append('-', 30)
133                 .AppendLine("\r\nPithos")
134                 .Append('-', 30)
135                 .AppendLine()
136                 .AppendLine();
137             foreach (var message in UserMessages)
138             {
139                 logText
140                     .Append('-', 20)
141                     .AppendFormat("\r\n[{0,5}]\t{1}", message.Severity, message.Message)
142                     .AppendLine()
143                     .AppendLine(message.Details)
144                     .AppendLine();
145             }
146
147             var text = logText.ToString();
148             return text;
149         }
150
151         private void OnClose(object sender, ExecutedRoutedEventArgs e)
152         {
153             this.Close();
154         }
155
156         public event PropertyChangedEventHandler PropertyChanged;
157
158         private void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property)
159         {
160             if (PropertyChanged!=null)
161                 PropertyChanged(this,new PropertyChangedEventArgs(property.GetMemberInfo().Name));
162         }
163
164         private void OnSend(object sender, RoutedEventArgs e)
165         {
166             var manager=IoC.Get<IWindowManager>();
167             var logText = GetLogText();
168             var feedBack = IoC.Get<FeedbackViewModel>();
169             feedBack.AppendData(logText);
170             manager.ShowWindow(feedBack);
171             this.Close();
172         }
173     }
174
175     public class UserMessage
176     {
177         public string Message { get; set; }
178
179         public Severity Severity { get; set; }
180         public string Details { get; set; }
181     }
182
183     public enum Severity
184     {
185         Info,
186         Warn,
187         Error
188     }
189 }