// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) 2006 Microsoft Corporation. All rights reserved.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace Microsoft.Samples.RssPlatform.ScreenSaver.UI
{
///
/// Encapsulates the rendering of the description of an item.
///
/// The type of item that this ItemDescriptionView will draw.
public class ItemDescriptionView : IDisposable where T : IItem
{
// What to draw
private FeedList feeds;
// Where to draw
private Point location;
private Size size;
private static Brush textDrawingBrush = Brushes.Black;
private Color lineColor;
private float lineWidth;
private Rectangle textRect;
private Rectangle titleRect;
private StringFormat textFormat;
private Color backColor;
private Color borderColor;
private Color foreColor;
private Font titleFont;
private Font textFont;
private T displayItem;
// The initial alpha value and the amount to change the value by each time
private int textAlpha = 0;
private int textAlphaDelta = 8; //4;
private int textAlphaMax = 200;
// Alpha fading timer
private Timer fadeTimer;
private int fadeInterval = 40;
private int fadePauseInterval = 2000;
public T DisplayItem { get { return displayItem; } set { displayItem = value; } }
public Point Location { get { return location; } set { location = value; } }
public Size Size { get { return size; } set { size = value; } }
public Color BackColor { get { return backColor; } set { backColor = value; } }
public Color BorderColor { get { return borderColor; } set { borderColor = value; } }
public Color ForeColor { get { return foreColor; } set { foreColor = value; } }
public Color LineColor { get { return lineColor; } set { lineColor = value; } }
public Font TextFont { get { return textFont; } set { textFont = value; } }
public Font TitleFont { get { return titleFont; } set { titleFont = value; } }
public float LineWidth { get { return lineWidth; } set { lineWidth = value; } }
public int FadeInterval { get { return fadeInterval; } set { fadeInterval = value; } }
public int FadePauseInterval { get { return fadePauseInterval; } set { fadePauseInterval = value; } }
public event EventHandler FadingComplete;
public event EventHandler FadingTick
{
add { fadeTimer.Tick += value; }
remove { fadeTimer.Tick -= value; }
}
///
/// Create a new ItemDescriptionView connected to .
///
///
public ItemDescriptionView(FeedList feeds)
{
this.feeds = feeds;
fadeTimer = new Timer();
fadeTimer.Tick += new EventHandler(fadeTimer_Tick);
fadeTimer.Enabled = true;
fadeTimer.Start();
}
///
/// Restart the fade effect
///
public void Reset()
{
textAlpha = 0;
textAlphaDelta = Math.Abs(textAlphaDelta);
fadeTimer_Tick(this, new EventArgs());
}
public void Paint(PaintEventArgs e)
{
// Change the graphics settings to draw clear text
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
DrawBackground(e.Graphics);
int lineVerticalBuffer = Size.Height / 50;
//DrawTwoLines(e.Graphics,lineVerticalBuffer);
// Draw the text of the article
textFormat = new StringFormat(StringFormatFlags.LineLimit);
textFormat.Alignment = StringAlignment.Near;
textFormat.LineAlignment = StringAlignment.Near;
textFormat.Trimming = StringTrimming.EllipsisWord;
int textVerticalBuffer = 4 * lineVerticalBuffer;
int textHorizontalBuffer = 20;
titleRect = new Rectangle(Location.X + textHorizontalBuffer,Location.Y + textVerticalBuffer,
Size.Width - 2*textHorizontalBuffer, titleFont.Height);
textRect = new Rectangle(Location.X + textHorizontalBuffer, Location.Y + textVerticalBuffer + titleFont.Height + textVerticalBuffer,
Size.Width - 2*textHorizontalBuffer, Size.Height - 3*textVerticalBuffer - titleFont.Height);
//using (Brush backBrush1 = new SolidBrush(Color.Blue))
//using (Brush backBrush2 = new SolidBrush(Color.BurlyWood))
//{
// e.Graphics.FillRectangle(backBrush1, titleRect);
// e.Graphics.FillRectangle(backBrush2, textRect);
//}
using (Brush textBrush = new SolidBrush(Color.FromArgb(textAlpha, ForeColor)))
{
string title = feeds.CurrentItem.Title;
e.Graphics.DrawString(title, TitleFont, textBrush, titleRect, textFormat);
string text = feeds.CurrentItem.Description;
e.Graphics.DrawString(text, TextFont, textBrush, textRect, textFormat);
}
}
///
/// Draws a box and border ontop of which the text of the items can be drawn.
///
/// The Graphics object to draw onto
private void DrawBackground(Graphics g)
{
using (Brush backBrush = new SolidBrush(BackColor))
using (Pen borderPen = new Pen(BorderColor, 4))
{
//g.FillRectangle(backBrush, new Rectangle(Location.X + 4, Location.Y + 4, Size.Width - 8, Size.Height - 8));
g.FillRectangle(backBrush, new Rectangle(Location.X, Location.Y, Size.Width, Size.Height));
//g.DrawRectangle(borderPen, new Rectangle(Location, Size));
}
}
private void DrawTwoLines(Graphics g,int lineVerticalBuffer)
{
// Determine the placement of the lines that will be placed
// above and below the text
float lineLeftX = Size.Width / 4;
float lineRightX = 3 * Size.Width / 4;
float lineTopY = Location.Y + lineVerticalBuffer;
float lineBottomY = Location.Y + Size.Height - lineVerticalBuffer;
// Draw the two lines
using (Pen linePen = new Pen(lineColor, lineWidth))
{
g.DrawLine(linePen, Location.X + lineLeftX, lineTopY, Location.X + lineRightX, lineTopY);
g.DrawLine(linePen, Location.X + lineLeftX, lineBottomY, Location.X + lineRightX, lineBottomY);
}
}
private void fadeTimer_Tick(object sender, EventArgs e)
{
// Change the alpha value of the text being drawn
// Moves up until it reaches textAlphaMax and then moves down
// Moves to the next article when it gets back to zero
fadeTimer.Interval = fadeInterval;
textAlpha += textAlphaDelta;
if (textAlpha >= textAlphaMax)
{
fadeTimer.Interval = fadePauseInterval;
textAlphaDelta *= -1;
}
else if (textAlpha <= 0)
{
FadingComplete(this, new EventArgs());
textAlpha = 0;
textAlphaDelta *= -1;
}
}
///
/// Dispose all disposable fields
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (fadeTimer != null)
{
fadeTimer.Dispose();
fadeTimer = null;
}
if (textFormat != null)
{
textFormat.Dispose();
textFormat = null;
}
}
}
}
}