589 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			589 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if (FRAMEWORK20)
 | 
						|
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.ComponentModel;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents an item that displays log information in list container.
 | 
						|
    /// </summary>
 | 
						|
    public class LogItem : BaseItem
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private const int DefaultWidth = 96;
 | 
						|
        private const int VerticalPadding = 3;
 | 
						|
        private const int HorizontalPadding = 7;
 | 
						|
        private const int TextLineSpacing = 4;
 | 
						|
        private const int MinimumHeight = 32;
 | 
						|
        private Size _CalloutSize = new Size(10, 10);
 | 
						|
        private int _CornerSize = 5;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Events
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when text markup link is clicked. Markup links can be created using "a" tag, for example:
 | 
						|
        /// <a name="MyLink">Markup link</a>
 | 
						|
        /// </summary>
 | 
						|
        public event MarkupLinkClickEventHandler MarkupLinkClick;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the LogItem class.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name=""></param>
 | 
						|
        public LogItem():this("","")
 | 
						|
        {
 | 
						|
        }
 | 
						|
		/// <summary>
 | 
						|
        /// Creates new instance of LogItem and assigns the name to it.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="sItemName">Item name.</param>
 | 
						|
		public LogItem(string sItemName):this(sItemName,"") {}
 | 
						|
		/// <summary>
 | 
						|
        /// Creates new instance of LogItem and assigns the name and text to it.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="sItemName">Item name.</param>
 | 
						|
		/// <param name="ItemText">item text.</param>
 | 
						|
        public LogItem(string sItemName, string ItemText)
 | 
						|
            : base(sItemName, ItemText)
 | 
						|
        {
 | 
						|
            SetIsContainer(true);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Dispose(bool disposing)
 | 
						|
        {
 | 
						|
            if (BarUtilities.DisposeItemImages && !this.DesignMode)
 | 
						|
            {
 | 
						|
                BarUtilities.DisposeImage(ref _Image);
 | 
						|
            }
 | 
						|
            base.Dispose(disposing);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
		/// Returns copy of the item.
 | 
						|
		/// </summary>
 | 
						|
		public override BaseItem Copy()
 | 
						|
		{
 | 
						|
            LogItem copy = new LogItem(m_Name);
 | 
						|
			this.CopyToItem(copy);
 | 
						|
			return copy;
 | 
						|
		}
 | 
						|
		/// <summary>
 | 
						|
		/// Copies the ButtonItem specific properties to new instance of the item.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="copy">New ButtonItem instance.</param>
 | 
						|
        protected override void CopyToItem(BaseItem instanceCopy)
 | 
						|
        {
 | 
						|
            LogItem copy = instanceCopy as LogItem;
 | 
						|
            base.CopyToItem(instanceCopy);
 | 
						|
 | 
						|
            copy.BackColor = this.BackColor;
 | 
						|
            copy.Created = this.Created;
 | 
						|
            copy.HeaderTextColor = this.HeaderTextColor;
 | 
						|
            if (this.Image != null)
 | 
						|
                copy.Image = (Image) this.Image.Clone();
 | 
						|
            copy.ImagePosition = this.ImagePosition;
 | 
						|
            copy.SourceName = this.SourceName;
 | 
						|
            copy.TextColor = this.TextColor;
 | 
						|
        }
 | 
						|
 | 
						|
        public override BaseItem ItemAtLocation(int x, int y)
 | 
						|
        {
 | 
						|
            if (this.SubItems.Count > 0)
 | 
						|
            {
 | 
						|
                BaseItem item = base.ItemAtLocation(x, y);
 | 
						|
                if (item != null) return item;
 | 
						|
            }
 | 
						|
            return this.Bounds.Contains(x, y) ? this : null;
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual int GetTextWidth(Rectangle bounds)
 | 
						|
        {
 | 
						|
            int textWidth = Math.Max(0, bounds.Width - (HorizontalPadding * 2 + _CalloutSize.Width + (_Image != null ? _ImageSize.Width : 0)));
 | 
						|
            return textWidth;
 | 
						|
        }
 | 
						|
 | 
						|
        public override void RecalcSize()
 | 
						|
        {
 | 
						|
            // We accept the width assigned and calculate the height based on that...
 | 
						|
            Rectangle bounds = this.DisplayRectangle;
 | 
						|
            Size imageSize = _ImageSize;
 | 
						|
 | 
						|
            if (bounds.Width <= 0)
 | 
						|
            {
 | 
						|
                if (_Image != null)
 | 
						|
                    bounds.Width = imageSize.Width;
 | 
						|
                bounds.Width += DefaultWidth;
 | 
						|
            }
 | 
						|
 | 
						|
            if (_Image != null && bounds.Width - (imageSize.Width + 25) <= 1)
 | 
						|
            {
 | 
						|
                bounds.Height = imageSize.Height;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                int totalHeight = VerticalPadding * 2;
 | 
						|
                Control parent = this.ContainerControl as Control;
 | 
						|
                if (parent != null)
 | 
						|
                {
 | 
						|
                    Font font = parent.Font;
 | 
						|
                    using (Graphics g = parent.CreateGraphics())
 | 
						|
                    {
 | 
						|
                        int textWidth = GetTextWidth(bounds);
 | 
						|
                        Size textSize = TextDrawing.MeasureString(g, (string.IsNullOrEmpty(this.SourceName) ? "A" : this.SourceName), font);
 | 
						|
                        totalHeight += textSize.Height + TextLineSpacing;
 | 
						|
 | 
						|
                        textSize = ButtonItemLayout.MeasureItemText(this, g, textWidth, font, eTextFormat.WordBreak, parent.RightToLeft == RightToLeft.Yes);
 | 
						|
                        //textSize = TextDrawing.MeasureString(g, this.Text, font, textWidth, eTextFormat.WordBreak);
 | 
						|
 | 
						|
                        totalHeight += textSize.Height + TextLineSpacing;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                bounds.Height = Math.Max(totalHeight, (imageSize != null ? imageSize.Height : MinimumHeight));
 | 
						|
            }
 | 
						|
 | 
						|
            base.RecalcSize();
 | 
						|
 | 
						|
            m_Rect = bounds;
 | 
						|
        }
 | 
						|
 | 
						|
        public override void Paint(ItemPaintArgs p)
 | 
						|
        {
 | 
						|
            Graphics g = p.Graphics;
 | 
						|
            Rectangle bounds = this.DisplayRectangle;
 | 
						|
 | 
						|
            if (_Image != null)
 | 
						|
            {
 | 
						|
                Rectangle imageRect = GetImageRect(bounds);
 | 
						|
                g.DrawImage(_Image, imageRect);
 | 
						|
            }
 | 
						|
 | 
						|
            Rectangle contentBounds = GetContentBounds(bounds);
 | 
						|
 | 
						|
            // Draw shadow
 | 
						|
            Rectangle shadowBounds = contentBounds;
 | 
						|
            shadowBounds.Inflate(1, 0);
 | 
						|
            shadowBounds.Offset(0, 1);
 | 
						|
            using (GraphicsPath path = CreateCalloutPath(shadowBounds))
 | 
						|
            {
 | 
						|
                using (Pen pen = new Pen(Color.FromArgb(32, Color.Black)))
 | 
						|
                    g.DrawPath(pen, path);
 | 
						|
            }
 | 
						|
 | 
						|
            using (GraphicsPath path = CreateCalloutPath(contentBounds))
 | 
						|
            {
 | 
						|
                Brush fill = GetCalloutBrush();
 | 
						|
                if (fill != null)
 | 
						|
                {
 | 
						|
                    g.FillPath(fill, path);
 | 
						|
                    fill.Dispose();
 | 
						|
                }
 | 
						|
                Pen pen = GetCalloutPen();
 | 
						|
                if (pen != null)
 | 
						|
                {
 | 
						|
                    g.DrawPath(pen, path);
 | 
						|
                    pen.Dispose();
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            Color headerColor = GetHeaderColor();
 | 
						|
            Rectangle headerTextBounds = GetTextBounds(bounds);
 | 
						|
            Rectangle textBounds = headerTextBounds;
 | 
						|
            string userName = this.SourceName;
 | 
						|
            if (!string.IsNullOrEmpty(userName))
 | 
						|
            {
 | 
						|
                using (Font font = new Font(p.Font, FontStyle.Bold))
 | 
						|
                {
 | 
						|
                    TextDrawing.DrawString(g, userName, font, headerColor, headerTextBounds, eTextFormat.Top | eTextFormat.Left);
 | 
						|
                    textBounds.Y += font.Height + TextLineSpacing;
 | 
						|
                    textBounds.Height -= font.Height + TextLineSpacing;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (_Created != DateTime.MinValue && _Created != DateTime.MaxValue)
 | 
						|
            {
 | 
						|
                TimeSpan span = DateTime.Now.Subtract(_Created);
 | 
						|
                //Console.WriteLine("Tweet from {0} created on {1}", SourceName, _Created);
 | 
						|
                string timeString = GetHumanTimeSpan(span);
 | 
						|
                using (Font font = new Font(p.Font, FontStyle.Italic))
 | 
						|
                {
 | 
						|
                    TextDrawing.DrawString(g, timeString, font, headerColor, headerTextBounds, eTextFormat.Top | eTextFormat.Right);
 | 
						|
                    headerTextBounds.Y += font.Height + TextLineSpacing;
 | 
						|
                    headerTextBounds.Height -= font.Height + TextLineSpacing;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            string text = this.Text;
 | 
						|
            Color textColor = GetTextColor();
 | 
						|
            if (!string.IsNullOrEmpty(text))
 | 
						|
            {
 | 
						|
                Font font = p.Font;
 | 
						|
                if (this.TextMarkupBody != null)
 | 
						|
                {
 | 
						|
                    TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, p.RightToLeft);
 | 
						|
                    d.HotKeyPrefixVisible = true;
 | 
						|
                    this.TextMarkupBody.Bounds = textBounds;
 | 
						|
                    this.TextMarkupBody.Render(d);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    TextDrawing.DrawString(g,
 | 
						|
                        text,
 | 
						|
                        font,
 | 
						|
                        textColor,
 | 
						|
                        textBounds,
 | 
						|
                        eTextFormat.Top | eTextFormat.Left | eTextFormat.WordBreak | eTextFormat.WordEllipsis);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _TextColor = Color.Empty;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the color of the control text body.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Columns"), Description("Indicates color of control text body.")]
 | 
						|
        public Color TextColor
 | 
						|
        {
 | 
						|
            get { return _TextColor; }
 | 
						|
            set { _TextColor = value; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeTextColor()
 | 
						|
        {
 | 
						|
            return !_TextColor.IsEmpty;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Resets property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetTextColor()
 | 
						|
        {
 | 
						|
            this.TextColor = Color.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
        private Color GetTextColor()
 | 
						|
        {
 | 
						|
            if (!_TextColor.IsEmpty)
 | 
						|
                return _TextColor;
 | 
						|
            return Color.Black;
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _HeaderTextColor = Color.Empty;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the color of the header text.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Columns"), Description("Indicates color of header text.")]
 | 
						|
        public Color HeaderTextColor
 | 
						|
        {
 | 
						|
            get { return _HeaderTextColor; }
 | 
						|
            set { _HeaderTextColor = value; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeHeaderTextColor()
 | 
						|
        {
 | 
						|
            return !_HeaderTextColor.IsEmpty;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Resets property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetHeaderTextColor()
 | 
						|
        {
 | 
						|
            this.HeaderTextColor = Color.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
        private Color GetHeaderColor()
 | 
						|
        {
 | 
						|
            if (!_HeaderTextColor.IsEmpty) return _HeaderTextColor;
 | 
						|
            return ColorScheme.GetColor(0x5D8CCB);
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual Rectangle GetTextBounds(Rectangle bounds)
 | 
						|
        {
 | 
						|
            Rectangle textBounds = GetContentBounds(bounds);
 | 
						|
            if (_ImagePosition == eLogItemImagePosition.Left)
 | 
						|
                textBounds.X += _CalloutSize.Width;
 | 
						|
            textBounds.Width -= _CalloutSize.Width;
 | 
						|
            textBounds.Inflate(-HorizontalPadding, -VerticalPadding);
 | 
						|
            return textBounds;
 | 
						|
        }
 | 
						|
 | 
						|
        private Brush GetCalloutBrush()
 | 
						|
        {
 | 
						|
            return new SolidBrush(_BackColor);
 | 
						|
            return new SolidBrush(ColorScheme.GetColor(0xE6EDF7));
 | 
						|
            return new SolidBrush(Color.FromArgb(208, Color.White));
 | 
						|
        }
 | 
						|
 | 
						|
        private Pen GetCalloutPen()
 | 
						|
        {
 | 
						|
            return new Pen(ColorScheme.GetColor(0x5D8CC9), 1f);
 | 
						|
        }
 | 
						|
 | 
						|
        private GraphicsPath CreateCalloutPath(Rectangle contentBounds)
 | 
						|
        {
 | 
						|
            GraphicsPath path = new GraphicsPath();
 | 
						|
            if (_ImagePosition == eLogItemImagePosition.Left)
 | 
						|
            {
 | 
						|
                if (_CornerSize == 0)
 | 
						|
                {
 | 
						|
                    Rectangle pathBounds = contentBounds;
 | 
						|
                    pathBounds.Width--;
 | 
						|
                    pathBounds.Height--;
 | 
						|
                    int i = _CalloutSize.Height / 2;
 | 
						|
                    path.AddLine(pathBounds.X + _CalloutSize.Width, pathBounds.Y + _CalloutSize.Height + i, pathBounds.X, pathBounds.Y + i * 2);
 | 
						|
                    path.AddLine(pathBounds.X, pathBounds.Y + i * 2, pathBounds.X + _CalloutSize.Width, pathBounds.Y + i);
 | 
						|
                    path.AddLine(pathBounds.X + _CalloutSize.Width, pathBounds.Y, pathBounds.Right, pathBounds.Y);
 | 
						|
                    path.AddLine(pathBounds.Right, pathBounds.Bottom, pathBounds.X + _CalloutSize.Width, pathBounds.Bottom);
 | 
						|
                    path.CloseAllFigures();
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    Rectangle pathBounds = contentBounds;
 | 
						|
                    pathBounds.Width--;
 | 
						|
                    pathBounds.Height--;
 | 
						|
                    int topOffset = _CornerSize;
 | 
						|
                    int i = _CalloutSize.Height / 2;
 | 
						|
                    path.AddLine(pathBounds.X + _CalloutSize.Width, pathBounds.Y + topOffset + _CalloutSize.Height + i, pathBounds.X, pathBounds.Y + topOffset + i * 2);
 | 
						|
                    path.AddLine(pathBounds.X, pathBounds.Y + topOffset + i * 2, pathBounds.X + _CalloutSize.Width, pathBounds.Y + topOffset + i);
 | 
						|
                    pathBounds.X += _CalloutSize.Width;
 | 
						|
                    pathBounds.Width -= _CalloutSize.Width;
 | 
						|
                    ArcData cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.TopLeft);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.TopRight);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.BottomRight);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.BottomLeft);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    path.CloseAllFigures();
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (_CornerSize == 0)
 | 
						|
                {
 | 
						|
                    Rectangle pathBounds = contentBounds;
 | 
						|
                    pathBounds.Width--;
 | 
						|
                    pathBounds.Height--;
 | 
						|
                    int i = _CalloutSize.Height / 2;
 | 
						|
                    path.AddLine(pathBounds.Right - _CalloutSize.Width, pathBounds.Y + _CalloutSize.Height + i, pathBounds.Right, pathBounds.Y + i * 2);
 | 
						|
                    path.AddLine(pathBounds.Right, pathBounds.Y + i * 2, pathBounds.Right - _CalloutSize.Width, pathBounds.Y + i);
 | 
						|
                    path.AddLine(pathBounds.Right - _CalloutSize.Width, pathBounds.Y, pathBounds.X, pathBounds.Y);
 | 
						|
                    path.AddLine(pathBounds.X, pathBounds.Bottom, pathBounds.Right - _CalloutSize.Width, pathBounds.Bottom);
 | 
						|
                    path.CloseAllFigures();
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    Rectangle pathBounds = contentBounds;
 | 
						|
                    pathBounds.Width--;
 | 
						|
                    pathBounds.Height--;
 | 
						|
                    int topOffset = _CornerSize;
 | 
						|
                    int i = _CalloutSize.Height / 2;
 | 
						|
 | 
						|
                    pathBounds.Width -= _CalloutSize.Width;
 | 
						|
                    ArcData cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.TopLeft);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.TopRight);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
 | 
						|
                    pathBounds.Width += _CalloutSize.Width;
 | 
						|
                    path.AddLine(pathBounds.Right - _CalloutSize.Width, pathBounds.Y + i, pathBounds.Right, pathBounds.Y + i * 2);
 | 
						|
                    path.AddLine(pathBounds.Right, pathBounds.Y + i * 2, pathBounds.Right - _CalloutSize.Width, pathBounds.Y + _CalloutSize.Height + i);
 | 
						|
                    pathBounds.Width -= _CalloutSize.Width;
 | 
						|
 | 
						|
                    cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.BottomRight);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    cornerArc = ElementStyleDisplay.GetCornerArc(pathBounds, _CornerSize, eCornerArc.BottomLeft);
 | 
						|
                    path.AddArc(cornerArc.X, cornerArc.Y, cornerArc.Width, cornerArc.Height, cornerArc.StartAngle, cornerArc.SweepAngle);
 | 
						|
                    path.CloseAllFigures();
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return path;
 | 
						|
        }
 | 
						|
 | 
						|
        private Rectangle GetContentBounds(Rectangle bounds)
 | 
						|
        {
 | 
						|
            if (_Image != null)
 | 
						|
            {
 | 
						|
                if (_ImagePosition == eLogItemImagePosition.Left)
 | 
						|
                    bounds.X += _ImageSize.Width;
 | 
						|
                bounds.Width -= _ImageSize.Width;
 | 
						|
            }
 | 
						|
            // Adjust for shadow
 | 
						|
            bounds.Height--;
 | 
						|
            bounds.Width--;
 | 
						|
            return bounds;
 | 
						|
        }
 | 
						|
 | 
						|
        private Rectangle GetImageRect(Rectangle bounds)
 | 
						|
        {
 | 
						|
            if (_ImagePosition == eLogItemImagePosition.Left)
 | 
						|
                return new Rectangle(bounds.X, bounds.Y, _ImageSize.Width, _ImageSize.Height);
 | 
						|
            return new Rectangle(bounds.Right - _ImageSize.Width, bounds.Y, _ImageSize.Width, _ImageSize.Height);
 | 
						|
        }
 | 
						|
 | 
						|
        private Image _Image = null;
 | 
						|
        private Size _ImageSize = new Size(48, 48);
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the image displayed on the log item.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null), Category("Appearance"), Description("Specifies image displayed on the log item.")]
 | 
						|
        public Image Image
 | 
						|
        {
 | 
						|
            get { return _Image; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_Image == value)
 | 
						|
                    return;
 | 
						|
                _Image = value;
 | 
						|
                _ImageSize = new Size(48, 48);
 | 
						|
                if (_Image != null)
 | 
						|
                {
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        _ImageSize = _Image.Size;
 | 
						|
                    }
 | 
						|
                    catch { }
 | 
						|
                }
 | 
						|
                NeedRecalcSize = true;
 | 
						|
                this.Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private eLogItemImagePosition _ImagePosition = eLogItemImagePosition.Left;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the image position in relation to text.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eLogItemImagePosition.Left), Category("Appearance"), Description("Specifies the image position in relation to text.")]
 | 
						|
        public eLogItemImagePosition ImagePosition
 | 
						|
        {
 | 
						|
            get { return _ImagePosition; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
 | 
						|
                if (_ImagePosition == value)
 | 
						|
                    return;
 | 
						|
                _ImagePosition = value;
 | 
						|
                NeedRecalcSize = true;
 | 
						|
                this.Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private string _SourceName = "";
 | 
						|
        [DefaultValue(""), Category("Appearance"), Description("Specifies the log item source name")]
 | 
						|
        public string SourceName
 | 
						|
        {
 | 
						|
            get { return _SourceName; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _SourceName = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private DateTime _Created;
 | 
						|
        public DateTime Created
 | 
						|
        {
 | 
						|
            get { return _Created; }
 | 
						|
            set { _Created = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        private string GetHumanTimeSpan(TimeSpan span)
 | 
						|
        {
 | 
						|
            if (span.TotalMinutes <= 1.5)
 | 
						|
                return "now";
 | 
						|
            else if (span.TotalMinutes < 2)
 | 
						|
                return "about a minute ago";
 | 
						|
            else if (span.TotalMinutes < 60)
 | 
						|
                return span.TotalMinutes.ToString("N0") + " minutes ago";
 | 
						|
            else if (span.TotalHours < 2)
 | 
						|
                return span.TotalHours.ToString("N0") + " hour ago";
 | 
						|
            else if (span.TotalHours < 24)
 | 
						|
                return span.TotalHours.ToString("N0") + " hours ago";
 | 
						|
            else if (span.TotalDays < 2)
 | 
						|
                return span.TotalDays.ToString("N0") + " day ago";
 | 
						|
            else if (span.TotalDays < 30)
 | 
						|
                return span.TotalDays.ToString("N0") + " days ago";
 | 
						|
            return (span.TotalDays / 30).ToString("N0") + " months ago";
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _BackColor = Color.White;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the background color of the item.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Appearance"), Description("Indicates background color of the item.")]
 | 
						|
        public Color BackColor
 | 
						|
        {
 | 
						|
            get { return _BackColor; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _BackColor)
 | 
						|
                {
 | 
						|
                    Color oldValue = _BackColor;
 | 
						|
                    _BackColor = value;
 | 
						|
                    OnBackColorChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private void OnBackColorChanged(Color oldValue, Color newValue)
 | 
						|
        {
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("BackColor"));
 | 
						|
            this.Refresh();
 | 
						|
        }
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeBackColor()
 | 
						|
        {
 | 
						|
            return _BackColor != Color.White;
 | 
						|
        }
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetBackColor()
 | 
						|
        {
 | 
						|
            this.BackColor = Color.White;
 | 
						|
        }
 | 
						|
        protected void SetBackColor(Color color)
 | 
						|
        {
 | 
						|
            _BackColor = color;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Markup Support
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether item supports text markup. Default is false.
 | 
						|
        /// </summary>
 | 
						|
        protected override bool IsMarkupSupported
 | 
						|
        {
 | 
						|
            get { return true; }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void TextMarkupLinkClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            TextMarkup.HyperLink link = sender as TextMarkup.HyperLink;
 | 
						|
            if (link != null)
 | 
						|
                OnMarkupLinkClick(new MarkupLinkClickEventArgs(link.Name, link.HRef));
 | 
						|
            base.TextMarkupLinkClick(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void OnMarkupLinkClick(MarkupLinkClickEventArgs e)
 | 
						|
        {
 | 
						|
            if (this.MarkupLinkClick != null)
 | 
						|
                MarkupLinkClick(this, e);
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    public enum eLogItemImagePosition
 | 
						|
    {
 | 
						|
        Left,
 | 
						|
        Right
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif |