home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 24 / CD_ASCQ_24_0995.iso / vrac / dflt20.zip / FILEOPEN.C < prev    next >
C/C++ Source or Header  |  1994-08-31  |  6KB  |  206 lines

  1. /* ----------- fileopen.c ------------- */
  2.  
  3. #include "dflat.h"
  4.  
  5. static BOOL DlgFileOpen(char *, char *, char *, DBOX *);
  6. static int DlgFnOpen(WINDOW, MESSAGE, PARAM, PARAM);
  7. static void InitDlgBox(WINDOW);
  8. static void StripPath(char *);
  9. static BOOL IncompleteFilename(char *);
  10.  
  11. static char FileSpec[15];
  12. static char SrchSpec[15];
  13. static char FileName[15];
  14.  
  15. extern DBOX FileOpen;
  16. extern DBOX SaveAs;
  17.  
  18. /*
  19.  * Dialog Box to select a file to open
  20.  */
  21. BOOL OpenFileDialogBox(char *Fspec, char *Fname)
  22. {
  23.     return DlgFileOpen(Fspec, Fspec, Fname, &FileOpen);
  24. }
  25.  
  26. /*
  27.  * Dialog Box to select a file to save as
  28.  */
  29. BOOL SaveAsDialogBox(char *Fspec, char *Sspec, char *Fname)
  30. {
  31.     return DlgFileOpen(Fspec, Sspec ? Sspec : Fspec, Fname, &SaveAs);
  32. }
  33.  
  34. /* --------- generic file open ---------- */
  35. static BOOL DlgFileOpen(char *Fspec, char *Sspec, char *Fname, DBOX *db)
  36. {
  37.     BOOL rtn;
  38.  
  39.     strncpy(FileSpec, Fspec, 15);
  40.     strncpy(SrchSpec, Sspec, 15);
  41.  
  42.     if ((rtn = DialogBox(NULL, db, TRUE, DlgFnOpen)) != FALSE)
  43.         strcpy(Fname, FileName);
  44.  
  45.     return rtn;
  46. }
  47.  
  48. /*
  49.  *  Process dialog box messages
  50.  */
  51. static int DlgFnOpen(WINDOW wnd,MESSAGE msg,PARAM p1,PARAM p2)
  52. {
  53.     switch (msg)    {
  54.         case CREATE_WINDOW:    {
  55.             int rtn = DefaultWndProc(wnd, msg, p1, p2);
  56.             DBOX *db = wnd->extension;
  57.             WINDOW cwnd = ControlWindow(db, ID_FILENAME);
  58.             SendMessage(cwnd, SETTEXTLENGTH, 64, 0);
  59.             return rtn;
  60.         }
  61.         case INITIATE_DIALOG:
  62.             InitDlgBox(wnd);
  63.             break;
  64.         case COMMAND:
  65.             switch ((int) p1)    {
  66.                 case ID_OK:
  67.                 {
  68.                     if ((int)p2 == 0)    {
  69.                         char fn[MAXPATH+1];
  70.                         char nm[MAXFILE];
  71.                         char ext[MAXEXT];
  72.                         GetItemText(wnd, ID_FILENAME, fn, MAXPATH);
  73.                         fnsplit(fn, NULL, NULL, nm, ext);
  74.                         strcpy(FileName, nm);
  75.                         strcat(FileName, ext);
  76.                         CreatePath(NULL, fn, FALSE, TRUE);
  77.                         if (IncompleteFilename(FileName))    {
  78.                             /* --- no file name yet --- */
  79.                             DBOX *db = wnd->extension;
  80.                             WINDOW cwnd = ControlWindow(db, ID_FILENAME);
  81.                             strcpy(FileSpec, FileName);
  82.                             strcpy(SrchSpec, FileName);
  83.                                InitDlgBox(wnd);
  84.                             SendMessage(cwnd, SETFOCUS, TRUE, 0);
  85.                             return TRUE;
  86.                         }
  87.                     }
  88.                     break;
  89.                 }
  90.                 case ID_FILES:
  91.                     switch ((int) p2)    {
  92.                         case ENTERFOCUS:
  93.                         case LB_SELECTION:
  94.                             /* selected a different filename */
  95.                             GetDlgListText(wnd, FileName, ID_FILES);
  96.                             PutItemText(wnd, ID_FILENAME, FileName);
  97.                             break;
  98.                         case LB_CHOOSE:
  99.                             /* chose a file name */
  100.                             GetDlgListText(wnd, FileName, ID_FILES);
  101.                             SendMessage(wnd, COMMAND, ID_OK, 0);
  102.                             break;
  103.                         default:
  104.                             break;
  105.                     }
  106.                     return TRUE;
  107.                 case ID_DIRECTORY:
  108.                     switch ((int) p2)    {
  109.                         case ENTERFOCUS:
  110.                             PutItemText(wnd, ID_FILENAME, FileSpec);
  111.                             break;
  112.                         case LB_CHOOSE:
  113.                         {
  114.                             /* chose dir */
  115.                             char dd[15];
  116.                             GetDlgListText(wnd, dd, ID_DIRECTORY);
  117.                             chdir(dd);
  118.                             InitDlgBox(wnd);
  119.                             SendMessage(wnd, COMMAND, ID_OK, 0);
  120.                             break;
  121.                         }
  122.                         default:
  123.                             break;
  124.                     }
  125.                     return TRUE;
  126.  
  127.                 case ID_DRIVE:
  128.                     switch ((int) p2)    {
  129.                         case ENTERFOCUS:
  130.                             PutItemText(wnd, ID_FILENAME, FileSpec);
  131.                             break;
  132.                         case LB_CHOOSE:
  133.                         {
  134.                             /* chose dir */
  135.                             char dr[15];
  136.                             GetDlgListText(wnd, dr, ID_DRIVE);
  137.                             setdisk(*dr - 'A');
  138.                             InitDlgBox(wnd);
  139.                             SendMessage(wnd, COMMAND, ID_OK, 0);
  140.                         }
  141.                         default:
  142.                             break;
  143.                     }
  144.                     return TRUE;
  145.  
  146.                 default:
  147.                     break;
  148.             }
  149.         default:
  150.             break;
  151.     }
  152.     return DefaultWndProc(wnd, msg, p1, p2);
  153. }
  154.  
  155. BOOL BuildFileList(WINDOW, char *);
  156. void BuildDirectoryList(WINDOW);
  157. void BuildDriveList(WINDOW);
  158. void BuildPathDisplay(WINDOW);
  159.  
  160. /*
  161.  *  Initialize the dialog box
  162.  */
  163. static void InitDlgBox(WINDOW wnd)
  164. {
  165.     if (*FileSpec)
  166.         PutItemText(wnd, ID_FILENAME, FileSpec);
  167.     if (BuildFileList(wnd, SrchSpec))
  168.         BuildDirectoryList(wnd);
  169.     BuildDriveList(wnd);
  170.     BuildPathDisplay(wnd);
  171. }
  172.  
  173. /*
  174.  * Strip the drive and path information from a file spec
  175.  */
  176. static void StripPath(char *filespec)
  177. {
  178.     char *cp, *cp1;
  179.  
  180.     cp = strchr(filespec, ':');
  181.     if (cp != NULL)
  182.         cp++;
  183.     else
  184.         cp = filespec;
  185.     while (TRUE)    {
  186.         cp1 = strchr(cp, '\\');
  187.         if (cp1 == NULL)
  188.             break;
  189.         cp = cp1+1;
  190.     }
  191.     strcpy(filespec, cp);
  192. }
  193.  
  194.  
  195. static BOOL IncompleteFilename(char *s)
  196. {
  197.     int lc = strlen(s)-1;
  198.     if (strchr(s, '?') || strchr(s, '*') || !*s)
  199.         return TRUE;
  200.     if (*(s+lc) == ':' || *(s+lc) == '\\')
  201.         return TRUE;
  202.     return FALSE;
  203. }
  204.  
  205.  
  206.