home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume19 / Jetedit / part02 / xmemenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-28  |  15.8 KB  |  530 lines

  1. /**---------------------------------------------------------------------
  2. ***     
  3. ***    file:        xmemenu.c
  4. ***    main:        xme.c
  5. ***
  6. ***    project:    Motif Widgets text editor
  7. ***
  8. ***             (c) Copyright 1989 by Open Software Foundation, Inc.
  9. ***                 All Rights Reserved.
  10. ***
  11. ***             (c) Copyright 1989 by Hewlett-Packard Company.
  12. ***
  13. ***
  14. ***-------------------------------------------------------------------*/
  15.  
  16. #define MENU_EXIT        201
  17. #define MENU_OPEN        202
  18. #define MENU_NEW        203
  19. #define MENU_CLOSE        204
  20. #define MENU_SAVE        205
  21. #define MENU_SAVE_AS        206
  22. #define MENU_PRINT        207
  23. #define MENU_CUT        208
  24. #define MENU_COPY        209
  25. #define MENU_PASTE        210
  26. #define MENU_CLEAR        211
  27. #define MENU_GOTO        212
  28. #define MENU_FINDA        213
  29. #define MENU_FIND        214
  30. #define MENU_UNDO        215
  31. #define MENU_REPLACE        216
  32. #define MENU_WRAP        217
  33. #define MENU_PREF        218
  34.  
  35. #define DISABLE_INDENT        300
  36. #define SMART_INDENT        301
  37. #define SYNTAX_INDENT        302
  38.  
  39. #define REAL_TAB        303
  40. #define FOUR_TAB        304
  41.  
  42. #include "xme.h"
  43.  
  44.  
  45. void CutItem(w,event)
  46. Widget      w;
  47. XKeyEvent *event;
  48. {
  49. #ifdef Motif1.0
  50.     CopyItemToClipboard(event->time);
  51.     DeletePrimarySelection();
  52. #else
  53.     XmTextCut(w, event->time+1);
  54. #endif
  55. }
  56.  
  57. void CopyItem(w,event)
  58. Widget      w;
  59. XKeyEvent *event;
  60. {
  61. #ifdef Motif1.0
  62.     CopyItemToClipboard(event->time);
  63. #else
  64.     XmTextCopy(w, event->time+1);
  65. #endif
  66. }
  67.  
  68. void PasteItem(w,event)
  69. Widget      w;
  70. XKeyEvent *event;
  71. {
  72. #ifdef Motif1.0
  73.     PasteItemFromClipboard();
  74. #else
  75.     XmTextPaste (w);
  76. #endif
  77. }
  78.  
  79. /* ClearItem will only be called if Clear is selected from the menu.
  80. Otherwise, the text widgets already handle the delete key correctly. */
  81. void ClearItem(w,event)
  82. Widget      w;
  83. XKeyEvent *event;
  84. {
  85. #ifdef Motif1.0
  86.     DeletePrimarySelection();
  87. #else
  88.     XmTextRemove(w);
  89. #endif
  90. }
  91.  
  92. /*-------------------------------------------------------------
  93. **    MenuCB
  94. **        Process callback from PushButtons in PulldownMenus.
  95. */
  96. void MenuCB (w, client_data, call_data) 
  97. Widget        w;        /*  widget id            */
  98. caddr_t        client_data;    /*  data from application    */
  99. caddr_t        call_data;    /*  data from widget class    */
  100. {
  101.     Cardinal    ac;        /* arg count                */
  102.     Arg        al[10];        /* arg list                 */
  103.     char    *command;    /* command used in printing */
  104.     Boolean    Wrap;
  105.  
  106.     XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
  107.     
  108.     switch ((int)client_data)
  109.     {
  110.     case MENU_OPEN:
  111.         /* display the file selection dialog */
  112.         XtManageChild (open_dialog);
  113.         if (!file_saved) /* display the 'save' message dialog */
  114.             XtManageChild (open_warning);
  115.         break;
  116.  
  117.     case MENU_NEW:
  118.         /* display the prompt dialog */
  119.         if (thefile) {
  120.             XtSetArg(al[0], XmNtextString, XmStringCreateLtoR
  121.                  (thefile, charset));
  122.             XtSetValues (new_dialog, al, 1);
  123.         }
  124.         XtManageChild (new_dialog);
  125.         if (!file_saved) /* display the 'save' message dialog */
  126.             XtManageChild (new_warning);
  127.         break;
  128.  
  129.     case MENU_CLOSE:
  130.         if (!file_saved) /* display the 'save' message dialog */
  131.             XtManageChild (close_warning);
  132.         else {
  133.             CloseFile();
  134.             sprintf (message_string, " Editing:");
  135.             XtSetArg(al[0], XmNlabelString, 
  136.                 XmStringCreateLtoR(message_string, charset));
  137.             XtSetValues(message, al, 1);
  138.         }
  139.         break;
  140.  
  141.     case MENU_SAVE:
  142.         SaveFile();
  143.         break;
  144.  
  145.     case MENU_SAVE_AS:
  146.         /* Display the 'save as' dialog with the
  147.         present thefile displayed in it. */
  148.         ac = 0;
  149.         XtSetArg(al[ac], XmNtextString,
  150.              XmStringCreateLtoR (thefile, charset));  ac++;
  151.         XtSetValues(save_as_dialog, al, ac);
  152.         XtManageChild (save_as_dialog);
  153.         break;
  154.  
  155.     case MENU_PRINT:
  156. /*        if (!file_saved)
  157.             XtManageChild(print_warning);
  158.         else if (thefile != NULL) {
  159.             /* malloc space for the command name. 
  160.                 Note: command = size of the thefile +
  161.                 "lp " + null terminator */
  162. /*            command = XtMalloc(sizeof(thefile) + 4);
  163.             sprintf(command, "lp %s", thefile);
  164.             if (system(command) != NULL)
  165.                 fprintf(stderr, "\7print failed");
  166.         }
  167.         break;
  168. */
  169.     
  170.     case MENU_EXIT:
  171.         /* exit if there is no files open */
  172.         if (!file_saved) /* display the 'save' message dialog */
  173.             XtManageChild (exit_warning);
  174.         else {
  175.             /* close up file pointers and descriptors */
  176.             CloseFile();
  177.             CloseUndoBuffer();
  178.  
  179.             /* exit this program */
  180.             exit (0);
  181.         }
  182.         break;
  183.  
  184.     case MENU_UNDO:
  185.         {
  186.         Undo(cb->event);
  187.         }
  188.         break;
  189.  
  190.     case MENU_CUT:
  191.         CutItem(text, cb->event);
  192.         break;
  193.  
  194.     case MENU_COPY:
  195.         CopyItem(text, cb->event);
  196.         break;
  197.  
  198.     case MENU_PASTE:
  199.         PasteItem(text, cb->event);
  200.         break;
  201.  
  202.     case MENU_CLEAR:
  203.         ClearItem(text, cb->event);
  204.         break;
  205.  
  206.     case MENU_FIND:
  207.         XtSetSensitive(findA_button, False);
  208.         XtSetSensitive(replace_button, False);
  209.         XtSetSensitive(replace_pb, False);
  210.         XtSetSensitive(replaceAll_pb, False);
  211.         XtManageChild(find_dialog);
  212.         break;
  213.  
  214.     case MENU_REPLACE:
  215.         ReplaceString();        
  216.     case MENU_FINDA:
  217.         if (the_string)
  218.             FindString(cb->event->xbutton.time+1);
  219.         break;
  220.  
  221.     case MENU_GOTO:
  222.         XtManageChild(goto_dialog);
  223.         break;
  224.  
  225.     case MENU_PREF:
  226.         XtManageChild (prefer_dialog);
  227.         break;
  228.  
  229.     default:
  230.         /* unknown client_data was recieved and
  231.             there is no setup to handle this */
  232.         fprintf(stderr, "\7Warning: in menu callback\n");
  233.         break;
  234.     }
  235.  
  236. }
  237.  
  238.  
  239.  
  240. /*-------------------------------------------------------------
  241. **      CreateMenuBar
  242. **              Create MenuBar in MainWindow
  243. */
  244. Widget CreateMenuBar (parent)
  245. Widget          parent;
  246. {
  247.     Widget    menu_bar;        /*  RowColumn                   */
  248.     Widget    cascade;        /*  CascadeButton               */
  249.     Widget    menu_pane;    /*  RowColumn                   */
  250.     Widget    button;        /*  PushButton                  */
  251.     Widget    sub_menu;
  252.     
  253.     Arg        al[10];        /*  arg list                    */
  254.     Cardinal    ac;        /*  arg count                   */
  255.     
  256.     /****   Create MenuArea.        ****/
  257.     ac = 0;
  258.     menu_bar = XmCreateMenuBar (parent, "menu_bar", al, ac);
  259.     
  260.     /****   Create "File" PulldownMenu.     ****/
  261.     ac = 0;
  262.     menu_pane = XmCreatePulldownMenu (menu_bar, "filemenu", al, ac);
  263.     
  264.     ac = 0;
  265.     XtSetArg(al[ac], XmNlabelString,
  266.         XmStringCreateLtoR("Open", charset)); ac++;
  267. #ifdef HARDCODE
  268.     XtSetArg(al[ac], XmNacceleratorText,
  269.         XmStringCreateLtoR("Ext+O", charset)); ac++;
  270.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>O:"); ac++;
  271.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  272. #endif
  273.     button = XmCreatePushButtonGadget (menu_pane, "Open", al, ac);
  274.     XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_OPEN);
  275.     XtManageChild (button);
  276.     
  277.     ac = 0;
  278.     XtSetArg(al[ac], XmNlabelString,
  279.         XmStringCreateLtoR("New", charset)); ac++;
  280. #ifdef HARDCODE
  281.     XtSetArg(al[ac], XmNacceleratorText,
  282.         XmStringCreateLtoR("Ext+N", charset)); ac++;
  283.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>N:"); ac++;
  284.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  285. #endif
  286.     button = XmCreatePushButtonGadget (menu_pane, "New", al, ac);
  287.     XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_NEW);
  288.     XtManageChild (button);
  289.     
  290.     ac = 0;
  291.     XtSetArg(al[ac], XmNlabelString,
  292.         XmStringCreateLtoR("Close", charset)); ac++;
  293. #ifdef HARDCODE
  294.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  295. #endif
  296.     button = XmCreatePushButtonGadget (menu_pane, "Close", al, ac);
  297.     XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_CLOSE);
  298.     XtManageChild (button);
  299.     
  300.     
  301.     ac = 0;
  302.     XtSetArg(al[ac], XmNlabelString,
  303.         XmStringCreateLtoR("Save", charset)); ac++;
  304. #ifdef HARDCODE
  305.     XtSetArg(al[ac], XmNacceleratorText,
  306.         XmStringCreateLtoR("Ext+S", charset)); ac++;
  307.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>S:"); ac++;
  308.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  309. #endif
  310.     save_button = XmCreatePushButtonGadget (menu_pane, "Save", al, ac);
  311.     XtAddCallback (save_button, XmNactivateCallback, MenuCB, MENU_SAVE);
  312.     XtManageChild (save_button);
  313.     XtSetSensitive(save_button, False);
  314.     
  315.     
  316.     ac = 0;
  317.     XtSetArg(al[ac], XmNlabelString,
  318.         XmStringCreateLtoR("Save As...", charset)); ac++;
  319. #ifdef HARDCODE
  320.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  321. #endif
  322.     button = XmCreatePushButtonGadget (menu_pane, "Save As...", al, ac);
  323.     XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_SAVE_AS);
  324.     XtManageChild (button);
  325.     
  326.     
  327.     ac = 0;
  328.     separator = XmCreateSeparator (menu_pane, "Sep", al, ac);
  329.     XtManageChild (separator);
  330.     
  331.     ac = 0;
  332.     XtSetArg(al[ac], XmNlabelString,
  333.         XmStringCreateLtoR("Quit", charset)); ac++;
  334. #ifdef HARDCODE
  335.     XtSetArg(al[ac], XmNacceleratorText,
  336.         XmStringCreateLtoR("Ext+Q", charset)); ac++;
  337.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>Q:"); ac++;
  338.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  339. #endif
  340.     button = XmCreatePushButtonGadget (menu_pane, "Exit", al, ac);
  341.     XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_EXIT);
  342.     XtManageChild (button);
  343.     
  344.     ac = 0;
  345.     XtSetArg (al[ac], XmNsubMenuId, menu_pane);  ac++;
  346.     XtSetArg(al[ac], XmNlabelString,
  347.         XmStringCreateLtoR("File", charset)); ac++;
  348. #ifdef HARDCODE
  349.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  350. #endif
  351.     cascade = XmCreateCascadeButton (menu_bar, "File", al, ac);
  352.     XtManageChild (cascade);
  353.     
  354.     /****   Create "Edit" PulldownMenu.     ****/
  355.     ac = 0;
  356.     menu_pane = XmCreatePulldownMenu (menu_bar, "editmenu", al, ac);
  357.  
  358.     ac = 0;
  359.     XtSetArg(al[ac], XmNlabelString,
  360.         XmStringCreateLtoR("Undo", charset)); ac++;
  361. #ifdef HARDCODE
  362.     XtSetArg(al[ac], XmNacceleratorText,
  363.         XmStringCreateLtoR("Ext+Z", charset)); ac++;
  364.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>Z:"); ac++;
  365.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  366. #endif
  367.     undo_button = XmCreatePushButtonGadget (menu_pane, "Undo", al, ac);
  368.     XtAddCallback (undo_button, XmNactivateCallback, MenuCB, MENU_UNDO);
  369.     XtManageChild (undo_button);
  370.     XtSetSensitive(undo_button, False);
  371.     
  372.     ac = 0;
  373.     separator = XmCreateSeparator (menu_pane, "Sep", al, ac);
  374.     XtManageChild (separator);
  375.     
  376.     ac = 0;
  377.     XtSetArg(al[ac], XmNlabelString,
  378.         XmStringCreateLtoR("Cut", charset)); ac++;
  379. #ifdef HARDCODE
  380.     XtSetArg(al[ac], XmNacceleratorText,
  381.         XmStringCreateLtoR("Ext+X", charset)); ac++;
  382.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>X:"); ac++;
  383.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  384. #endif
  385.     cut_button = XmCreatePushButtonGadget (menu_pane, "Cut", al, ac);
  386.     XtAddCallback (cut_button, XmNactivateCallback, MenuCB, MENU_CUT);
  387.     XtManageChild (cut_button);
  388.     XtSetSensitive(cut_button, False);
  389.     
  390.     ac = 0;
  391.     XtSetArg(al[ac], XmNlabelString,
  392.         XmStringCreateLtoR("Copy", charset)); ac++;
  393. #ifdef HARDCODE
  394.     XtSetArg(al[ac], XmNacceleratorText,
  395.         XmStringCreateLtoR("Ext+C", charset)); ac++;
  396.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>C:"); ac++;
  397.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  398. #endif
  399.     copy_button = XmCreatePushButtonGadget (menu_pane, "Copy", al, ac);
  400.     XtAddCallback (copy_button, XmNactivateCallback, MenuCB, MENU_COPY);
  401.     XtManageChild (copy_button);
  402.     XtSetSensitive(copy_button, False);
  403.     
  404.     ac = 0;
  405.     XtSetArg(al[ac], XmNlabelString,
  406.         XmStringCreateLtoR("Paste", charset)); ac++;
  407. #ifdef HARDCODE
  408.     XtSetArg(al[ac], XmNacceleratorText,
  409.         XmStringCreateLtoR("Ext+V", charset)); ac++;
  410.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>V:"); ac++;
  411.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  412. #endif
  413.     paste_button = XmCreatePushButtonGadget (menu_pane, "Paste", al, ac); ac++;
  414.     XtAddCallback (paste_button, XmNactivateCallback, MenuCB, MENU_PASTE);
  415.     XtManageChild (paste_button);
  416.     XtSetSensitive(paste_button, False);
  417.     
  418.     ac = 0;
  419.     XtSetArg(al[ac], XmNlabelString,
  420.         XmStringCreateLtoR("Clear", charset)); ac++;
  421. #ifdef HARDCODE
  422.     XtSetArg(al[ac], XmNacceleratorText,
  423.         XmStringCreateLtoR("Del", charset)); ac++;
  424.     /* don't need an accelerator - Text already handles
  425.     this action appropriately */
  426.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  427. #endif
  428.     clear_button = XmCreatePushButtonGadget (menu_pane, "Clear", al, ac);
  429.     XtAddCallback (clear_button, XmNactivateCallback, MenuCB, MENU_CLEAR);
  430.     XtManageChild (clear_button);
  431.     XtSetSensitive(clear_button, False);
  432.     
  433.     ac = 0;
  434.     separator = XmCreateSeparator (menu_pane, "Sep", al, ac);
  435.     XtManageChild (separator);
  436.     
  437.     ac = 0;
  438.     XtSetArg (al[ac], XmNvisibleWhenOff, True);  ac++;
  439. #ifdef HARDCODE
  440.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  441. #endif
  442.     button = XmCreatePushButtonGadget (menu_pane, "Preferences", al, ac); ac++;
  443.     XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_PREF);
  444.     XtManageChild (button);
  445.     
  446.     ac = 0;
  447.     XtSetArg (al[ac], XmNsubMenuId, menu_pane);  ac++;
  448.     XtSetArg(al[ac], XmNlabelString,
  449.         XmStringCreateLtoR("Edit", charset)); ac++;
  450. #ifdef HARDCODE
  451.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  452. #endif
  453.     cascade= XmCreateCascadeButton (menu_bar, "Edit", al, ac);
  454.     XtManageChild (cascade);
  455.     
  456.     
  457.     /****   Create "Search" PulldownMenu.   ****/
  458.     ac = 0;
  459.     menu_pane = XmCreatePulldownMenu (menu_bar, "searchmenu", al, ac);
  460.     
  461.     ac = 0;
  462.     XtSetArg(al[ac], XmNlabelString,
  463.         XmStringCreateLtoR("Find", charset)); ac++;
  464. #ifdef HARDCODE
  465.     XtSetArg(al[ac], XmNacceleratorText,
  466.         XmStringCreateLtoR("Ext+F", charset)); ac++;
  467.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>F:"); ac++;
  468.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  469. #endif
  470.     find_button = XmCreatePushButtonGadget (menu_pane, "Find", al, ac);
  471.     XtAddCallback (find_button, XmNactivateCallback, MenuCB, MENU_FIND);
  472.     XtManageChild (find_button);
  473.     XtSetSensitive(find_button, False);
  474.     
  475.     ac = 0;
  476.     XtSetArg(al[ac], XmNlabelString,
  477.         XmStringCreateLtoR("Find again", charset)); ac++;
  478. #ifdef HARDCODE
  479.     XtSetArg(al[ac], XmNacceleratorText,
  480.         XmStringCreateLtoR("Ext+A", charset)); ac++;
  481.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>A:"); ac++;
  482.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  483. #endif
  484.     findA_button = XmCreatePushButtonGadget (menu_pane, "FindA", al, ac);
  485.     XtAddCallback (findA_button, XmNactivateCallback, MenuCB, MENU_FINDA);
  486.     XtManageChild (findA_button);
  487.     XtSetSensitive(findA_button, False);
  488.     
  489.     ac = 0;
  490.     XtSetArg(al[ac], XmNlabelString,
  491.         XmStringCreateLtoR("Replace", charset)); ac++;
  492. #ifdef HARDCODE
  493.     XtSetArg(al[ac], XmNacceleratorText,
  494.         XmStringCreateLtoR("Ext+R", charset)); ac++;
  495.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>R:"); ac++;
  496.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  497. #endif
  498.     replace_button = XmCreatePushButtonGadget (menu_pane, "Replace", al, ac);
  499.     XtAddCallback (replace_button, XmNactivateCallback, MenuCB, MENU_REPLACE);
  500.     XtManageChild (replace_button);
  501.     XtSetSensitive(replace_button, False);
  502.     
  503.     ac = 0;
  504.     XtSetArg(al[ac], XmNlabelString,
  505.         XmStringCreateLtoR("Go to", charset)); ac++;
  506. #ifdef HARDCODE
  507.     XtSetArg(al[ac], XmNacceleratorText,
  508.         XmStringCreateLtoR("Ext+G", charset)); ac++;
  509.     XtSetArg(al[ac], XmNaccelerator, "Meta<Key>G:"); ac++;
  510.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  511. #endif
  512.     goto_button = XmCreatePushButtonGadget (menu_pane, "GoTo", al, ac);
  513.     XtAddCallback (goto_button, XmNactivateCallback, MenuCB, MENU_GOTO);
  514.     XtManageChild (goto_button);
  515.     XtSetSensitive(goto_button, False);
  516.     
  517.     ac = 0;
  518.     XtSetArg (al[ac], XmNsubMenuId, menu_pane);  ac++;
  519.     XtSetArg(al[ac], XmNlabelString,
  520.         XmStringCreateLtoR("Search", charset)); ac++;
  521. #ifdef HARDCODE
  522.     XtSetArg (al[ac], XmNfontList, fontlist);  ac++;
  523. #endif
  524.     cascade= XmCreateCascadeButton (menu_bar, "Search", al, ac);
  525.     XtManageChild (cascade);
  526.     
  527.     return (menu_bar);
  528. }
  529.  
  530.