private static void AddMessageToView(Mailbox mailbox, MyMessage message)
 {
     mailbox.Messages.Add(message);
 }
 private void UpdateProgressBarSafely(MyMessage message, int loaded, int total)
 {
     if (InvokeRequired) {
         this.BeginInvoke(() =>
                              {
                                  if (ActiveMessage != message) {
                                      return;
                                  }
                                  MessageProgressBar.Value = loaded;
                                  MessageProgressBar.Maximum = total;
                              });
     } else {
         if (ActiveMessage != message) {
             return;
         }
         MessageProgressBar.Value = loaded;
         MessageProgressBar.Maximum = total;
     }
 }
        private void FetchMessageAsync(MyMessage message)
        {
            new Thread(() =>
                           {
                               try {
                                   using (var client = CreateClientByAccount(message.Mailbox.AccountState.Account)) {
                                       client.Select(message.Mailbox.Fullname);

                                       client.DownloadProgressChanged += (sender, e) => UpdateProgressBarSafely(message, e.ReceivedBytes, e.TotalBytes);

                                       message.Message = client.FetchMessageByUid(message.Uid);

                                       if (ActiveMessage == null) {
                                           return;
                                       }

                                       // only display message when user has not moved on
                                       if (ActiveMessage == message) {
                                           DisplayMessageSafely(message);
                                       }
                                   }
                               }
                               catch (Exception ex) {
                                   LogSafely(ex.Message);
                               }
                           }).Start();
        }
 private void DisplayMessageSafely(MyMessage message)
 {
     if (InvokeRequired) {
         this.Invoke(() => DisplayMessage(message));
     }
 }
        private void DisplayMessage(MyMessage message)
        {
            AttachmentListView.Items.Clear();
            MessageViewer.Navigate("about:blank");

            foreach (var attachment in message.Message.Attachments) {
                var item = new ListViewItem(attachment.Filename) {Tag = attachment, BackColor = Color.Orange, ForeColor = Color.WhiteSmoke};
                AttachmentListView.Items.Add(item);
            }

            if (message.Message.Views.Count == 0) {
                return;
            }

            if (message.Message.HasHtmlView) {
                var html = message.Message.GetHtmlView();
                DisplayView(html.Text);
            } else {
                var plain = message.Message.GetPlainTextView();

                if (plain == null) {
                    if (message.Message.Views.Count > 0) {
                        plain = message.Message.Views.First();
                    }
                }

                if (plain == null) {
                    LogSafely("No view found ... shouldnt be ...");
                    return;
                }

                // we want line breaks in text documents
                if (string.IsNullOrEmpty(plain.Text)) {
                    return;
                }

                DisplayView(plain.Text.Replace(Environment.NewLine, "<br />"));
            }
        }
 private void AddMessageToViewSafely(Mailbox mailbox, MyMessage message)
 {
     if (InvokeRequired) {
         this.Invoke(() => AddMessageToView(mailbox, message));
     } else {
         AddMessageToView(mailbox, message);
     }
 }