home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / XAP / XFILEMAN / XFILEMAN.TAR / xfilemanager / menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-22  |  12.5 KB  |  519 lines

  1. /*
  2.  * Copyright 1993 by Ove Kalkan, Cremlingen, Germany
  3.  *
  4.  * Permission to use, copy, modify, distribute and sell this software and it's
  5.  * documentation for any purpose is hereby granted without fee, rpovided that
  6.  * the above copyright notice and this permission appear in supporting
  7.  * documentation, and that the name of Ove Kalkan not to be used in
  8.  * advertising or publicity pertaining to distributiopn of the software without
  9.  * specific, written prior permission. Ove Kalkan makes no representations
  10.  * about the suitability of this software for any purpose. It is provided
  11.  * as is without express or implied warranty.
  12.  *
  13.  * OVE KALKAN DISPLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  14.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABLILITY AND FITNESS, IN NO
  15.  * EVENT SHALL OVE KALKAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  16.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  17.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  18.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  19.  * PERFORMANCE OF THIS SOFTWARE.
  20.  *
  21.  * $Header: filename,v 1.0 yyyy/mm/dd hh:mm:ss loginname Exp $
  22.  */
  23.  
  24. #include "global.h"
  25.  
  26. /*
  27.  * Ein Typedef fuer die Menus
  28.  */
  29. typedef struct {
  30.     char        *label;
  31.     void  (*cb)();
  32. } Menu_Glyph, *Menu_Glyph_Ptr;
  33.  
  34.  
  35. /*
  36.  * Global variables
  37.  */
  38. static    void    start_empty(void);
  39.  
  40. /*
  41.  * Hier stehen die Menus
  42.  */
  43. static    Menu_Glyph    main_menu[] = {
  44.     {"Execute ...",        start_exec},
  45. #ifndef COHERENT
  46.     {"Create Link",        start_link},
  47. #endif
  48.     {"Package Builder",    start_merger},
  49.     {"LINE",        NULL},
  50.     {"Show Dir",        start_goto},
  51.     {"Change Root",        start_root},
  52.     {"LINE",        NULL},
  53.     {"Quit",        start_quit},
  54.     {"LINE",        NULL},
  55.     {"Copyright",        start_about},
  56.     {NULL,            NULL},
  57. };
  58.  
  59. static    Menu_Glyph    maint_menu[] = {
  60.     {"Execute ...",        start_exec},
  61. #ifndef COHERENT
  62.     {"Create Link",        start_link},
  63. #endif
  64.     {"Package Builder",    start_merger},
  65.     {"Emptry Trashcan",    start_empty},
  66.     {"LINE",        NULL},
  67.     {"Show Dir",        start_goto},
  68.     {"Change Root",        start_root},
  69.     {"LINE",        NULL},
  70.     {"Quit",        start_quit},
  71.     {"LINE",        NULL},
  72.     {"Copyright",        start_about},
  73.     {NULL,            NULL},
  74. };
  75.  
  76. static    Menu_Glyph    setup_menu[] = {
  77.     {"Associate Filetype",    NULL},
  78.     {"LINE",        NULL},
  79.     {"Configuration",    NULL},
  80.     {NULL,            NULL},
  81. };
  82.  
  83. static    String        menun[] = {"File"}; /*"Setup"}; */
  84. static    Menu_Glyph_Ptr    menus[] = {main_menu}; /*,setup_menu};*/
  85. static    Menu_Glyph_Ptr    tmenus[] = {maint_menu}; /*,setup_menu};*/
  86.  
  87.  
  88. /*
  89. **    Function name : makeMenu
  90. **
  91. **    Description : erzeugt auf einem Parent eine Form, in der
  92. **            das Controlmenu gesetzt wird.
  93. **    Input : Widget    parent    - Zeiger auf das Parentwidget
  94. **    Ouput : none
  95. */
  96. void makeMenu (Widget parent)
  97. {
  98.     Widget    form;
  99.     Widget    last, new;
  100.     Arg    args[10];
  101.     int    i;
  102.  
  103.     /*
  104.      * Erst die Widgetform erzeugen
  105.      */
  106.     XtSetArg(args[0],XtNshowGrip, FALSE);
  107.     form = XtCreateManagedWidget ("menu_form", formWidgetClass,
  108.                     parent, args, 1);
  109.  
  110.     last = NULL;
  111.     for (i = 0; i < XtNumber(menun); i++) {
  112.         char    *buf;
  113.         char    *nbuf;
  114.         int    j;
  115.         Widget    menu;
  116.         Widget    but;
  117.         Menu_Glyph    *mm;
  118.  
  119.         /*
  120.          * Zunaechst einmal den Menubutton erzeugen
  121.          */
  122.         if (!(buf = (char *) malloc (30)) ||
  123.             !(nbuf = (char *) malloc (30)))
  124.             FATAL_ERROR ("makeMenu: Malloc failed\n");
  125.         sprintf(buf,"%s_menu",menun[i]);
  126.         sprintf(nbuf,"%s_button",menun[i]);
  127.  
  128.         XtSetArg(args[0],XtNfromHoriz, last);
  129.         XtSetArg(args[1],XtNlabel, menun[i]);
  130.         XtSetArg(args[2],XtNmenuName,buf);
  131.         XtSetArg(args[3],XtNtop,XtChainTop);
  132.         XtSetArg(args[4],XtNbottom,XtChainTop);
  133.         XtSetArg(args[5],XtNright,XtChainLeft);
  134.         XtSetArg(args[6],XtNleft,XtChainLeft);
  135.         XtSetArg(args[7],XtNwidth,60);
  136.         XtSetArg(args[8],XtNheight,32);
  137.         new = XtCreateManagedWidget ("menu_but", menuButtonWidgetClass,
  138.                          form, args, 9);
  139.  
  140.         /*
  141.          * Jetzt das Menu erzeugen
  142.          */
  143.         menu = XtCreateManagedWidget (buf, simpleMenuWidgetClass,
  144.                         toplevel, args, 0);
  145.         if (defaults.trashcan)
  146.             mm = (Menu_Glyph *) tmenus[i];
  147.         else
  148.             mm = (Menu_Glyph *) menus[i];
  149.  
  150.         /*
  151.          * Nun die Menuitems erzeugen
  152.          */
  153.         for (j = 0; mm[j].label; j++) {
  154.             if (strcmp(mm[j].label,"LINE")) {
  155.                 XtSetArg(args[0],XtNlabel,mm[j].label);
  156.                 but = XtCreateManagedWidget ("menu_item",
  157.                                 smeBSBObjectClass,
  158.                                 menu, args, 1);
  159.                 if (mm[j].cb)
  160.                     XtAddCallback (but, XtNcallback,
  161.                             (XtCallbackProc) mm[j].cb,
  162.                             NULL);
  163.             }
  164.             else {
  165.                 but = XtCreateManagedWidget ("menu_line",
  166.                                 smeLineObjectClass,
  167.                                 menu, args, 0);
  168.             }
  169.         }
  170.         last = new;
  171.     }
  172.     icon_bar = form;
  173.     icon_left = last;
  174.  
  175. }
  176.  
  177.  
  178. /*********************************************************
  179.  * name:    getString
  180.  * description:    gibt den vollen Filenamen der selection zurueck
  181.  * input:    none
  182.  * output:    none
  183.  * author:    Ove Kalkan
  184.  * date:    18.6.93
  185.  *********************************************************/
  186. char    *getString(void)
  187. {    char    *from = NULL;
  188.  
  189.     if (selc_g || (selc_fo && selc_f < 16000)) {
  190.         if (selc_g)
  191.             from = getPath(selc_g);
  192.         else {
  193.             char *got = getPath(selc_fo->dir);
  194.  
  195.             if (!(from = (char *) malloc (strlen(got) + 4 +
  196.                               strlen (selc_fo->file[selc_f]->name))))
  197.                 FATAL_ERROR("start_delete: Malloc faileed\n");
  198.             if (strcmp(got,"/"))
  199.                 sprintf(from,"%s/%s",got,selc_fo->file[selc_f]->name);
  200.             else
  201.                 sprintf(from,"/%s",selc_fo->file[selc_f]->name);
  202.             free(got);
  203.         }
  204.     }
  205.     return(from);
  206. }
  207.  
  208.  
  209. /*********************************************************
  210.  * name:    getMulti
  211.  * description:    Auslesen des Mutliarrays
  212.  * input:    none    
  213.  * output:    char    *multi-string
  214.  * author:    Ove Kalkan
  215.  * date:    3.8.1993
  216.  *********************************************************/
  217. char    *getMulti(void)
  218. {    char    *back = NULL;
  219.  
  220.     if (multi_fo && multi_vs < 16000 && multi_ve < multi_fo->file_count) {
  221.         int    i;
  222.         char    *got;
  223.  
  224.         if (!(back = (char *) malloc(2)))
  225.             FATAL_ERROR("GetMulti: Malloc failed");
  226.         *back = '\0';
  227.         got = getPath(multi_fo->dir);
  228.         for (i = multi_vs; i <= multi_ve; i++) {
  229.             if (!(back = (char *) realloc((void *) back, strlen(back) +
  230.                 strlen(got) + strlen(multi_fo->file[i]->name) + 3)))
  231.                 FATAL_ERROR("GetMulti: realloc failed.");
  232.             if (strcmp(got,"/"))
  233.                 sprintf(back,"%s%s/%s\n",back,got,multi_fo->file[i]->name);
  234.             else
  235.                 sprintf(back,"%s/%s\n",back,multi_fo->file[i]->name);
  236.         }
  237.         free(got);
  238.         MULTI = TRUE;
  239.     }
  240.     return(back);
  241. }
  242.  
  243. /*********************************************************
  244.  * name:    start_move
  245.  * description:    Ruft die init_move routine mit den
  246.  *        richtigen Parametern auf. Wenn etwas mit
  247.  *        einem single-select selectiert wurde, so
  248.  *        wird der Filename als Argument uebergeben
  249.  * input:    none
  250.  * output:    none
  251.  * author:    Ove Kalkan
  252.  * date:    18.6.93
  253.  *********************************************************/
  254. void    start_move (void)
  255. {
  256.     char    *from = NULL;
  257.  
  258.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  259.         return;
  260.     from = getString();
  261.     if (!from)
  262.         from = getMulti();
  263.     init_move(from,NULL);
  264.     free(from);
  265. }
  266.  
  267.  
  268. /*********************************************************
  269.  * name:    start_copy
  270.  * description:    Ruft die init_copy routine mit den
  271.  *        richtigen Parametern auf. Wenn etwas mit
  272.  *        einem single-select selectiert wurde, so
  273.  *        wird der Filename als Argument uebergeben
  274.  * input:    none
  275.  * output:    none
  276.  * author:    Ove Kalkan
  277.  * date:    18.6.93
  278.  *********************************************************/
  279. void    start_copy (void)
  280. {
  281.     char    *from = NULL;
  282.  
  283.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  284.         return;
  285.     from = getString();
  286.     if (!from)
  287.         from = getMulti();
  288.     init_copy(from,NULL);
  289.     free(from);
  290. }
  291.  
  292.  
  293. /*********************************************************
  294.  * name:    start_delete
  295.  * description:    Ruft die init_delete routine mit den
  296.  *        richtigen Parametern auf. Wenn etwas mit
  297.  *        einem single-select selectiert wurde, so
  298.  *        wird der Filename als Argument uebergeben
  299.  * input:    none
  300.  * output:    none
  301.  * author:    Ove Kalkan
  302.  * date:    18.6.93
  303.  *********************************************************/
  304. void    start_delete (void)
  305. {
  306.     char    *from = NULL;
  307.  
  308.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  309.         return;
  310.     from = getString();
  311.     if (!from)
  312.         from = getMulti();
  313.     init_delete(from);
  314.     free(from);
  315. }
  316.  
  317.  
  318. /*********************************************************
  319.  * name:    start_newdir
  320.  * description:    Ruft die init_newdir routine mit den
  321.  *        richtigen Parametern auf. Wenn etwas mit
  322.  *        einem single-select selectiert wurde, so
  323.  *        wird der Filename als Argument uebergeben
  324.  * input:    none
  325.  * output:    none
  326.  * author:    Ove Kalkan
  327.  * date:    18.6.93
  328.  *********************************************************/
  329. void    start_newdir (void)
  330. {
  331.     char    *from = NULL;
  332.  
  333.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  334.         return;
  335.     from = getString();
  336.     if (!from)
  337.         from = getPath (&root);
  338.     init_newdir(from);
  339.     free(from);
  340. }
  341.  
  342.  
  343.  
  344. /*********************************************************
  345.  * name:    start_exec
  346.  * description:    Ruft die init_exec routine mit den
  347.  *        richtigen Parametern auf. Wenn etwas mit
  348.  *        einem single-select selectiert wurde, so
  349.  *        wird der Filename als Argument uebergeben
  350.  * input:    none
  351.  * output:    none
  352.  * author:    Ove Kalkan
  353.  * date:    18.6.93
  354.  ********************************************************/
  355. void    start_exec (void)
  356. {
  357.     char    *from = NULL;
  358.  
  359.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  360.         return;
  361.     from = getString();
  362.     init_exec(from,NULL);
  363.     if (from)    free(from);
  364. }
  365.  
  366.  
  367. /*********************************************************
  368.  * name:    start_quit
  369.  * description:    Ruft die init_quit
  370.  * input:    none
  371.  * output:    none
  372.  * author:    Ove Kalkan
  373.  * date:    18.6.93
  374.  *********************************************************/
  375. void    start_quit (void)
  376. {
  377.     init_quit();
  378. }
  379.  
  380. /*********************************************************
  381.  * name:    start_about
  382.  * description:    Ruft die initAbout routine
  383.  * input:    none
  384.  * output:    none
  385.  * author:    Ove Kalkan
  386.  * date:    2.7.93
  387.  *********************************************************/
  388. void    start_about (void)
  389. {
  390.     initAbout();
  391. }
  392.  
  393. /*********************************************************
  394.  * name:    start_info
  395.  * description:    ruft init_info auf
  396.  * input:    none
  397.  * output:    none
  398.  * author:    Ove Kalkan
  399.  * date:    18.6.1993
  400.  *********************************************************/
  401. void    start_info(void)
  402. {
  403.     if (selc_g || (selc_f < 16000 && selc_fo && selc_fo->fs_type == FS_NORMAL))
  404.         init_info();
  405. }
  406.  
  407. /*********************************************************
  408.  * name:    start_goto
  409.  * description:    displays the goto-requester
  410.  * input:    none
  411.  * output:    none
  412.  * author:    Ove Kalkan
  413.  * date:    5.8.1993
  414.  *********************************************************/
  415. void    start_goto(void)
  416. {
  417.     init_goto ();
  418. }
  419.  
  420.  
  421. /*********************************************************
  422.  * name:    start_root
  423.  * description:    displays the change_root-dialog
  424.  * input:    none
  425.  * output:    none
  426.  * author:    Ove Kalkan
  427.  * date:    5.8.1993
  428.  *********************************************************/
  429. void    start_root(void)
  430. {
  431.     init_root();
  432. }
  433.  
  434. /*********************************************************
  435.  * name:    start_WSedit
  436.  * description:    displays the workspace-editor-dialog
  437.  * input:    none
  438.  * output:    none
  439.  * author:    Ove Kalkan
  440.  * date:    5.8.1993
  441.  *********************************************************/
  442. void    start_WSedit(void)
  443. {
  444.     init_editWSE();
  445. }
  446.  
  447. /*********************************************************
  448.  * name:    start_WSdelete
  449.  * description:    displays the workspace-delete-question
  450.  * input:    none
  451.  * output:    none
  452.  * author:    Ove Kalkan
  453.  * date:    5.8.1993
  454.  *********************************************************/
  455. void    start_WSdelete(void)
  456. {
  457.     if (selc_ws && selc_w < 16000)
  458.         init_deleteWSE();
  459. }
  460.  
  461. /*********************************************************
  462.  * name:    start_filter
  463.  * description:    displays the set-filter-dialog
  464.  * input:    none
  465.  * output:    none
  466.  * author:    Ove Kalkan
  467.  * date:    5.8.1993
  468.  *********************************************************/
  469. void    start_filter(Widget w, XtPointer c, XtPointer s)
  470. {
  471.     Folder_Glyph *fo = (Folder_Glyph *) c;
  472.  
  473.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  474.         return;
  475.     getFilter(fo);
  476. }
  477.  
  478. /*********************************************************
  479.  * name:    start_empty
  480.  * description:    empties the trashcan
  481.  * input:    none
  482.  * output:    none
  483.  * author:    Ove Kalkan
  484.  * date:    5.8.1993
  485.  *********************************************************/
  486. static void    start_empty()
  487. {
  488.     if (defaults.trashcan) {
  489.         char    s[1024];
  490.  
  491.         sprintf(s,"%s %s/./*",RM_CMD,defaults.trashcan);
  492.         system(s);
  493.         sprintf(s,"%s/.",defaults.trashcan);
  494.         refreshFolderByPathname(s);
  495. #ifdef    HAVE_QUOTA
  496.         showQuota(quota_label);
  497. #endif
  498.     }
  499. }
  500.  
  501. #ifndef COHERENT
  502. /*********************************************************
  503.  * name:    start_link
  504.  * description:    aufrufen von init_link
  505.  * input:    none
  506.  * output:    none
  507.  * author:    Ove Kalkan
  508.  * date:    Friday,13th.Aug.1993
  509.  *********************************************************/
  510. void    start_link(void)
  511. {
  512.     char    *file = getString();
  513.  
  514.     if (selc_fo && selc_fo->fs_type != FS_NORMAL)
  515.         return;
  516.     init_link(NULL,file);
  517. }
  518. #endif
  519.