using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace DevComponents.DotNetBar
{
    /// 
    /// Represent a task-dialog message box window.
    /// 
    public static class TaskDialog
    {
        /// 
        /// Displays TaskDialog message.
        /// 
        /// Title of the window.
        /// Task dialog header.
        /// Task dialog text.
        /// Displayed buttons.
        /// Result from task-dialog.
        public static eTaskDialogResult Show(string dialogTitle, string dialogHeader, string dialogText, eTaskDialogButton dialogButtons)
        {
            TaskDialogInfo info = new TaskDialogInfo(dialogTitle, eTaskDialogIcon.Information, dialogHeader, dialogText, dialogButtons);
            return Show(info);
        }
        /// 
        /// Displays TaskDialog message.
        /// 
        /// Title of the window.
        /// Task dialog header.
        /// Task dialog text.
        /// Displayed buttons.
        /// Specifies the predefined color for the dialog.
        /// Result from task-dialog.
        public static eTaskDialogResult Show(string dialogTitle, string dialogHeader, string dialogText, eTaskDialogButton dialogButtons, eTaskDialogBackgroundColor dialogColor)
        {
            TaskDialogInfo info = new TaskDialogInfo(dialogTitle, eTaskDialogIcon.Information, dialogHeader, dialogText, dialogButtons, dialogColor);
            return Show(info);
        }
        /// 
        /// Displays TaskDialog message.
        /// 
        /// Title of the window.
        /// Icon displayed on dialog.
        /// Task dialog header.
        /// Task dialog text.
        /// Displayed buttons.
        /// Result from task-dialog.
        public static eTaskDialogResult Show(string dialogTitle, eTaskDialogIcon dialogIcon, string dialogHeader, string dialogText, eTaskDialogButton dialogButtons)
        {
            TaskDialogInfo info = new TaskDialogInfo(dialogTitle, dialogIcon, dialogHeader, dialogText, dialogButtons);
            return Show(info);
        }
        /// 
        /// Displays TaskDialog message.
        /// 
        /// Title of the window.
        /// Icon displayed on dialog.
        /// Task dialog header.
        /// Task dialog text.
        /// Displayed buttons.
        /// Specifies the predefined color for the dialog.
        /// Result from task-dialog.
        public static eTaskDialogResult Show(string dialogTitle, eTaskDialogIcon dialogIcon, string dialogHeader, string dialogText, eTaskDialogButton dialogButtons, eTaskDialogBackgroundColor dialogColor)
        {
            TaskDialogInfo info = new TaskDialogInfo(dialogTitle, dialogIcon, dialogHeader, dialogText, dialogButtons, dialogColor);
            return Show(info);
        }
        /// 
        /// Displays TaskDialog message.
        /// 
        /// Specifies the content of the task dialog.
        /// Result from task-dialog.
        public static eTaskDialogResult Show(TaskDialogInfo info)
        {
            return Show(null, info);
        }
        private static TaskDialogForm _TaskDialogForm = null;
        /// 
        /// Displays TaskDialog message.
        /// 
        /// Window owner of the task dialog.
        /// Specifies the content of the task dialog.
        /// Result from task-dialog.
        public static eTaskDialogResult Show(IWin32Window owner, TaskDialogInfo info)
        {
            eTaskDialogResult result = eTaskDialogResult.None;
            TaskDialogForm taskDialog = new TaskDialogForm();
            try
            {
                _TaskDialogForm = taskDialog;
                if (!_AntiAlias)
                    taskDialog.AntiAlias = _AntiAlias;
                taskDialog.EnableGlass = _EnableGlass && !StyleManager.IsMetro(StyleManager.Style);
                taskDialog.TopMost = info.TopMost;
                if (!info.FormCloseEnabled)
                    taskDialog.CloseEnabled = false;
                taskDialog.ShowTaskDialog(owner, info);
                result = taskDialog.Result;
            }
            finally
            {
                taskDialog.Dispose();
                _TaskDialogForm = null;
            }
            return result;
        }
        /// 
        /// Closes the task dialog if it is open with eTaskDialogResult.None result.
        /// 
        public static void Close()
        {
            Close(eTaskDialogResult.None);
        }
        /// 
        /// Closes the task dialog if it is open with specified result value.
        /// 
        /// Value that will be used as return value from Show method.
        public static void Close(eTaskDialogResult result)
        {
            if (_TaskDialogForm == null)
                throw new NullReferenceException("Task Dialog Form is not shown.");
            _TaskDialogForm.CloseDialog(result);
        }
        private static bool _EnableGlass = true;
        /// 
        /// Gets or sets whether TaskDialog form has Windows Vista Glass enabled if running on 
        /// Windows Vista with Glass enabled. Default value is true.
        /// 
        public static bool EnableGlass
        {
            get { return _EnableGlass; }
            set
            {
                _EnableGlass = value;
            }
        }
        private static bool _AntiAlias = true;
        /// 
        /// Gets or sets the anti-alias text-rendering setting for the controls on task-dialog. Default value is true.
        /// 
        public static bool AntiAlias
        {
            get { return _AntiAlias; }
            set
            {
                _AntiAlias = value;
            }
        }
        
        internal static Image GetImage(eTaskDialogIcon icon)
        {
            if (icon == eTaskDialogIcon.None) return null;
            return BarFunctions.LoadBitmap("SystemImages.Task" + icon.ToString() + ".png");
        }
        /// 
        /// Occurs when any text markup link on Task-Dialog Box is clicked. Markup links can be created using "a" tag, for example:
        /// Markup link
        /// 
        public static event MarkupLinkClickEventHandler MarkupLinkClick;
        internal static void InvokeMarkupLinkClick(object sender, MarkupLinkClickEventArgs e)
        {
            MarkupLinkClickEventHandler h = MarkupLinkClick;
            if (h != null)
                h(sender, e);
        }
    }
    /// 
    /// Specifies the information displayed on task-dialog.
    /// 
    public struct TaskDialogInfo
    {
        /// 
        /// Initializes a new instance of the TaskDialogInfo structure.
        /// 
        /// Title of dialog.
        /// Task-dialog icon
        /// Header text.
        /// Dialog main/content text.
        /// Dialog buttons displayed.
        /// Dialog background color.
        /// Radio Button Commands
        /// Button commands.
        /// Check-box command.
        /// Footer text
        /// Footer image.
        public TaskDialogInfo(string title, eTaskDialogIcon taskDialogIcon, string header, string text, eTaskDialogButton dialogButtons, eTaskDialogBackgroundColor dialogColor, Command[] radioButtons, Command[] buttons, Command checkBoxCommand, string footerText, Image footerImage)
        {
            _Title = title;
            _Header = header;
            _Text = text;
            _DialogButtons = dialogButtons;
            _DialogColor = dialogColor;
            _RadioButtons = radioButtons;
            _Buttons = buttons;
            _FooterText = footerText;
            _CheckBoxCommand = checkBoxCommand;
            _TaskDialogIcon = taskDialogIcon;
            _FooterImage = footerImage;
            _TopMost = false;
            _DefaultButton = eTaskDialogButton.Ok;
            _FormCloseEnabled = true;
        }
        /// 
        /// Initializes a new instance of the TaskDialogInfo structure.
        /// 
        /// Title of dialog.
        /// Task-dialog icon
        /// Header text.
        /// Dialog main/content text.
        /// Dialog buttons displayed.
        /// Dialog background color.
        /// Radio Button Commands
        /// Button commands.
        /// Check-box command.
        /// Footer text
        /// Footer image.
        /// Indicates whether TaskDialog is top most.
        public TaskDialogInfo(string title, eTaskDialogIcon taskDialogIcon, string header, string text, eTaskDialogButton dialogButtons, eTaskDialogBackgroundColor dialogColor, Command[] radioButtons, Command[] buttons, Command checkBoxCommand, string footerText, Image footerImage, bool topMost)
        {
            _Title = title;
            _Header = header;
            _Text = text;
            _DialogButtons = dialogButtons;
            _DialogColor = dialogColor;
            _RadioButtons = radioButtons;
            _Buttons = buttons;
            _FooterText = footerText;
            _CheckBoxCommand = checkBoxCommand;
            _TaskDialogIcon = taskDialogIcon;
            _FooterImage = footerImage;
            _TopMost = topMost;
            _DefaultButton = eTaskDialogButton.Ok;
            _FormCloseEnabled = true;
        }
        /// 
        /// Initializes a new instance of the TaskDialogInfo structure.
        /// 
        /// Title of dialog.
        /// Task-dialog icon
        /// Header text.
        /// Dialog main/content text.
        /// Dialog buttons displayed.
        /// Dialog background color.
        public TaskDialogInfo(string title, eTaskDialogIcon taskDialogIcon, string header, string text, eTaskDialogButton dialogButtons, eTaskDialogBackgroundColor dialogColor)
        {
            _Title = title;
            _Header = header;
            _Text = text;
            _DialogButtons = dialogButtons;
            _DialogColor = dialogColor;
            _RadioButtons = null;
            _Buttons = null;
            _FooterText = null;
            _CheckBoxCommand = null;
            _TaskDialogIcon = taskDialogIcon;
            _FooterImage = null;
            _TopMost = false;
            _DefaultButton = eTaskDialogButton.Ok;
            _FormCloseEnabled = true;
        }
        /// 
        /// Initializes a new instance of the TaskDialogInfo structure.
        /// 
        /// Title of dialog.
        /// Task-dialog icon
        /// Header text.
        /// Dialog main/content text.
        /// Dialog buttons displayed.
        public TaskDialogInfo(string title, eTaskDialogIcon taskDialogIcon, string header, string text, eTaskDialogButton dialogButtons)
        {
            _Title = title;
            _Header = header;
            _Text = text;
            _DialogButtons = dialogButtons;
            _DialogColor = eTaskDialogBackgroundColor.Default;
            _RadioButtons = null;
            _Buttons = null;
            _FooterText = null;
            _CheckBoxCommand = null;
            _TaskDialogIcon = taskDialogIcon;
            _FooterImage = null;
            _TopMost = false;
            _DefaultButton = eTaskDialogButton.Ok;
            _FormCloseEnabled = true;
        }
        /// 
        /// Initializes a new instance of the TaskDialogInfo structure.
        /// 
        /// Title of dialog.
        /// Task-dialog icon
        /// Header text.
        /// Dialog main/content text.
        /// Dialog buttons displayed.
        public TaskDialogInfo(string title, eTaskDialogIcon taskDialogIcon, string header, string text, eTaskDialogButton dialogButtons, eTaskDialogButton defaultButton)
        {
            _Title = title;
            _Header = header;
            _Text = text;
            _DialogButtons = dialogButtons;
            _DialogColor = eTaskDialogBackgroundColor.Default;
            _RadioButtons = null;
            _Buttons = null;
            _FooterText = null;
            _CheckBoxCommand = null;
            _TaskDialogIcon = taskDialogIcon;
            _FooterImage = null;
            _TopMost = false;
            _DefaultButton = defaultButton;
            _FormCloseEnabled = true;
        }
        private string _Title;
        /// 
        /// Gets or sets the task-dialog window title.
        /// 
        public string Title
        {
            get { return _Title; }
            set
            {
                _Title = value;
            }
        }
        private string _Header;
        /// 
        /// Gets or sets the task-dialog header.
        /// 
        public string Header
        {
            get { return _Header; }
            set
            {
                _Header = value;
            }
        }
        private string _Text;
        /// 
        /// Gets or sets the task-dialog text.
        /// 
        public string Text
        {
            get { return _Text; }
            set
            {
                _Text = value;
            }
        }
        private eTaskDialogButton _DialogButtons;
        /// 
        /// Gets or sets the task-dialog buttons displayed.
        /// 
        public eTaskDialogButton DialogButtons
        {
            get { return _DialogButtons; }
            set { _DialogButtons = value; }
        }
        private eTaskDialogBackgroundColor _DialogColor;
        /// 
        /// Gets or sets the task-dialog background color.
        /// 
        public eTaskDialogBackgroundColor DialogColor
        {
            get { return _DialogColor; }
            set { _DialogColor = value; }
        }
        private Command[] _RadioButtons;
        /// 
        /// Gets or sets the array of commands that will be used to create the radio-buttons displayed on task-dialog. Each command will be executed as radio-buttons are checked by user.
        /// 
        public Command[] RadioButtons
        {
            get { return _RadioButtons; }
            set { _RadioButtons = value; }
        }
        private Command[] _Buttons;
        /// 
        /// Gets or sets the array of commands that will be used to create the buttons displayed on task-dialog. Each command will be executed as buttons are clicked by user.
        /// 
        public Command[] Buttons
        {
            get { return _Buttons; }
            set { _Buttons = value; }
        }
        private string _FooterText;
        /// 
        /// Gets or sets the footer text displayed on task-dialog.
        /// 
        public string FooterText
        {
            get { return _FooterText; }
            set
            {
                _FooterText = value;
            }
        }
        private Command _CheckBoxCommand;
        /// 
        /// Gets or sets the command that is used to initialize the footer check-box. Command will be executed when check-box state changes by end user.
        /// 
        public Command CheckBoxCommand
        {
            get { return _CheckBoxCommand; }
            set { _CheckBoxCommand = value; }
        }
        private eTaskDialogIcon _TaskDialogIcon;
        /// 
        /// Gets or sets the icon that is displayed on task dialog.
        /// 
        public eTaskDialogIcon TaskDialogIcon
        {
            get { return _TaskDialogIcon; }
            set { _TaskDialogIcon = value; }
        }
        private Image _FooterImage;
        /// 
        /// Gets or sets the image that is displayed in the task-dialog footer. Expected image size is 16x16 pixels.
        /// 
        public Image FooterImage
        {
            get { return _FooterImage; }
            set { _FooterImage = value; }
        }
        private bool _TopMost;
        /// 
        ///  Gets or sets whether TaskDialog form is top-most. Default value is false.
        /// 
        public bool TopMost
        {
            get { return _TopMost; }
            set
            {
                _TopMost = value;
            }
        }
        private eTaskDialogButton _DefaultButton;
        /// 
        /// Gets or sets the TaskDialog default button.
        /// 
        public eTaskDialogButton DefaultButton
        {
            get { return _DefaultButton; }
            set { _DefaultButton = value; }
        }
        private bool _FormCloseEnabled;
        /// 
        /// Indicates whether task dialog form close button is enabled, default value is true.
        /// 
        public bool FormCloseEnabled
        {
            get { return _FormCloseEnabled; }
            set
            {
                _FormCloseEnabled = value;
            }
        }
        
    }
    /// 
    /// Specifies the task dialog buttons.
    /// 
    [Flags]
    public enum eTaskDialogButton
    {
        /// 
        /// OK button will be displayed.
        /// 
        Ok = 1,
        /// 
        /// Yes button will be displayed.
        /// 
        Yes = 2,
        /// 
        /// No button will be displayed.
        /// 
        No = 4,
        /// 
        /// Cancel button will be displayed.
        /// 
        Cancel = 8,
        /// 
        /// Retry button will be displayed.
        /// 
        Retry = 16,
        /// 
        /// Close button will be displayed.
        /// 
        Close = 32
    }
    /// 
    /// Specifies the task dialog return values.
    /// 
    public enum eTaskDialogResult
    {
        /// 
        /// No button was clicked because dialog was closed using TaskDialog.Close method.
        /// 
        None,
        /// 
        /// OK button was clicked.
        /// 
        Ok,
        /// 
        /// Yes button was clicked.
        /// 
        Yes,
        /// 
        /// No button was clicked.
        /// 
        No,
        /// 
        /// Cancel button was clicked.
        /// 
        Cancel,
        /// 
        /// Retry button was clicked.
        /// 
        Retry,
        /// 
        /// Close button was clicked.
        /// 
        Close,
        /// 
        /// Specifies the custom result. Custom result can be specified if TaskDialog.Close method is called to close dialog.
        /// 
        Custom1,
        /// 
        /// Specifies the custom result. Custom result can be specified if TaskDialog.Close method is called to close dialog.
        /// 
        Custom2,
        /// 
        /// Specifies the custom result. Custom result can be specified if TaskDialog.Close method is called to close dialog.
        /// 
        Custom3
    }
    /// 
    /// Define icons available on TaskDialog.
    /// 
    public enum eTaskDialogIcon
    {
        /// 
        /// No icon.
        /// 
        None,
        /// 
        /// Blue flag icon.
        /// 
        BlueFlag,
        /// 
        /// Blue stop icon.
        /// 
        BlueStop,
        /// 
        /// Light bulb, idea icon.
        /// 
        Bulb,
        /// 
        /// Check-mark icon.
        /// 
        CheckMark,
        /// 
        /// Check-mark icon.
        /// 
        CheckMark2,
        /// 
        /// Trash-can delete icon.
        /// 
        Delete,
        /// 
        /// Exclamation icon.
        /// 
        Exclamation,
        /// 
        /// Flag icon.
        /// 
        Flag,
        /// 
        /// Hand-stop icon.
        /// 
        Hand,
        /// 
        /// Help icon.
        /// 
        Help,
        /// 
        /// Informational icon.
        /// 
        Information,
        /// 
        /// Informational icon.
        /// 
        Information2,
        /// 
        /// No entry icon.
        /// 
        NoEntry,
        /// 
        /// Shield icon.
        /// 
        Shield,
        /// 
        /// Shield help icon.
        /// 
        ShieldHelp,
        /// 
        /// Shield OK icon.
        /// 
        ShieldOk,
        /// 
        /// Shield stop icon.
        /// 
        ShieldStop,
        /// 
        /// Stop icon.
        /// 
        Stop,
        /// 
        /// Stop icon.
        /// 
        Stop2,
        /// 
        /// Users icons.
        /// 
        Users
    }
}