home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / freeWAIS-sf-1.1 / x / filereq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-04  |  5.3 KB  |  218 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.
  4.  
  5.    This is part of the X user-interface for the WAIS software.  Do with it
  6.    as you please.
  7.  
  8.    jonathan@Think.COM
  9. */
  10.  
  11. /* Copyright (c) CNIDR (see ../COPYRIGHT) */
  12.  
  13. /*
  14.  * $Log: filereq.c,v $
  15.  * Revision 1.3  1994/08/05  07:24:12  pfeifer
  16.  * Release beta 04
  17.  *
  18.  * Revision 1.2  93/07/02  18:37:30  warnock
  19.  * call to DoSave with correct number of args
  20.  * 
  21.  * Revision 1.1  1993/02/16  15:10:18  freewais
  22.  * Initial revision
  23.  *
  24.  * Revision 1.4  92/06/22  10:53:40  jonathan
  25.  * ?
  26.  * 
  27.  * Revision 1.3  92/06/03  17:10:19  jonathan
  28.  * Modified calls to RebuildListWidget to position list widget appropriately.
  29.  * 
  30.  * Revision 1.2  92/04/30  12:21:34  jonathan
  31.  * Added "quit no save" button, and changed the meaning of cancel.
  32.  * 
  33.  * Revision 1.1  92/03/25  18:51:30  jonathan
  34.  * Initial revision
  35.  * 
  36.  */
  37.  
  38. #ifndef lint
  39. static char *RCSid = "$Header: /usr/local/ls6/src+data/src/freeWAIS-sf/x/RCS/filereq.c,v 1.3 1994/08/05 07:24:12 pfeifer Exp $";
  40. #endif
  41.  
  42. #define FILEREQ_C
  43. #include "xwais.h"
  44. #include <sys/stat.h>
  45.  
  46. #ifndef S_ISDIR
  47. #define S_ISDIR(foo) ((foo & S_IFMT) == S_IFDIR)
  48. #endif
  49.  
  50. static char **dirfiles = NULL;
  51.  
  52. static Boolean
  53. isdir(name)
  54. char* name;
  55. {
  56.   struct stat stats;
  57.  
  58.   if(stat(name, &stats) < 0) return FALSE;
  59.  
  60.   if(S_ISDIR(stats.st_mode)) return TRUE;
  61.   else return FALSE;
  62. }
  63.  
  64. static int last_file = NO_ITEM_SELECTED;
  65.  
  66. void
  67. SetFileName(w, closure, call_data)
  68. Widget w;
  69. XtPointer closure, call_data;
  70. {
  71.   char dirname[MAX_FILENAME_LEN+1], filename[MAX_FILENAME_LEN+1];
  72. #ifdef MOTIF
  73.   XmListCallbackStruct *l = (XmListCallbackStruct*)call_data;
  74.   long pos = l->item_position-1;
  75.   char *item = dirfiles[pos];
  76. #else
  77.   XawListReturnStruct *l = (XawListReturnStruct*)call_data;
  78.   char* item = l->string;
  79.   long pos = l->list_index;
  80. #endif
  81.  
  82.   if(!(strcmp(item, "."))) return;
  83.   if(!(strcmp(item, ".."))) {
  84.     char *slash;
  85.     sprintf(dirname, "%s", GetString(dirnamewidget));
  86.     if(dirname[strlen(dirname)-1] == '/')
  87.       dirname[strlen(dirname)-1] = 0;
  88.     slash = (char*)strrchr(dirname, '/');
  89.     if (slash != NULL) *(slash+1) = 0;
  90.     ReplaceText(dirnamewidget, dirname);
  91.     last_file = NO_ITEM_SELECTED;
  92.     SetDir(NULL, NULL, NULL);
  93.     ReplaceText(filenamewidget, "");
  94.     return;
  95.   }
  96.   
  97.   sprintf(dirname, "%s", GetString(dirnamewidget));
  98.   if(dirname[strlen(dirname)-1] != '/')
  99.     strcat(dirname, "/");
  100.  
  101.   sprintf(filename, "%s%s", dirname, item);
  102.  
  103.   if(isdir(filename)) {
  104.     strcat(filename, "/");
  105.     ReplaceText(dirnamewidget, filename);
  106.     last_file = NO_ITEM_SELECTED;
  107.     SetDir(NULL, NULL, NULL);
  108.     ReplaceText(filenamewidget, "");
  109.   }
  110.   else {
  111.     if(last_file == pos) {
  112.       last_file = NO_ITEM_SELECTED;
  113.       DoSave(w, closure, call_data);
  114.     }
  115.     else {
  116.       last_file = pos;
  117.       ReplaceText(filenamewidget, item);
  118.     }
  119.   }
  120. }
  121.  
  122. void SetDir(w, closure, call_data)
  123. Widget w;
  124. XtPointer closure, call_data;
  125. {
  126.   char dirname[MAX_FILENAME_LEN+2];
  127.  
  128.   last_file = NO_ITEM_SELECTED;
  129.  
  130.   if(dirfiles != NULL) {
  131.     int i;
  132.     for(i =0; dirfiles[i] != NULL; i++) s_free(dirfiles[i]);
  133.     free(dirfiles);
  134.   }
  135.  
  136.   strncpy(dirname, GetString(dirnamewidget), MAX_FILENAME_LEN);
  137.   if((dirfiles = GetDirNames(dirname)) == NULL) {
  138.     pathname_directory(dirname, dirname);
  139.     dirfiles = GetDirNames(dirname);
  140.   }
  141.  
  142.   if(dirname[strlen(dirname)-1] != '/')
  143.     strcat(dirname, "/");
  144.   ReplaceText(dirnamewidget, dirname);
  145.  
  146.   RebuildListWidget(savelist, dirfiles, LIST_TOP);
  147. }
  148.  
  149. static void
  150. cancelFile(w, closure, call_data)
  151. Widget w;
  152. XtPointer closure, call_data;
  153. {
  154.   Arg args[1];
  155.   XtPopdown(savereq);
  156.   XtSetArg(args[0], XtNsensitive, False);
  157.   XtSetValues(quitbutton, args, ONE);
  158. }
  159.  
  160. void SetReqButtons(how)
  161. boolean how;
  162. {
  163.   Arg args[1];
  164. #ifdef MOTIF
  165.   XmString str = XmStringCreateSimple(how? "Save&Quit": "   Save  ");
  166. #else
  167.   char* str = (how? "Save&Quit": "   Save  ");
  168. #endif
  169.   
  170.   XtSetArg(args[0], NLABEL, str);
  171.   XtSetValues(savebutton, args, ONE);
  172.   XtSetArg(args[0], XtNsensitive, how);
  173.   XtSetValues(quitbutton, args, ONE);
  174. }
  175.  
  176. ScrollList
  177. MakeSaveRequester(parent)
  178. Widget parent;
  179. {
  180.   Widget frame, labelwid, button, view;
  181.   ScrollList result;
  182.   Arg arglist[10];
  183.   Arg args[1];
  184.   Cardinal num_args;
  185.  
  186.   num_args = 0;
  187.   XtSetArg(arglist[num_args], XtNtitle, "Save As"); num_args++;
  188.   XtSetArg(arglist[num_args], XtNiconName, "Save As"); num_args++;
  189.   savereq = XtCreatePopupShell("savereqpopup", applicationShellWidgetClass, 
  190.                   parent, arglist, num_args);
  191.   frame = XtCreateManagedWidget("savereq", formWidgetClass, savereq, NULL, ZERO);
  192.  
  193.   labelwid = MakeLabel(frame, "dirlabel", "Directory", NULL, NULL);
  194.   dirnamewidget = MakeStringBox(frame, "dirbox", "", NULL, NULL);
  195.  
  196.   num_args = 0;
  197.   XtSetArg (arglist[num_args], XtNallowVert, True); num_args++;
  198.  
  199.   view = XtCreateManagedWidget ("fileview", viewportWidgetClass,
  200.                 frame, arglist, num_args);
  201.  
  202.   result = 
  203.     MakeScrollList(view, "fileWindow", NULL, SetFileName, NULL, NULL);
  204.  
  205.   labelwid = MakeLabel(frame, "filelabel", "File Name", NULL, NULL);
  206.   filenamewidget = MakeStringBox(frame, "filebox", "", NULL, NULL);
  207.  
  208.   savebutton = MakeCommandButton(frame, "fileset", setFile,
  209.                  NULL, NULL, NULL);
  210.   cancelbutton = MakeCommandButton(frame, "filecancel", cancelFile,
  211.                    NULL, NULL, NULL);
  212.   quitbutton = MakeCommandButton(frame, "filequit", quitFile,
  213.                    NULL, NULL, NULL);
  214.  
  215.   SetReqButtons(false);
  216.   return result;
  217. }
  218.