/*
 * MODULE: TIMER.C
 *
 *    Subroutines for TIMER.
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

#define MODULE_TIMER
#include "common.h"


/*
 * LIST HOOK FUNCTIONS ------------------------------
 */
SAVEDS ASM APTR fnTimerDefConstructFunc(REG(a0) struct Hook *hook, REG(a2) APTR mempool, REG(a1) char *pszTimer )
{
   struct TimerDefNode *pNew = NULL, *pOld;


   pOld = (struct TimerDefNode *)pszTimer;
   if ( pNew = (struct TimerDefNode *)
               AllocVec( sizeof( struct TimerDefNode ), MEMF_ANY | MEMF_CLEAR ) )
   {
      pNew->ubPaused = FALSE;
      strncpy( pNew->szTime,       pOld->szTime,       sizeof( pNew->szTime )-1 );
      strncpy( pNew->szDoneTime,   pOld->szDoneTime,   sizeof( pNew->szDoneTime )-1 );
      strncpy( pNew->szRecipeName, pOld->szRecipeName, sizeof( pNew->szRecipeName )-1 );

      return( pNew );
   }
   else
   {
      return( NULL );
   }
}
static struct Hook hTimerDefConstructHook =
{
   {NULL, NULL},
   (void *)fnTimerDefConstructFunc,
   NULL, NULL
};

SAVEDS ASM APTR fnTimerDefCompareFunc(REG(a0) struct Hook *hook, REG(a1) struct TimerDefNode *p1, REG(a2) struct TimerDefNode *p2 )
{
   return( (APTR)( strcmp( p1->szDoneTime, p2->szDoneTime ) ) );
}
static struct Hook hTimerDefCompareHook =
{
   {NULL, NULL},
   (void *)fnTimerDefCompareFunc,
   NULL, NULL
};

SAVEDS ASM VOID fnTimerDefDestructFunc(REG(a0) struct Hook *hook, REG(a2) APTR mempool, REG(a1) struct TimerDefNode *pTDNode )
{
   FreeVec( pTDNode );
}
static struct Hook hTimerDefDestructHook = {
   {NULL, NULL},
   (void *)fnTimerDefDestructFunc,
   NULL, NULL
};

SAVEDS ASM LONG fnTimerDefDisplayFunc(REG(a0) struct Hook *hook,REG(a2) char **array,REG(a1) struct TimerDefNode *pTDNode )
{
   if ( pTDNode )
   {
      //
      // display data
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      *array++ = pTDNode->szRecipeName;
      *array++ = pTDNode->szTime;
      *array   = pTDNode->szDoneTime;
   }
   else
   {
      //
      // display list title
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      *array++ = "\33bRecipe Name";
      *array++ = "\33bTime";
      *array   = "\33bDone Time";
   }

   return(0);
}
static struct Hook hTimerDefDisplayHook = {
   {NULL, NULL},
   (void *)fnTimerDefDisplayFunc,
   NULL, NULL
};


/*
 *             -------======= ROUTINES =======-------
 *
 * BOOL fnConstructTimerWindow( void )
 * BOOL fnInitTimerWindow( void )
 * BOOL fnDestructTimerWindow( BOOL fOKorCANCEL )
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// ***********************************************************************
//
//    TIMER WINDOW
// struct TimerWindow {
//    APTR  LIS_TimerList,
//          CHE_Pause,
//          BUT_Remove,
//          BUT_AlarmConfig,
//          BUT_OK;
// } TIMER;
//
// ***********************************************************************
//
BOOL fnConstructTimerWindow( void )
{
   MG.WIN_Timer = WindowObject,
      MUIA_Window_ID, MAKE_ID('T','I','M','E'),
      MUIA_Window_Title, "Timer List",
      MUIA_Window_Menu, MUIV_Window_Menu_NoMenu,
      WindowContents, VGroup,
         Child, TIMER.LIS_TimerList = ListviewObject,
            MUIA_Listview_Input, TRUE,
            MUIA_Listview_List, ListObject,
               InputListFrame,
               MUIA_List_ConstructHook, &hTimerDefConstructHook,
               MUIA_List_CompareHook,   &hTimerDefCompareHook,
               MUIA_List_DestructHook,  &hTimerDefDestructHook,
               MUIA_List_DisplayHook,   &hTimerDefDisplayHook,
               End,
            End,
         Child, HGroup,
            Child, TIMER.BUT_Remove      = KeyButton("Remove",'r'),
            Child, TIMER.BUT_AlarmConfig = KeyButton("Alarm Configuration...",'a'),
            End,
         Child, HGroup,
            Child, HSpace(0),
            Child, TIMER.CHE_Pause       = KeyCheckMark(FALSE,'p'),
            Child, KeyLabel1("Paused?",'p'),
            Child, HSpace(0),
            End,
         Child, HGroup,
            Child, HSpace(0),
            Child, TIMER.BUT_OK = KeyButton("OK",'o'),
            Child, HSpace(0),
            End,
         End,
      End;

   // window failed?
   if ( !MG.WIN_Timer )
   {
      return( FAILURE );
   }
   else
   {
      // make gadget connections
      DoMethod( MG.WIN_Timer, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
                MG.App, 2, MUIM_Application_ReturnID, ID_WIN_CLOSE_TIMER );

      DoMethod( TIMER.CHE_Pause, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_CHE_TIMERPAUSE );
      DoMethod( TIMER.BUT_Remove, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_TIMERREMOVE );
      DoMethod( TIMER.BUT_AlarmConfig, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_TIMERALARMCONFIG );
      DoMethod( TIMER.BUT_OK, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_TIMERCANCEL );

      // set tab cycle chain
      DoMethod( MG.WIN_Timer, MUIM_Window_SetCycleChain,
                TIMER.LIS_TimerList,
                TIMER.BUT_Remove,
                TIMER.BUT_AlarmConfig,
                TIMER.CHE_Pause,
                TIMER.BUT_OK,
                NULL );

      // add window to Application object
      DoMethod( MG.App, OM_ADDMEMBER, MG.WIN_Timer );

      return( SUCCESS );
   }
}

BOOL fnInitTimerWindow( void )
{
   set( MG.WIN_Timer, MUIA_Window_Open, TRUE );

   set( MG.WIN_Timer, MUIA_Window_DefaultObject, TIMER.LIS_TimerList );
   set( MG.WIN_Timer, MUIA_Window_ActiveObject, TIMER.LIS_TimerList );

   return( SUCCESS );
}

BOOL fnDestructTimerWindow( BOOL fOKorCANCEL )
{
   BOOL  rc = SUCCESS;


   switch( fOKorCANCEL )
   {
      case ENDWINDOW_OK:
      case ENDWINDOW_CANCEL:
         break;
   }

   set( MG.WIN_Timer, MUIA_Window_Open, FALSE );

   return( rc );
}
