home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / simpleMenu.C < prev    next >
C/C++ Source or Header  |  1998-11-26  |  9KB  |  349 lines

  1. // $Id: simpleMenu.C,v 1.6 1998/11/26 12:31:13 zeller Exp $ -*- C++ -*-
  2. // Simple `File', `Edit', and `Help' menus
  3.  
  4. // Copyright (C) 1998 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char simpleMenu_rcsid[] = 
  30.     "$Id: simpleMenu.C,v 1.6 1998/11/26 12:31:13 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "simpleMenu.h"
  37.  
  38. #include "config.h"
  39. #include "MakeMenu.h"
  40. #include "HelpCB.h"
  41. #include "WhatNextCB.h"
  42. #include "events.h"
  43. #include "exit.h"
  44. #include "findParent.h"
  45. #include "tips.h"
  46. #include "show.h"
  47.  
  48. #include <Xm/Text.h>
  49. #include <Xm/TextF.h>
  50.  
  51.  
  52. //-----------------------------------------------------------------------------
  53. // Basic functions
  54. //-----------------------------------------------------------------------------
  55.  
  56. static bool same_shell(Widget w1, Widget w2)
  57. {
  58.     if (w1 == 0 || w2 == 0)
  59.     return false;
  60.  
  61.     Widget shell_1 = findTopLevelShellParent(w1);
  62.     Widget shell_2 = findTopLevelShellParent(w2);
  63.  
  64.     return shell_1 == shell_2;
  65. }
  66.  
  67. static Boolean cut(Widget w, Widget dest, Time tm)
  68. {
  69.     if (!same_shell(w, dest))
  70.     return False;
  71.  
  72.     Boolean success = False;
  73.  
  74.     if (XmIsText(dest))
  75.     success = XmTextCut(dest, tm);
  76.     else if (XmIsTextField(dest))
  77.     success = XmTextFieldCut(dest, tm);
  78.  
  79.     return success;
  80. }
  81.  
  82. static Boolean copy(Widget w, Widget dest, Time tm)
  83. {
  84.     if (!same_shell(w, dest))
  85.     return False;
  86.  
  87.     Boolean success = False;
  88.  
  89.     if (XmIsText(dest))
  90.     success = XmTextCopy(dest, tm);
  91.     else if (XmIsTextField(dest))
  92.     success = XmTextFieldCopy(dest, tm);
  93.  
  94.     return success;
  95. }
  96.  
  97. static Boolean paste(Widget w, Widget dest)
  98. {
  99.     if (!same_shell(w, dest))
  100.     return False;
  101.  
  102.     Boolean editable = False;
  103.     XtVaGetValues(dest, XmNeditable, &editable, NULL);
  104.     if (!editable)
  105.     return False;
  106.  
  107.     Boolean success = False;
  108.  
  109.     if (XmIsText(dest))
  110.     success = XmTextPaste(dest);
  111.     else if (XmIsTextField(dest))
  112.     success = XmTextFieldPaste(dest);
  113.  
  114.     return success;
  115. }
  116.  
  117. static void clear(Widget w, Widget dest)
  118. {
  119.     if (!same_shell(w, dest))
  120.     return;
  121.  
  122.     Boolean editable = False;
  123.     XtVaGetValues(dest, XmNeditable, &editable, NULL);
  124.     if (!editable)
  125.     return;
  126.  
  127.     if (XmIsText(dest))
  128.     XmTextSetString(dest, "");
  129.     else if (XmIsTextField(dest))
  130.     XmTextFieldSetString(dest, "");
  131. }
  132.  
  133.  
  134. static Boolean select(Widget w, Widget dest, Time tm)
  135. {
  136.     if (!same_shell(w, dest))
  137.     return False;
  138.  
  139.     Boolean success = False;
  140.  
  141.     if (!success && XmIsText(dest))
  142.     {
  143.     XmTextSetSelection(dest, 0, XmTextGetLastPosition(dest), tm);
  144.     success = True;
  145.     }
  146.     else if (!success && XmIsTextField(dest))
  147.     {
  148.     XmTextFieldSetSelection(dest, 0, 
  149.                 XmTextFieldGetLastPosition(dest), tm);
  150.     success = True;
  151.     }
  152.  
  153.     return success;
  154. }
  155.  
  156. static void unselect(Widget w, Widget dest, Time tm)
  157. {
  158.     if (!same_shell(w, dest))
  159.     return;
  160.  
  161.     if (XmIsText(dest))
  162.     XmTextClearSelection(dest, tm);
  163.     else if (XmIsTextField(dest))
  164.     XmTextFieldClearSelection(dest, tm);
  165. }
  166.  
  167. static Boolean remove(Widget w, Widget dest)
  168. {
  169.     if (!same_shell(w, dest))
  170.     return False;
  171.  
  172.     Boolean editable = False;
  173.     XtVaGetValues(dest, XmNeditable, &editable, NULL);
  174.     if (!editable)
  175.     return False;
  176.  
  177.     Boolean success = False;
  178.     if (XmIsText(dest))
  179.     success = XmTextRemove(dest);
  180.     else if (XmIsTextField(dest))
  181.     success = XmTextFieldRemove(dest);
  182.  
  183.     return success;
  184. }
  185.  
  186.  
  187. //-----------------------------------------------------------------------------
  188. // Callbacks
  189. //-----------------------------------------------------------------------------
  190.  
  191. static void UnselectAllCB(Widget w, XtPointer client_data,
  192.               XtPointer call_data)
  193. {
  194.     XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *)call_data;
  195.     Time tm = time(cbs->event);
  196.  
  197.     Widget dest = XmGetDestination(XtDisplay(w));
  198.     Widget win = Widget(client_data);
  199.  
  200.     // Do destination window
  201.     unselect(w, dest, tm);
  202.  
  203.     // Do given window
  204.     if (win != dest)
  205.     unselect(w, win, tm);
  206. }
  207.  
  208. static void CutCB(Widget w, XtPointer client_data, XtPointer call_data)
  209. {
  210.     XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *)call_data;
  211.     Time tm = time(cbs->event);
  212.  
  213.     Boolean success = False;
  214.     Widget dest = XmGetDestination(XtDisplay(w));
  215.     Widget win  = Widget(client_data);
  216.  
  217.     // Try destination window
  218.     if (!success)
  219.     success = cut(w, dest, tm);
  220.  
  221.     // Try given window
  222.     if (!success && win != dest)
  223.     success = cut(w, win, tm);
  224.  
  225.     if (success)
  226.     UnselectAllCB(w, client_data, call_data);
  227. }
  228.  
  229. static void CopyCB(Widget w, XtPointer client_data, XtPointer call_data)
  230. {
  231.     XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *)call_data;
  232.     Time tm = time(cbs->event);
  233.     
  234.     Boolean success = False;
  235.     Widget dest = XmGetDestination(XtDisplay(w));
  236.     Widget win = Widget(client_data);
  237.  
  238.     // Try destination window
  239.     if (!success)
  240.     success = copy(w, dest, tm);
  241.  
  242.     // Try given window
  243.     if (!success && win != dest)
  244.     success = copy(w, win, tm);
  245. }
  246.  
  247. static void PasteCB(Widget w, XtPointer client_data, XtPointer)
  248. {
  249.     Boolean success = False;
  250.     Widget dest = XmGetDestination(XtDisplay(w));
  251.     Widget win = Widget(client_data);
  252.  
  253.     // Try destination window
  254.     if (!success)
  255.     success = paste(w, dest);
  256.  
  257.     // Try given window
  258.     if (!success && win != dest)
  259.     success = paste(w, win);
  260. }
  261.  
  262. static void ClearAllCB(Widget w, XtPointer client_data, XtPointer call_data)
  263. {
  264.     UnselectAllCB(w, client_data, call_data);
  265.  
  266.     Widget dest = XmGetDestination(XtDisplay(w));
  267.     Widget win  = Widget(client_data);
  268.  
  269.     // Clear destination window
  270.     clear(w, dest);
  271.  
  272.     // Clear given window
  273.     if (win != dest)
  274.     clear(w, win);
  275. }
  276.  
  277. static void SelectAllCB(Widget w, XtPointer client_data, XtPointer call_data)
  278. {
  279.     XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *)call_data;
  280.     Time tm = time(cbs->event);
  281.  
  282.     Boolean success = false;
  283.     Widget dest = XmGetDestination(XtDisplay(w));
  284.     Widget win  = (Widget)client_data;
  285.  
  286.     if (!success)
  287.     success = select(w, dest, tm);
  288.     if (!success && win != dest)
  289.     success = select(w, win, tm);
  290. }
  291.  
  292. static void RemoveCB(Widget w, XtPointer client_data, XtPointer call_data)
  293. {
  294.     Boolean success = False;
  295.     Widget dest = XmGetDestination(XtDisplay(w));
  296.     Widget win  = (Widget)client_data;
  297.  
  298.     // Try destination window
  299.     if (!success)
  300.     success = remove(w, dest);
  301.  
  302.     // Try given window
  303.     if (!success && win != dest)
  304.     success = remove(w, win);
  305.  
  306.     if (success)
  307.     UnselectAllCB(w, client_data, call_data);
  308. }
  309.  
  310.  
  311. //-----------------------------------------------------------------------------
  312. // Menus
  313. //-----------------------------------------------------------------------------
  314.  
  315. // Edit menu
  316. MMDesc simple_edit_menu[] =
  317. {
  318.     { "cut",       MMPush,  { CutCB, 0       }, 0, 0, 0, 0},
  319.     { "copy",      MMPush,  { CopyCB, 0      }, 0, 0, 0, 0},
  320.     { "paste",     MMPush,  { PasteCB, 0     }, 0, 0, 0, 0},
  321.     { "clearAll",  MMPush,  { ClearAllCB, 0  }, 0, 0, 0, 0},
  322.     { "delete",    MMPush,  { RemoveCB, 0    }, 0, 0, 0, 0},
  323.     MMSep,
  324.     { "selectAll", MMPush,  { SelectAllCB, 0 }, 0, 0, 0, 0},
  325.     MMEnd
  326. };
  327.  
  328. // Help menu
  329. MMDesc simple_help_menu[] = 
  330. {
  331.     {"onHelp",      MMPush, { HelpOnHelpCB, 0}, 0, 0, 0, 0},
  332.     MMSep,
  333.     {"onItem",      MMPush, { HelpOnItemCB, 0}, 0, 0, 0, 0},
  334.     {"onWindow",    MMPush, { HelpOnWindowCB, 0}, 0, 0, 0, 0},
  335.     MMSep,
  336.     {"whatNext",    MMPush, { WhatNextCB, 0}, 0, 0, 0, 0},
  337.     {"tipOfTheDay", MMPush, { TipOfTheDayCB, 0}, 0, 0, 0, 0},
  338.     MMSep,
  339.     {"dddManual",   MMPush, { DDDManualCB, 0}, 0, 0, 0, 0},
  340.     {"news",        MMPush, { DDDNewsCB, 0}, 0, 0, 0, 0},
  341.     {"gdbManual",   MMPush, { GDBManualCB, 0}, 0, 0, 0, 0},
  342.     MMSep,
  343.     {"license",     MMPush, { DDDLicenseCB, 0}, 0, 0, 0, 0},
  344.     {"www",         MMPush, { DDDWWWPageCB, 0}, 0, 0, 0, 0},
  345.     MMSep,
  346.     {"onVersion",   MMPush, { HelpOnVersionCB, 0}, 0, 0, 0, 0},
  347.     MMEnd
  348. };
  349.