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

#define MODULE_REORG
#include "common.h"


/*
 *             -------======= HOOKS =======-------
 *
 * Destination filespec hook FREQ
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SAVEDS ASM ULONG fnReOrgToHook(REG(a0) struct Hook *hook, REG(a2) APTR pObj, REG(a1) void *v )
{
   struct Window        *pWindow;
   struct FileRequester *pFReq;
   ULONG                 ulWidth;
   char                 *psz;
   char                  szBuf[FMSIZE+1], szPath[FMSIZE+1], *pszPathFile;


   // put our application to sleep while displaying the requester
   set( MG.App, MUIA_Application_Sleep, TRUE );

   // get the calling object's window and position
   get( pObj, MUIA_Window, &pWindow );
   get( pObj, MUIA_Width,  &ulWidth );

   // get contents of string gadget
   get( REORG.POP_ToReOrg, MUIA_String_Contents, &pszPathFile );
   strcpy( szBuf, pszPathFile );
   psz = FilePart( szBuf );
   if ( psz )
   {
      *psz = 0;
      strcpy( szPath, szBuf );
   }
   else
   {
      strcpy( szPath, "" );
   }

   if ( pFReq = MUI_AllocAslRequestTags( ASL_FileRequest,
                                         TAG_DONE ) )
   {
      if ( MUI_AslRequestTags( pFReq,
                               ASLFR_Window         , pWindow,
                               ASLFR_PrivateIDCMP   , TRUE,
                               ASLFR_TitleText      , "Select Re-Organization Destination",
                               ASLFR_InitialLeftEdge, pWindow->LeftEdge,
                               ASLFR_InitialTopEdge , pWindow->TopEdge,
                               ASLFR_InitialWidth   , ulWidth,
                               ASLFR_InitialHeight  , 250,
                               ASLFR_InitialDrawer  , szPath,
                               ASLFR_DrawersOnly    , TRUE,
                               TAG_DONE ) )
      {
         // set the new contents for our string gadget
         strcpy( MG.szReOrgDir, pFReq->fr_Drawer );

         set( pObj, MUIA_String_Contents, MG.szReOrgDir );
      }

      MUI_FreeAslRequest( (APTR)pFReq );
   }

   // wake up our application again
   set( MG.App, MUIA_Application_Sleep, FALSE );

   return(0);
}

static struct Hook hReOrgToHook = {
   {NULL,NULL},
   (void *)fnReOrgToHook,
   NULL, NULL
};


/*
 *             -------======= ROUTINES =======-------
 *
 * BOOL  fnConstructReOrgWindow( void )
 * BOOL  fnInitReOrgWindow( void )
 * BOOL  fnDestructReOrgWindow( BOOL fOKorCANCEL )
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// ***********************************************************************
//
//    REORGANIZE WINDOW
// struct ReOrgWindow {
//    APTR  FLO_ReOrgText,
//          POP_ToReOrg,
//          GAU_Progress,
//          BUT_ReOrg,
//          BUT_Cancel;
// } REORG;
//
// ***********************************************************************
//
BOOL  fnConstructReOrgWindow( void )
{
   MG.WIN_ReOrg = WindowObject,
      MUIA_Window_ID, MAKE_ID('R','O','R','G'),
      MUIA_Window_Title, "Reorganize Recipe Data File",
      MUIA_Window_Menu, MUIV_Window_Menu_NoMenu,
      MUIA_Window_CloseGadget, FALSE,
      WindowContents, VGroup,
         Child, REORG.FLO_ReOrgText = FloattextObject,
            End,
         Child, ColGroup(2),
            Child, Label("Backup To"),
            Child, HGroup, GroupSpacing(1),           // POPUP
               Child, REORG.POP_ToReOrg = StringObject, StringFrame,
                  MUIA_String_Format, MUIV_String_Format_Left,
                  MUIA_String_MaxLen, FMSIZE,
                  MUIA_String_Contents, NULL,
                  End,
               Child, dummy = ImageObject,
                  ImageButtonFrame,
                  MUIA_Image_Spec          , MUII_PopDrawer,
                  MUIA_Image_FontMatchWidth, TRUE,
                  MUIA_Image_FreeVert      , TRUE,
                  MUIA_InputMode           , MUIV_InputMode_RelVerify,
                  MUIA_Background          , MUII_BACKGROUND,
                  End,
               TAG_IGNORE, dummy && REORG.POP_ToReOrg ?
                            DoMethod(dummy,MUIM_Notify,MUIA_Pressed,FALSE,REORG.POP_ToReOrg,2,MUIM_CallHook,&hReOrgToHook) : 0,
               End,
            End,
         Child, VSpace(0),
         Child, HCenter( Label( "Progress" ) ),
         Child, REORG.GAU_Progress = GaugeObject, GaugeFrame,
            MUIA_Gauge_Current, 0,
            MUIA_Gauge_Horiz, TRUE,
            End,
         Child, ScaleObject,
            MUIA_Scale_Horiz, TRUE,
            End,
         Child, VSpace(0),
         Child, HGroup,
            Child, REORG.BUT_ReOrg = KeyButton("Re-Organize",'r'),
            Child, HSpace(0),
            Child, REORG.BUT_Cancel = SimpleButton("Cancel"),
            End,
         End,
      End;

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

      DoMethod( REORG.BUT_ReOrg, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_REORGREORG );
      DoMethod( REORG.BUT_Cancel, MUIM_Notify, MUIA_Pressed, FALSE,
                MG.App, 2, MUIM_Application_ReturnID, ID_BUT_REORGCANCEL );

      // set tab cycle chain
      DoMethod( MG.WIN_ReOrg, MUIM_Window_SetCycleChain,
                REORG.POP_ToReOrg,
                REORG.BUT_ReOrg,
                REORG.BUT_Cancel,
                NULL );

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

      return( SUCCESS );
   }
}

BOOL  fnInitReOrgWindow( void )
{
   float  fl;


   set( MG.WIN_Main,     MUIA_Window_Sleep, TRUE );
   set( MG.WIN_Add,      MUIA_Window_Sleep, TRUE );
   set( MG.WIN_Category, MUIA_Window_Sleep, TRUE );
   set( MG.WIN_Make,     MUIA_Window_Sleep, TRUE );
   set( MG.WIN_Find,     MUIA_Window_Sleep, TRUE );
   set( MG.WIN_ReOrg,    MUIA_Window_Sleep, TRUE );
   set( MG.WIN_Timer,    MUIA_Window_Sleep, TRUE );
   set( MG.WIN_SpeakXP,  MUIA_Window_Sleep, TRUE );
   set( MG.WIN_GrocList, MUIA_Window_Sleep, TRUE );

   set( REORG.GAU_Progress, MUIA_Gauge_Current, 0 );

   set( MG.WIN_ReOrg, MUIA_Window_Open, TRUE );
   fl = 100.0 * ( (float)( MG.ulTotalFileSize - (MG.ulNullSpaceSize-1) ) / (float)MG.ulTotalFileSize );
   fl = 100.0 - fl;
   sprintf( GL_szReOrgStat,
            "A reorganization of the recipe file would decrease the file \
size from %lu bytes to %lu bytes or by %.1f%c.",
            MG.ulTotalFileSize,
            MG.ulTotalFileSize - (MG.ulNullSpaceSize-1),
            fl,
            '%' );
   set( REORG.FLO_ReOrgText, MUIA_Floattext_Text, GL_szReOrgStat );
   set( MG.WIN_ReOrg, MUIA_Window_ActiveObject,  REORG.POP_ToReOrg );

   return( SUCCESS );
}

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


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

   set( MG.WIN_ReOrg, MUIA_Window_Open, FALSE );

   set( MG.WIN_GrocList, MUIA_Window_Sleep, FALSE );
   set( MG.WIN_SpeakXP,  MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Timer,    MUIA_Window_Sleep, FALSE );
   set( MG.WIN_ReOrg,    MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Find,     MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Make,     MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Category, MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Add,      MUIA_Window_Sleep, FALSE );
   set( MG.WIN_Main,     MUIA_Window_Sleep, FALSE );

   return( rc );
}
