Vanara/Windows.Forms/Dialogs/TaskDialog/EmulateExpInfoButton.cs

224 lines
7.4 KiB
C#

/*
* Copyright © 2015 David Hall
*
* Design Notes:-
* --------------
* - Maximum size: 150px. Limited by the control itself.
*
* References:
* - http://www.codeproject.com/KB/vista/Vista_TaskDialog_Wrapper.aspx
* - http://www.codeproject.com/Articles/21276/Vista-TaskDialog-Wrapper-and-Emulator
*
* Revision Control:-
* ------------------
* Created On: 2007 November 26
* Major updates: 2015 Nov 6
*/
#if TASKDIALOG_EMULATE
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Vanara.Windows.Forms
{
internal class EmulateExpInfoButton : UserControl
{
private string collapsedText;
private System.ComponentModel.IContainer components = null;
private string expandedText;
private bool isExpanded;
private Label label;
private PictureBox pictureBox;
private TableLayoutPanel tableLayoutPanel;
private readonly ImageList imageList;
public EmulateExpInfoButton(bool newIsExpanded, string newExpandedText, string newCollapsedText)
{
InitializeComponent();
isExpanded = newIsExpanded;
expandedText = newExpandedText;
collapsedText = newCollapsedText;
imageList = new ImageList(components) { ColorDepth = ColorDepth.Depth32Bit, ImageSize = new Size(19, 21) };
imageList.Images.AddStrip(Properties.Resources.ExpandoButtonV);
SetState();
}
public override string Text
{
get { return label.Text; }
set { label.Text = value; }
}
public void ToogleState()
{
isExpanded = !isExpanded;
SetState();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing)
components?.Dispose();
base.Dispose(disposing);
}
private void EmulateExpInfoButton_Click(object sender, EventArgs e)
{
OnClick(e);
}
private void EmulateExpInfoButton_Enter(object sender, EventArgs e)
{
// Focus rectangle.
// http://msdn.microsoft.com/en-us/library/system.windows.forms.controlpaint.drawfocusrectangle(VS.71).aspx
ControlPaint.DrawFocusRectangle(Graphics.FromHwnd(label.Handle), label.ClientRectangle);
}
private void EmulateExpInfoButton_Leave(object sender, EventArgs e)
{
// Lost focus.
// Correct way to erase a border?
ControlPaint.DrawBorder(Graphics.FromHwnd(label.Handle), label.ClientRectangle, label.BackColor, ButtonBorderStyle.Solid);
}
private void EmulateExpInfoButton_MouseDown(object sender, MouseEventArgs e)
{
pictureBox.Image = imageList.Images[isExpanded ? 2 : 6];
}
private void EmulateExpInfoButton_MouseEnter(object sender, EventArgs e)
{
pictureBox.Image = imageList.Images[isExpanded ? 1 : 5];
}
private void EmulateExpInfoButton_MouseLeave(object sender, EventArgs e)
{
pictureBox.Image = imageList.Images[isExpanded ? 0 : 4];
}
private void EmulateExpInfoButton_MouseUp(object sender, MouseEventArgs e)
{
pictureBox.Image = imageList.Images[isExpanded ? 0 : 4];
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
pictureBox = new System.Windows.Forms.PictureBox();
label = new Label();
tableLayoutPanel = new TableLayoutPanel();
((System.ComponentModel.ISupportInitialize)(pictureBox)).BeginInit();
tableLayoutPanel.SuspendLayout();
SuspendLayout();
//
// pictureBox
//
pictureBox.Location = new System.Drawing.Point(0, 0);
pictureBox.Margin = new System.Windows.Forms.Padding(0);
pictureBox.Name = "pictureBox";
pictureBox.Size = new System.Drawing.Size(20, 20);
pictureBox.TabIndex = 2;
pictureBox.TabStop = false;
pictureBox.Click += new EventHandler(EmulateExpInfoButton_Click);
pictureBox.MouseDown += new MouseEventHandler(EmulateExpInfoButton_MouseDown);
pictureBox.MouseEnter += new EventHandler(EmulateExpInfoButton_MouseEnter);
pictureBox.MouseLeave += new EventHandler(EmulateExpInfoButton_MouseLeave);
pictureBox.MouseUp += new MouseEventHandler(EmulateExpInfoButton_MouseUp);
//
// label
//
label.AutoSize = true;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Location = new System.Drawing.Point(20, 0);
label.Margin = new System.Windows.Forms.Padding(0);
label.MaximumSize = new System.Drawing.Size(130, 0);
label.Name = "label";
label.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0);
label.Size = new System.Drawing.Size(70, 20);
label.TabIndex = 3;
label.Text = "label";
label.Click += new EventHandler(EmulateExpInfoButton_Click);
label.MouseDown += new MouseEventHandler(EmulateExpInfoButton_MouseDown);
label.MouseEnter += new EventHandler(EmulateExpInfoButton_MouseEnter);
label.MouseLeave += new EventHandler(EmulateExpInfoButton_MouseLeave);
label.MouseUp += new MouseEventHandler(EmulateExpInfoButton_MouseUp);
//
// tableLayoutPanel
//
tableLayoutPanel.AutoSize = true;
tableLayoutPanel.ColumnCount = 2;
tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
tableLayoutPanel.Controls.Add(pictureBox, 0, 0);
tableLayoutPanel.Controls.Add(label, 1, 0);
tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
tableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
tableLayoutPanel.Name = "tableLayoutPanel";
tableLayoutPanel.RowCount = 1;
tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
tableLayoutPanel.Size = new System.Drawing.Size(90, 20);
tableLayoutPanel.TabIndex = 4;
tableLayoutPanel.Click += new EventHandler(EmulateExpInfoButton_Click);
tableLayoutPanel.MouseDown += new MouseEventHandler(EmulateExpInfoButton_MouseDown);
tableLayoutPanel.MouseEnter += new EventHandler(EmulateExpInfoButton_MouseEnter);
tableLayoutPanel.MouseLeave += new EventHandler(EmulateExpInfoButton_MouseLeave);
tableLayoutPanel.MouseUp += new MouseEventHandler(EmulateExpInfoButton_MouseUp);
//
// EmulateExpInfoButton
//
AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
AutoSize = true;
Controls.Add(tableLayoutPanel);
Margin = new System.Windows.Forms.Padding(0);
MinimumSize = new System.Drawing.Size(0, 20);
Name = "EmulateExpInfoButton";
Size = new System.Drawing.Size(90, 20);
Enter += new System.EventHandler(EmulateExpInfoButton_Enter);
Leave += new System.EventHandler(EmulateExpInfoButton_Leave);
((System.ComponentModel.ISupportInitialize)(pictureBox)).EndInit();
tableLayoutPanel.ResumeLayout(false);
tableLayoutPanel.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
private void SetState()
{
pictureBox.Image = imageList.Images[isExpanded ? 0 : 4];
if (isExpanded)
{
Text = string.IsNullOrEmpty(collapsedText) ? "Hide details" : collapsedText;
}
else
{
if (string.IsNullOrEmpty(expandedText) && string.IsNullOrEmpty(collapsedText))
{
Text = "See details";
}
else if (string.IsNullOrEmpty(expandedText) && !string.IsNullOrEmpty(collapsedText))
{
Text = collapsedText;
}
else
{
Text = expandedText;
}
}
}
}
}
#endif