///////////////////////////////////////////////////////////////////////////////
//
//                          IMPORTANT NOTICE
//
// The following open source license statement does not apply to any
// entity in the Exception List published by FMSoft.
//
// For more information, please visit:
//
// https://www.fmsoft.cn/exception-list
//
//////////////////////////////////////////////////////////////////////////////
/**
 * \file spinbox.h
 * \author Wei Yongming <vincent@minigui.org>
 * \date 2002/01/06
 * 
 \verbatim

    This file is part of MiniGUI, a mature cross-platform windowing 
    and Graphics User Interface (GUI) support system for embedded systems
    and smart IoT devices.

    Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
    Copyright (C) 1998~2002, WEI Yongming

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

    Or,

    As this program is a library, any link to this program must follow
    GNU General Public License version 3 (GPLv3). If you cannot accept
    GPLv3, you need to be licensed from FMSoft.

    If you have got a commercial license of this program, please use it
    under the terms and conditions of the commercial license.

    For more information about the commercial license, please refer to
    <http://www.minigui.com/en/about/licensing-policy/>.

 \endverbatim
 */

/*
 * $Id: spinbox.h 10690 2008-08-18 09:32:47Z weiym $
 *
 *      MiniGUI for Linux/uClinux, eCos, uC/OS-II, VxWorks, 
 *      pSOS, ThreadX, NuCleus, OSE, and Win32.
 */

#ifndef EXT_SPINBOX_H
#define EXT_SPINBOX_H

#ifdef  __cplusplus
extern "C" {
#endif

    /**
     * \addtogroup controls
     * @{
     */

    /**
     * \defgroup mgext_ctrl_spinbox SpinBox control
     * @{
     */

/**
 * \def CTRL_SPINBOX
 * \brief The class name of spinbox control.
 */
#define CTRL_SPINBOX                ("SpinBox")

/** Structure of the spinbox info */
typedef struct _SPININFO
{
    /** Maximum position value */
    int max;
    /** Minimum position value */
    int min;
    /** Current position value */
    int cur;
} SPININFO;
/**
 * \var typedef SPININFO *PSPININFO;
 * \brief Data type of the pointer to a SPININFO.
 */
typedef SPININFO *PSPININFO;

/**
 * \fn void GetSpinBoxSize (DWORD dwStyle, int* w, int* h)
 * \brief Gets size of a vertical spin box control.
 *
 * The spin box control in MiniGUI has fixed size. 
 * This function gets the size of a spin box control.
 *
 * \param dwStyle The style of the spin box.
 * \param w The width of the spin box control will be returned through this argument.
 * \param h The height of the spin box control will be returned through this argument.
 */
void GetSpinBoxSize (DWORD dwStyle, int* w, int* h);

    /**
     * \defgroup mgext_ctrl_spinbox_styles Styles of spinbox control
     * @{
     */

/**
 * \def SPS_AUTOSCROLL
 * \brief The spinbox control can automatically scroll, 
 *        and disable itself when reach maximal or minimal value.
 */
#define SPS_AUTOSCROLL          0x00000001L

/**
 * \def SPS_HORIZONTAL
 * \brief The spinbox control is horizontal. The default is vertical.
 */
#define SPS_HORIZONTAL          0x00000010L

/**
 * \def SPS_TYPE_NORMAL
 * \brief The spinbox control contains the up and left arrows. 
 */
#define SPS_TYPE_NORMAL         0x00000000L

/**
 * \def SPS_TYPE_UPARROW
 * \brief The spinbox control contains only the up/left arrow. 
 */
#define SPS_TYPE_UPARROW        0x00000100L

/**
 * \def SPS_TYPE_DOWNARROW
 * \brief The spinbox control contains only the down/right arrow. 
 */
#define SPS_TYPE_DOWNARROW      0x00000200L

/**
 * \def SPS_TYPE_MASK
 * \brief The mask code of spinbox control.
 */ 
#define SPS_TYPE_MASK           0x00000F00L

    /** @} end of mgext_ctrl_spinbox_styles */

    /**
     * \defgroup mgext_ctrl_spinbox_msgs Messages of spinbox control
     * @{
     */
/**
 * \def KS_SPINPOST
 * \brief The flag of the spinbox control message.
 */
#define KS_SPINPOST             0x00010000

/**
 * \def SPM_SETTARGET
 * \brief Sets the target window of the spinbox.
 *
 * When the user click the up/left or down/right arrow of the spin box, it will
 * emulate the down and up of the key SCANCODE_CURSORBLOCKUP or
 * SCANCODE_CURSORBLOCKDOWN, and post MSG_KEYDOWN and MSG_KEYUP
 * message to the target window. Note that the shifit key status of the
 * message will have the flag KS_SPINPOST set.
 *
 * \code
 * SPM_SETTARGET
 * HWND hTarget;
 *
 * wParam = 0;
 * lParam = (LPARAM)hTarget;
 * \endcode
 *
 * \param hTarget Handle of the target window.
 * \return Always be zero.
 */
#define SPM_SETTARGET           0xF300

/**
 * \def SPM_GETTARGET
 * \brief Gets the target window of the spinbox.
 *
 * \code
 * SPM_GETTARGET
 *
 * wParam = 0;
 * lParam = 0;
 * \endcode
 *
 * \return The handle to the target window.
 */
#define SPM_GETTARGET           0xF301

/**
 * \def SPM_SETINFO
 * \brief Sets the parameter information of the spinbox.
 *
 * \code
 * SPM_SETINFO
 * PSPININFO newinfo;
 *
 * wParam = 0;
 * lParam = (LPARAM)newinfo;
 * \endcode
 *
 * \param newinfo Pointer to the SPININFO structure storing the new spinbox info.
 *
 * \return Zero on success, -1 to indicate invalid parameter.
 *
 * \sa SPININFO
 */
#define SPM_SETINFO             0xF302

/**
 * \def SPM_GETINFO
 * \brief Gets the parameter infos of the spinbox.
 *
 * \code
 * SPM_GETINFO
 * PSPININFO info;
 *
 * wParam = 0;
 * lParam = (LPARAM)info;
 * \endcode
 *
 * \param info Pointer to the SPININFO structure retreiving the spinbox info.
 *
 * \return Zero on success, -1 to indicate invalid parameter.
 *
 * \sa SPININFO
 */
#define SPM_GETINFO             0xF303

/**
 * \def SPM_DISABLEUP
 * \brief Disable the ability to scroll up.
 *
 * \code
 * SPM_DISABLEUP
 *
 * wParam = 0;
 * lParam = 0;
 * \endcode
 *
 * \return Always be zero.
 */
#define SPM_DISABLEUP           0xF304

/**
 * \def SPM_DISABLEDOWN
 * \brief Disable the ability to scroll down.
 *
 * \code
 * SPM_DISABLEDOWN
 *
 * wParam = 0;
 * lParam = 0;
 * \endcode
 *
 * \return Always be zero.
 */
#define SPM_DISABLEDOWN         0xF305

/**
 * \def SPM_ENABLEUP
 * \brief Enable the ability to scroll up.
 *
 * \code
 * SPM_ENABLEUP
 *
 * wParam = 0;
 * lParam = 0;
 * \endcode
 *
 * \return Always be zero.
 */
#define SPM_ENABLEUP            0xF306

/**
 * \def SPM_ENABLEDOWN
 * \brief Enable the ability to scroll down.
 *
 * \code
 * SPM_ENABLEDOWN
 *
 * wParam = 0;
 * lParam = 0;
 * \endcode
 *
 * \return Always be zero.
 */
#define SPM_ENABLEDOWN          0xF307

/**
 * \def SPM_SETCUR
 * \brief Sets the current position in the range of the spinbox.
 *
 * \code
 * SPM_SETCUR
 * int pos;
 *
 * wParam = (WPARAM)pos;
 * lParam = 0;
 * \endcode
 *
 * \param pos The current position to set.
 *
 * \return Zero on success, -1 to indicate invalid parameter.
 */
#define SPM_SETCUR              0xF308

/**
 * \def SPM_GETCUR
 * \brief Gets the current position in the range of the spinbox.
 *
 * \code
 * SPM_GETCUR
 *
 * wParam = 0;
 * lParam = 0;
 * \endcode
 *
 * \return The current position in the range of the spinbox.
 */
#define SPM_GETCUR              0xF309

    /** @} end of mgext_ctrl_spinbox_msgs */

    /**
     * \defgroup mgext_ctrl_spinbox_ncs Notification codes of spinbox control
     * @{
     */

/**
 * \def SPN_REACHMIN
 * \brief Notifies that the spin box has reached the minimum limit.
 */
#define SPN_REACHMIN            1

/**
 * \def SPN_REACHMAX
 * \brief Notifies that the spin box has reached the maximum limit.
 */
#define SPN_REACHMAX            2

    /** @} end of mgext_ctrl_spinbox_ncs */

    /** @} end of mgext_ctrl_spinbox */

    /** @} end of controls */

#ifdef  __cplusplus
}
#endif

#endif /* EXT_SPINBOX_H */

