home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / online / source / c / compilers / Tickle-4.0.sit.hqx / Tickle-4.0 / src / SFGetFile.c < prev    next >
Text File  |  1993-11-18  |  6KB  |  264 lines

  1.  
  2. /*
  3. ** This source code was written by Tim Endres
  4. ** Email: time@ice.com.
  5. ** USMail: 8840 Main Street, Whitmore Lake, MI  48189
  6. **
  7. ** Some portions of this application utilize sources
  8. ** that are copyrighted by ICE Engineering, Inc., and
  9. ** ICE Engineering retains all rights to those sources.
  10. **
  11. ** Neither ICE Engineering, Inc., nor Tim Endres, 
  12. ** warrants this source code for any reason, and neither
  13. ** party assumes any responsbility for the use of these
  14. ** sources, libraries, or applications. The user of these
  15. ** sources and binaries assumes all responsbilities for
  16. ** any resulting consequences.
  17. */
  18.  
  19. #include "tickle.h"
  20. #include "tge.h"
  21.  
  22.  
  23. #define SFSaveDisk        (* (short *) 0x0214)
  24. #define CurDirStore        (* (long *)  0x0398)
  25.  
  26. #pragma segment Main
  27.  
  28. #define MY_GETFILE_DIALOG        777
  29. #define getInit                    -1        /* Initialize */
  30. #define getPromptItem            11
  31.  
  32. static    char    get_prompt[256];
  33.  
  34. pascal Boolean
  35. SFFilter(myDialog, myEvent, myItem)
  36.     DialogPtr        myDialog;
  37.     EventRecord        *myEvent;
  38.     short            *myItem;
  39.     {
  40.     int            result = FALSE, myascii;
  41.     char        title[256];
  42.     Handle        myhandle;
  43.     short        type;
  44.     Rect        myrect;
  45.  
  46.     /* Do the standard filtering... */
  47.     if (myEvent->what == keyDown)
  48.         {
  49.         myascii = myEvent->message % 256;
  50.         if ((myEvent->modifiers & 0x0100) != 0)
  51.             {
  52.             if (myascii == 'x' || myascii == 'X')
  53.                 { DlgCut(myDialog); ZeroScrap(); TEToScrap(); result = TRUE; }
  54.             else if (myascii == 'c' || myascii == 'C')
  55.                 { DlgCopy(myDialog); ZeroScrap(); TEToScrap(); result = TRUE; }
  56.             else if (myascii == 'v' || myascii == 'V')
  57.                 { DlgPaste(myDialog); result = TRUE; }
  58.             }
  59.         else if (myascii == '\015' || myascii == '\003')
  60.             {
  61.             *myItem = ((DialogRecord *) myDialog)->aDefItem;
  62.             result = TRUE;
  63.             }
  64.         }
  65.  
  66.     SetPort(myDialog);
  67.     return result;
  68.     }
  69.  
  70. pascal short SFPromptHook(item, dialog)
  71.     short        item;
  72.     DialogPtr    dialog;
  73.     {
  74.     switch (item)
  75.         {
  76.         case getInit:
  77.             if (get_prompt[0] != '\0')
  78.                 MySetText(dialog, getPromptItem, get_prompt);
  79.             get_prompt[0] = '\0';
  80.             break;
  81.         }
  82.     
  83.     return item;
  84.     }
  85.  
  86. SFGetDefault(dirid, vrefnum)
  87.     long    *dirid;
  88.     short    *vrefnum;
  89.     {
  90.  
  91.     *vrefnum = SFSaveDisk * -1;
  92.     *dirid = CurDirStore;
  93.     }
  94.  
  95. SFSetDefault(dirid, vrefnum)
  96.     long    dirid;
  97.     short    vrefnum;
  98.     {
  99.  
  100.     SFSaveDisk = vrefnum * -1;
  101.     CurDirStore = dirid;
  102.     }
  103.  
  104. SFWDDefault(wdref)
  105.     int        wdref;
  106.     {
  107.     SFSaveDisk = -1 * WDVolRef(wdref);
  108.     CurDirStore = WDDirID(wdref);
  109.     }
  110.  
  111. static long        _save_sf_dirid = 0;
  112. static short    _save_sf_vrefnum = -1;
  113. SFSaveDefault()
  114.     {
  115.     SFGetDefault(&_save_sf_dirid, &_save_sf_vrefnum);
  116.     }
  117.  
  118. SFRestoreDefault()
  119.     {
  120.     SFSetDefault(_save_sf_dirid, _save_sf_vrefnum);
  121.     }
  122.  
  123. MyGetFile(sfpoint, sfprompt, sffilter, sfnumtypes, sftypes, sfhook, sfreply)
  124.     Point                sfpoint;
  125.     char                *sfprompt;
  126.     FileFilterProcPtr    sffilter;
  127.     int                    sfnumtypes;
  128.     SFTypeList            sftypes;
  129.     char                *sfhook;
  130.     SFReply                *sfreply;
  131.     {
  132.     Point        mypoint;
  133.     Handle        dlog;
  134.     short        saveref;
  135.     Rect        myrect, screenRect;
  136.     WindowPtr    myWindow;
  137.  
  138. #pragma unused(sfhook)
  139.  
  140.     myWindow = FrontWindow();
  141.     if (myWindow != NULL && WPeek->windowKind == tgeWKind)
  142.         tge_activate(myWindow, 0);
  143.  
  144.     saveref = CurResFile();
  145.     UseResFile(app_refnum);
  146.  
  147.     strncpy(get_prompt, &sfprompt[1], sfprompt[0]);
  148.     get_prompt[sfprompt[0]] = '\0';
  149.     sfreply->version = 0;
  150.  
  151.     mypoint = sfpoint;
  152.     dlog = GetResource((ResType)'DLOG', (short)MY_GETFILE_DIALOG);
  153.     if (dlog != NULL)
  154.         LoadResource(dlog);
  155.     
  156.     if (dlog != NULL && *dlog != NULL)
  157.         {
  158.         screenRect = qd.screenBits.bounds;
  159.         myrect = *( *( (Rect **) dlog ) );
  160.         OffsetRect(&myrect, -myrect.left, -myrect.top);
  161.         OffsetRect(&myrect,
  162.                     (screenRect.right - myrect.right) >> 1,
  163.                     ((screenRect.bottom - myrect.bottom) >> 2) + 10);
  164.         mypoint.h = myrect.left;
  165.         mypoint.v = myrect.top;
  166.     
  167.         SFPGetFile( mypoint, sfprompt, sffilter, (short)sfnumtypes,
  168.                     sftypes, (DlgHookProcPtr)SFPromptHook, sfreply,
  169.                     (short)MY_GETFILE_DIALOG, (ModalFilterProcPtr)SFFilter );
  170.     
  171.         if (sfreply->good)
  172.             if (sfreply->fName[0] != '\0')
  173.                 if (sfreply->fName[1] == '.')
  174. {
  175. message_note(
  176. "WARNING: File names may not begin with periods.\015\
  177. You must rename this file if you save it!"
  178. );
  179. }
  180.         }
  181.     else
  182.         {
  183.         message_alert("ERROR #%d Could not load file dialog #%d.",
  184.                         ResError(), MY_GETFILE_DIALOG);
  185.         }
  186.     UseResFile(saveref);
  187.     }
  188.  
  189.  
  190. MyPutFile(sfpoint, sfprompt, sforiginal, sfhook, sfreply)
  191.     Point                sfpoint;
  192.     char                *sfprompt;
  193.     char                *sforiginal;
  194.     DlgHookProcPtr        sfhook;
  195.     SFReply                *sfreply;
  196.     {
  197.     Handle        dlog;
  198.     Rect        screenRect;
  199.     short        saveref, dialogID;
  200.     Rect        myrect;
  201.     Point        mypoint;
  202.     WindowPtr    myWindow;
  203.  
  204.     myWindow = FrontWindow();
  205.     if (WPeek->windowKind == tgeWKind)
  206.         tge_activate(myWindow, 0);
  207.  
  208.     saveref = CurResFile();
  209.     UseResFile(app_refnum);
  210.     sfreply->version = 0;
  211.  
  212.     mypoint = sfpoint;
  213.     
  214.     dialogID = gHasStandardFile ? sfPutDialogID : putDlgID;
  215.     dlog = GetResource( (ResType)'DLOG', dialogID );
  216.         
  217.     if (dlog != NULL)
  218.         LoadResource(dlog);
  219.         
  220.     if ( dlog != NULL && *dlog != NULL )
  221.         {
  222.         if (dlog != NULL && *dlog != NULL)
  223.             {
  224.             screenRect = qd.screenBits.bounds;
  225.             myrect = *( *( (Rect **) dlog ) );
  226.             OffsetRect(&myrect, -myrect.left, -myrect.top);
  227.             OffsetRect(&myrect,
  228.                         (screenRect.right - myrect.right) >> 1,
  229.                         ((screenRect.bottom - myrect.bottom) >> 2) + 10);
  230.             mypoint.h = myrect.left;
  231.             mypoint.v = myrect.top;
  232.             }
  233.         for ( ; ; )
  234.             {
  235.             if (gHasStandardFile)
  236.                 {
  237.                 /* Should use the new StandardFile! */
  238.                 SFPutFile(mypoint, sfprompt, sforiginal, NULL, sfreply);
  239.                 }
  240.             else
  241.                 {
  242.                 SFPPutFile(mypoint, sfprompt, sforiginal, sfhook, sfreply,
  243.                             (short)dialogID, (ModalFilterProcPtr)SFFilter);
  244.                 }
  245.         
  246.             if (sfreply->good)
  247.                 if (sfreply->fName[0] != '\0')
  248.                     if (sfreply->fName[1] == '.')
  249.                         {
  250.                         message_note("File names may not begin with periods.");
  251.                         continue;
  252.                         }
  253.             
  254.             break;
  255.             }
  256.         }
  257.     else
  258.         {
  259.         message_alert("ERROR #%d Could not load file dialog #%d.",
  260.                         ResError(), dialogID);
  261.         }
  262.     UseResFile(saveref);
  263.     }
  264.