Added category colors and appointment status. Owner drawn items to make them look a bit nicer. :-)
This commit is contained in:
parent
ef0f86d79d
commit
575d950f41
@ -77,12 +77,14 @@
|
|||||||
this.listView1.Location = new System.Drawing.Point(0, 228);
|
this.listView1.Location = new System.Drawing.Point(0, 228);
|
||||||
this.listView1.MultiSelect = false;
|
this.listView1.MultiSelect = false;
|
||||||
this.listView1.Name = "listView1";
|
this.listView1.Name = "listView1";
|
||||||
|
this.listView1.OwnerDraw = true;
|
||||||
this.listView1.ShowItemToolTips = true;
|
this.listView1.ShowItemToolTips = true;
|
||||||
this.listView1.Size = new System.Drawing.Size(258, 539);
|
this.listView1.Size = new System.Drawing.Size(258, 539);
|
||||||
this.listView1.TabIndex = 4;
|
this.listView1.TabIndex = 4;
|
||||||
this.listView1.TileSize = new System.Drawing.Size(300, 38);
|
this.listView1.TileSize = new System.Drawing.Size(300, 38);
|
||||||
this.listView1.UseCompatibleStateImageBehavior = false;
|
this.listView1.UseCompatibleStateImageBehavior = false;
|
||||||
this.listView1.View = System.Windows.Forms.View.Tile;
|
this.listView1.View = System.Windows.Forms.View.Tile;
|
||||||
|
this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.listView1_DrawItem);
|
||||||
this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick);
|
this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick);
|
||||||
//
|
//
|
||||||
// columnHeader1
|
// columnHeader1
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Drawing.Drawing2D;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Outlook = Microsoft.Office.Interop.Outlook;
|
using Outlook = Microsoft.Office.Interop.Outlook;
|
||||||
@ -360,6 +361,180 @@ namespace Outlook2013TodoAddIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method to custom draw the list items
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">Sender</param>
|
||||||
|
/// <param name="e">DrawListViewItemEventArgs</param>
|
||||||
|
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
|
||||||
|
{
|
||||||
|
e.DrawBackground(); // To avoid repainting (making font "grow")
|
||||||
|
Outlook.AppointmentItem appt = e.Item.Tag as Outlook.AppointmentItem;
|
||||||
|
|
||||||
|
Color catColor = Color.Empty;
|
||||||
|
|
||||||
|
Font itemFont = this.Font;
|
||||||
|
if (!String.IsNullOrEmpty(appt.Categories))
|
||||||
|
{
|
||||||
|
string[] allCats = appt.Categories.Split(new char[] { ',' });
|
||||||
|
if (allCats != null && allCats.Length != 0)
|
||||||
|
{
|
||||||
|
List<string> cs = allCats.Select(cat => cat.Trim()).ToList();
|
||||||
|
cs.ForEach(cat =>
|
||||||
|
{
|
||||||
|
Outlook.Category c = Globals.ThisAddIn.Application.Session.Categories[cat] as Outlook.Category;
|
||||||
|
if (c != null)
|
||||||
|
{
|
||||||
|
catColor = TranslateCategoryColor(c.Color);
|
||||||
|
}
|
||||||
|
// TODO: Check if more than one
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int startRectangleWidth = 65;
|
||||||
|
int horizontalSpacing = 5;
|
||||||
|
|
||||||
|
Rectangle totalRectangle = e.Bounds;
|
||||||
|
Rectangle startRectangle = totalRectangle; startRectangle.Width = startRectangleWidth;
|
||||||
|
Rectangle statusRectangle = totalRectangle; statusRectangle.Width = horizontalSpacing * 2; statusRectangle.Offset(startRectangleWidth + horizontalSpacing, 0);
|
||||||
|
Rectangle subjectRectangle = totalRectangle; subjectRectangle.Height = this.FontHeight; subjectRectangle.Offset(startRectangleWidth + horizontalSpacing * 4, 0);
|
||||||
|
Rectangle locationRectangle = totalRectangle; locationRectangle.Height = this.FontHeight; locationRectangle.Offset(startRectangleWidth + horizontalSpacing * 4, this.FontHeight);
|
||||||
|
bool selected = e.State.HasFlag(ListViewItemStates.Selected);
|
||||||
|
Color back = Color.Empty;
|
||||||
|
if (selected) back = Color.LightCyan;
|
||||||
|
using (Brush br = new SolidBrush(back))
|
||||||
|
e.Graphics.FillRectangle(br, totalRectangle);
|
||||||
|
|
||||||
|
StringFormat rightFormat = new StringFormat();
|
||||||
|
rightFormat.Alignment = StringAlignment.Far;
|
||||||
|
rightFormat.LineAlignment = StringAlignment.Near;
|
||||||
|
StringFormat leftFormat = new StringFormat();
|
||||||
|
leftFormat.Alignment = StringAlignment.Near;
|
||||||
|
leftFormat.LineAlignment = StringAlignment.Near;
|
||||||
|
|
||||||
|
Brush colorBrush = new SolidBrush(this.ForeColor);
|
||||||
|
e.Graphics.DrawString(appt.Start.ToShortTimeString(), this.Font, colorBrush, startRectangle, rightFormat);
|
||||||
|
|
||||||
|
Color statusColor = Color.LightBlue;
|
||||||
|
Brush statusBrush = new SolidBrush(Color.Transparent);
|
||||||
|
switch (appt.BusyStatus)
|
||||||
|
{
|
||||||
|
case Outlook.OlBusyStatus.olBusy:
|
||||||
|
statusBrush = new SolidBrush(statusColor);
|
||||||
|
break;
|
||||||
|
case Outlook.OlBusyStatus.olFree:
|
||||||
|
break;
|
||||||
|
case Outlook.OlBusyStatus.olOutOfOffice:
|
||||||
|
statusBrush = new SolidBrush(Color.Purple); // TODO: Figure this out
|
||||||
|
break;
|
||||||
|
case Outlook.OlBusyStatus.olTentative:
|
||||||
|
statusBrush = new HatchBrush(HatchStyle.BackwardDiagonal, statusColor, this.BackColor);
|
||||||
|
break;
|
||||||
|
case Outlook.OlBusyStatus.olWorkingElsewhere:
|
||||||
|
statusBrush = new HatchBrush(HatchStyle.DottedDiamond, statusColor, this.BackColor);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Let's draw the status with a custom brush
|
||||||
|
e.Graphics.FillRectangle(statusBrush, statusRectangle);
|
||||||
|
e.Graphics.DrawRectangle(new Pen(statusColor), statusRectangle);
|
||||||
|
|
||||||
|
e.Graphics.FillRectangle(new SolidBrush(catColor), subjectRectangle);
|
||||||
|
e.Graphics.DrawString(appt.Subject, new Font(this.Font, FontStyle.Bold), colorBrush, subjectRectangle, leftFormat);
|
||||||
|
e.Graphics.FillRectangle(new SolidBrush(catColor), locationRectangle);
|
||||||
|
e.Graphics.DrawString(appt.Location, this.Font, colorBrush, locationRectangle, leftFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Color TranslateCategoryColor(Outlook.OlCategoryColor col)
|
||||||
|
{
|
||||||
|
Color result = Color.Black;
|
||||||
|
switch (col)
|
||||||
|
{
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorNone:
|
||||||
|
// Nothing
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorRed:
|
||||||
|
result = Color.Red;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorOrange:
|
||||||
|
result = Color.Orange;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorPeach:
|
||||||
|
result = Color.PeachPuff;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorYellow:
|
||||||
|
result = Color.Yellow;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorGreen:
|
||||||
|
result = Color.Green;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorTeal:
|
||||||
|
result = Color.Teal;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorOlive:
|
||||||
|
result = Color.Olive;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorBlue:
|
||||||
|
result = Color.Blue;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorPurple:
|
||||||
|
result = Color.Purple;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorMaroon:
|
||||||
|
result = Color.Maroon;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorSteel:
|
||||||
|
result = Color.LightSteelBlue;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkSteel:
|
||||||
|
result = Color.SteelBlue;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorGray:
|
||||||
|
result = Color.Gray;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkGray:
|
||||||
|
result = Color.DarkGray;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorBlack:
|
||||||
|
result = Color.Black;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkRed:
|
||||||
|
result = Color.DarkRed;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkOrange:
|
||||||
|
result = Color.DarkOrange;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkPeach:
|
||||||
|
result = Color.DarkSalmon;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkYellow:
|
||||||
|
result = Color.DarkGoldenrod;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkGreen:
|
||||||
|
result = Color.DarkGreen;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkTeal:
|
||||||
|
result = Color.DarkCyan;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkOlive:
|
||||||
|
result = Color.DarkOliveGreen;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkBlue:
|
||||||
|
result = Color.DarkBlue;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkPurple:
|
||||||
|
result = Color.DarkViolet;
|
||||||
|
break;
|
||||||
|
case Outlook.OlCategoryColor.olCategoryColorDarkMaroon:
|
||||||
|
result = Color.DarkKhaki;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion "Methods"
|
#endregion "Methods"
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user