/*********************************************************************
*                 SEGGER Software GmbH                               *
*        Solutions for real time microcontroller applications        *
**********************************************************************
*                                                                    *
*        (c) 1996 - 2019  SEGGER Microcontroller GmbH                *
*                                                                    *
*        Internet: www.segger.com    Support:  support@segger.com    *
*                                                                    *
**********************************************************************

** emWin V6.10 - Graphical user interface for embedded applications **
All  Intellectual Property rights in the Software belongs to  SEGGER.
emWin is protected by  international copyright laws.  Knowledge of the
source code may not be used to write a similar product. This file may
only be used in accordance with the following terms:

The  software has  been licensed by SEGGER Software GmbH to Nuvoton Technology Corporationat the address: No. 4, Creation Rd. III, Hsinchu Science Park, Taiwan
for the purposes  of  creating  libraries  for its 
Arm Cortex-M and  Arm9 32-bit microcontrollers, commercialized and distributed by Nuvoton Technology Corporation
under  the terms and conditions  of  an  End  User  
License  Agreement  supplied  with  the libraries.
Full source code is available at: www.segger.com

We appreciate your understanding and fairness.
----------------------------------------------------------------------
Licensing information
Licensor:                 SEGGER Software GmbH
Licensed to:              Nuvoton Technology Corporation, No. 4, Creation Rd. III, Hsinchu Science Park, 30077 Hsinchu City, Taiwan
Licensed SEGGER software: emWin
License number:           GUI-00735
License model:            emWin License Agreement, signed February 27, 2018
Licensed platform:        Cortex-M and ARM9 32-bit series microcontroller designed and manufactured by or for Nuvoton Technology Corporation
----------------------------------------------------------------------
Support and Update Agreement (SUA)
SUA period:               2018-03-26 - 2020-03-27
Contact to extend SUA:    sales@segger.com
----------------------------------------------------------------------
File        : AppWizard.h
Purpose     : Interface of AppWizard
---------------------------END-OF-HEADER------------------------------
*/

#ifndef APPWIZARD_H
#define APPWIZARD_H

#include <stddef.h>

#include "DIALOG.h"

#include "BUTTON_Private.h"
#include "WINDOW_Private.h"
#include "IMAGE_Private.h"
#include "TEXT_Private.h"
#include "SLIDER_Private.h"
#include "ROTARY_Private.h"
#include "SWITCH_Private.h"
#include "EDIT_Private.h"

#if (GUI_WINSUPPORT && GUI_SUPPORT_MEMDEV && WM_SUPPORT_TRANSPARENCY)

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
//
// Dispose flags (coordinates)
//
#define APPW_DISPOSE_FLAG_X0 (1 << 0)
#define APPW_DISPOSE_FLAG_Y0 (1 << 1)
#define APPW_DISPOSE_FLAG_X1 (1 << 2)
#define APPW_DISPOSE_FLAG_Y1 (1 << 3)

#define APPW_DISPOSE_DONE (APPW_DISPOSE_FLAG_X0 | APPW_DISPOSE_FLAG_Y0 | APPW_DISPOSE_FLAG_X1 | APPW_DISPOSE_FLAG_Y1)

#define APPW_DISPOSE_FLAG_ISROOT    (1 << 0)

//
// Manage screens as persistent
//
#define APPW_STATE_PERSISTENT (1 << 0)

//
// Interaction flag(s)
//
#define APPW_ACTION_FLAG_DONTGETVALUEFROMEMITTER (1UL << 16)

//
// Dispose modes
//
#define DISPOSE_MODE_NULL        0  // No dispose information
#define DISPOSE_MODE_REL_DISPLAY 1  // Relative to display
#define DISPOSE_MODE_REL_PARENT  2  // Relative to parent
#define DISPOSE_MODE_REL_SIBLING 3  // Relative to sibling (opposite edge)
#define DISPOSE_MODE_REL_PARTNER 4  // Relative to sibling (same edge)
// The following 4 modes are currently not supported by the AppWizard:
#define DISPOSE_MODE_MID_DISPLAY 5  // Relative to center of display
#define DISPOSE_MODE_MID_PARENT  6  // Relative to center of parent
#define DISPOSE_MODE_TAB_DISPLAY 7  // Tabular layout relative to display
#define DISPOSE_MODE_TAB_PARENT  8  // Tabular layout relative to parent

//
// Dispose indices
//
#define DISPOSE_INDEX_X0 0
#define DISPOSE_INDEX_Y0 1
#define DISPOSE_INDEX_X1 2
#define DISPOSE_INDEX_Y1 3
#define DISPOSE_INDEX_MX 4  // Not used for disposing
#define DISPOSE_INDEX_MY 5  // Not used for disposing

//
// Edges
//
#define APPW_EDGE_LEFT   0
#define APPW_EDGE_RIGHT  1
#define APPW_EDGE_TOP    2
#define APPW_EDGE_BOTTOM 3

//
// Messages
//
#define MSG_GET_DISPOSE    (WM_USER + 0)
#define MSG_GET_FUNCSETUP  (WM_USER + 1)
#define MSG_SET_LANG       (WM_USER + 2)
#define MSG_GET_JOBS       (WM_USER + 3)
#define MSG_SETUP_FINISHED (WM_USER + 4)
#define MSG_GET_STATE      (WM_USER + 5)
#define MSG_SET_VALUE      (WM_USER + 6)
#define MSG_SET_VAR        (WM_USER + 7)

//
// Draw modes
//
#define APPW_DRAW_MODE_FILL  0
#define APPW_DRAW_MODE_GRADH 1
#define APPW_DRAW_MODE_GRADV 2

//
// Swiping modes
//
#define APPW_SWIPE_REPLACE  0
#define APPW_SWIPE_DISCLOSE 1
#define APPW_SWIPE_CUSTOM   2

//
// Off, On, Toggle
//
#define APPW_SET_OFF    0
#define APPW_SET_ON     1
#define APPW_SET_TOGGLE 2

//
// Please do not change existing values because they are used to determine the font type when reading XBF fonts!
//
#define MODE_FONT_1BPP     0       // Monochrome mode
#define MODE_FONT_2BPP     1       // 4  gray scales for antialiased fonts
#define MODE_FONT_4BPP     2       // 16 gray scales for antialiased fonts
#define MODE_FONT_1EXT     3       // Monochrome mode with extended character information
#define MODE_FONT_1FRM     4       // Monochrome mode with extended character information and frame
#define MODE_FONT_2BPP_EXT 5       // 4  gray scales for antialiased fonts with extended character information
#define MODE_FONT_4BPP_EXT 6       // 16 gray scales for antialiased fonts with extended character information

//
// Modes of Text-object
//
#define APPW_TEXTMODE_TEXT 0
#define APPW_TEXTMODE_DEC  1

//
// Modes of Edit-object
//
#define APPW_EDITMODE_TEXT 0
#define APPW_EDITMODE_DEC  1

//
// Text state
//
#define APPW_STATE_TEXT_INVALID  (1U << 0)
#define APPW_STATE_TEXT_HASTEXT  (1U << 1)
#define APPW_STATE_TEXT_HASVALUE (1U << 2)

//
// Macros
//
#ifdef APP_WIZARD
  #define GENERATE_JOB(Action, pFunc, HasReceiver) { Action, #Action, (int(*)(WM_HWIN, WM_HWIN, APPW_PARA_ITEM *, int))pFunc, HasReceiver }
#else
  #define GENERATE_JOB(Action, pFunc, HasReceiver) { Action, (int(*)(WM_HWIN, WM_HWIN, APPW_PARA_ITEM *, int))pFunc, HasReceiver }
#endif

//
// Notification codes
//
enum {
  APPW_NOTIFICATION_INITDIALOG = (WM_NOTIFICATION_WIDGET + 0),
  APPW_NOTIFICATION_CREATE,
  APPW_NOTIFICATION_DELETE,
  APPW_NOTIFICATION_MOTION,
  APPW_NOTIFICATION_ANIMCOORD,
  APPW_NOTIFICATION_ANIMEND,
  APPW_NOTIFICATION_ANIMSTART
};

//
// Jobs of interactions
//
enum {
  APPW_JOB_NULL = -1,
  /*  1 */ APPW_JOB_SETENABLE = 1,  // (pPara + 0)->v     - 1 = On, 0 = Off
  /*  2 */ APPW_JOB_SETVIS,         // (pPara + 0)->v     - 1 = On, 0 = Off
  /*  3 */ APPW_JOB_ANIMCOORD,      // (pPara + 0)->v     - End value
                                    // (pPara + 1)->v     - Index of coordinate
                                    // (pPara + 2)->pFunc - Ease func
                                    // (pPara + 3)->v     - Period
  /*  4 */ APPW_JOB_ANIMVALUE,      // (pPara + 0)->v     - End value
                                    // (pPara + 1)->pFunc - Ease func
                                    // (pPara + 2)->v     - Period
  /*  5 */ APPW_JOB_ANIMRANGE,      // (pPara + 0)->v     - Start value
                                    // (pPara + 1)->v     - End value
                                    // (pPara + 2)->pFunc - Ease func
                                    // (pPara + 3)->v     - Period
  /*  6 */ APPW_JOB_SETCOORD,       // (pPara + 0)->v     - Value
                                    // (pPara + 1)->v     - Index of coordinate
  /*  7 */ APPW_JOB_SWAPSCREEN,     // (pPara + 0)->v     - Screen Id
  /*  8 */ APPW_JOB_SETCOLOR,       // (pPara + 0)->v     - Color to be used
  /*  9 */ APPW_JOB_SETBKCOLOR,     // (pPara + 0)->v     - BkColor to be used
  /* 10 */ APPW_JOB_ADDVALUE,       // (pPara + 0)->v     - Value to be added
  /* 11 */ APPW_JOB_SETVALUE,       // (pPara + 0)->v     - Value to be set
  /* 12 */ APPW_JOB_SETSIZE,        // (pPara + 0)->v     - Value to be used
                                    // (pPara + 1)->v     - Index of axis
  /* 13 */ APPW_JOB_CASCADECOORD,   // (pPara + 0)->v     - End value
                                    // (pPara + 1)->v     - Index of coordinate
                                    // (pPara + 2)->v     - Emitter Id of trigger
  /* 14 */ APPW_JOB_SHIFTSCREEN,    // (pPara + 0)->v     - Screen Id
                                    // (pPara + 1)->v     - Index of edge
                                    // (pPara + 2)->pFunc - Ease func
                                    // (pPara + 3)->v     - Period
                                    // (pPara + 4)->v     - Disclose
  /* 15 */ APPW_JOB_SET,            // === NO PARAMETERS ===
  /* 16 */ APPW_JOB_CLEAR,          // === NO PARAMETERS ===
  /* 17 */ APPW_JOB_TOGGLE,         // === NO PARAMETERS ===
  /* 18 */ APPW_JOB_SETTEXT,        // (pPara + 0)->v     - Text id (if (pPara + 0)->p == NULL)
                                    // (pPara + 0)->p     - Handle  (if (pPara + 0)->v < 0)
  /* 19 */ APPW_JOB_SHOWSCREEN,     // (pPara + 0)->v     - Screen Id
  /* 20 */ APPW_JOB_SETLANG         // (pPara + 0)->v     - Index of language 
};

//
// Commands for setting properties !!! INCLUDING USAGE DESCRIPTION FOR REFERENCE !!!
//
// IMPORTANT: Sequence has to be identical to _aSetup[] in APP_StreamWrite.cpp!!!
//
enum {
//--------------------------------------------------------------------------------
// Value                               // Purpose
//--------------------------------------------------------------------------------
  /*  0 */ APPW_SET_PROP_COLOR   = 0,  // pSetup->aPara [0].v     = Color
  /*  1 */ APPW_SET_PROP_COLORS     ,  // pSetup->aPara [0:3].v   = Colors for unpressed, pressed and disabled
  /*  2 */ APPW_SET_PROP_BKCOLOR    ,  // === same as APPW_SET_PROP_COLOR ===
  /*  3 */ APPW_SET_PROP_BKCOLORS   ,  // === same as APPW_SET_PROP_COLORS ===
  /*  4 */ APPW_SET_PROP_SBITMAP    ,  // === same as unpressed image of APPW_SET_PROP_SBITMAPS ===
  /*  5 */ APPW_SET_PROP_JPEG       ,  // pSetup->aPara [0].p     = pObj->apDraw[0].pData - Image-Data (INT) / Image-Filename (EXT)
                                       // pSetup->aPara [0].v     = 0 (INT) / 1 (EXT)
                                       // pSetup->aExtra[0].p     = Source file name (=== In AppWizard application only ===)
                                       // pSetup->aPara [1].v     = File size
  /*  6 */ APPW_SET_PROP_BMP        ,  // === same as APPW_SET_PROP_JPEG ===
  /*  7 */ APPW_SET_PROP_GIF        ,  // === same as APPW_SET_PROP_JPEG ===
  /*  8 */ APPW_SET_PROP_SBITMAPS   ,  // pSetup->aPara [0:3].p   = pObj->apDraw[0:2].pData - unpressed, pressed, disabled, DTA-Data (INT) / DTA-Filename (EXT)
                                       // pSetup->aPara [0:3].v   = 0 (INT) / 1 (EXT)
                                       // pSetup->aExtra[0:3].p   = Source file names (=== In AppWizard application only ===)
  /*  9 */ APPW_SET_PROP_REPEAT     ,  // pSetup->aPara [0].v     = Delay
                                       // pSetup->aPara [1].v     = Period
  /* 10 */ APPW_SET_PROP_TOGGLE     ,  // === NO PARAMETERS ===
  /* 11 */ APPW_SET_PROP_TEXTID     ,  // pSetup->aPara [0].p     = Pointer to pointer containing Id-string
                                       // pSetup->aPara [0].v     = Index value of text calculated in APP_DataUpdateObjects()
  /* 12 */ APPW_SET_PROP_ALIGNTEXT  ,  // pSetup->aPara [0:2].v   = pObj->AlignBm, pObj->xOffBm, pObj->yOffBm
  /* 13 */ APPW_SET_PROP_ALIGNBITMAP,  // pSetup->aPara [0:2].v   = pObj->AlignBm, pObj->xOffBm, pObj->yOffBm
  /* 14 */ APPW_SET_PROP_FONT       ,  // pSetup->aPara [0].p     = XBF-Data (INT) / Filename (EXT)
                                       // pSetup->aPara [0].v     = 0 (INT) / 1 (EXT)
  /* 15 */ APPW_SET_PROP_GRADH      ,  // pSetup->aPara [0].v     = n Number of colors
                                       // pSetup->aPara [0].p     = Pointer to n GUI_GRADIENT_INFO elements
  /* 16 */ APPW_SET_PROP_GRADV      ,  // === same as APPW_SET_PROP_GRADH ===
  /* 17 */ APPW_SET_PROP_MOTIONH    ,  // pSetup->aPara [0].p     = Pointer to APPW_ROOT_INFO of left screen (H) top screen (V)
                                       // pSetup->aExtra[0].p     = Pointer to Id-string          "" (=== In AppWizard application only ===)
                                       // pSetup->aPara [0].v     = Swiping mode                  ""
                                       // pSetup->aPara [1].p     = Pointer to APPW_ROOT_INFO  of right screen (H) bottom screen (V)
                                       // pSetup->aExtra[1].p     = Pointer to Id-string          "" (=== In AppWizard application only ===)
                                       // pSetup->aPara [1].v     = Swiping mode                  ""
                                       // pSetup->aPara [2].v     = 'Snap in' period              ""
  /* 18 */ APPW_SET_PROP_MOTIONV    ,  // === same as APPW_SET_PROP_MOTIONH ===
  /* 19 */ APPW_SET_PROP_RANGE      ,  // pSetup->aPara [0].v     = Minimum value
                                       // pSetup->aPara [1].v     = Maximum value
  /* 20 */ APPW_SET_PROP_OFFSET     ,  // pSetup->aPara [0].v     = Offset
  /* 21 */ APPW_SET_PROP_POS        ,  // pSetup->aPara [0].v     = Position
  /* 22 */ APPW_SET_PROP_DECMODE    ,  // pSetup->aPara [0].v     = Len   (parameter of func TEXT_SetDec())
                                       // pSetup->aPara [1].v     = Shift (parameter of func TEXT_SetDec())
                                       // pSetup->aPara [2].v     = Sign  (parameter of func TEXT_SetDec())
                                       // pSetup->aPara [3].v     = Space (parameter of func TEXT_SetDec())
  /* 23 */ APPW_SET_PROP_OWNERDRAW  ,  // pSetup->aPara [0].pFunc = Pointer to new callback function !!! APPW_SET_PROP_OWNERDRAW: CURRENTLY USED ONLY MANUALLY, NOT BY APPWIZARD APPLICATION !!!
                                       // pSetup->aPara [1].pFunc = Old callback function
  /* 24 */ APPW_SET_PROP_VALUE      ,  // pSetup->aPara [0].v     = Value to be used
  /* 25 */ APPW_SET_PROP_INVERT     ,  // === NO PARAMETERS ===
  /* 26 */ APPW_SET_PROP_PERIOD     ,  // pSetup->aPara [0].v     = Sets period when widget stops motion
  /* 27 */ APPW_SET_PROP_SNAP       ,  // pSetup->aPara [0].v     = Sets sets snap position in 1/10 degrees
  /* 28 */ APPW_SET_PROP_SPAN       ,  // pSetup->aPara [0].v     = Minimum value returned by object
                                       // pSetup->aPara [1].v     = Maximum value returned by object
  /* 29 */ APPW_SET_PROP_VERTICAL   ,  // === NO PARAMETERS ===
  /* 30 */ APPW_SET_PROP_PERSISTENT ,  // === NO PARAMETERS ===
  /* 31 */ APPW_SET_PROP_ROTATE     ,  // === NO PARAMETERS ===
  /* 32 */ APPW_SET_PROP_FADE       ,  // === NO PARAMETERS ===
  /* 33 */ APPW_SET_PROP_TILE       ,  // === NO PARAMETERS ===
  /* 34 */ APPW_SET_PROP_WRAP       ,  // === NO PARAMETERS ===
  /* 35 */ APPW_SET_PROP_TEXTID2    ,  // pSetup->aPara [0].p     = Pointer to pointer containing Id-string
                                       // pSetup->aPara [0].v     = Index value of text calculated in APP_DataUpdateObjects()
  /* 36 */ APPW_SET_PROP_ALIGN      ,  // pSetup->aPara [0].v     = pObj->Align
  /* 37 */ APPW_SET_PROP_RADIUS     ,  // pSetup->aPara [0].v     = Radius
  /* 38 */ APPW_SET_PROP_FRAME      ,  // pSetup->aPara [0].v     = Frame
  /* 39 */ APPW_SET_PROP_BORDER     ,  // pSetup->aPara [0].v     = Border
  /* 40 */ APPW_SET_PROP_LENGTH        // pSetup->aPara [0].v     = Length
};

//
// Bitmap indices
//
#define APPW_BI_UNPRESSED 0
#define APPW_BI_PRESSED   1
#define APPW_BI_DISABLED  2

#define APPW_MAX_RANGE    0xFFFFu

//
// Use of parameter
//
#define ARG_V(x)     { (U32)x, (const void *)0, (void (*)(void))0 }
#define ARG_P(x)     { (U32)0, (const void *)x, (void (*)(void))0 }
#define ARG_VP(x, y) { (U32)x, (const void *)y, (void (*)(void))0 }
#define ARG_F(x)     { (U32)0, (const void *)0, (void (*)(void))x }

/*********************************************************************
*
*       Types
*
**********************************************************************
*/
/*********************************************************************
*
*       APPW_DISPOSE_COORD
*/
typedef struct {
  int Mode;
  int Off;
  int Id;
  int Valid;
} APPW_DISPOSE_COORD;

/*********************************************************************
*
*       APPW_DISPOSE
*/
typedef struct {
  APPW_DISPOSE_COORD aDisposeCoord[4];
  int                xSize;
  int                ySize;
  int                xSizeMin;
  int                ySizeMin;
  U8                 State;
  U32                Flags;
} APPW_DISPOSE;

/*********************************************************************
*
*       APPW_TEXT_INIT
*/
typedef struct {
  const char ** appData;
  int           NumItems;
} APPW_TEXT_INIT;

/*********************************************************************
*
*       APPW_ANIM_PARA
*/
typedef struct  {
  I32     Start;
  I32     End;
  WM_HWIN hItem;
  WM_HWIN hWinSrc;
  U16     IdSrc;
  U16     IdDst;
  int     RootIndex;
} APPW_ANIM_PARA;

/*********************************************************************
*
*       APPW_ANIM_PARA_CASCADE
*/
typedef struct APPW_ANIM_PARA_CASCADE APPW_ANIM_PARA_CASCADE;

struct APPW_ANIM_PARA_CASCADE {
  APPW_ANIM_PARA AnimPara;
  U16            IdDst;
  GUI_HMEM       hNext;
};

/*********************************************************************
*
*       APPW_ANIM_COORD_PARA
*/
typedef struct {
  APPW_ANIM_PARA AnimPara;
  int            Index;
} APPW_ANIM_COORD_PARA;

/*********************************************************************
*
*       APPW_ANIM_SCREEN_PARA
*/
typedef struct {
  int EdgeIndex;
  I32 x0, x1;
  I32 y0, y1;
  WM_HWIN hWinOld;
  WM_HWIN hWinNew;
  APPW_DISPOSE DisposeOld;
  APPW_DISPOSE DisposeNew;
  GUI_ANIM_HANDLE hAnim;
  U8 Disclose;
} APPW_ANIM_SCREEN_PARA;

/*********************************************************************
*
*       APPW_CREATE_ITEM
*/
typedef struct {
  WM_HWIN   (* pfCreate)(APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
  int          Id;
  int          IdParent;
  APPW_DISPOSE Dispose;
} APPW_CREATE_ITEM;

/*********************************************************************
*
*       APPW_PARA_ITEM
*/
typedef struct {
  U32          v;
  const void * p;
  void      (* pFunc)(void);
} APPW_PARA_ITEM;

/*********************************************************************
*
*       APPW_SETUP_ITEM
*/
typedef struct {
  int            Id;
  unsigned       Command;
  APPW_PARA_ITEM aPara[6];
#ifdef APP_WIZARD
  APPW_PARA_ITEM aExtra[6];
#endif
} APPW_SETUP_ITEM;

/*********************************************************************
*
*       APPW_ACTION_ITEM
*
* Purpose:
*   Represents an interaction (including parameters) associated to a root object.
*   Each root object contains a list of interactions defining the behavior of the screen.
*/
typedef struct APPW_ACTION_ITEM APPW_ACTION_ITEM;

struct APPW_ACTION_ITEM {
  int            IdSrc;                               // Emitter
  int            NCode;                               // Signal
  int            IdDst;                               // Receiver
  int            IdJob;                               // Job
  void        (* pfSlot)(APPW_ACTION_ITEM * pAction,  // Pointer to action
                         WM_HWIN            hScreen,  // Handle of screen
                         WM_MESSAGE       * pMsg,     // pMsg->hWnd: receiver, pMsg->hWndSrc: emitter
                         int * pResult);              // Pointer to result
  APPW_PARA_ITEM aPara[6];                            // Optional job specific parameters
  U32            Flags;                               // Bitmask: 0 means -> aPara[x].v = value
                                                      //          1 means -> aPara[x].v = Variable-Id
#ifdef APP_WIZARD
  char         * pCode;                               // Additional code
  void         * pFunc;                               // Function name of slot
#endif
};

/*********************************************************************
*
*       APPW_JOB
*
* Purpose:
*   Defines the function to be called for a specific job
*/
typedef struct {
  int          IdJob;                               // Id of job
#ifdef APP_WIZARD
  const char * pName;                               // Name to be shown
#endif
  int       (* pFunc)(WM_HWIN          hWinDst,     // Handle of receiver
                      WM_HWIN          hWinSrc,     // Handle of emitter
                      APPW_PARA_ITEM * pPara,       // Parameters to be used
                      int              RootIndex);
  int          HasReceiver;
} APPW_JOB;

/*********************************************************************
*
*       APPW_OBJ_SETUP_T
*
* Purpose:
*   Common type definition of setup function
*/
typedef int APPW_OBJ_SETUP_T(const APPW_SETUP_ITEM * pSetup, WM_HWIN hParent);

/*********************************************************************
*
*       APPW_ROOT_INFO
*
* Purpose:
*   Structure to be passed to APPW_CreateRoot()
*/
typedef struct {
  U16                      Id;
  APPW_CREATE_ITEM       * pCreateInfo;
  unsigned                 NumCreateInfo;
  const APPW_SETUP_ITEM  * pSetupInfo;
  unsigned                 NumSetupInfo;
  const APPW_ACTION_ITEM * pActionInfo;
  unsigned                 NumActionInfo;
  WM_CALLBACK            * cb;
  WM_HWIN                  hWin;
} APPW_ROOT_INFO;

/*********************************************************************
*
*       APPW_VAR_OBJECT
*
* Purpose:
*   Configurable variables to be used
*/
typedef struct {
  U16 Id;       // Used to address the variables
  U8  IsDirty;  // Is set to 1 if content is 'dirty' and needs to be processed
  U32 Data;     // Could be anything except a pointer
} APPW_VAR_OBJECT;

/*********************************************************************
*
*       APPW_FILE_INFO
*
* Purpose:
*   ...
*/
typedef struct {
  const char * pFileName;
  void       * pVoid;
} APPW_FILE_INFO;

/*********************************************************************
*
*       APPW_DRAW_OBJECT
*
* Purpose:
*   Structure for drawing bitmaps (streamed or C)
*/
typedef struct {
  void      (* pfDraw)(const void * p, int x, int y);  // Drawing function
  const void * pData;                                  // Data pointer (bitmap) or file name (streamed bitmap)
  int          xSize;                                  // (obvious)
  int          ySize;                                  // (obvious)
  U32          FileSize;                               // (obvious)
} APPW_DRAW_OBJECT;

/*********************************************************************
*
*       APPW_FILEACCESS
*
* Purpose:
*   File access
*/
typedef struct {
  GUI_GET_DATA_FUNC        * pfGetDataBGJ;                                                   // Function for getting data of (B)MP, (G)IF and (J)PEG files
  GUI_GET_DATA_FUNC        * pfGetDataImage;                                                 // Function for getting data of streamed bitmaps and text resource files
  GUI_XBF_GET_DATA_FUNC    * pfGetDataFont;                                                  // Function for getting data of XBF fonts
  U32                     (* pfGetDataFile)  (void * p, U8 * pData, U32 NumBytes, U32 Off);  // Function for getting data of generic files
  void                  * (* pfOpenFontFile) (const char * pFilename);                       // Opens a file in resource (sub)folder 'Font'
  void                  * (* pfOpenImageFile)(const char * pFilename);                       // Opens a file in resource (sub)folder 'Image'
  void                  * (* pfOpenTextFile) (const char * pFilename);                       // Opens a file in resource (sub)folder 'Text'
  void                    (* pfCloseFile)    (void *);                                       // (obvious)
  U32                     (* pfGetFileSize)  (void *);                                       // (obvious)
} APPW_FILEACCESS;

/*********************************************************************
*
*       APPW_X_FILEACCESS
*
* Purpose:
*   Bare file access
*/
typedef struct {
  void * (* pfOpen   )(const char * pFilename);
  int    (* pfSeek   )(const void * p, U32 Off);
  U32    (* pfRead   )(const void * p, void * pData, U32 NumBytes);
  void   (* pfClose  )(const void * p);
  U32    (* pfGetSize)(const void * p);
} APPW_X_FILEACCESS;

/*********************************************************************
*
*       APPW_MEMACCESS
*
* Purpose:
*   Accessing object data located in memory
*/
typedef struct {
  GUI_GET_DATA_FUNC        * pfGetDataImage;
  GUI_XBF_GET_DATA_FUNC    * pfGetDataFont;
  U32                     (* pfGetDataFile)(void * p, U8 * pData, U32 NumBytes, U32 Off);
} APPW_MEMACCESS;

/*********************************************************************
*
*       WM_OBJECT_BOX
*/
typedef struct {
  WIDGET               Widget;
  APPW_DISPOSE         Dispose;
  unsigned             Mode;
  GUI_COLOR            Color0;
  int                  NumColors;
  GUI_GRADIENT_INFO  * pGradient;
} WM_OBJECT_BOX;

/*********************************************************************
*
*       WM_OBJECT_BUTTON
*/
typedef struct {
  BUTTON_Obj       Widget;
  APPW_DISPOSE     Dispose;
  U32              State;
  unsigned         Mode;
  unsigned         Delay;
  unsigned         Period;
  unsigned         Toggle;
  unsigned         AlignBm;
  int              xOffBm;
  int              yOffBm;
  APPW_DRAW_OBJECT apDraw[3];
  int              TextId;
  WM_HTIMER        hTimer;
  GUI_FONT         Font;
  GUI_XBF_DATA     FontData;
} WM_OBJECT_BUTTON;

/*********************************************************************
*
*       WM_OBJECT_IMAGE
*/
typedef struct {
  IMAGE_OBJ        Widget;
  APPW_DISPOSE     Dispose;
  unsigned         Mode;
  GUI_COLOR        Color0;
  unsigned         AlignBm;
  int              xOffBm;
  int              yOffBm;
  const     void * pData;
  void           * pFile;

} WM_OBJECT_IMAGE;

/*********************************************************************
*
*       WM_OBJECT_ROTARY
*/
typedef struct {
  ROTARY_OBJ       Widget;
  APPW_DISPOSE     Dispose;
  APPW_DRAW_OBJECT apDraw[3];  // 0 = Bk, 1 = Marker, 2 = MarkerHR
  WM_HMEM          hMarkerPara;
} WM_OBJECT_ROTARY;

/*********************************************************************
*
*       WM_OBJECT_SLIDER
*/
typedef struct {
  SLIDER_Obj       Widget;
  APPW_DISPOSE     Dispose;
  unsigned         Mode;
  APPW_DRAW_OBJECT apDraw[4];
  GUI_COLOR        aColor[2];
  GUI_COLOR      * apStretchLine[2];  // Pointer for bitmap pixels to be stretched
  U8               HasValue;
} WM_OBJECT_SLIDER;

/*********************************************************************
*
*       WM_OBJECT_SWITCH
*/
typedef struct {
  SWITCH_Obj       Widget;
  APPW_DISPOSE     Dispose;
  U32              State;
  APPW_DRAW_OBJECT apDraw[6];
  int              aTextId[2];
  GUI_FONT         Font;
  GUI_XBF_DATA     FontData;
} WM_OBJECT_SWITCH;

/*********************************************************************
*
*       WM_OBJECT_TEXT
*/
typedef struct {
  TEXT_OBJ         Widget;
  APPW_DISPOSE     Dispose;
  U32              State;
  unsigned         Mode;
  unsigned         AlignText;
  int              xOffText;
  int              yOffText;
  int              TextId;
  GUI_FONT         Font;
  GUI_XBF_DATA     FontData;
  //
  // Elements required for decimal mode
  //
  I32              Value;
  I32              Min;
  I32              Max;
  //
  // Parameters for decimal mode
  //
  U8               Len;
  U8               Shift;
  U8               Signed;
  U8               Space;
} WM_OBJECT_TEXT;

/*********************************************************************
*
*       WM_OBJECT_EDIT
*/
typedef struct {
  EDIT_Obj         Widget;
  APPW_DISPOSE     Dispose;
  U32              State;
  unsigned         Mode;
  GUI_FONT         Font;
  GUI_XBF_DATA     FontData;
  int              FrameRadius;
  int              FrameSize;
  GUI_COLOR        FrameColor;
  //
  // Elements required for decimal mode
  //
  I32              Value;
  I32              Min;
  I32              Max;
  //
  // Parameters for decimal mode
  //
  U8               Len;
  U8               Shift;
  U8               Signed;
  U8               Space;
} WM_OBJECT_EDIT;

/*********************************************************************
*
*       WM_OBJECT_WINDOW
*/
typedef struct {
  WINDOW_OBJ        Widget;
  APPW_DISPOSE      Dispose;
  U32               State;
  APPW_ROOT_INFO  * pRoot;
  APPW_SETUP_ITEM * pSetupMotionH;
  APPW_SETUP_ITEM * pSetupMotionV;
} WM_OBJECT_WINDOW;

/*********************************************************************
*
*       Public Data (to be supplied by project)
*
**********************************************************************
*/
extern APPW_ROOT_INFO ** APPW_ppRootList;
extern APPW_ROOT_INFO  * APPW_apRootList[];
extern APPW_VAR_OBJECT   APPW_aVarList[];

extern APPW_VAR_OBJECT * APPW_paVarList;
extern unsigned          APPW_NumScreens;
extern unsigned          APPW_NumVars;

/*********************************************************************
*
*       Interface
*
**********************************************************************
*/
//
// BOX
//
WM_HWIN WM_OBJECT_BOX_Create      (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_BOX_Setup       (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// WINDOW
//
WM_HWIN WM_OBJECT_WINDOW_Create   (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_WINDOW_SetPara  (WM_HWIN hWin, APPW_ROOT_INFO * pRoot);
//
// BUTTON
//
WM_HWIN WM_OBJECT_BUTTON_Create   (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_BUTTON_Setup    (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// IMAGE
//
WM_HWIN WM_OBJECT_IMAGE_Create    (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_IMAGE_Setup     (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// TEXT
//
WM_HWIN WM_OBJECT_TEXT_Create     (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_TEXT_Setup      (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// ROTARY
//
WM_HWIN WM_OBJECT_ROTARY_Create   (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_ROTARY_Setup    (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// SLIDER
//
WM_HWIN WM_OBJECT_SLIDER_Create   (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_SLIDER_Setup    (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// SWITCH
//
WM_HWIN WM_OBJECT_SWITCH_Create   (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_SWITCH_Setup    (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);
//
// EDIT
//
WM_HWIN WM_OBJECT_EDIT_Create     (APPW_DISPOSE * pDispose, WM_HWIN hParent, int Id);
int     WM_OBJECT_EDIT_Setup      (WM_HWIN hWin, APPW_SETUP_ITEM * pSetup);

//
// Private
//
APPW_DISPOSE          * APPW__GetDispose             (WM_HWIN hWin);
int                     APPW__DisposeObject          (WM_HWIN hWin, int Index);

//
// Common
//
int                     APPW_ACTION_AnimValue        (WM_HWIN hWinDst, WM_HWIN hWinSrc, APPW_PARA_ITEM * pPara, int RootIndex);
int                     APPW_ACTION_SetEnable        (WM_HWIN hWinDst, WM_HWIN hWinSrc, APPW_PARA_ITEM * pPara, int RootIndex);
void                    APPW_ClearShiftScreenActive  (void);
WM_HWIN                 APPW_CreateRoot              (APPW_ROOT_INFO * pRoot, WM_HWIN hParent);
int                     APPW_Dispose                 (WM_HWIN hWin, unsigned Invalidate);
void                    APPW_DragCoord               (APPW_DISPOSE * pDisposeOld, APPW_DISPOSE * pDisposeNew, unsigned Index, int Delta);
void                    APPW_DrawObject              (APPW_DRAW_OBJECT * pDraw, GUI_RECT * pRect, int AlignBm, int xOffBm, int yOffBm);
void                    APPW_DrawObjectAt            (APPW_DRAW_OBJECT * pDraw, int xPos, int yPos);
void                    APPW_DrawStreamedBitmapEXT   (const APPW_DRAW_OBJECT * pDraw, int x, int y);
void                    APPW_DrawStreamedBitmapEXT_HR(const APPW_DRAW_OBJECT * pDraw, int x, int y);
void                    APPW_DrawStreamedBitmapINT   (const APPW_DRAW_OBJECT * pDraw, int x, int y);
void                    APPW_DrawStreamedBitmapINT_HR(const APPW_DRAW_OBJECT * pDraw, int x, int y);
void                    APPW_Exec                    (void);
APPW_ROOT_INFO        * APPW_GetCurrentRootInfo      (WM_HWIN hWin);
const APPW_JOB        * APPW_GetJob                  (int Id);
const APPW_JOB        * APPW_GetJobs                 (int * pNumJobs);
const APPW_JOB        * APPW_GetJobsAnim             (int * pNumJobs);
const APPW_JOB        * APPW_GetJobsVar              (int * pNumJobs);
const APPW_FILEACCESS * APPW_GetFileAccess           (void);
const GUI_XBF_TYPE    * APPW_GetFileType             (U8 Type);
const APPW_MEMACCESS  * APPW_GetMemAccess            (void);
const char            * APPW_GetResourcePath         (void);
WM_HWIN                 APPW_GetRoot                 (WM_HWIN hWin);
APPW_ROOT_INFO        * APPW_GetRootInfo             (WM_HWIN hRoot, int * pRootIndex);
APPW_ROOT_INFO        * APPW_GetRootInfoByIndex      (int RootIndex);
APPW_ROOT_INFO        * APPW_GetRootInfoByRootId     (U16 Id);
int                     APPW_GetOpponent             (int Index);
void                    APPW_GetStreamedBitmapInfoEXT(const APPW_DRAW_OBJECT * pDraw, GUI_BITMAPSTREAM_INFO * pInfo);
void                    APPW_GetStreamedBitmapInfoINT(const APPW_DRAW_OBJECT * pDraw, GUI_BITMAPSTREAM_INFO * pInfo);
APPW_VAR_OBJECT       * APPW_GetVar                  (U16 Id);
WM_HWIN                 APPW_GetVarWin               (void);
void                    APPW_Init                    (const char * pResourcePath);
void                    APPW_InitResourcePath        (const char * pResourcePath);
int                     APPW_IsValid                 (WM_HWIN hWin);
int                     APPW_IsRoot                  (WM_HWIN hWin);
int                     APPW_MakeFont                (APPW_SETUP_ITEM * pSetup, GUI_FONT * pFont, GUI_XBF_DATA * pData);
void                    APPW_MoveDispose             (APPW_DISPOSE * pDisposeOld, APPW_DISPOSE * pDisposeNew, int dx, int dy);
int                     APPW_ProcessActions          (WM_MESSAGE * pMsg, int RootIndex);
int                     APPW_ProcessMotion           (WM_MESSAGE * pMsg, APPW_SETUP_ITEM * pSetupMotion);
void                    APPW_SendNotification        (WM_HWIN hWin, int Notification);
APPW_ROOT_INFO       ** APPW_SetData                 (APPW_ROOT_INFO ** ppRootInfo, int NumScreens, APPW_VAR_OBJECT * paVarList, int NumVars);
void                    APPW_SetFileAccess           (APPW_X_FILEACCESS * pFileAccess);
void                    APPW_SetpfInitFS             (void (* pFunc)(void));
void                    APPW_SetpfInitText           (void (* pFunc)(void));
void                    APPW_SetPos                  (WM_HWIN hItem, int xPos, int yPos);
void                    APPW_SetStreamedBitmap       (APPW_DRAW_OBJECT * pDraw, APPW_PARA_ITEM * pPara, GUI_BITMAPSTREAM_INFO * pInfo);
void                    APPW_SetStreamedBitmap_HR    (APPW_DRAW_OBJECT * pDraw, APPW_PARA_ITEM * pPara, GUI_BITMAPSTREAM_INFO * pInfo);
void                    APPW_TextInitMem             (const APPW_TEXT_INIT * pPara);
void                    APPW_TextInitExt             (const APPW_TEXT_INIT * pPara);
void                    APPW_X_Config                (void);
void                    APPW_X_InitText              (void);
void                    APPW_X_FS_Init               (void);
void                    APPW_X_Setup                 (void);

//
// Public
//
int                     APPW_SetVarData              (U16 Id, U32 Data);
U32                     APPW_GetVarData              (U16 Id);

#endif  // GUI_WINSUPPORT

#endif  // APPWIZARD_H

/*************************** End of file ****************************/
