using System;
using System.Runtime.InteropServices;
namespace Hardcodet.Wpf.TaskbarNotification.Interop
{
    /// 
    /// A struct that is submitted in order to configure
    /// the taskbar icon. Provides various members that
    /// can be configured partially, according to the
    /// values of the 
    /// that were defined.
    /// 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct NotifyIconData
    {
        /// 
        /// Size of this structure, in bytes.
        /// 
        public uint cbSize;
        /// 
        /// Handle to the window that receives notification messages associated with an icon in the
        /// taskbar status area. The Shell uses hWnd and uID to identify which icon to operate on
        /// when Shell_NotifyIcon is invoked.
        /// 
        public IntPtr WindowHandle;
        /// 
        /// Application-defined identifier of the taskbar icon. The Shell uses hWnd and uID to identify
        /// which icon to operate on when Shell_NotifyIcon is invoked. You can have multiple icons
        /// associated with a single hWnd by assigning each a different uID. This feature, however
        /// is currently not used.
        /// 
        public uint TaskbarIconId;
        /// 
        /// Flags that indicate which of the other members contain valid data. This member can be
        /// a combination of the NIF_XXX constants.
        /// 
        public IconDataMembers ValidMembers;
        /// 
        /// Application-defined message identifier. The system uses this identifier to send
        /// notifications to the window identified in hWnd.
        /// 
        public uint CallbackMessageId;
        /// 
        /// A handle to the icon that should be displayed. Just
        /// Icon.Handle.
        /// 
        public IntPtr IconHandle;
        /// 
        /// String with the text for a standard ToolTip. It can have a maximum of 64 characters including
        /// the terminating NULL. For Version 5.0 and later, szTip can have a maximum of
        /// 128 characters, including the terminating NULL.
        /// 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string ToolTipText;
        /// 
        /// State of the icon. Remember to also set the .
        /// 
        public IconState IconState;
        /// 
        /// A value that specifies which bits of the state member are retrieved or modified.
        /// For example, setting this member to 
        /// causes only the item's hidden
        /// state to be retrieved.
        /// 
        public IconState StateMask;
        /// 
        /// String with the text for a balloon ToolTip. It can have a maximum of 255 characters.
        /// To remove the ToolTip, set the NIF_INFO flag in uFlags and set szInfo to an empty string.
        /// 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string BalloonText;
        /// 
        /// Mainly used to set the version when  is invoked
        /// with . However, for legacy operations,
        /// the same member is also used to set timeouts for balloon ToolTips.
        /// 
        public uint VersionOrTimeout;
        /// 
        /// String containing a title for a balloon ToolTip. This title appears in boldface
        /// above the text. It can have a maximum of 63 characters.
        /// 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string BalloonTitle;
        /// 
        /// Adds an icon to a balloon ToolTip, which is placed to the left of the title. If the
        ///  member is zero-length, the icon is not shown.
        /// 
        public BalloonFlags BalloonFlags;
        /// 
        /// Windows XP (Shell32.dll version 6.0) and later.
        /// - Windows 7 and later: A registered GUID that identifies the icon.
        ///   This value overrides uID and is the recommended method of identifying the icon.
        /// - Windows XP through Windows Vista: Reserved.
        /// 
        public Guid TaskbarIconGuid;
        /// 
        /// Windows Vista (Shell32.dll version 6.0.6) and later. The handle of a customized
        /// balloon icon provided by the application that should be used independently
        /// of the tray icon. If this member is non-NULL and the 
        /// flag is set, this icon is used as the balloon icon.
        /// If this member is NULL, the legacy behavior is carried out.
        /// 
        public IntPtr CustomBalloonIconHandle;
        /// 
        /// Creates a default data structure that provides
        /// a hidden taskbar icon without the icon being set.
        /// 
        /// 
        /// NotifyIconData
        public static NotifyIconData CreateDefault(IntPtr handle)
        {
            var data = new NotifyIconData();
            if (Environment.OSVersion.Version.Major >= 6)
            {
                //use the current size
                data.cbSize = (uint) Marshal.SizeOf(data);
            }
            else
            {
                //we need to set another size on xp/2003- otherwise certain
                //features (e.g. balloon tooltips) don't work.
                data.cbSize = 952; // NOTIFYICONDATAW_V3_SIZE
                //set to fixed timeout
                data.VersionOrTimeout = 10;
            }
            data.WindowHandle = handle;
            data.TaskbarIconId = 0x0;
            data.CallbackMessageId = WindowMessageSink.CallbackMessageId;
            data.VersionOrTimeout = (uint) NotifyIconVersion.Win95;
            data.IconHandle = IntPtr.Zero;
            //hide initially
            data.IconState = IconState.Hidden;
            data.StateMask = IconState.Hidden;
            //set flags
            data.ValidMembers = IconDataMembers.Message
                                | IconDataMembers.Icon
                                | IconDataMembers.Tip;
            //reset strings
            data.ToolTipText = data.BalloonText = data.BalloonTitle = string.Empty;
            return data;
        }
    }
}