Dec
12
Written by:
Angelo
12/12/2007 3:51 PM
I've made this ... It's very bulk, and if someone can help me a bit ...
this is the code:
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using ComponentFactory.Krypton.Toolkit;
namespace ExtendedRenderer
{
public class KryptonListView : ListView
{
private IPalette _palette;
private PaletteRedirect _paletteRedirect;
private ListViewColumnSorter lvwColumnSorter;
public KryptonListView()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint , true);
UpdateStyles();
this.OwnerDraw = true;
// add Palette Handler
if (_palette != null)
_palette.PalettePaint += new EventHandler(OnPalettePaint);
KryptonManager.GlobalPaletteChanged += new EventHandler(OnGlobalPaletteChanged);
_palette = KryptonManager.CurrentGlobalPalette;
_paletteRedirect = new PaletteRedirect(_palette);
// Create an instance of a ListView column sorter and assign it
// to the ListView control.
lvwColumnSorter = new ListViewColumnSorter();
this.ListViewItemSorter = lvwColumnSorter;
if (_selectEntireRowOnSubItem == true)
{
this.FullRowSelect = true;
}
//fix the Row height
if (this.SmallImageList == null)
{
ImageList il = new ImageList();
il.ImageSize = new Size(16,16);
this.SmallImageList =il;
_indendFirstItem = true;
}
}
Color _gradientStartColor = Color.White;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("Color.White")]
public Color GradientStartColor
{
get { return _gradientStartColor; }
set { _gradientStartColor = value; Invalidate(); }
}
Color _gradientEndColor = Color.Gray;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("Color.Gray")]
public Color GradientEndColor
{
get { return _gradientEndColor; }
set { _gradientEndColor = value; Invalidate(); }
}
Color _gradientMiddleColor = Color.LightGray;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("Color.Gray")]
public Color GradientMiddleColor
{
get { return _gradientMiddleColor; }
set { _gradientMiddleColor = value; Invalidate(); }
}
Boolean _persistentColors = false;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("False")]
public Boolean PersistentColors
{
get { return _persistentColors; }
set { _persistentColors = value; }
}
Boolean _useStyledColors = false;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("False")]
public Boolean UseStyledColors
{
get { return _useStyledColors; }
set { _useStyledColors = value; }
}
Boolean _selectEntireRowOnSubItem = true;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("True")]
public Boolean SelectEntireRowOnSubItem
{
get { return _selectEntireRowOnSubItem; }
set { _selectEntireRowOnSubItem = value; }
}
Boolean _indendFirstItem = true;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("True")]
public Boolean IndendFirstItem
{
get { return _indendFirstItem; }
set { _indendFirstItem = value; }
}
Boolean _forceLeftAlign = false;
[Browsable(false), Category("Appearance-Extended")]
[DefaultValue("True")]
public Boolean ForceLeftAlign
{
get { return _forceLeftAlign; }
set { _forceLeftAlign = value; }
}
Boolean _enableSorting = true;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("True")]
public Boolean EnableSorting
{
get { return _enableSorting; }
set { _enableSorting = value; }
}
Boolean _enableHeaderRendering = false;
[Browsable(true), Category("Appearance-Extended")]
[DefaultValue("False")]
public Boolean EnableHeaderRendering
{
get { return _enableHeaderRendering; }
set { _enableHeaderRendering = value; }
}
//Draw Item
protected override void OnDrawItem(DrawListViewItemEventArgs e)
{
Rectangle rect = e.Bounds;
Graphics g = e.Graphics;
//ClearType
try
{
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
//g.InterpolationMode = InterpolationMode.HighQualityBicubic;
if (_palette == null)
{
EventArgs Ev = new EventArgs();
OnGlobalPaletteChanged(this,Ev);
}
//set colors
if (_persistentColors == false)
{
//init color values
if (_useStyledColors == true)
{
_gradientStartColor = Color.FromArgb(255, 246, 215);
_gradientEndColor = Color.FromArgb(255, 213, 77);
_gradientMiddleColor = Color.FromArgb(252, 224, 133);
}
else
{
_gradientStartColor = _palette.ColorTable.StatusStripGradientBegin;
_gradientEndColor = _palette.ColorTable.OverflowButtonGradientEnd;
_gradientMiddleColor = _palette.ColorTable.StatusStripGradientEnd;
}
}
//BackColors
Color gradStartColor = _gradientStartColor;
Color gradEndColor = _gradientEndColor;
Color gradMiddleColor = _gradientMiddleColor;
//force Left align on items
if (_forceLeftAlign == true)
{
foreach (ColumnHeader col in this.Columns)
{
col.TextAlign = HorizontalAlignment.Left;
}
}
ListViewItemStates sta = e.State;
Console.Write(sta);
if (this.View == View.Details)
{
if ((e.State & ListViewItemStates.Selected) != 0)
{
// Draw the background and focus rectangle for a selected item.
DrawBlendGradient(e.Graphics, e.Bounds, gradStartColor, gradEndColor, gradMiddleColor, 90F);
//DrawGradient(e.Graphics, e.Bounds, gradStartColor, gradEndColor, 90F);
//text
e.DrawText();
//Picture Present?
if (this.SmallImageList != null && e.Item.ImageIndex >= 0 && e.Item.ImageIndex < SmallImageList.Images.Count)
{
this.SmallImageList.Draw(g, rect.X, rect.Y, 16, 16, e.Item.ImageIndex);
}
//e.DrawFocusRectangle();
}
else
{
// Draw the background for an unselected item.
e.DrawDefault = true;
}
}
// Draw the item text for views other than the Details view.
else
{
// Draw the background for an unselected item.
e.DrawDefault = true;
}
}
//Draw SubItem
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
Rectangle rect = e.Bounds;
Graphics g = e.Graphics;
//ClearType
try
{
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
//set colors
if (_persistentColors == false)
{
//init color values
if (_useStyledColors == true)
{
_gradientStartColor = Color.FromArgb(255, 246, 215);
_gradientEndColor = Color.FromArgb(255, 213, 77);
_gradientMiddleColor = Color.FromArgb(252, 224, 133);
}
else
{
_gradientStartColor = _palette.ColorTable.StatusStripGradientBegin;
_gradientEndColor = _palette.ColorTable.OverflowButtonGradientEnd;
_gradientMiddleColor = _palette.ColorTable.StatusStripGradientEnd;
}
}
//BackColors
Color gradStartColor = _gradientStartColor;
Color gradEndColor = _gradientEndColor;
Color gradMiddleColor = _gradientMiddleColor;
//force Left align on items
if (_forceLeftAlign == true)
{
foreach (ColumnHeader col in this.Columns)
{
col.TextAlign = HorizontalAlignment.Left;
}
}
//ListViewItemStates sta = e.ItemState;
//Console.Write(sta);
if (this.View == View.Details)
{
if ((e.ItemState & ListViewItemStates.Selected) != 0)
{
// Draw the background and focus rectangle for a selected item.
DrawBlendGradient(e.Graphics, e.Bounds, gradStartColor, gradEndColor, gradMiddleColor, 90F);
//DrawGradient(e.Graphics, e.Bounds, gradStartColor, gradEndColor, 90F);
//Picture Present?
if (e.ColumnIndex==0)
{
try
{
this.SmallImageList.Draw(g, rect.X+4, rect.Y, 16, 16, e.Item.ImageIndex);
if (_indendFirstItem == true)
{
rect.Offset(16, 0);
}
}
catch (Exception ex)
{
Console.Write(ex.Message);
if (_indendFirstItem == true)
{
rect.Offset(16, 0);
}
}
}
rect.Offset(4, 2);
e.Graphics.DrawString(e.SubItem.Text,this.Font,new SolidBrush(Color.Black),rect);
//e.DrawFocusRectangle();
}
else
{
// Draw the background for an unselected item.
e.DrawDefault = true;
}
}
// Draw the item text for views other than the Details view.
else
{
// Draw the background for an unselected item.
e.DrawDefault = true;
}
}
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
if (_enableHeaderRendering == true)
{
Rectangle rect = e.Bounds;
rect.Height = rect.Height - 2;
rect.Width = rect.Width-0;
Graphics g = e.Graphics;
//ClearType
try
{
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
//set colors
Color gradStartColor;
Color gradEndColor;
Color gradMiddleColor;
Color borderColor = _palette.ColorTable.ToolStripBorder;
Color textColor = _palette.ColorTable.StatusStripText;
if (e.State == ListViewItemStates.Selected)
{
gradStartColor = _palette.ColorTable.ButtonSelectedGradientBegin;
gradMiddleColor = _palette.ColorTable.ButtonSelectedGradientEnd;
gradEndColor = _palette.ColorTable.ButtonSelectedGradientBegin;
}
else
{
gradStartColor = _palette.ColorTable.ToolStripGradientBegin;
gradMiddleColor = _palette.ColorTable.ToolStripGradientEnd;
gradEndColor = _palette.ColorTable.ToolStripGradientBegin;
}
//Empty Area
g.FillRectangle(new SolidBrush(Color.White),rect);
//Fill Gradient
using (LinearGradientBrush brush = new LinearGradientBrush(rect, gradStartColor, gradEndColor, LinearGradientMode.Vertical))
{
//g.FillRectangle(brush, rect);
DrawBlendGradient(g, rect, gradStartColor, gradEndColor, gradMiddleColor, 90F);
}
//DrawBorder
g.DrawRectangle(new Pen(borderColor), rect);
//Draw light lines
//oriz
g.DrawLine(new Pen(Color.White), new Point(rect.X + 1, rect.Y + 1), new Point(rect.X + rect.Width - 1, rect.Y + 1));
//vert
g.DrawLine(new Pen(Color.White), new Point(rect.X + 1, rect.Y + 1), new Point(rect.X + 1, rect.Y + rect.Height -1));
if (e.ColumnIndex == this.Columns.Count - 1)
{
//last border
g.DrawLine(new Pen(borderColor), new Point(rect.X + rect.Width - 1, rect.Y ), new Point(rect.X + rect.Width - 1, rect.Y + rect.Height + 0));
}
if (e.State == ListViewItemStates.Selected)
{
rect.Offset(3, 5);
}
else
{
rect.Offset(2, 4);
}
StringFormat TextFormat = new StringFormat();
TextFormat.FormatFlags = StringFormatFlags.NoWrap;
g.DrawString(e.Header.Text, this.Font, new SolidBrush(textColor), rect, TextFormat);
//e.DrawText();
}
else
{
e.DrawDefault = true;
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
}
protected override void OnLostFocus(EventArgs e)
{
//base.OnLostFocus(e);
Invalidate();
}
protected override void OnColumnClick(ColumnClickEventArgs e)
{
base.OnColumnClick(e);
if (_enableSorting == true)
{
// Determine if clicked column is already the column that is being sorted.
if (e.Column == lvwColumnSorter.SortColumn)
{
// Reverse the current sort direction for this column.
if (lvwColumnSorter.Order == SortOrder.Ascending)
{
lvwColumnSorter.Order = SortOrder.Descending;
}
else
{
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
// Perform the sort with these new sort options.
this.Sort();
}
}
//Kripton Palette Events
private void OnGlobalPaletteChanged(object sender, EventArgs e)
{
if (_palette != null)
_palette.PalettePaint -= new EventHandler(OnPalettePaint);
_palette = KryptonManager.CurrentGlobalPalette;
_paletteRedirect.Target = _palette;
if (_palette != null)
{
_palette.PalettePaint += new EventHandler(OnPalettePaint);
//repaint with new values
//set colors
if (_persistentColors == false)
{
//init color values
if (_useStyledColors == true)
{
_gradientStartColor = Color.FromArgb(255, 246, 215);
_gradientEndColor = Color.FromArgb(255, 213, 77);
_gradientMiddleColor = Color.FromArgb(252, 224, 133);
}
else
{
_gradientStartColor = _palette.ColorTable.StatusStripGradientBegin;
_gradientEndColor = _palette.ColorTable.OverflowButtonGradientEnd;
_gradientMiddleColor = _palette.ColorTable.StatusStripGradientEnd;
}
}
}
Invalidate();
}
//Kripton Palette Events
private void OnPalettePaint(object sender, PaletteLayoutEventArgs e)
{
Invalidate();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (_palette != null)
{
_palette.PalettePaint -= new EventHandler(OnPalettePaint);
_palette = null;
}
KryptonManager.GlobalPaletteChanged -= new EventHandler(OnGlobalPaletteChanged);
}
base.Dispose(disposing);
}
public static void DrawGradient(Graphics g, Rectangle rect, Color LightColor, Color DarkColor, float Angle)
{
Rectangle r = rect;
if (r.Width == 0 || r.Height == 0)
return;
ColorBlend cb = new ColorBlend(3);
cb.Positions[0] = 0f;
cb.Colors[0] = LightColor;
cb.Positions[1] = 0.5f;
cb.Colors[1] = DarkColor;
cb.Positions[2] = 1f;
cb.Colors[2] = LightColor;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.CompositingMode = CompositingMode.SourceOver;
using (LinearGradientBrush lgb = new LinearGradientBrush(r, LightColor, DarkColor, Angle))
{
lgb.InterpolationColors = cb;
g.FillRectangle(lgb, r);
}
}
public static void DrawBlendGradient(Graphics g, Rectangle rect, Color LightColor, Color DarkColor, Color MiddleColor, float Angle)
{
ColorBlend blend = new ColorBlend(4);
blend.Positions[0] = 0f;
blend.Colors[0] = LightColor;
blend.Positions[1] = 0.5f;
blend.Colors[1] = DarkColor;
blend.Positions[2] = 0.5f;
blend.Colors[2] = DarkColor;
blend.Positions[3] = 1f;
blend.Colors[3] = MiddleColor;
using (LinearGradientBrush b = new LinearGradientBrush(rect, blend.Colors[0], blend.Colors[3], Angle))
{
b.InterpolationColors = blend;
g.FillRectangle(Brushes.White, rect);
g.FillRectangle(b, rect);
}
}
}
}