FILEDIAL.CPP
上传用户:wtrl82617
上传日期:2007-01-07
资源大小:187k
文件大小:11k
源码类别:

界面编程

开发平台:

DOS

  1. // 1993 (c) ALL RIGHTS RESERVED
  2. // AUTHOR:  XuYongYong
  3. /* --------------------------------------------------------
  4.   FILEDIAL.CPP
  5.   Defines type TFileDialog.  This defines the basic
  6.   behavior of all file dialogs.
  7.   -------------------------------------------------------- */
  8. #include "yyxmain.h"
  9. #include "filedial.h"
  10. #include "msgbox.h"
  11. #include <string.h>
  12. #include <dir.h>
  13. #include <errno.h>
  14. /*
  15. char _FAR * _CType _FARFUNC _fullpath( char _FAR *__buf,
  16.                   const char _FAR *__path,
  17.                   size_t __maxlen );
  18. */
  19. /*
  20. extern "C" {
  21. char far* _fullpath (char far *__buf,const char far *__path,size_t __maxlen);
  22. }
  23. */
  24. int  filedial_class::get_sub_files (char *path_name,char **sub_files)
  25. {
  26. // return nums; -1:Error
  27.   struct ffblk ffblk;
  28.   int done;
  29.   int file_counter=0;
  30. done = findfirst(path_name,&ffblk, (FA_HIDDEN| FA_RDONLY |
  31.    FA_SYSTEM | FA_LABEL |FA_ARCH ) );
  32. if (done==ENOENT) return -1;
  33. while (!done)
  34. {
  35. if ( !(ffblk.ff_attrib & FA_DIREC)) {
  36. // strcpy ( ((FILENAMESTRING *)sub_files )[file_counter],ffblk.ff_name );
  37. strcpy (sub_files[file_counter],ffblk.ff_name );
  38. file_counter ++;
  39. }
  40. done = findnext(&ffblk);
  41. }
  42. return file_counter;
  43. }
  44. int  filedial_class::get_sub_dires (char *dir_name,char **sub_dires)
  45. {
  46. //return nums; -1:Error  ADDING [A][B][C][D] etc;
  47.   struct ffblk ffblk;
  48.   int done ,i;
  49.   int dir_counter =0;
  50.   char path[100];
  51. //  char * disk[10]={"A:","B:","C:","D:","E:","F:" };
  52.   char * disk[10]={"A:","B:","C:","D:","E:","F:" };
  53. strcpy(path,dir_name); //E.G "dos"
  54. strcat(path,"*.*");
  55. done = findfirst(path,&ffblk, (FA_DIREC /*| FA_HIDDEN| FA_RDONLY |
  56.    FA_SYSTEM | FA_LABEL |FA_ARCH */ ) );
  57. if (done==ENOENT) return -1;
  58. while (!done)
  59. {
  60. if ((ffblk.ff_attrib & FA_DIREC) && (strcmp(ffblk.ff_name,"."))) {
  61. strcpy (sub_dires[dir_counter],ffblk.ff_name );
  62. dir_counter ++;
  63. }
  64. done = findnext(&ffblk);
  65. }
  66. for (i=0;i< /*int disknum=setdisk(getdisk())*/ 4 ; i++ ) {
  67. strcpy (sub_dires[dir_counter],disk[i]);
  68. dir_counter ++;
  69. }
  70. return dir_counter;
  71. }
  72. BOOL  filedial_class::haswildcards(char *pathname)
  73. { register i;
  74. for (i=strlen (pathname)-1; (i>=0) && pathname[i] !='\'; i-- )
  75. if ((pathname[i] =='*') || (pathname[i] =='?')) return TRUE;
  76. return FALSE;
  77. }
  78. char * filedial_class::getfilename(char *pathname)
  79. {
  80.   char *p;
  81. p = strrchr(pathname, '\');
  82. if ( !p )
  83. p = strrchr(pathname, ':');
  84. if ( !p )
  85. return pathname;
  86. else
  87. return p + 1;
  88. }
  89. int   filedial_class::analyse_edit_filename(char *buf)
  90. {
  91.   struct ffblk ffblk;
  92.   int done;
  93. // input:: edit_filename
  94. // if part path ,connect with dirname
  95. if ((! strchr(edit_filename,':') ) && (edit_filename[0] !='\' )){
  96. strcpy (buf,dirname);
  97. strcat (buf,edit_filename);
  98. strcpy (edit_filename,buf);
  99. }
  100. ////////////////////////////////////// !!!!!!!!!! BC3.0
  101. _fullpath(buf, edit_filename, MAXPATH);
  102. // now I should realize fullpath ,as .. . etc in tc1.00
  103. // strcpy (buf,edit_filename);
  104. /*  Now c:dos ----> c:dos
  105. but c:      ----> c:
  106. */
  107. if  ( buf[strlen(buf)-1] == '\' )  buf[strlen(buf)-1] ='';
  108. /*  Now c:dos ----> c:dos
  109. and c:     ----> c:
  110. */
  111. if ( haswildcards (edit_filename ) == TRUE ) {
  112. strcpy (wildcards, getfilename  (buf));
  113. (getfilename(buf))[0] ='';
  114. if  ( buf[strlen(buf)-1] == '\' )  buf[strlen(buf)-1] ='';
  115. }  else { // split wildcards     from buf
  116. // assume wildcards not contains '';
  117. if (!strcmp (wildcards,"*.*"))  strcpy (wildcards,"*.*" );
  118. }
  119. done = findfirst( buf ,&ffblk, ( FA_DIREC| FA_HIDDEN| FA_RDONLY |
  120.    FA_SYSTEM | FA_LABEL |FA_ARCH  ) );
  121. // perror (sys_errlist[errno]);
  122. if ( (done)&&(buf[strlen(buf)-1]!=':') ) {
  123. // ; no such file or directory      c:dos
  124. // since root directory is the exception c:
  125.   char buf1[100];
  126. strcpy (buf1,buf);
  127. getfilename(buf1)[0] ='';
  128. strcat (buf1,"*.*");
  129. done = findfirst( buf1 ,&ffblk, FA_DIREC );
  130. if (done ) return 0;     //error path
  131. else  return 3;          //true dirname, no file
  132. ;
  133. }   else { // exists such file or directory
  134. if( !(ffblk.ff_attrib & FA_DIREC) && (buf[strlen(buf)-1]!=':') ) {
  135. //buf is a existed file // ??
  136. return 1;
  137. } else { // is an existing directory
  138. return 2;
  139. }
  140. }
  141. }
  142. BOOL  filedial_class:: change_edit_filename()
  143. {
  144.   char buf[100];
  145.   int i=analyse_edit_filename(buf);
  146. strcpy (edit_filename,wildcards);
  147. switch (i) {
  148. case 0:
  149. case 3: return FALSE; //other information
  150. case 1: strcpy (pathname ,buf ); //existed file
  151. strcpy (dirname, buf);
  152. strcat (dirname,"\");
  153. getfilename(buf)[0] ='';
  154. return TRUE;
  155. case 2: //existed directory
  156. strcat (buf,"\");
  157. strcpy (dirname ,buf );  //dirname  use for sub_dires' search
  158. strcpy (pathname  ,buf );  //pathname use for sub_files' search
  159. strcat (pathname  ,wildcards );
  160. return FALSE;
  161. }
  162. // NO need Return A value
  163. return FALSE;
  164. }
  165. filedial_class::filedial_class(int ID,char *title,int left,int top,int width,int height,
  166. int atype, char *apath )
  167. :dialog_class(ID,title,left,top,width,height)
  168. {
  169.   int i;
  170. achFile =apath;     // a Path For the last time
  171. dial_type =atype;
  172. for (i=0;i<MAXFILES;i++ ) { files[i]=new FILENAMESTRING;
  173. if ( files[i]==NULL) error("Less memory");
  174. }
  175. for (i=0;i<MAXDIRES;i++ ) { dires[i]=new FILENAMESTRING;
  176. if ( dires[i]==NULL) error("Less memory");
  177. }
  178. // putch('07');
  179. dirname[0]='';
  180. pathname[0]='';
  181. strcpy (edit_filename,apath);
  182. change_edit_filename();
  183. // putch('07');
  184. if (!(filesnum=get_sub_files (pathname,files ))) filesnum=0;
  185. if (!(diresnum=get_sub_dires (dirname,dires ))) diresnum=0;
  186. // putch('07');
  187. insert_control( dires_listscrl =new Tlistscrl (DIRES_ID,"&Directories",216,80,150,100,
  188. diresnum,dires) );
  189. insert_control( files_listscrl =new Tlistscrl (FILES_ID,"&Files",16,80,160,100,
  190. filesnum,files) );
  191. if ( dial_type == SD_FILESAVE ) {
  192. files_listscrl->status |=INVISIBLE;
  193. files_listscrl->status |=DISABLE;
  194. }
  195. insert_control( file_tedit =new Ttedit (EDIT_ID,"File&name",16,32,128,22 ,
  196. edit_filename, 25 ) );
  197. insert_control( dir_tstatic =new Tstatic (13,"Directory",
  198. 206,30,150,20, dirname ,ALIGN_LEFT ) );
  199. canclose =FALSE;
  200. }
  201. filedial_class::~filedial_class ()
  202. { int i;
  203. for (i=0;i<MAXFILES;i++ ) if (files[i]!=NULL )delete files[i];
  204. for (i=0;i<MAXDIRES;i++ ) if (dires[i]!=NULL )delete dires[i];
  205. }
  206. void filedial_class::updatelists( )
  207. {
  208. change_edit_filename();
  209. if (!(filesnum=get_sub_files (pathname,files ))) filesnum=0;
  210. if (!(diresnum=get_sub_dires (dirname,dires ))) diresnum=0;
  211. strcpy (file_tedit->text,edit_filename);
  212. file_tedit ->update_control();
  213. strcpy (dir_tstatic->text, dirname);
  214. dir_tstatic ->draw ();
  215. files_listscrl->listbox->max_value =filesnum -1;
  216. files_listscrl->listbox->current_value=-1;
  217. files_listscrl ->update_control();
  218. dires_listscrl->listbox->max_value =diresnum -1;
  219. dires_listscrl->listbox->current_value=-1;
  220. dires_listscrl ->update_control();
  221. }
  222. BOOL filedial_class::disk_ready (int disk_num ) // 0,1,2,3,
  223. {
  224.   struct dfree adfree;
  225. Redo:
  226. getdfree(disk_num+1, &adfree);
  227. if ( diskerrorno != 0 ) {
  228. if (theprogram->exec_dialog(new Tmsgbox("Message",msgbuf,MB_RETRYCANCEL))
  229. != Dlg_OK ) { diskerrorno =0; return FALSE; }
  230. else { diskerrorno =0; goto Redo ;}
  231. }
  232. if ( adfree.df_sclus  == 0xFFFF ) return FALSE; else return TRUE;
  233. // On error df_sclus in the dfree structure to 0xFFFF
  234. }
  235. int filedial_class::msg_handler (MSG& message)
  236. { int done ;
  237.   char buf[100];
  238. switch (message.Action) {
  239. case EditInputedMSG:
  240. if (message.fptr==file_tedit) {
  241. strcpy (edit_filename,file_tedit->text);
  242. if (( analyse_edit_filename(buf) ==1 ) ||
  243. ((analyse_edit_filename(buf) ==3 )&&(dial_type==SD_FILESAVE))
  244.    ) {
  245. // thequeue.SendMessage(ok_button->ID,
  246. // ButtonPushedMSG,ok_button);
  247. // Note::EditInputedMSG--------->
  248. return TRUE;
  249. } else {
  250. updatelists ();
  251. return TRUE;
  252. }
  253. }
  254. break;
  255. // after you selected sth
  256. case ListBoxItemSelectedMSG:
  257.  // if (message.ID==((FILES_ID <<8)|222)) {
  258. if((message.fptr==files_listscrl->listbox) &&
  259.    (files_listscrl->listbox->current_value>=files_listscrl->listbox->min_value)&&
  260.    (files_listscrl->listbox->current_value<=files_listscrl->listbox->max_value )
  261.   ) {
  262. // now selected one file
  263. thequeue.SendMessage(ok_button->ID,
  264. ButtonPushedMSG,ok_button);
  265. return TRUE;
  266. } else
  267. // if (message.ID==((DIRES_ID <<8)|222)) {
  268. if((message.fptr==dires_listscrl->listbox) &&
  269.    (dires_listscrl->listbox->current_value>=dires_listscrl->listbox->min_value)&&
  270.    (dires_listscrl->listbox->current_value<=dires_listscrl->listbox->max_value )
  271.   ) {
  272. //  int disknum =setdisk(getdisk());
  273.   int disknum =4; //NOte::when many disk exits
  274.   int real_dir_num =dires_listscrl->listbox->max_value -disknum+1;
  275. if (dires_listscrl->listbox->current_value >=
  276. dires_listscrl->listbox->max_value -disknum+1
  277.    )  { // A: B: etc
  278.   int new_disk=dires_listscrl->listbox->current_value-real_dir_num;
  279. while ( !disk_ready(new_disk) )
  280. if (theprogram->exec_dialog(new Tmsgbox
  281. ("Message","Disk Not Ready",MB_RETRYCANCEL)) ==Dlg_CANCEL)
  282. return TRUE;
  283. strcpy (dirname ,"");
  284. } else  ; //NORMAL DIRECTORY
  285. strcpy (edit_filename,dirname);
  286. strcat (edit_filename,dires_listscrl->listbox->string_list[
  287. dires_listscrl->listbox->current_value]);
  288. updatelists ();
  289. return TRUE;
  290. }
  291.  // As you are selecting
  292.  // <--- ---> ^V etc
  293. case ListBoxValueChangedMSG:
  294. if((message.fptr==files_listscrl->listbox) &&
  295.    (files_listscrl->listbox->current_value>=files_listscrl->listbox->min_value)&&
  296.    (files_listscrl->listbox->current_value<=files_listscrl->listbox->max_value )
  297.   ) {
  298. strcpy (file_tedit->text,files_listscrl->listbox->string_list[
  299. files_listscrl->listbox->current_value]);
  300. file_tedit ->update_control();
  301. // return TRUE; //For listscrl use
  302. break;
  303. } else
  304. // FROM dires_listscrl, changed one selection
  305. if((message.fptr==dires_listscrl->listbox) &&
  306.    (dires_listscrl->listbox->current_value>=dires_listscrl->listbox->min_value)&&
  307.    (dires_listscrl->listbox->current_value<=dires_listscrl->listbox->max_value )
  308.   ) {
  309. strcpy (file_tedit->text,dires_listscrl->listbox->string_list[
  310. dires_listscrl->listbox->current_value]);
  311. if (file_tedit->text[strlen(file_tedit->text)-1] !=':')
  312. strcat (file_tedit->text, "\");
  313. strcat (file_tedit->text,wildcards);
  314. file_tedit ->update_control();
  315. // return TRUE; //For listscrl use
  316. break;
  317. }
  318. }
  319. return dialog_class::msg_handler (message);
  320. }
  321. BOOL filedial_class::func_canclose()
  322. {
  323.   char buf[100];
  324. strcpy (edit_filename, file_tedit->text);
  325. switch ( dial_type ) {
  326. case SD_FILESAVE :
  327. if ( ( analyse_edit_filename(buf) ==1 ) || (analyse_edit_filename(buf) ==3 )
  328.    ) {
  329. strcpy (achFile, buf );
  330. return TRUE;
  331. }; break;
  332. case SD_FILEOPEN :
  333. if ( analyse_edit_filename(buf) ==1 ) {
  334. strcpy (achFile, buf );
  335. return TRUE;
  336. }; break;
  337. } // switch
  338. theprogram->exec_dialog(new Tmsgbox
  339. ("Message","Sorry, Please Select a File",MB_OK));
  340. return FALSE;
  341. }