home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / GNU_C++ / LIB / CFLIB-11.LZH / src / filesel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-09  |  6.6 KB  |  300 lines

  1. #include "intern.h"
  2.  
  3. #ifdef __MINT__
  4. #include <gemx.h>
  5. #endif
  6.  
  7.  
  8. /* -- Selectric -------------------------------------------------------------- */
  9.  
  10. typedef struct
  11. {
  12.     unsigned long    id;                        /* Selectric ID (SLCT)        */
  13.     unsigned short    version;                    /* version (BCD-Format)        */
  14.     struct
  15.     {
  16.         unsigned                    : 7;    /* reserved                            */
  17.         unsigned todaytime    : 1;
  18.         unsigned pthsav        : 1;    /* save GEMDOS paths                */
  19.         unsigned stdest        : 1;    /* stay in destination path    */
  20.         unsigned                    : 1;    /* reserved                            */
  21.         unsigned numsrt        : 1;    /* numsort                             */
  22.         unsigned lower            : 1;    /* use lowercase letters        */
  23.         unsigned dclick        : 1;    /* open folder on dclick        */
  24.         unsigned hidden        : 1;    /* show hidden files                */
  25.         unsigned bypass        : 1;    /* Selectric ON/OFF                 */
  26.     } config;
  27.     short        sort;                        /* sort-mode (neg. = rev.)    */
  28.     short        num_ext;                    /* number of extensions        */
  29.     char        *(*ext)[];                /* preset extensions        */
  30.     short        num_paths;                /* number of paths        */
  31.     char        *(*paths)[];            /* preset paths            */
  32.     short        comm;                        /* communication word        */
  33.     short        in_count;                /* input counter        */
  34.     void        *in_ptr;                    /* input pointer        */
  35.     short        out_count;                /* output counter        */
  36.     void        *out_ptr;                /* output pointer        */
  37.     void        *f1;
  38.     void        *f2;
  39.     void        *f3;
  40. } SLCT;
  41.  
  42. #define SLCT_ANZ 10
  43. static SLCT    *slct = NULL;
  44.  
  45.  
  46. static int slct_check(void)
  47. {
  48.     long    l;
  49.  
  50.     if (getcookie("FSEL", &l))
  51.     {
  52.         slct = (SLCT *)l;
  53.         if (slct && slct->id != 0x534c4354L)    /* 'SLCT' */
  54.             slct = NULL;
  55.         if (slct && !slct->config.bypass)    /* Selectric auch aktiv? */
  56.             slct = NULL;
  57.     }
  58.     if (slct && (slct->version >= 0x100))
  59.         return TRUE;
  60.     else
  61.         return FALSE;
  62. }
  63.  
  64. /* -- MagiC ------------------------------------------------------------------ */
  65. static int do_magx(char *path, char *name, char *mask, char *title, FSEL_CB open_cb)
  66. {
  67.     int    ok = FALSE;
  68.     void    *fsl;
  69.     char    def_mask[] = "*\0\0",
  70.             pat[50], *p,
  71.             hist_path[256] = "\0\0";
  72.     int    num, flags = 0, but, i, j,
  73.             win, ret;
  74.     EVNT    ev;
  75.     
  76.     j = 0;
  77.     if ((mask[0] != EOS) && strcmp(mask, "*") != 0)
  78.     {
  79.         p = mask;
  80.         j = 0;
  81.         while (*p != EOS)
  82.         {
  83.             pat[j++] = *p;
  84.             p++;
  85.         }
  86.         pat[j++] = EOS;
  87.     }
  88.     for (i = 0; i<5; i++)
  89.         pat[j++] = def_mask[i];
  90.     
  91.     if (path[0] != EOS)
  92.     {
  93.         strcpy(hist_path, path);
  94.         i = (int)strlen(path);
  95.         hist_path[i+1] = EOS;        /* Doppelnull am Ende! */
  96.     }
  97.     
  98.     if (open_cb != NULL)
  99.         flags |= GETMULTI;
  100.     
  101.     if (!cf_msg_cb)                    /* keine Msg-Routine -> modal */
  102.     {
  103.         i = SORTBYNAME;
  104.         fsl = fslx_do(title, path, 256, name, 60, pat, 0L, hist_path, 
  105.                           &i, flags, &but, &num, &p);
  106.         if (fsl)
  107.         {
  108.         }
  109.     }
  110.     else
  111.     {
  112.         fsl = fslx_open(title, -1, -1, &win, path, 256, name, 60, pat, 
  113.                              0L, hist_path, SORTBYNAME, flags);
  114.         if (fsl)
  115.         {
  116.             disable_menu();
  117.             do
  118.             {
  119. #ifdef __GNUC__
  120.                 int    msg[8], i, mx, my, mb, mc, ks, kr;
  121.         
  122.                 /*
  123.                  * GNU erwartet beim evnt_multi wirklich 'int', in EVNT sind aber
  124.                  * nur 'short', so daß die Struktur nicht übergeben werden kann!
  125.                 */
  126.                 ev.mwhich = (short)evnt_multi(MU_KEYBD|MU_MESAG|MU_BUTTON, 2, 1, 1, 
  127.                                                 0, 0, 0, 0, 0,    0, 0, 0, 0, 0,
  128.                                                 msg, 0, &mx, &my, &mb, &ks, &kr, &mc);
  129.                 ev.mx = mx;
  130.                 ev.my = my;
  131.                 ev.mbutton = mb;
  132.                 ev.kstate = ks;
  133.                 ev.key = kr;
  134.                 ev.mclicks = mc;
  135.                 for (i = 0; i<8; i++)
  136.                     ev.msg[i] = msg[i];
  137. #else
  138. #ifdef __MTAES__
  139.                 MOBLK    null = {0,0,0,0,0};
  140.  
  141.                 EVNT_multi((MU_KEYBD|MU_MESAG|MU_BUTTON), 2, 1, 1,
  142.                                 &null, &null, 0, &ev);
  143. #else
  144.                 ev.mwhich = (short)evnt_multi(MU_KEYBD|MU_MESAG|MU_BUTTON, 2, 1, 1, 
  145.                                                     0, 0, 0, 0, 0,    0, 0, 0, 0, 0,
  146.                                                     (int*)ev.msg, 0, 
  147.                                                     (int*)&ev.mx, (int*)&ev.my, 
  148.                                                     (int*)&ev.mbutton, 
  149.                                                     (int*)&ev.kstate,    (int*)&ev.key, 
  150.                                                 (int*)&ev.mclicks);
  151. #endif
  152. #endif
  153.                 if (ev.mwhich & MU_MESAG)
  154.                 {
  155.                     switch (ev.msg[0])
  156.                     {
  157.                         case WM_REDRAW :
  158.                         case WM_MOVED :
  159.                         case WM_SIZED:
  160.                             if (ev.msg[3] != win)        /* für fremdes Fenster */
  161.                             {
  162. #ifdef __GNUC__
  163.                                 handle_mdial_msg(msg);
  164. #else
  165.                                 handle_mdial_msg((int *)ev.msg);
  166. #endif
  167.                             }
  168.                             break;
  169.         
  170.                         case WM_BOTTOMED:                    /* nicht erlaubt! */
  171.                             break;
  172.                         
  173.                         case WM_TOPPED :
  174.                         case WM_NEWTOP :
  175.                         case WM_ONTOP :        
  176.                             ev.msg[0] = WM_TOPPED;        /* immer Filebox toppen! */
  177.                             ev.msg[3] = win;
  178.                             break;
  179.                     }
  180.         
  181.                 }
  182.                 ret = fslx_evnt(fsl, &ev, path, name, &but, &num, &i, &p);
  183.             } 
  184.             while (ret == 1);
  185.             enable_menu();
  186.         }
  187.     }
  188.  
  189.     if (fsl)
  190.     {
  191.         if (but == 1)
  192.         {
  193.             if (flags & GETMULTI)
  194.             {
  195.                 do
  196.                 {
  197.                     open_cb(path, name);
  198.                     i = fslx_getnxtfile(fsl, name);
  199.                 }
  200.                 while (i);
  201.  
  202.                 /* leeren */
  203.                 path[0] = EOS;
  204.                 name[0] = EOS;
  205.             }
  206.             else
  207.             {
  208.                 p = strrchr (path, '\\');        /* Maske abhacken */
  209.                 p[1] = EOS;
  210.                 make_normalpath(path);
  211.             }
  212.             ok = TRUE;
  213.         }
  214.         fslx_close(fsl);
  215.     }
  216.     return ok;
  217. }
  218.  
  219. /* --------------------------------------------------------------------------- */
  220.  
  221. int select_file(char *path, char *name, char *mask, char *title, FSEL_CB open_cb)
  222. {
  223.     int    ok = FALSE, slct_multi = FALSE;
  224.     int    but, i, d;
  225.     char    *p;
  226.     char    *files[SLCT_ANZ];
  227.         
  228.     if (path[0] == EOS)            /* kein Pfad -> aktuellen holen */
  229.         get_path(path, 0);
  230.     else
  231.         make_normalpath(path);
  232.  
  233.     if (slct_check())
  234.     {
  235.         if (open_cb != NULL)        /* Selectric-mehrfach Auswahl */
  236.         {
  237.             for (i = 0; i < SLCT_ANZ; i++)
  238.                 files[i] = (char *) cf_malloc(256, "select_file", FALSE);
  239.             slct->comm = 1;
  240.             slct->out_count = SLCT_ANZ;
  241.             slct->out_ptr = files;
  242.             slct_multi = TRUE;
  243.         }
  244.     }
  245.     else if (appl_xgetinfo(7, &i, &d, &d, &d) && (i & 8))
  246.     {
  247.         return do_magx(path, name, mask, title, open_cb);
  248.     }
  249.     
  250.     /* normale Auswahl */
  251.     if (mask[0] == EOS)
  252.         strcat(path, "*.*");
  253.     else
  254.         strcat(path, mask);
  255.  
  256.     wind_update(BEG_UPDATE);
  257. /*    wind_update(BEG_MCTRL);*/
  258.     if (slct || gl_gem >= 0x140)
  259.         fsel_exinput(path, name, &but, title);
  260.     else
  261.         fsel_input(path, name, &but);
  262. /*    wind_update(END_MCTRL);*/
  263.     wind_update(END_UPDATE);
  264.     ok = (but == 1);
  265.     if (ok)
  266.     {
  267.         p = strrchr (path, '\\');        /* Maske abhacken */
  268.         p[1] = EOS;
  269.         make_normalpath(path);
  270.  
  271.         if (slct_multi)                    /* Mehrfach-Selectrics */
  272.         {
  273.             int    cont = TRUE;
  274.             
  275.             i = 0;
  276.             while (cont && (i < slct->out_count))
  277.             {
  278.                 cont = open_cb(path, files[i]);
  279.                 i++;
  280.             }
  281.             for (i = 0; i < SLCT_ANZ; i++)
  282.                 if (files[i] != NULL)
  283.                     Mfree(files[i]);
  284.             
  285.             /* leeren */
  286.             path[0] = EOS;
  287.             name[0] = EOS;
  288.         }
  289.         else if (open_cb)                    /* Callback, aber keine Mahrfachauswahl */
  290.         {
  291.             open_cb(path, name);
  292.  
  293.             /* leeren */
  294.             path[0] = EOS;
  295.             name[0] = EOS;
  296.         }
  297.     }
  298.     return ok;
  299. }
  300.