Added new functionality to create appointments when dragging & dropping emails into the calendar. By default will create them on the designated day, using current's day time rounded up within the following 15 minutes.
This commit is contained in:
parent
cbb4618c7e
commit
d6526a2d11
@ -11,15 +11,6 @@ namespace Outlook2013TodoAddIn
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class AppointmentsControl : UserControl
|
public partial class AppointmentsControl : UserControl
|
||||||
{
|
{
|
||||||
#region "Variables"
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used to retrieve the email address of a contact
|
|
||||||
/// </summary>
|
|
||||||
private const string PR_SMTP_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E";
|
|
||||||
|
|
||||||
#endregion "Variables"
|
|
||||||
|
|
||||||
#region "Properties"
|
#region "Properties"
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -283,10 +274,10 @@ namespace Outlook2013TodoAddIn
|
|||||||
if (appt != null)
|
if (appt != null)
|
||||||
{
|
{
|
||||||
Outlook.MailItem mail = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
|
Outlook.MailItem mail = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
|
||||||
string curUserAddress = GetEmailAddress(Globals.ThisAddIn.Application.Session.CurrentUser);
|
string curUserAddress = OutlookHelper.GetEmailAddress(Globals.ThisAddIn.Application.Session.CurrentUser);
|
||||||
foreach (Outlook.Recipient rcpt in appt.Recipients)
|
foreach (Outlook.Recipient rcpt in appt.Recipients)
|
||||||
{
|
{
|
||||||
string smtpAddress = GetEmailAddress(rcpt);
|
string smtpAddress = OutlookHelper.GetEmailAddress(rcpt);
|
||||||
if (curUserAddress != smtpAddress)
|
if (curUserAddress != smtpAddress)
|
||||||
{
|
{
|
||||||
mail.Recipients.Add(smtpAddress);
|
mail.Recipients.Add(smtpAddress);
|
||||||
@ -299,17 +290,6 @@ namespace Outlook2013TodoAddIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Resolves Outlook recipient email address
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="rcpt">Recipient</param>
|
|
||||||
/// <returns>Email address of the contact</returns>
|
|
||||||
private string GetEmailAddress(Outlook.Recipient rcpt)
|
|
||||||
{
|
|
||||||
Outlook.PropertyAccessor pa = rcpt.PropertyAccessor;
|
|
||||||
return pa.GetProperty(PR_SMTP_ADDRESS).ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Switch to the calendar view when double-clicking a date
|
/// Switch to the calendar view when double-clicking a date
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -7,6 +7,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using Outlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Outlook2013TodoAddIn
|
namespace Outlook2013TodoAddIn
|
||||||
{
|
{
|
||||||
@ -156,6 +157,9 @@ namespace Outlook2013TodoAddIn
|
|||||||
lblCtrl.MouseLeave += lblCtrl_MouseLeave;
|
lblCtrl.MouseLeave += lblCtrl_MouseLeave;
|
||||||
lblCtrl.Click += lblCtrl_Click; // TODO: If we disable this, then we can't select a date...
|
lblCtrl.Click += lblCtrl_Click; // TODO: If we disable this, then we can't select a date...
|
||||||
lblCtrl.DoubleClick += lblCtrl_DoubleClick;
|
lblCtrl.DoubleClick += lblCtrl_DoubleClick;
|
||||||
|
lblCtrl.AllowDrop = true;
|
||||||
|
lblCtrl.DragEnter += lblCtrl_DragEnter;
|
||||||
|
lblCtrl.DragDrop += lblCtrl_DragDrop;
|
||||||
}
|
}
|
||||||
this.tableLayoutPanel1.Controls.Add(lblCtrl);
|
this.tableLayoutPanel1.Controls.Add(lblCtrl);
|
||||||
this.tableLayoutPanel1.SetCellPosition(lblCtrl, new TableLayoutPanelCellPosition(col, row));
|
this.tableLayoutPanel1.SetCellPosition(lblCtrl, new TableLayoutPanelCellPosition(col, row));
|
||||||
@ -166,6 +170,92 @@ namespace Outlook2013TodoAddIn
|
|||||||
this.btnNext.FlatAppearance.MouseOverBackColor = this.HoverBackColor;
|
this.btnNext.FlatAppearance.MouseOverBackColor = this.HoverBackColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// To enable/disable drop operations on every day of the calendar
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">Sender</param>
|
||||||
|
/// <param name="e">DragEventArgs</param>
|
||||||
|
private void lblCtrl_DragEnter(object sender, DragEventArgs e)
|
||||||
|
{
|
||||||
|
List<string> outlookRequiredFormats = new List<string>() { "RenPrivateSourceFolder", "RenPrivateMessages", "RenPrivateItem", "FileGroupDescriptor", "FileGroupDescriptorW", "FileContents", "Object Descriptor" };
|
||||||
|
if (outlookRequiredFormats.All(r => e.Data.GetDataPresent(r)))
|
||||||
|
{
|
||||||
|
e.Effect = DragDropEffects.Copy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e.Effect = DragDropEffects.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When the user "drops" one or more email items into the calendar
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">Sender</param>
|
||||||
|
/// <param name="e">DragEventArgs</param>
|
||||||
|
private void lblCtrl_DragDrop(object sender, DragEventArgs e)
|
||||||
|
{
|
||||||
|
Label lblDay = sender as Label;
|
||||||
|
if (sender != null)
|
||||||
|
{
|
||||||
|
Outlook.Explorer mailExpl = Globals.ThisAddIn.Application.ActiveExplorer();
|
||||||
|
List<string> attendees = new List<string>();
|
||||||
|
string curUserAddress = OutlookHelper.GetEmailAddress(Globals.ThisAddIn.Application.Session.CurrentUser);
|
||||||
|
string body = String.Empty;
|
||||||
|
string subject = String.Empty;
|
||||||
|
foreach (object obj in mailExpl.Selection)
|
||||||
|
{
|
||||||
|
Outlook.MailItem mail = obj as Outlook.MailItem;
|
||||||
|
if (mail != null)
|
||||||
|
{
|
||||||
|
subject = mail.Subject;
|
||||||
|
body = mail.Body;
|
||||||
|
if (mail.SenderEmailAddress != curUserAddress && !attendees.Contains(mail.SenderEmailAddress))
|
||||||
|
{
|
||||||
|
attendees.Add(mail.SenderEmailAddress);
|
||||||
|
}
|
||||||
|
attendees.AddRange(OutlookHelper.GetRecipentsEmailAddresses(mail.Recipients, curUserAddress));
|
||||||
|
}
|
||||||
|
else // It's not an email, let's see if it's a meeting instead
|
||||||
|
{
|
||||||
|
Outlook.MeetingItem meeting = obj as Outlook.MeetingItem;
|
||||||
|
if (meeting != null)
|
||||||
|
{
|
||||||
|
subject = meeting.Subject;
|
||||||
|
body = meeting.Body;
|
||||||
|
if (meeting.SenderEmailAddress != curUserAddress && !attendees.Contains(meeting.SenderEmailAddress))
|
||||||
|
{
|
||||||
|
attendees.Add(meeting.SenderEmailAddress);
|
||||||
|
}
|
||||||
|
attendees.AddRange(OutlookHelper.GetRecipentsEmailAddresses(meeting.Recipients, curUserAddress));
|
||||||
|
}
|
||||||
|
else // It wasn't a meeting either, let's try with an appointment
|
||||||
|
{
|
||||||
|
Outlook.AppointmentItem appointment = obj as Outlook.AppointmentItem;
|
||||||
|
if (appointment != null)
|
||||||
|
{
|
||||||
|
subject = appointment.Subject;
|
||||||
|
body = appointment.Body;
|
||||||
|
if (appointment.Organizer != curUserAddress && !attendees.Contains(appointment.Organizer))
|
||||||
|
{
|
||||||
|
attendees.Add(appointment.Organizer);
|
||||||
|
}
|
||||||
|
attendees.AddRange(OutlookHelper.GetRecipentsEmailAddresses(appointment.Recipients, curUserAddress));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Outlook.AppointmentItem appt = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olAppointmentItem) as Outlook.AppointmentItem;
|
||||||
|
attendees.ForEach(a => appt.Recipients.Add(a));
|
||||||
|
appt.Body = Environment.NewLine + Environment.NewLine + body;
|
||||||
|
appt.Subject = subject;
|
||||||
|
DateTime day = (DateTime)lblDay.Tag;
|
||||||
|
DateTime now = DateTime.Now;
|
||||||
|
appt.Start = OutlookHelper.RoundUp(new DateTime(day.Year, day.Month, day.Day, now.Hour, now.Minute, now.Second), TimeSpan.FromMinutes(15));
|
||||||
|
appt.Display();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Changes labels according to the currently displayed month
|
/// Changes labels according to the currently displayed month
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -201,6 +201,7 @@
|
|||||||
<Compile Include="NewMailAlert.Designer.cs">
|
<Compile Include="NewMailAlert.Designer.cs">
|
||||||
<DependentUpon>NewMailAlert.cs</DependentUpon>
|
<DependentUpon>NewMailAlert.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="OutlookHelper.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs">
|
<Compile Include="Properties\AssemblyInfo.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
67
Outlook2013TodoAddIn/OutlookHelper.cs
Normal file
67
Outlook2013TodoAddIn/OutlookHelper.cs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Outlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
|
namespace Outlook2013TodoAddIn
|
||||||
|
{
|
||||||
|
public class OutlookHelper
|
||||||
|
{
|
||||||
|
#region "Variables"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to retrieve the email address of a contact
|
||||||
|
/// </summary>
|
||||||
|
private const string PR_SMTP_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E";
|
||||||
|
|
||||||
|
#endregion "Variables"
|
||||||
|
|
||||||
|
#region "Methods"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resolves Outlook recipient email address
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="rcpt">Recipient</param>
|
||||||
|
/// <returns>Email address of the contact</returns>
|
||||||
|
public static string GetEmailAddress(Outlook.Recipient rcpt)
|
||||||
|
{
|
||||||
|
Outlook.PropertyAccessor pa = rcpt.PropertyAccessor;
|
||||||
|
return pa.GetProperty(PR_SMTP_ADDRESS).ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a list of recipients email addresses, and when exception is present will not be included
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="rcpts">Recipients</param>
|
||||||
|
/// <param name="exception">Email address exception</param>
|
||||||
|
/// <returns>List of emails</returns>
|
||||||
|
public static List<string> GetRecipentsEmailAddresses(Outlook.Recipients rcpts, string exception)
|
||||||
|
{
|
||||||
|
List<string> results = new List<string>();
|
||||||
|
foreach (Outlook.Recipient rcpt in rcpts)
|
||||||
|
{
|
||||||
|
string smtpAddress = OutlookHelper.GetEmailAddress(rcpt);
|
||||||
|
if (smtpAddress != exception && !results.Contains(smtpAddress))
|
||||||
|
{
|
||||||
|
results.Add(smtpAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rounds up a datetime to the nearest X interval
|
||||||
|
/// e.g.: RoundUp(new DateTime(2013, 6, 18, 13, 43, 10), TimeSpan.FromMinutes(15)); -> 6/18/2013 1:45:00 PM
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dt">DateTime</param>
|
||||||
|
/// <param name="d">TimeSpan</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static DateTime RoundUp(DateTime dt, TimeSpan d)
|
||||||
|
{
|
||||||
|
return new DateTime(((dt.Ticks + d.Ticks - 1) / d.Ticks) * d.Ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion "Methods"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user