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 / DataDisp.h < prev    next >
C/C++ Source or Header  |  1998-11-30  |  24KB  |  634 lines

  1. // $Id: DataDisp.h,v 1.109 1998/11/30 09:38:04 zeller Exp $
  2. // Data Display
  3.  
  4. // Copyright (C) 1995-1997 Technische Universitaet Braunschweig, Germany.
  5. // Written by Dorothea Luetkehaus <luetke@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. #ifndef _DDD_DataDisp_h
  30. #define _DDD_DataDisp_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. //-----------------------------------------------------------------------------
  37. // The `DataDisp' class creates the data display and provides the
  38. // necessary callback functions.
  39. //
  40. // Name conventions used:
  41. // ...CB  : Callback function.
  42. // ...DCB : Dialog callback function.
  43. // ...CD  : Create dialog.
  44. // ...Act : Action function.
  45. // ...SQ  : calls gdb->send_question().
  46. // ...OQC : needed in on_question_completion; see `GDBAgent.h'.
  47. // ...OQAC: needed in on_question_array_completion; see `GDBAgent.h'.
  48. // ...HP  : HandlerProc.  See `HandlerL.h'
  49. // 
  50. //-----------------------------------------------------------------------------
  51.  
  52. // Motif includes
  53. #include <Xm/Xm.h>
  54.  
  55. // DDD includes
  56. #include "ArgField.h"
  57. #include "BoxSize.h"
  58. #include "Command.h"
  59. #include "Delay.h"
  60. #include "ExitCB.h"
  61. #include "GDBAgent.h"
  62. #include "GraphEdit.h"
  63. #include "HelpCB.h"
  64. #include "IntArray.h"
  65. #include "MString.h"
  66. #include "MakeMenu.h"
  67. #include "StringA.h"
  68. #include "VSEFlags.h"
  69. #include "VSLLib.h"
  70. #include "events.h"
  71. #include "strclass.h"
  72. #include "string-fun.h"
  73.  
  74.  
  75. //-----------------------------------------------------------------------------
  76. extern GDBAgent *gdb;
  77. extern ArgField *source_arg;
  78.  
  79. enum DeferMode { 
  80.     DeferAlways,        // Defer display creation
  81.     DeferIfNeeded,        // Defer display creation if needed
  82.     DeferNever            // Create display now
  83. };
  84.  
  85. class NewDisplayInfo;
  86. class DispGraph;
  87. class DispNode;
  88. class DispBox;
  89. class DispValue;
  90. class RegionGraphNode;
  91.  
  92. //-----------------------------------------------------------------------------
  93. class DataDisp {
  94.  
  95.     friend class DataDispCount;
  96.  
  97.     //-----------------------------------------------------------------------
  98.     // Callbacks
  99.     //-----------------------------------------------------------------------
  100.     static void dispCB                  (Widget, XtPointer, XtPointer);
  101.  
  102.     //-----------------------------------------------------------------------
  103.     // Button callbacks
  104.     //-----------------------------------------------------------------------
  105.     static void dereferenceCB           (Widget, XtPointer, XtPointer);
  106.     static void dereferenceArgCB        (Widget, XtPointer, XtPointer);
  107.     static void dereferenceInPlaceCB    (Widget, XtPointer, XtPointer);
  108.     static void toggleDetailCB          (Widget, XtPointer, XtPointer);
  109.     static void toggleRotateCB          (Widget, XtPointer, XtPointer);
  110.     static void toggleDisableCB         (Widget, XtPointer, XtPointer);
  111.     static void rotateCB                (Widget, XtPointer, XtPointer);
  112.     static void newCB                   (Widget, XtPointer, XtPointer);
  113.     static void enableCB                (Widget, XtPointer, XtPointer);
  114.     static void disableCB               (Widget, XtPointer, XtPointer);
  115.     static void showDetailCB            (Widget, XtPointer, XtPointer);
  116.     static void showMoreDetailCB        (Widget, XtPointer, XtPointer);
  117.     static void hideDetailCB            (Widget, XtPointer, XtPointer);
  118.     static void dependentCB             (Widget, XtPointer, XtPointer);
  119.     static void displayArgCB            (Widget, XtPointer, XtPointer);
  120.     static void plotArgCB               (Widget, XtPointer, XtPointer);
  121.     static void plotHistoryCB           (Widget, XtPointer, XtPointer);
  122.     static void setCB                   (Widget, XtPointer, XtPointer);
  123.     static void shortcutCB              (Widget, XtPointer, XtPointer);
  124.     static void deleteArgCB        (Widget, XtPointer, XtPointer);
  125.     static void clusterSelectedCB       (Widget, XtPointer, XtPointer);
  126.     static void unclusterSelectedCB     (Widget, XtPointer, XtPointer);
  127.     static void toggleClusterSelectedCB (Widget, XtPointer, XtPointer);
  128.  
  129.     //-----------------------------------------------------------------------
  130.     // Popup menu callbacks
  131.     //-----------------------------------------------------------------------
  132.     static void popup_new_argCB         (Widget, XtPointer, XtPointer);
  133.     static void popup_newCB             (Widget, XtPointer, XtPointer);
  134.     static void new_displayDCB          (Widget, XtPointer, XtPointer);
  135.  
  136.     //-----------------------------------------------------------------------
  137.     // Callbacks of the display editor
  138.     //-----------------------------------------------------------------------
  139.     static void UpdateGraphEditorSelectionCB   (Widget, XtPointer, XtPointer);
  140.     static void UpdateDisplayEditorSelectionCB (Widget, XtPointer, XtPointer);
  141.     static void PreLayoutCB                    (Widget, XtPointer, XtPointer);
  142.     static void PostLayoutCB                   (Widget, XtPointer, XtPointer);
  143.     static void DoubleClickCB                  (Widget, XtPointer, XtPointer);
  144.  
  145.     //-----------------------------------------------------------------------
  146.     // Graph callbacks
  147.     //-----------------------------------------------------------------------
  148.     static bool bump(RegionGraphNode *node, const BoxSize& newSize);
  149.  
  150.     //-----------------------------------------------------------------------
  151.     // Timers and timer callbacks
  152.     //-----------------------------------------------------------------------
  153.     static void RefreshGraphEditCB(XtPointer client_data, XtIntervalId *id);
  154.     static void RefreshArgsCB     (XtPointer client_data, XtIntervalId *id);
  155.     static void RefreshAddrCB     (XtPointer client_data, XtIntervalId *id);
  156.  
  157.     static XtIntervalId refresh_args_timer;
  158.     static XtIntervalId refresh_graph_edit_timer;
  159.     static XtIntervalId refresh_addr_timer;
  160.  
  161.     //-----------------------------------------------------------------------
  162.     // Sorting nodes for layout
  163.     //-----------------------------------------------------------------------
  164.     static void CompareNodesCB (Widget, XtPointer, XtPointer);
  165.  
  166.     //-----------------------------------------------------------------------
  167.     // Create dialogs
  168.     //-----------------------------------------------------------------------
  169.     static void new_displayCD (Widget w, BoxPoint box_point = BoxPoint());
  170.  
  171.     //-----------------------------------------------------------------------
  172.     // Set sensitivity
  173.     //-----------------------------------------------------------------------
  174.     static void no_displaysHP (void*, void*, void*);
  175.  
  176.     //-----------------------------------------------------------------------
  177.     // Helpers
  178.     //-----------------------------------------------------------------------
  179.  
  180.     static bool lose_selection;
  181.  
  182.     static void set_args(BoxPoint p = BoxPoint(),
  183.              SelectionMode mode = SetSelection);
  184.  
  185.     static void refresh_display_list(bool silent = false);
  186.  
  187.     static DispValue *selected_value();
  188.     static DispNode  *selected_node();
  189.  
  190.     static void open_data_window();
  191.     static void close_data_window();
  192.  
  193.     static DispNode *new_data_node(const string& name, const string& scope,
  194.                    const string& answer, bool plotted);
  195.     static DispNode *new_user_node(const string& name, const string& scope,
  196.                    const string& answer, bool plotted);
  197.     static DispNode *new_deferred_node(const string& expr, const string& scope,
  198.                        const BoxPoint& pos,
  199.                        const string& depends_on,
  200.                        bool clustered, bool plotted);
  201.  
  202.     static int getDispNrAtPoint(BoxPoint point);
  203.  
  204.     static string numbers(IntArray& a);
  205.     static bool all_data_displays(IntArray& numbers);
  206.  
  207.     static void show(Widget dialog, int depth, int more);
  208.  
  209.     static Widget create_display_dialog(Widget parent, String name,
  210.                     NewDisplayInfo& info);
  211.  
  212.     static void toggle_rotate(DispValue *dv, bool all = false);
  213.  
  214.     static void select_node(DispNode *dn, int src = 0);
  215.  
  216.     // Setting values
  217.     static void setDCB (Widget, XtPointer, XtPointer);
  218.     static void DeleteSetInfoCB(Widget, XtPointer client_data, XtPointer);
  219.     static void SetDone(const string& answer, void *qu_data);
  220.  
  221.     // Builtin user displays
  222.     static bool is_builtin_user_command(const string& cmd);
  223.     static string builtin_user_command(const string& cmd, DispNode *dn = 0);
  224.     static void refresh_builtin_user_displays();
  225.  
  226.     // DispNode properties
  227.     static bool needs_refresh(DispNode *dn);
  228.     static bool selected(DispNode *dn);
  229.  
  230.     //-----------------------------------------------------------------------
  231.     // Actions
  232.     //-----------------------------------------------------------------------
  233.     static XtActionsRec actions [];
  234.     static void graph_selectAct         (Widget, XEvent*, String*, Cardinal*);
  235.     static void graph_select_or_moveAct (Widget, XEvent*, String*, Cardinal*);
  236.     static void graph_extendAct         (Widget, XEvent*, String*, Cardinal*);
  237.     static void graph_extend_or_moveAct (Widget, XEvent*, String*, Cardinal*);
  238.     static void graph_toggleAct         (Widget, XEvent*, String*, Cardinal*);
  239.     static void graph_toggle_or_moveAct (Widget, XEvent*, String*, Cardinal*);
  240.     static void graph_popupAct          (Widget, XEvent*, String*, Cardinal*);
  241.     static void graph_dereferenceAct    (Widget, XEvent*, String*, Cardinal*);
  242.     static void graph_detailAct         (Widget, XEvent*, String*, Cardinal*);
  243.     static void graph_rotateAct         (Widget, XEvent*, String*, Cardinal*);
  244.     static void graph_dependentAct      (Widget, XEvent*, String*, Cardinal*);
  245.  
  246.     static void call_selection_proc(Widget, String, XEvent*, String*, Cardinal,
  247.                     SelectionMode mode);
  248.  
  249.     //-----------------------------------------------------------------------
  250.     // Menus
  251.     //-----------------------------------------------------------------------
  252.     static MMDesc graph_popup[];
  253.     static MMDesc node_popup[];
  254.     static MMDesc shortcut_popup1[];
  255.     static MMDesc shortcut_popup2[];
  256.     static MMDesc display_area[];
  257.     static MMDesc plot_menu[];
  258.     static MMDesc detail_menu[];
  259.     static MMDesc shortcut_menu[];
  260.     static MMDesc rotate_menu[];
  261.     static MMDesc delete_menu[];
  262.  
  263.     static const int shortcut_items;
  264.  
  265.  
  266.     // Array of shortcut expressions
  267.     static StringArray shortcut_exprs;
  268.     static StringArray shortcut_labels;
  269.  
  270.     static void add_shortcut_expr(const string& expr);
  271.  
  272. public:
  273.     // Menus - public such that we can chain them in a toolbar
  274.     static MMDesc graph_cmd_area[];
  275.  
  276.     //-----------------------------------------------------------------------
  277.     // Send queries to GDB and process answers
  278.     //-----------------------------------------------------------------------
  279.  
  280.     // Create a new display for DISPLAY_EXPRESSION.
  281.     // SCOPE is the name of the current function (must match backtrace
  282.     // output) or a scope to be reached; see DEFERRED, below.
  283.     // If POS is set, the new display is created at this position.
  284.     // If DEPENDS_ON is set, the new display is made dependent on
  285.     // DEPENDS_ON (a display number or name).
  286.     // If DEFERRED is set, defer creation until SCOPE is reached.
  287.     // If CLUSTERED is set, cluster display.
  288.     // If PLOTTED is set, plot display.
  289.     // If ORIGIN is set, the last origin is set to ORIGIN.
  290.     static void new_displaySQ(string display_expression,
  291.                   string scope,
  292.                   BoxPoint *pos = 0,
  293.                   string depends_on = "",
  294.                   DeferMode deferred = DeferAlways,
  295.                   bool clustered = false,
  296.                   bool plotted = false,
  297.                   Widget origin = 0,
  298.                   bool verbose = true,
  299.                   bool prompt = true);
  300.  
  301.     // Refresh displays.  Sends `info display' and `display' to GDB.
  302.     static void refresh_displaySQ(Widget origin = 0, 
  303.                   bool verbose = true,
  304.                   bool prompt = true);
  305.  
  306.     // Disable displays given in DISPLAY_NRS.  Sends `disable display' to GDB.
  307.     static void disable_displaySQ(IntArray& display_nrs,
  308.                   bool verbose = true,
  309.                   bool prompt = true);
  310.  
  311.     // Enable displays given in DISPLAY_NRS.  Sends `enable display' to GDB.
  312.     static void enable_displaySQ(IntArray& display_nrs,
  313.                  bool verbose = true,
  314.                  bool prompt = true);
  315.  
  316.     // Delete displays given in DISPLAY_NRS.  Sends `delete display' to GDB.
  317.     static void delete_displaySQ(IntArray& display_nrs,
  318.                  bool verbose = true,
  319.                  bool prompt = true);
  320.  
  321.     // Same, but return the appropriate command
  322.     static string new_display_cmd(const string& display_expression,
  323.                   BoxPoint *pos = 0,
  324.                   const string& depends_on = "",
  325.                   bool clustered = false,
  326.                   bool plotted = false);
  327.  
  328.     static string refresh_display_cmd();
  329.     static string disable_display_cmd(IntArray& display_nrs);
  330.     static string enable_display_cmd(IntArray& display_nrs);
  331.     static string delete_display_cmd(IntArray& display_nrs);
  332.     static string delete_display_cmd(const string& name);
  333.  
  334.     // Same, but use the GDB_COMMAND interface for enqueing commands
  335.     static void new_display(string display_expression,
  336.                 BoxPoint *pos = 0,
  337.                 string depends_on = "",
  338.                 bool clustered = false,
  339.                 bool plotted = false,
  340.                 Widget origin = 0)
  341.     {
  342.     string c = new_display_cmd(display_expression, pos, 
  343.                    depends_on, clustered, plotted);
  344.     gdb_command(c, origin);
  345.     }
  346.  
  347.     static void refresh_display(Widget origin = 0)
  348.     {
  349.     gdb_command(refresh_display_cmd(), origin);
  350.     }
  351.  
  352.     static void disable_display(IntArray& display_nrs, Widget origin = 0)
  353.     {
  354.     if (display_nrs.size() > 0)
  355.         gdb_command(disable_display_cmd(display_nrs), origin);
  356.     }
  357.  
  358.     static void enable_display(IntArray& display_nrs, Widget origin = 0)
  359.     {
  360.     if (display_nrs.size() > 0)
  361.         gdb_command(enable_display_cmd(display_nrs), origin);
  362.     }
  363.  
  364.     static void delete_display(IntArray& display_nrs, Widget origin = 0)
  365.     {
  366.     if (display_nrs.size() > 0)
  367.         gdb_command(delete_display_cmd(display_nrs), origin);
  368.     }
  369.  
  370.     static void delete_display(const string& name, Widget origin = 0)
  371.     {
  372.     gdb_command(delete_display_cmd(name), origin);
  373.     }
  374.  
  375.     // Process 'info display' output in INFO_DISPLAY_ANSWER.  If
  376.     // DEFER_DELETED is set, defer displays that have been deleted.
  377.     static void process_info_display (string& info_display_answer, 
  378.                       bool defer_deleted = true);
  379.  
  380.     // Process `display' output in DISPLAY_ANSWER.  Remaining
  381.     // (non-display) output is returned.  If DISABLING_OCCURRED is set
  382.     // after the call, some displays have been disabled and a
  383.     // `display' command must be re-sent to GDB.
  384.     static string process_displays(string& display_answer,
  385.                    bool& disabling_occurred);
  386.  
  387.     // Process user-defined command output in ANSWERS.
  388.     static void process_user(StringArray& answers);
  389.  
  390.     // Process data output in ANSWERS.
  391.     static void process_addr(StringArray& answers);
  392.  
  393.     // Process current scope
  394.     static void process_scope(const string& scope);
  395.     static bool need_scope();
  396.  
  397.     // Set shortcut menu to expressions EXPRS
  398.     static void set_shortcut_menu(const StringArray& exprs,
  399.                   const StringArray& labels);
  400.  
  401.     // Return current shortcut menu items
  402.     static void get_shortcut_menu(StringArray& exprs,
  403.                   StringArray& labels);
  404.  
  405.     // Refresh argument buttons
  406.     static void refresh_args(bool update_arg = false);
  407.  
  408. private:
  409.     // Call me back again
  410.     static void again_new_displaySQ (XtPointer client_data, XtIntervalId *id);
  411.  
  412.     // Tons of helpers
  413.     static void new_data_displayOQC      (const string& answer, void* data);
  414.     static void new_data_display_extraOQC(const string& answer, void* data);
  415.     static void new_data_displaysSQA     (string display_expression, 
  416.                       void *data);
  417.     static void new_data_displaysOQAC    (const StringArray& answers, 
  418.                       const VoidArray& qu_datas,
  419.                       void* data);
  420.  
  421.     static void new_user_displayOQC  (const string& answer, void* data);
  422.  
  423.     static void refresh_displayOQC   (const string& answer, void*  data);
  424.     static void refresh_displayOQAC  (const StringArray& answers,
  425.                       const VoidArray& qu_datas,
  426.                       void*  data);
  427.  
  428.     static void disable_displayOQC   (const string& answer, void* data);
  429.     static void enable_displayOQC    (const string& answer, void* data);
  430.     static void delete_displayOQC    (const string& answer, void* data);
  431.  
  432.     static void deletion_done(IntArray& display_nrs, bool do_prompt);
  433.  
  434.     static void add_aliases(IntArray& a);
  435.     static bool sort_and_check(IntArray& a);
  436.  
  437.     static void select_with_all_descendants(GraphNode *node);
  438.     static void select_with_all_ancestors(GraphNode *node);
  439.  
  440.     // Get display number and name from ANSWER; store them in NR and NAME
  441.     static void read_number_and_name(string& answer, string& nr, string& name);
  442.  
  443.     //-----------------------------------------------------------------------
  444.     // Data
  445.     //-----------------------------------------------------------------------
  446.     static DispGraph *disp_graph;
  447.     static Delay *delay;
  448.     static Widget last_origin;
  449.     static Time last_select_time;
  450.     static int next_ddd_display_number;
  451.     static int next_gdb_display_number;
  452.     static bool detect_aliases;
  453.     static bool cluster_displays;
  454.     static bool arg_needs_update;
  455.  
  456.     static Widget graph_popup_w;
  457.     static Widget node_popup_w;
  458.     static Widget shortcut_popup_w;
  459.  
  460.     static Widget edit_displays_dialog_w;
  461.     static Widget display_list_w;
  462.  
  463.     // Origin handling
  464.     static void ClearOriginCB(Widget, XtPointer, XtPointer);
  465.     static void set_last_origin(Widget origin);
  466.  
  467.     // Alias checking
  468.     static bool check_aliases();
  469.     static void sort_last_change(IntArray& disp_nrs);
  470.     static int last_change_of_disp_nr(int disp_nr);
  471.  
  472.     // True iff aliases are to be checked regardless of address changes
  473.     static bool force_check_aliases;
  474.  
  475.     // Merge displays in DISPLAYS.  Set CHANGED iff changed.  Set
  476.     // SUPPRESSED if displays were suppressed.
  477.     static void merge_displays(IntArray displays, 
  478.                    bool& changed, bool& suppressed);
  479.  
  480.     // Unmerge display DISP_NR; return true iff change
  481.     static bool unmerge_display(int disp_nr);
  482.  
  483.     static Widget graph_form_w;
  484.  
  485.     static int alias_display_nr(GraphNode *node);
  486.  
  487.     // State stuff
  488.     static void write_frame_command(ostream& os, int& current_frame, 
  489.                    int target_frame);
  490.     static void write_restore_scope_command(ostream& os,
  491.                         int& current_frame,
  492.                         const StringArray& scopes,
  493.                         DispNode *dn,
  494.                         bool& ok);
  495.  
  496.     static bool get_state(ostream& os,
  497.               bool restore_state,
  498.               bool include_position,
  499.               const StringArray& scopes,
  500.               int target_frame);
  501.  
  502.     static void get_node_state(ostream& os, DispNode *dn,
  503.                    bool include_position);
  504.  
  505.     // Reset done
  506.     static void reset_done(const string& answer, void *data);
  507.  
  508.     // Clustering stuff
  509.     static void insert_data_node(DispNode *dn, int depend_nr,
  510.                  bool clustered, bool plotted);
  511.     static int new_cluster();
  512.     static int current_cluster();
  513.  
  514.     static DispValue *update_hook(string& value);
  515.  
  516. public:
  517.     static Widget graph_edit;
  518.     static Widget graph_cmd_w;
  519.     static Widget graph_selection_w;
  520.     static ArgField *graph_arg;
  521.     static bool bump_displays;
  522.  
  523.     // Constructor
  524.     DataDisp(Widget parent, Widget& data_buttons_w);
  525.  
  526.     void create_shells();
  527.  
  528.     static int count_data_displays();
  529.     static void get_all_display_numbers(IntArray& numbers);
  530.     static void get_all_clusters(IntArray& numbers);
  531.     static void refresh_graph_edit (bool silent = false);
  532.     static Widget graph_form() { return graph_form_w; }
  533.  
  534.     // Refresh address of NODE (0: all nodes)
  535.     static void refresh_addr(DispNode *node = 0);
  536.  
  537.     // Command(s) to re-print all displays; return # of commands
  538.     static int add_refresh_data_commands(StringArray& cmds);
  539.     static int add_refresh_user_commands(StringArray& cmds);
  540.     static int add_refresh_addr_commands(StringArray& cmds, DispNode *dn = 0);
  541.  
  542.     // Callbacks for menu bar
  543.     static void EditDisplaysCB(Widget, XtPointer, XtPointer);
  544.     static void refreshCB(Widget, XtPointer, XtPointer);
  545.     static void selectAllCB(Widget, XtPointer, XtPointer);
  546.     static void unselectAllCB(Widget, XtPointer, XtPointer);
  547.     static void deleteCB(Widget, XtPointer, XtPointer);
  548.  
  549.     // Helpers for user displays
  550.     static bool have_user_display(const string& name);
  551.     static void new_user_display(const string& name);
  552.     static void delete_user_display(const string& name);
  553.  
  554.     // Callbacks for language changes
  555.     static void language_changedHP(Agent *source, void *client_data, 
  556.                    void *call_data);
  557.  
  558.     // Set whether aliases are to be detected
  559.     static void set_detect_aliases(bool value);
  560.  
  561.     // Set whether displays are to be clustered
  562.     static void set_cluster_displays(bool value);
  563.  
  564.     // True iff we have some selection
  565.     static bool have_selection();
  566.  
  567.     // Write current selection as DDD commands to OS
  568.     // Return true iff all went well
  569.     static bool get_selection(ostream& os, bool include_position = false);
  570.  
  571.     // The maximum display number when saving states
  572.     static int max_display_number;
  573.  
  574.     // Return DDD commands to restore current state (displays, etc.)
  575.     // Return true iff all went well.  SCOPES are obtained via
  576.     // GET_SCOPES (see below).  TARGET_FRAME indicates final frame.
  577.     static bool get_state(ostream& os, const StringArray& scopes, 
  578.               int target_frame = 0);
  579.     static bool get_scopes(StringArray& scopes);
  580.  
  581.     // Return true if a core dump is needed to restore displays
  582.     static bool need_core_to_restore();
  583.  
  584.     // Return documentation string for shortcut menu item W. 
  585.     // Returns 0 if W is no shortcut menu item.
  586.     static MString shortcut_help(Widget w);
  587.  
  588.     // Select a specific value.  Plotter uses this.
  589.     static void select(DispValue *dv);
  590.  
  591.     // Reset all
  592.     static void reset();
  593.  
  594.     // True if the selection was lost
  595.     static void SelectionLostCB(Widget = 0, XtPointer = 0, XtPointer = 0);
  596.  
  597.     // Get number(s) of display NAME
  598.     static int display_number(const string& name, bool verbose = false);
  599.     static void get_display_numbers(const string& name, IntArray& numbers);
  600.  
  601.     // Refresh titles after change in APP_DATA
  602.     static void refresh_titles();
  603.  
  604.     // Update and activate displays manually (from undo)
  605.     static void update_displays(const StringArray& names, 
  606.                 const StringArray& values,
  607.                 const StringArray& addrs);
  608.  
  609.     // Restore sane state
  610.     static void make_sane();
  611. };
  612.  
  613. inline bool DataDisp::get_selection(ostream& os, bool include_position)
  614. {
  615.     StringArray dummy;
  616.     return get_state(os, false, include_position, dummy, 0);
  617. }
  618.  
  619. inline bool DataDisp::get_state(ostream& os, const StringArray& scopes, 
  620.                 int target_frame)
  621. {
  622.     return get_state(os, true, true, scopes, target_frame);
  623. }
  624.  
  625. inline void DataDisp::get_shortcut_menu(StringArray& exprs,
  626.                     StringArray& labels)
  627. {
  628.     exprs  = shortcut_exprs;
  629.     labels = shortcut_labels;
  630. }
  631.  
  632. #endif // _DDD_DataDisp_h
  633. // DON'T ADD ANYTHING BEHIND THIS #endif
  634.