home *** CD-ROM | disk | FTP | other *** search
/ Media Share 13 / mediashare_13.zip / mediashare_13 / ZIPPED / PROGRAM / DFLT18.ZIP / FILEOPEN.C < prev    next >
C/C++ Source or Header  |  1994-01-25  |  6KB  |  203 lines

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