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

#define MODULE_MAKELOCL
#include "common.h"


char  szWindowTitle[50];

/*
 *             -------======= DEFINES =======-------
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
UBYTE *MakeLocal_PageCYCLabels[] = {
   (UBYTE *)"Ingredients",
   (UBYTE *)"Directions",
   (UBYTE *)"Timers",
   NULL };


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


   if ( pNew = AllocVec( sizeof( struct TimersNode ), MEMF_ANY | MEMF_CLEAR ) )
   {
      pOld = (struct TimersNode *)pszTime;
      strncpy( pNew->szTimerName, pOld->szTimerName, sizeof( pNew->szTimerName )-1 );
      strncpy( pNew->szPrepOrBake, pOld->szPrepOrBake, sizeof( pNew->szPrepOrBake )-1 );
      strcpy( pNew->szHMSTime, pOld->szHMSTime );

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

SAVEDS ASM VOID fnMLTDestructFunc(REG(a0) struct Hook *hook, REG(a2) APTR mempool, REG(a1) struct TimersNode *pTNode )
{
   FreeVec( pTNode );
}
static struct Hook hMLTDestructHook = {
   {NULL, NULL},
   (void *)fnMLTDestructFunc,
   NULL, NULL
};

SAVEDS ASM LONG fnMLTDisplayFunc(REG(a0) struct Hook *hook,REG(a2) char **array,REG(a1) struct TimersNode *pTNode)
{
   if ( pTNode )
   {
      //
      // display data
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      *array++ = pTNode->szTimerName;
      *array++ = pTNode->szPrepOrBake;
      *array   = pTNode->szHMSTime;
   }
   else
   {
      //
      // display list title
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      *array++ = "\33bTimer Name";
      *array++ = "\33bType";
      *array   = "\33bTime";
   }

   return(0);
}
static struct Hook hMLTDisplayHook = {
   {NULL, NULL},
   (void *)fnMLTDisplayFunc,
   NULL, NULL
};


/*
 *             -------======= ROUTINES =======-------
 *
 * BOOL fnConstructMakeLocalWindow( void )
 * BOOL fnInitMakeLocalWindow( void )
 * BOOL fnDestructMakeLocalWindow( BOOL fOKorCANCEL )
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

// ***********************************************************************
//
//    MAKELOCL WINDOW
// struct MakeLocalWindow {
//    APTR  REG_PageIngDir,
//          LIS_IngList,
//          LIS_DirList,
//          LIS_TimerList,
//          BUT_StartTimer,
//          CHE_OpenTimerWindow,
//          BUT_PrevRecipe,
//          BUT_NextRecipe,
//          BUT_Cancel;
// };
//
// ***********************************************************************
//
BOOL fnConstructMakeLocalWindow( void )
{
   MG.WIN_MakeLocal = WindowObject,
      MUIA_Window_ID, MAKE_ID('M','L','C','L'),
      MUIA_Window_Title, "Make Recipe(s)",
      MUIA_Window_Menu, MUIV_Window_Menu_NoMenu,
      WindowContents, VGroup,
         Child, MAKELOCL.REG_PageIngDir = RegisterGroup( MakeLocal_PageCYCLabels ),
            MUIA_Register_Frame, TRUE,
            Child, VGroup,       // INGREDIENTS  PAGE !!!!!!!!!!!!!!!!!!!!
               Child, MAKELOCL.LIS_IngList = ListviewObject,
                  MUIA_Listview_Input, FALSE,
                  MUIA_Listview_List, ListObject,
                     ReadListFrame,
                     MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
                     MUIA_List_DestructHook,  MUIV_List_DestructHook_String,
                     End,
                  End,
               End,
            Child, VGroup,       // DIRECTIONS  PAGE !!!!!!!!!!!!!!!!!!!!
               Child, MAKELOCL.LIS_DirList = ListviewObject,
                  MUIA_Listview_Input, FALSE,
                  MUIA_Listview_List, ListObject,
                     ReadListFrame,
                     MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
                     MUIA_List_DestructHook,  MUIV_List_DestructHook_String,
                     End,
                  End,
               End,
            Child, VGroup,       // TIMERS  PAGE !!!!!!!!!!!!!!!!!!!!
               Child, MAKELOCL.LIS_TimerList = ListviewObject,
                  MUIA_Listview_Input, TRUE,
                  MUIA_Listview_List, ListObject,
                     InputListFrame,
                     MUIA_List_ConstructHook, &hMLTConstructHook,
                     MUIA_List_DestructHook,  &hMLTDestructHook,
                     MUIA_List_DisplayHook,   &hMLTDisplayHook,
                     MUIA_List_Format, "D=10 COL=0,D=10 COL=1,D=10 COL=2",
                     MUIA_List_Title, TRUE,
                     End,
                  End,
               Child, HGroup,
                  Child, MAKELOCL.BUT_StartTimer = KeyButton("Start Timer",'t'),
                  Child, HSpace(0),
                  Child, MAKELOCL.CHE_OpenTimerWindow = KeyCheckMark(FALSE,'w'),
                  Child, KeyLabel1("Open Timers window?",'w'),
                  End,
               End,
            End,
         Child, ColGroup(3),
            Child, MAKELOCL.BUT_PrevRecipe = KeyButton("< Prev Recipe",'<'),
            Child, MAKELOCL.BUT_NextRecipe = KeyButton("Next Recipe >",'>'),
            Child, MAKELOCL.BUT_Cancel     = SimpleButton("Cancel"),
            End,
         End,
      End;

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

      DoMethod( MAKELOCL.REG_PageIngDir, MUIM_Notify, MUIA_Group_ActivePage, 0,
                MG.WIN_MakeLocal, 2, MUIA_Window_DefaultObject, MAKELOCL.LIS_IngList );
      DoMethod( MAKELOCL.REG_PageIngDir, MUIM_Notify, MUIA_Group_ActivePage, 1,
                MG.WIN_MakeLocal, 2, MUIA_Window_DefaultObject, MAKELOCL.LIS_DirList );
      DoMethod( MAKELOCL.REG_PageIngDir, MUIM_Notify, MUIA_Group_ActivePage, 2,
                MG.WIN_MakeLocal, 2, MUIA_Window_DefaultObject, MAKELOCL.LIS_TimerList );

      DoMethod( MAKELOCL.BUT_PrevRecipe, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_MAKELOCLPREVRECIPE );
      DoMethod( MAKELOCL.BUT_NextRecipe, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_MAKELOCLNEXTRECIPE );
      DoMethod( MAKELOCL.BUT_StartTimer, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_MAKELOCLSTARTTIMER );
      DoMethod( MAKELOCL.CHE_OpenTimerWindow, MUIM_Notify, MUIA_Selected, TRUE,
                MG.App, 2, MUIM_Application_ReturnID, ID_MENU_TIMERS );
      DoMethod( MAKELOCL.CHE_OpenTimerWindow, MUIM_Notify, MUIA_Selected, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_WIN_CLOSE_TIMER );
      DoMethod( MAKELOCL.BUT_Cancel, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_MAKELOCLCANCEL );

      // set tab cycle chain
      DoMethod( MG.WIN_MakeLocal, MUIM_Window_SetCycleChain,
                MAKELOCL.REG_PageIngDir,
                MAKELOCL.LIS_IngList,
                MAKELOCL.LIS_DirList,
                MAKELOCL.LIS_TimerList,
                MAKELOCL.BUT_StartTimer,
                MAKELOCL.CHE_OpenTimerWindow,
                MAKELOCL.BUT_PrevRecipe,
                MAKELOCL.BUT_NextRecipe,
                MAKELOCL.BUT_Cancel,
                NULL );

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

      return( SUCCESS );
   }
}

BOOL fnInitMakeLocalWindow( void )
{
   UBYTE *pMemRecord = NULL;
   UBYTE *psz, *psz2;
   UBYTE *pszStart = NULL,
         *pszEnd   = NULL;
   LONG   lActive = -1, lNumEntries = -1;

   struct RecipeMemNode *pRMNode = NULL;
   struct MakeNode      *pMNode = NULL;


   DoMethod( MAKELOCL.LIS_IngList,   MUIM_List_Clear, TRUE );
   DoMethod( MAKELOCL.LIS_DirList,   MUIM_List_Clear, TRUE );
   DoMethod( MAKELOCL.LIS_TimerList, MUIM_List_Clear, TRUE );

   set( MAKELOCL.REG_PageIngDir, MUIA_Group_ActivePage, 0 );
   set( MAKELOCL.CHE_OpenTimerWindow, MUIA_Selected, FALSE );
   set( MG.WIN_Main, MUIA_Window_Sleep, TRUE );
   set( MG.WIN_Make, MUIA_Window_Sleep, TRUE );

   set( MG.WIN_MakeLocal, MUIA_Window_ActiveObject, MAKELOCL.LIS_IngList );

   DoMethod( MAKE.LIS_Recipes, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &pMNode );
   if ( pMNode )
   {
      DoMethod( MAIN.LIS_RecipeList, MUIM_List_GetEntry, pMNode->ulMainListIndex, &pRMNode );
      if ( pRMNode == NULL )
      {
         JMH_Error( "Internal Error!\nCannot find information for this entry.", MG.WIN_MakeLocal, NULL, NULL, 0 );
         return( FAILURE );
      }
   }
   else
   {
      JMH_Error( "Internal Error!\nCannot find information for this entry.", MG.WIN_MakeLocal, NULL, NULL, 0 );
      return( FAILURE );
   }

   pMemRecord = fnFetchRecord( pRMNode->ulDiskAddr );
   if ( pMemRecord )
   {
      //
      // read in timers...
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if ( pszStart = (char *)fnFindRecordItem( pMemRecord, RECITEM_TIMERLIST, NULL ) )
      {
         pszEnd = strchr( pszStart, LEVEL1BREAK );

         for ( psz = pszStart; psz < ( pszEnd-1 ); )
         {
            psz2 = strchr( psz+1, LEVEL2BREAK );
            if ( psz2 )
            {
               *psz2 = 0;
               DoMethod( MAKELOCL.LIS_TimerList, MUIM_List_Insert, &psz, 1, MUIV_List_Insert_Bottom );
               *psz2 = LEVEL2BREAK;
               psz = psz2+1;
            }
            else
            {
               JMH_Error( "Error reading timers.\nAll timers may not be listed.", MG.WIN_MakeLocal, NULL, NULL, 0 );
               break;
            }
         }
      }

      //
      // read in ingredients...
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      fnFillIngredientsList( MAKELOCL.LIS_IngList, pRMNode->ulDiskAddr, pMNode );

      //
      // read in directions...
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if ( pszStart = (char *)fnFindRecordItem( pMemRecord, RECITEM_DIRECTIONS, NULL ) )
      {
         pszEnd = strchr( pszStart, LEVEL1BREAK );

         for ( psz = pszStart; psz < ( pszEnd-1 ); )
         {
            psz2 = strchr( psz+1, LEVEL2BREAK );
            if ( psz2 )
            {
               *psz2 = 0;
               DoMethod( MAKELOCL.LIS_DirList, MUIM_List_Insert, &psz, 1, MUIV_List_Insert_Bottom );
               *psz2 = LEVEL2BREAK;
               psz = psz2+1;
            }
            else
            {
               JMH_Error( "Error reading directions.\nAll directions may not be listed.", MG.WIN_MakeLocal, NULL, NULL, 0 );
               break;
            }
         }
      }

      // set window title to name of recipe
      sprintf( szWindowTitle, "Make: %s", pRMNode->pszRecipeName );
      set( MG.WIN_MakeLocal, MUIA_Window_Title, szWindowTitle );

      FreeVec( pMemRecord );
   }

   set( MAKELOCL.BUT_PrevRecipe, MUIA_Disabled, FALSE );
   set( MAKELOCL.BUT_NextRecipe, MUIA_Disabled, FALSE );
   get( MAKE.LIS_Recipes, MUIA_List_Active, &lActive );
   get( MAKE.LIS_Recipes, MUIA_List_Entries, &lNumEntries );
   if ( lActive == 0 )
   {
      // disable PREV
      set( MAKELOCL.BUT_PrevRecipe, MUIA_Disabled, TRUE );
   }
   if ( ( lActive == lNumEntries-1 ) || ( lNumEntries <= 1 ) )
   {
      // disable NEXT
      set( MAKELOCL.BUT_NextRecipe, MUIA_Disabled, TRUE );
   }

   set( MAKELOCL.LIS_TimerList, MUIA_List_Active, 0 );

   set( MG.WIN_MakeLocal, MUIA_Window_Open, TRUE );

   return( SUCCESS );
}

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


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

   set( MG.WIN_MakeLocal, MUIA_Window_Open, FALSE );
   set( MG.WIN_Make, MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Main, MUIA_Window_Sleep, FALSE );

   return( rc );
}
