﻿/*
 * 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