/* c.SaveBox */
                  
#include <stdio.h>    
#include <stdlib.h>  
#include <string.h>            
                   
#include "DeskLib:Wimp.h"
#include "DeskLib:WimpSWIs.h"
#include "DeskLib:Window.h"
#include "DeskLib:Event.h"
#include "DeskLib:EventMsg.h"
#include "DeskLib:Icon.h"
#include "DeskLib:DragASpr.h"
#include "DeskLib:Error.h"
#include "DeskLib:Menu.h"
#include "DeskLib:Handler.h"

#include "SaveBox.h"
#include "AttachMenu.h"

window_handle SaveBox;
char sOldPath[212];
int SaveFileType;
void *SaveHandle;
savebox_control *sc;

void SaveBox_Initialise(void)
{                          
  sc=(savebox_control *)malloc(sizeof(savebox_control));
  
  SaveBox=Window_Create("SaveBox",-1);
  Event_Claim(event_CLICK,SaveBox,event_ANY,SaveBox_Mouse,(void *)sc);
  Event_Claim(event_KEY,SaveBox,2,SaveBox_KeyPress,(void *)sc);
  Event_Claim(event_OPEN,SaveBox,event_ANY,Handler_OpenWindow,0);
}

void SaveBox_PopUp(char *name,int ft,save_handler sh,void *ref)
{                                                                          
  SaveHandle=ref;       
  SaveFileType=ft;
  sc->funct=sh;  
  
  Icon_SetText(SaveBox, 2,name);
   
  Window_ShowAsMenu(SaveBox);
}

BOOL SaveBox_Mouse(event_pollblock *ClickData,void *ref)
{ 
  BOOL rcode=FALSE;
  
  if(ClickData->data.mouse.icon == 3 && ClickData->data.mouse.button.data.dragselect)
  {
    DragASprite_DragIcon(SaveBox,3);
    Event_Claim(event_USERDRAG,event_ANY,event_ANY,SaveBox_DragDone,ref);
    rcode=TRUE;
  }
  
  if(ClickData->data.mouse.button.data.select)
  {
    switch(ClickData->data.mouse.icon)
    {
      case 0:
        rcode=SaveBox_QuickSave((savebox_control *)ref);
        break;
      case 1:
        rcode=TRUE;
        break;
    }
    if(rcode)
      Menu_Show((menu_block *)-1,0,0);
  }
               
  return rcode;
}

BOOL SaveBox_DragDone(event_pollblock *pb,void *ref)
{       
  mouse_block Ptr;
  message_destinee SendWhere;
  icon_handle SendIcon=0;
  message_block *sSending=(message_block *)malloc(sizeof(message_block));
  
  pb=pb;  
               
  Event_Release(event_USERDRAG,event_ANY,event_ANY,SaveBox_DragDone,ref);
  
  Wimp_GetPointerInfo(&Ptr);
  sSending->header.size=sizeof(message_header)+sizeof(message_datasave);
  sSending->header.action=message_DATASAVE;
  sSending->data.datasave.window=Ptr.window;
  sSending->data.datasave.icon=Ptr.icon;
  sSending->data.datasave.pos=Ptr.pos;
  sSending->data.datasave.estsize=100;
  sSending->data.datasave.filetype=SaveFileType;
  
  Icon_GetText(SaveBox,2,sOldPath);       
  if(strrchr(sOldPath,'.') != NULL)
    strcpy(sSending->data.datasave.leafname,(strrchr(sOldPath,'.'))+1);
  else
    strcpy(sSending->data.datasave.leafname,sOldPath);    
  
  if(Ptr.window >= 0)
  {
    SendWhere=(message_destinee)Ptr.window;
  }
  else
  {
    SendWhere=-2;
    SendIcon=Ptr.icon;
  }
  
  Wimp_SendMessage(event_SEND,sSending,SendWhere,SendIcon);
                      
  free((void *)sSending);
  
  EventMsg_Claim(message_DATASAVEACK,event_ANY,SaveBox_SaveAck,ref);  
  
  return TRUE;
}

BOOL SaveBox_SaveAck(event_pollblock *SAData,void *ref)
{         
  message_block *Sending;
  savebox_control *sc=(savebox_control *)ref;
  
  EventMsg_Release(message_DATASAVEACK,event_ANY,SaveBox_SaveAck);
  
  if(sc->funct(SAData->data.message.data.datasaveack.filename,
                 (SAData->data.message.data.datasaveack.estsize != -1),SaveHandle)) { 
    
    Sending=(message_block *)malloc(sizeof(message_block));
  
    *Sending=SAData->data.message;
    Sending->header.yourref=Sending->header.myref;
    Sending->header.action=message_DATALOAD;
    Wimp_SendMessage(event_SEND,Sending,(message_destinee)(Sending->header.sender),0);
                                                                 
    free((void *)Sending);
    
    EventMsg_Claim(message_DATALOADACK,event_ANY,SaveBox_LoadAck,0);
  
  } 
  else
  {
    Menu_Show((menu_block *)-1,0,0);
  }
  
  return(TRUE);
}

BOOL SaveBox_LoadAck(event_pollblock *pb,void *ref)
{
  ref=ref;
  pb=pb;
  
  EventMsg_Release(message_DATALOAD,event_ANY,SaveBox_LoadAck);
  Menu_Show((menu_block *)-1,0,0);
  
  return TRUE;
}

BOOL SaveBox_KeyPress(event_pollblock *KeyData,void *ref)
{ 
  BOOL rcode=FALSE;
  savebox_control *sc=(savebox_control *)ref;
  
  if(KeyData->data.key.code==13) {
    rcode=SaveBox_QuickSave(sc);
    if(rcode) 
      Menu_Show((menu_block *)-1,0,0);
  }
  
  return rcode;
}

BOOL SaveBox_QuickSave(savebox_control *sc)
{
  BOOL rcode=FALSE;
  
  Icon_GetText(SaveBox,2,sOldPath);
  
  if(strchr(sOldPath,'.') == NULL) {
    Error_Report(150,"To save, drag icon to a directory viewer.");
  }
  else
  {
    sc->funct(sOldPath,TRUE,SaveHandle);
    rcode=TRUE;
  }                        

  return rcode;
}                 



