home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / IDEHOOK.PAK / PATHSPEC.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  5KB  |  281 lines

  1. //----------------------------------------------------------------------------
  2. // IdeHook - (C) Copyright 1994 by Borland International
  3. //----------------------------------------------------------------------------
  4. #pragma hdrstop
  5. #include <string.h>
  6. #include <dos.h>
  7. #include <commdlg.h>
  8. #include "pathspec.h"
  9.  
  10.  
  11. //                                      //
  12. //    class PathSpec implementation     //
  13. //                                      //
  14.  
  15. int
  16. PathSpec::split()
  17. {
  18.     return( _flags = ::fnsplit( _path, _drive, _dir, _file, _ext ) );
  19. }
  20.  
  21. void
  22. PathSpec::merge()
  23. {
  24.     ::fnmerge( _path, _drive, _dir, _file, _ext );
  25. }
  26.  
  27. void
  28. PathSpec::path(const char *path)
  29. {
  30.     strcpy( _path, path );
  31.     split();
  32. }
  33.  
  34. void
  35. PathSpec::drive(const char *drive)
  36. {
  37.     strcpy( _drive, drive );
  38.     merge();
  39. }
  40.  
  41. void
  42. PathSpec::dir(const char *dir)
  43. {
  44.     strcpy( _dir, dir );
  45.     merge();
  46. }
  47.  
  48. void
  49. PathSpec::file(const char *file)
  50. {
  51.     strcpy( _file, file );
  52.     merge();
  53. }
  54.  
  55. void
  56. PathSpec::ext(const char *ext)
  57. {
  58.     strcpy( _ext, ext );
  59.     merge();
  60. }
  61.  
  62. void
  63. PathSpec::fileext( const char *fileExt )
  64. {
  65.     char * p = (char *)(strchr(fileExt,'.'));
  66.  
  67.     if( !p )
  68.         p = "";
  69.  
  70.     ext( p );
  71.     *p = 0;
  72.  
  73.     file( fileExt );
  74. }
  75.  
  76. int
  77. PathSpec::first()
  78. {
  79.     if( ::findfirst( _path, &_dta, 0 ) == -1 )
  80.         return(0);
  81.  
  82.     fileext( _dta.ff_name );
  83.     return( 1 );
  84. }
  85.  
  86. int
  87. PathSpec::next()
  88. {
  89.     if( ::findnext( &_dta ) == -1 )
  90.         return( 0 );
  91.  
  92.     fileext( _dta.ff_name );
  93.     return( 1 );
  94. }
  95.  
  96. int
  97. PathSpec::sameDrive( PathSpec & other )
  98. {
  99.     if( *_drive == *other._drive )
  100.         return(1);
  101.  
  102.     if( !*_drive )
  103.     {
  104.         _drive[0] = ::getdisk() + 'A' - 1;
  105.         _drive[1] = ':';
  106.         _drive[2] = 0;
  107.     }
  108.     else
  109.     {
  110.         if( !*other._drive )
  111.         {
  112.             other._drive[0] = ::getdisk() + 'A' - 1;
  113.             other._drive[1] = ':';
  114.             other._drive[2] = 0;
  115.         }
  116.     }
  117.  
  118.     char    s[3];
  119.  
  120.     s[0] = *_drive;
  121.     s[1] = *other._drive;
  122.     s[2] = 0;
  123.     
  124.     strlwr( s );
  125.  
  126.     return( s[0] == s[1] );
  127. }
  128.  
  129. int
  130. PathSpec::isDirectory()
  131. {
  132.     int lastCharPos = strlen( _path ) - 1;
  133.  
  134.     char lastChar;
  135.     
  136.     if(((lastChar = _path[lastCharPos]) == '\\') || (lastChar == '/'))
  137.         _path[lastCharPos] = 0;
  138.  
  139.     int ret =  (::findfirst( _path, &_dta, FA_DIREC ) != -1 ) &&
  140.                   ( _dta.ff_attrib & FA_DIREC );
  141.              
  142.     _path[ lastCharPos ] = lastChar;
  143.         
  144.     return( ret );
  145. }
  146.  
  147. char *
  148. PathSpec::stripTrailingSlash()
  149. {
  150.     int lastCharPos = strlen( _path ) - 1;
  151.  
  152.     if( (_path[lastCharPos] == '\\') || (_path[lastCharPos] == '/') )
  153.         _path[lastCharPos] = 0;
  154.  
  155.     return( _path );
  156. }
  157.  
  158. void
  159. PathSpec::addTrailingSlash()
  160. {
  161.     int lastCharPos = strlen( _path ) - 1;
  162.  
  163.     if( (_path[lastCharPos] != '\\') && (_path[lastCharPos] != '/') )
  164.     {
  165.         strcat( _path, "\\" );
  166.         split();
  167.     }
  168. }
  169.  
  170. int
  171. PathSpec::newFileDialog
  172. (
  173.    const char *    filter,
  174.    const char *    initialDir,
  175.    unsigned long   hwndParent
  176. )
  177. {
  178.    return(
  179.        fileDialog
  180.            (
  181.                filter,
  182.                initialDir,
  183.                hwndParent,
  184.                OFN_HIDEREADONLY |
  185.                OFN_PATHMUSTEXIST
  186.            )
  187.         );
  188. }
  189.  
  190. int
  191. PathSpec::openFileDialog
  192. (
  193.    const char *    filter,
  194.    const char *    initialDir,
  195.    unsigned long   hwndParent
  196. )
  197. {
  198.    return(
  199.        fileDialog
  200.            (
  201.                filter,
  202.                initialDir,
  203.                hwndParent,
  204.                OFN_HIDEREADONLY |
  205.                OFN_PATHMUSTEXIST |
  206.                OFN_FILEMUSTEXIST
  207.            )
  208.         );
  209. }
  210.  
  211. int
  212. PathSpec::fileDialog
  213. (
  214.    const char *    filter,
  215.    const char *    initialDir,
  216.    unsigned long   hwndParent,
  217.    unsigned long   flags
  218. )
  219. {
  220.     char           szFile[256];
  221.     char          *szFilter;
  222.  
  223.     strcpy( szFile, file() );
  224.     if( *szFile )
  225.        strcat( szFile, ext() );
  226.  
  227.     if( !filter )
  228.        filter = "All files (*.*)|(*.*)|";
  229.     szFilter = new char[ strlen(filter) + 1 ];
  230.     strcpy( szFilter, filter );
  231.     
  232.     for ( unsigned short i = 0; szFilter[i] != 0; i++)
  233.     {
  234.         if (szFilter[i] == '|' )
  235.            szFilter[i] = 0;
  236.     }
  237.  
  238.     /* Set all structure members to zero. */
  239.  
  240.     OPENFILENAME   ofn;
  241.  
  242.     memset( &ofn, 0, sizeof(ofn) );
  243.  
  244.     ofn.lStructSize        = sizeof(OPENFILENAME);
  245.     ofn.hwndOwner          = (HWND)(hwndParent);
  246.     ofn.lpstrFilter        = szFilter;
  247.     ofn.nFilterIndex       = 1;
  248.     ofn.lpstrFile          = szFile;
  249.     ofn.nMaxFile           = sizeof(szFile);
  250.     ofn.lpstrInitialDir    = initialDir;
  251.     ofn.Flags              = flags;
  252.  
  253.  
  254.     int ret;
  255.  
  256.     if ( (ret = GetOpenFileName(&ofn)) == 0 )
  257.     {
  258.       DWORD Errval = ::CommDlgExtendedError();
  259.  
  260.       if (Errval != 0)    // 0 value means user selected Cancel
  261.       {
  262.          char szErr[80];
  263.  
  264.          wsprintf( szErr, "GetOpenFile error: %ld", Errval );
  265.          ::MessageBox( ::GetActiveWindow(),szErr,"OpenFile", 
  266.                        MB_ICONEXCLAMATION | MB_OK );
  267.       }
  268.     }
  269.     else
  270.     {
  271.        path( ofn.lpstrFile );
  272.     }
  273.  
  274.     delete szFilter;
  275.  
  276.     return( ret );
  277. }
  278.  
  279. // End of file
  280.  
  281.