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 / SourceView.h < prev    next >
C/C++ Source or Header  |  1998-10-25  |  35KB  |  948 lines

  1. // $Id: SourceView.h,v 1.143 1998/10/25 21:58:21 zeller Exp $
  2. // View the Source.
  3.  
  4. // Copyright (C) 1995-1997 Technische Universitaet Braunschweig, Germany.
  5. // Written by Dorothea Luetkehaus <luetke@ips.cs.tu-bs.de>
  6. // and Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  7. // 
  8. // This file is part of DDD.
  9. // 
  10. // DDD is free software; you can redistribute it and/or
  11. // modify it under the terms of the GNU General Public
  12. // License as published by the Free Software Foundation; either
  13. // version 2 of the License, or (at your option) any later version.
  14. // 
  15. // DDD is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. // See the GNU General Public License for more details.
  19. // 
  20. // You should have received a copy of the GNU General Public
  21. // License along with DDD -- see the file COPYING.
  22. // If not, write to the Free Software Foundation, Inc.,
  23. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24. // 
  25. // DDD is the data display debugger.
  26. // For details, see the DDD World-Wide-Web page, 
  27. // `http://www.cs.tu-bs.de/softech/ddd/',
  28. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  29.  
  30. //-----------------------------------------------------------------------------
  31. // This class creates the source view window and provides necessary
  32. // callbacks.
  33. //
  34. // Name conventions:
  35. // ...CB  : Callback function.
  36. // ...DCB : Dialog callback function.
  37. // ...CD  : Create a dialog.
  38. // ...Act : Action function.
  39. // ...SQ  : Calls gdb->send_question().
  40. // ...OQC : For on_question_completion (type: OQCProc), see GDBAgent.h
  41. // ...SQA : Calls gdb->send_qu_array().
  42. // ...OQAC: For on_question_array_completion (type: OQACProc), see GDBAgent.h
  43. // ...HP  : Handler procedure (type: HandlerProc), see HandlerL.h
  44. // 
  45. //-----------------------------------------------------------------------------
  46.  
  47. #ifndef _DDD_SourceView_h
  48. #define _DDD_SourceView_h
  49.  
  50. #ifdef __GNUG__
  51. #pragma interface
  52. #endif
  53.  
  54. // Motif includes
  55. #include <Xm/Xm.h>
  56.  
  57. // Misc includes
  58. #include "strclass.h"
  59. #include "Assoc.h"
  60. #include "MakeMenu.h"
  61. #include "StringA.h"
  62. #include "IntIntAA.h"
  63. #include "TextPosA.h"
  64.  
  65. // DDD includes
  66. #include "ArgField.h"
  67. #include "GDBAgent.h"
  68. #include "BreakPM.h"
  69. #include "CodeCache.h"
  70. #include "Delay.h"
  71. #include "StringSA.h"
  72. #include "MString.h"
  73.  
  74. //-----------------------------------------------------------------------------
  75. extern GDBAgent* gdb;
  76. extern ArgField* source_arg;
  77.  
  78. struct BreakpointPropertiesInfo;
  79.  
  80. //-----------------------------------------------------------------------------
  81. class SourceView {
  82.     //-----------------------------------------------------------------------
  83.     // Callbacks
  84.     //-----------------------------------------------------------------------
  85.     static void set_source_argCB         (Widget, XtPointer, XtPointer);
  86.  
  87.     static void line_popup_setCB         (Widget, XtPointer, XtPointer);
  88.     static void line_popup_set_tempCB    (Widget, XtPointer, XtPointer);
  89.     static void line_popup_temp_n_contCB (Widget, XtPointer, XtPointer);
  90.     static void line_popup_set_pcCB      (Widget, XtPointer, XtPointer);
  91.  
  92.     static void bp_popup_infoCB          (Widget, XtPointer, XtPointer);
  93.     static void bp_popup_deleteCB        (Widget, XtPointer, XtPointer);
  94.     static void bp_popup_disableCB       (Widget, XtPointer, XtPointer);
  95.     static void bp_popup_set_pcCB        (Widget, XtPointer, XtPointer);
  96.  
  97.     static void text_popup_printCB       (Widget, XtPointer, XtPointer);
  98.     static void text_popup_dispCB        (Widget, XtPointer, XtPointer);
  99.     static void text_popup_watchCB       (Widget, XtPointer, XtPointer);
  100.     static void text_popup_print_refCB   (Widget, XtPointer, XtPointer);
  101.     static void text_popup_disp_refCB    (Widget, XtPointer, XtPointer);
  102.     static void text_popup_watch_refCB   (Widget, XtPointer, XtPointer);
  103.     static void text_popup_whatisCB      (Widget, XtPointer, XtPointer);
  104.     static void text_popup_lookupCB      (Widget, XtPointer, XtPointer);
  105.     static void text_popup_breakCB       (Widget, XtPointer, XtPointer);
  106.     static void text_popup_clearCB       (Widget, XtPointer, XtPointer);
  107.  
  108.     static void NewBreakpointDCB         (Widget, XtPointer, XtPointer);
  109.     static void NewBreakpointCB          (Widget, XtPointer, XtPointer);
  110.  
  111.     static void NewWatchpointDCB         (Widget, XtPointer, XtPointer);
  112.     static void NewWatchpointCB          (Widget, XtPointer, XtPointer);
  113.  
  114.     static void LookupBreakpointCB       (Widget, XtPointer, XtPointer);
  115.     static void PrintWatchpointCB        (Widget, XtPointer, XtPointer);
  116.     static void BreakpointCmdCB          (Widget, XtPointer, XtPointer);
  117.  
  118.     static void EditBreakpointPropertiesCB (Widget, XtPointer, XtPointer);
  119.     static void SetBreakpointIgnoreCountCB (Widget, XtPointer, XtPointer);
  120.     static void SetBreakpointConditionCB   (Widget, XtPointer, XtPointer);
  121.     static void EnableBreakpointsCB        (Widget, XtPointer, XtPointer);
  122.     static void DisableBreakpointsCB       (Widget, XtPointer, XtPointer);
  123.     static void MakeBreakpointsTempCB      (Widget, XtPointer, XtPointer);
  124.     static void DeleteBreakpointsCB        (Widget, XtPointer, XtPointer);
  125.     static void RecordBreakpointCommandsCB (Widget, XtPointer, XtPointer);
  126.     static void EndBreakpointCommandsCB    (Widget, XtPointer, XtPointer);
  127.     static void EditBreakpointCommandsCB   (Widget, XtPointer, XtPointer);
  128.     static void SetBreakpointIgnoreCountNowCB(XtPointer, XtIntervalId *);
  129.     static void DeleteInfoCB               (Widget, XtPointer, XtPointer);
  130.     static void RefreshBreakpointsHP       (Agent *, void *, void *);
  131.     static void RecordingHP                (Agent *, void *, void *);
  132.  
  133.     static void UpdateBreakpointButtonsCB (Widget, XtPointer, XtPointer);
  134.  
  135.     static void CheckScrollCB(Widget, XtPointer, XtPointer);
  136.     static void CheckScrollWorkProc(XtPointer, XtIntervalId *);
  137.  
  138.     static void CheckModificationCB        (Widget, XtPointer, XtPointer);
  139.  
  140.     static void StackDialogPoppedDownCB    (Widget, XtPointer, XtPointer);
  141.     static void CodeDialogPoppedDownCB     (Widget, XtPointer, XtPointer);
  142.     static void RegisterDialogPoppedDownCB (Widget, XtPointer, XtPointer);
  143.     static void ThreadDialogPoppedDownCB   (Widget, XtPointer, XtPointer);
  144.  
  145.     static void SelectFrameCB    (Widget, XtPointer, XtPointer);
  146.     static void SelectRegisterCB (Widget, XtPointer, XtPointer);
  147.     static void SelectThreadCB   (Widget, XtPointer, XtPointer);
  148.     static void ThreadCommandCB  (Widget, XtPointer, XtPointer);
  149.  
  150.     static void SetWatchModeCB(Widget, XtPointer, XtPointer);
  151.     static void ActivateGlyphCB(Widget, XtPointer, XtPointer);
  152.  
  153.     // Set shell title
  154.     static void update_title();
  155.  
  156.     // Return height of a text line
  157.     static int line_height(Widget text_w);
  158.  
  159.     // Create text or code widget
  160.     static void create_text(Widget parent,
  161.                 const string& base, bool editable,
  162.                 Widget& form, Widget& text);
  163.  
  164.     // Refresh displays
  165.     static void refresh_bp_disp();
  166.     static void refresh_source_bp_disp();
  167.     static void refresh_code_bp_disp();
  168.  
  169.     // Clear breakpoint helpers
  170.     static void clearBP(void *client_data, XtIntervalId *timer);
  171.     static void clearJumpBP(const string& answer, void *client_data);
  172.  
  173.     // Move/Copy breakpoint NR to ADDRESS; return true if changed
  174.     static bool move_bp(int nr, const string& address, Widget origin = 0,
  175.             bool copy = false);
  176.     static bool copy_bp(int nr, const string& address, Widget origin = 0)
  177.     {
  178.     return move_bp(nr, address, origin, true);
  179.     }
  180.  
  181.     // Position history
  182.     static void add_current_to_history();
  183.     static void add_position_to_history(const string& file_name, 
  184.                     int line, bool stopped);
  185.  
  186.     // Set condition of breakpoints NRS to COND.
  187.     // * If COND is char(-1), preserve old condition.
  188.     // * If MAKE_FALSE is >= 0, disable breakpoint by making 
  189.     //   the condition false.
  190.     // * If MAKE_FALSE is == 0, enable breakpoint by restoring
  191.     //   the original condition.
  192.     // * Otherwise, preserve the condition state.
  193.     static void _set_bps_cond(IntArray& nrs, string cond, 
  194.                   int make_false, Widget origin);
  195.  
  196.     // Set condition of breakpoints NRS to COND.
  197.     inline static void set_bps_cond(IntArray& nrs, string cond,
  198.                     Widget origin = 0)
  199.     {
  200.     _set_bps_cond(nrs, cond, -1, origin);
  201.     }
  202.  
  203.     // Enable and disable breakpoints via conditions.
  204.     inline static void set_bps_cond_enabled(IntArray& nrs, bool enabled,
  205.                         Widget origin = 0)
  206.     {
  207.     _set_bps_cond(nrs, char(-1), enabled ? 0 : 1, origin);
  208.     }
  209.  
  210.     // Custom calls
  211.     inline static void enable_bps_cond(IntArray& nrs, Widget origin = 0)
  212.     {
  213.     set_bps_cond_enabled(nrs, true, origin);
  214.     }
  215.     inline static void disable_bps_cond(IntArray& nrs, Widget origin = 0)
  216.     {
  217.     set_bps_cond_enabled(nrs, false, origin);
  218.     }
  219.  
  220.     // Find the line number at POS.  LINE_NR becomes the line number
  221.     // at POS.  IN_TEXT becomes true iff POS is in the source area.
  222.     // BP_NR is the number of the breakpoint at POS (none: 0).  Return
  223.     // false iff failure.
  224.     static bool get_line_of_pos (Widget w,
  225.                  XmTextPosition pos,
  226.                  int& line_nr,
  227.                  string& address,
  228.                  bool& in_text,
  229.                  int& bp_nr);
  230.  
  231.     // Find word around POS.  STARTPOS is the first character, ENDPOS
  232.     // is the last character in the word.
  233.     static void find_word_bounds (Widget w,
  234.                   const XmTextPosition pos,
  235.                   XmTextPosition& startpos,
  236.                   XmTextPosition& endpos);
  237.  
  238.     //-----------------------------------------------------------------------
  239.     // Action procedures
  240.     //-----------------------------------------------------------------------
  241.     static void srcpopupAct       (Widget, XEvent*, String*, Cardinal*);
  242.     static void startSelectWordAct(Widget, XEvent*, String*, Cardinal*);
  243.     static void endSelectWordAct  (Widget, XEvent*, String*, Cardinal*);
  244.     static void updateGlyphsAct   (Widget, XEvent*, String*, Cardinal*);
  245.     static void dragGlyphAct      (Widget, XEvent*, String*, Cardinal*);
  246.     static void followGlyphAct    (Widget, XEvent*, String*, Cardinal*);
  247.     static void dropGlyphAct      (Widget, XEvent*, String*, Cardinal*);
  248.     static void deleteGlyphAct    (Widget, XEvent*, String*, Cardinal*);
  249.     static void doubleClickAct    (Widget, XEvent*, String*, Cardinal*);
  250.     static void setArgAct         (Widget, XEvent*, String*, Cardinal*);
  251.  
  252.     //-----------------------------------------------------------------------
  253.     // Timer procedures
  254.     //-----------------------------------------------------------------------
  255.     static void setSelection(XtPointer client_data, XtIntervalId *timer);
  256.  
  257.     //-----------------------------------------------------------------------
  258.     // Action decls
  259.     //-----------------------------------------------------------------------
  260.     static XtActionsRec actions [];
  261.  
  262.     //-----------------------------------------------------------------------
  263.     // Menus
  264.     //-----------------------------------------------------------------------
  265.     static MMDesc line_popup[];
  266.     static MMDesc address_popup[];
  267.     static MMDesc bp_popup[];
  268.     static MMDesc text_popup[];
  269.     static MMDesc bp_area[];
  270.  
  271.     static void set_text_popup_label(int item, const string& arg, bool sens);
  272.     static void set_text_popup_resource(int item, const string& arg);
  273.  
  274.     //-----------------------------------------------------------------------
  275.     // Data
  276.     //-----------------------------------------------------------------------
  277.     static bool checking_scroll;
  278.  
  279.     static Widget toplevel_w;     // Top-level widget
  280.  
  281.     static Widget source_form_w; // Form around text and glyphs
  282.     static Widget source_text_w; // Source text
  283.     static Widget code_form_w;   // Form around Machine code and glyphs
  284.     static Widget code_text_w;   // Machine code text
  285.  
  286.     static Widget edit_breakpoints_dialog_w; // Dialog for editing breakpoints
  287.     static Widget breakpoint_list_w;         // The breakpoint list
  288.  
  289.     static Widget stack_dialog_w;            // Dialog for viewing the stack
  290.     static Widget frame_list_w;              // The frame list
  291.     static Widget up_w;                      // The `Up' button
  292.     static Widget down_w;                    // The `Down' button
  293.     static bool stack_dialog_popped_up;         // True if the stack is visible
  294.  
  295.     static Widget register_dialog_w;          // Dialog for registers
  296.     static Widget register_list_w;            // Register list inside
  297.     static Widget int_registers_w;            // Display integer registers
  298.     static Widget all_registers_w;            // Display all registers
  299.     static bool register_dialog_popped_up;    // True if registers are visible
  300.  
  301.     static Widget thread_dialog_w;            // Dialog for threads
  302.     static Widget thread_list_w;              // Thread list inside
  303.     static bool thread_dialog_popped_up;      // True if registers are visible
  304.  
  305.     static bool display_glyphs;                  // Display glyphs?
  306.     static bool display_line_numbers;          // Display line numbers?
  307.     
  308.     static bool disassemble;                  // Disassemble code?
  309.     static bool all_registers;                  // Show all registers?
  310.     static bool at_lowest_frame;              // Are we at lowest frame?
  311.     static bool signal_received;          // Did we receive a signal?
  312.  
  313.     static WatchMode selected_watch_mode;     // Last selected watch mode
  314.  
  315.     // Tab width
  316.     static int tab_width;
  317.  
  318.     // The breakpoint map
  319.     static BreakPointMap bp_map;
  320.  
  321.     // File attributes
  322.     static string current_file_name;
  323.     static int    line_count;
  324.     static IntIntArrayAssoc bps_in_line;
  325.     static TextPositionArray _pos_of_line;
  326.     static StringArray bp_addresses;
  327.     static XmTextPosition pos_of_line(int line);
  328.  
  329.     // True iff breakpoint BP is in current file (at LINE, if given)
  330.     static bool bp_matches(BreakPoint *bp, int line = 0);
  331.  
  332.     // True iff breakpoint BP is in FILE (at LINE, if given)
  333.     static bool bp_matches(BreakPoint *bp, const string& file, int line = 0);
  334.  
  335.     // True iff FILE1 is equal to FILE2
  336.     static bool file_matches(const string& file1, const string& file2);
  337.  
  338.     // True iff the base names of FILE1 and FILE2 are equal
  339.     static bool base_matches(const string& file1, const string& file2);
  340.  
  341.     // True iff FILE is the currently loaded file
  342.     static bool is_current_file(const string& file);
  343.  
  344.     static StringStringAssoc file_cache;
  345.     static StringOriginAssoc origin_cache;
  346.     static CodeCache code_cache;
  347.  
  348.     // The current source text.
  349.     static string current_source;
  350.  
  351.     // The current frame number.  (-1 if none)
  352.     static int current_frame;
  353.  
  354.     // The origin of the current source text.
  355.     static SourceOrigin current_origin;
  356.  
  357.     // The current assembler code.
  358.     static string current_code;
  359.     static string current_code_start;
  360.     static string current_code_end;
  361.  
  362.     // Return current source name (name under this source is known to GDB)
  363.     static StringStringAssoc source_name_cache;
  364.     static string current_source_name();
  365.  
  366.     // File name of current source (for JDB)
  367.     static StringStringAssoc file_name_cache;
  368.  
  369.     // Files listed as erroneous
  370.     static StringArray bad_files;
  371.     static bool new_bad_file(const string& file_name);
  372.     static void post_file_error(const string& file_name,
  373.                 string text, String name = 0,
  374.                 Widget origin = 0);
  375.     static void post_file_warning(const string& file_name,
  376.                   string text, String name = 0,
  377.                   Widget origin = 0);
  378.  
  379.     // The current directory
  380.     static string current_pwd;
  381.  
  382.     // The current JDB search path
  383.     static string current_class_path;
  384.  
  385.     // The current JDB threadgroup.
  386.     static string current_threadgroup;
  387.  
  388.     // Some positions in source text.
  389.     static XmTextPosition last_top;
  390.     static XmTextPosition last_pos;
  391.     static XmTextPosition last_start_highlight;
  392.     static XmTextPosition last_end_highlight;
  393.  
  394.     // Some positions in assembler code.
  395.     static XmTextPosition last_top_pc;
  396.     static XmTextPosition last_pos_pc;
  397.     static XmTextPosition last_start_highlight_pc;
  398.     static XmTextPosition last_end_highlight_pc;
  399.  
  400.     static string last_execution_file;
  401.     static int    last_execution_line;
  402.     static string last_execution_pc;
  403.     static string last_shown_pc;
  404.     static void _show_execution_position (string file, int line, 
  405.                       bool silent, bool stopped);
  406.  
  407.     // Last frame position
  408.     static int last_frame_pos;
  409.     static bool frame_pos_locked;
  410.  
  411.     // Read source text
  412.     static String read_local(const string& file_name, long& length,
  413.                  bool silent);
  414.     static String read_remote(const string& file_name, long& length,
  415.                   bool silent);
  416.     static String read_class(const string& class_name, 
  417.                  string& file_name, SourceOrigin& origin,
  418.                  long& length, bool silent);
  419.     static String read_from_gdb(const string& source_name, long& length,
  420.                 bool silent);
  421.  
  422.     static String read_indented(string& file_name, long& length,
  423.                 SourceOrigin& origin,
  424.                 bool silent = false);
  425.     static int read_current(string& file_name, 
  426.                 bool force_reload = false,
  427.                 bool silent = false);
  428.  
  429.     // Set insertion position to POS.
  430.     static void SetInsertionPosition(Widget w, XmTextPosition pos, 
  431.                      bool fromTop = false);
  432.  
  433.     // Make position POS visible.
  434.     static void ShowPosition(Widget w, XmTextPosition pos, 
  435.                  bool fromTop = false);
  436.  
  437.     static bool is_source_widget(Widget w);
  438.     static bool is_code_widget(Widget w);
  439.     static string& current_text(Widget w);
  440.  
  441.     // Return current breakpoint indent amount.  If POS is given, add
  442.     // the whitespace from POS.
  443.     static int indent_amount(Widget w, int pos = -1);
  444.  
  445.     // Format `where' and `thread' lines
  446.     static void setup_where_line(string& line);
  447.  
  448.     // Assembler code display routines.
  449.     static XmTextPosition find_pc(const string& pc);
  450.     static void refresh_codeOQC(const string& answer, void *data);
  451.     static void set_code(const string& code,
  452.              const string& start,
  453.              const string& end);
  454.  
  455.     static MString help_on_bp(int bp, bool detailed);
  456.  
  457.     // Disassembler stuff
  458.     // Normalize ADDRESS
  459.     static void normalize_address(string& address);
  460.  
  461.     // Make address from ADDRESS
  462.     static string make_address(long address);
  463.  
  464.     // Return FUNCTION and OFFSET at ADDRESS
  465.     static void get_func_at(const string& address, string& func, int& offset);
  466.     
  467.     // Check if function at PC is larger than MAX_SIZE
  468.     static bool function_is_larger_than(string pc, int max_size);
  469.  
  470.     // Breakpoint properties.
  471.     static void update_properties_panel(BreakpointPropertiesInfo *info);
  472.     static void update_properties_panels();
  473.     static void move_breakpoint_properties(int old_bp, int new_bp);
  474.     static void copy_breakpoint_properties(int old_bp, int new_bp);
  475.  
  476.     //-----------------------------------------------------------------------
  477.     // Glyphs
  478.     //-----------------------------------------------------------------------
  479.  
  480.     // Create a pixmap from BITS suitable for the widget W
  481.     static Pixmap pixmap(Widget w, unsigned char *bits, int width, int height);
  482.  
  483.     // Create glyph in FORM_W named NAME from given BITS
  484.     static Widget create_glyph(Widget form_w, String name, 
  485.                    unsigned char *bits, int width, int height);
  486.  
  487.     // Map glyph W in (X, Y)
  488.     static void map_glyph(Widget& w, Position x, Position y);
  489.  
  490.     // Unmap glyph W
  491.     static void unmap_glyph(Widget w);
  492.  
  493.     // Report glyph state (for debugging)
  494.     static void log_glyph(Widget w, int n = -1);
  495.     static void log_glyphs();
  496.  
  497.     // Return position during glyph drag and drop
  498.     static XmTextPosition glyph_position(Widget w, XEvent *e, 
  499.                      bool normalize = true);
  500.  
  501.     // Get relative coordinates of GLYPH in TEXT
  502.     static void translate_glyph_pos(Widget glyph, Widget text, int& x, int& y);
  503.  
  504.     // Data associated with current drag operation
  505.     // The Glyph being dragged
  506.     static Widget current_drag_origin;
  507.  
  508.     // The breakpoint being dragged, or 0 if execution position
  509.     static int current_drag_breakpoint;
  510.  
  511. public:
  512.     // Horizontal arrow offset (pixels)
  513.     static int arrow_x_offset;
  514.  
  515.     // Horizontal breakpoint symbol offset (pixels)
  516.     static int stop_x_offset;
  517.  
  518.     // Additional offset for multiple breakpoints (pixels)
  519.     static int multiple_stop_x_offset;
  520.  
  521. private:
  522.     // Glyph locations: X[0] is source, X[1] is code
  523.     static Widget plain_arrows[2];
  524.     static Widget grey_arrows[2];
  525.     static Widget past_arrows[2];
  526.     static Widget signal_arrows[2];
  527.     static Widget drag_arrows[2];
  528.     static WidgetArray plain_stops[2];
  529.     static WidgetArray grey_stops[2];
  530.     static WidgetArray plain_conds[2];
  531.     static WidgetArray grey_conds[2];
  532.     static WidgetArray plain_temps[2];
  533.     static WidgetArray grey_temps[2];
  534.     static Widget drag_stops[2];
  535.     static Widget drag_conds[2];
  536.     static Widget drag_temps[2];
  537.  
  538.     // Map stop sign in W at position POS.  Get widget from STOPS[COUNT];
  539.     // store location in POSITIONS.  Return mapped widget (0 if none)
  540.     static Widget map_stop_at(Widget w, XmTextPosition pos,
  541.                   WidgetArray& stops, int& count,
  542.                   TextPositionArray& positions);
  543.  
  544.     // Map arrow/drag arrow/drag stop in W at POS.  If ORIGIN is
  545.     // given, use colors from ORIGIN.
  546.     static Widget map_arrow_at     (Widget w, XmTextPosition pos);
  547.     static Widget map_drag_arrow_at(Widget w, XmTextPosition pos,
  548.                     Widget origin = 0);
  549.     static inline void unmap_drag_arrow(Widget w)
  550.     {
  551.     map_drag_arrow_at(w, XmTextPosition(-1));
  552.     }
  553.     static Widget map_drag_stop_at (Widget w, XmTextPosition pos,
  554.                     Widget origin = 0);
  555.     static inline void unmap_drag_stop(Widget w)
  556.     {
  557.     map_drag_stop_at(w, XmTextPosition(-1));
  558.     }
  559.     static void copy_colors(Widget w, Widget origin);
  560.  
  561.     // True if code/source glyphs need to be updated
  562.     static bool update_code_glyphs;
  563.     static bool update_source_glyphs;
  564.  
  565.     // Helping background procedures
  566.     static void UpdateGlyphsWorkProc(XtPointer, XtIntervalId *);
  567.     static Boolean CreateGlyphsWorkProc(XtPointer);
  568.  
  569.     // Update all glyphs now (without delay).
  570.     static void update_glyphs_now();
  571.  
  572.     // Return all glyphs that would change
  573.     static const WidgetArray& glyphs_to_be_updated();
  574.  
  575.     // Helpers needed by glyphs_to_be_changed
  576.     static bool change_glyphs;
  577.     static WidgetArray changed_glyphs;
  578.  
  579.     // Callback when state has been reset
  580.     static void reset_done(const string& answer, void *data);
  581.  
  582.     static int max_breakpoint_number_seen;
  583.  
  584.     // Return breakpoint number of BP_INFO; 0 if new; -1 if none
  585.     static int breakpoint_number(const string& bp_info);
  586.  
  587.     // Get numbers of selected breakpoints
  588.     static void getBreakpointNumbers(IntArray& numbers);
  589.  
  590. public:
  591.     // Constructor
  592.     SourceView(Widget parent);
  593.  
  594.     // Shell constructor
  595.     void create_shells();
  596.  
  597.     // Set current execution position, based on the GDB position info
  598.     // POSITION; no arg means clear current position.
  599.     // STOPPED indicates that the program just stopped.
  600.     // SIGNALED indicates that the program received a signal.
  601.     static void show_execution_position (string position = "",
  602.                      bool stopped    = false,
  603.                      bool signaled   = false,
  604.                      bool silent     = false);
  605.  
  606.     // Unset current execution position (program terminated)
  607.     static void clear_execution_position();
  608.  
  609.     // Set cursor position, based on the GDB position info POSITION
  610.     static void show_position (string position, bool silent = false);
  611.  
  612.     // Set pc position to PC.
  613.     // If MODE is given, highlight PC line.
  614.     // STOPPED indicates that the program just stopped.
  615.     // SIGNALED indicates that the program just received a signal.
  616.     static void show_pc (const string& pc, 
  617.              XmHighlightMode mode = XmHIGHLIGHT_NORMAL,
  618.              bool stopped  = false,
  619.              bool signaled = false);
  620.  
  621.     // Handle breakpoint information
  622.     static void process_info_bp         (string& info_output,
  623.                      const string& break_arg = "");
  624.  
  625.     // Handle 'info line' information
  626.     static void process_info_line_main  (string& info_output);
  627.  
  628.     // Handle 'where' information
  629.     static void process_where           (string& where_output);
  630.  
  631.     // Handle 'frame' information
  632.     static void process_frame           (string& frame_output);
  633.     static void process_frame           (int frame_nr);
  634.  
  635.     // Handle 'info register' information
  636.     static void process_registers       (string& info_register_output);
  637.  
  638.     // Handle 'info threads' information
  639.     static void process_threads         (string& info_threads_output);
  640.  
  641.     // Handle `info breakpoints' information
  642.     static void process_breakpoints     (string& info_breakpoints_output);
  643.  
  644.     // Handle 'disassemble' information
  645.     static void process_disassemble     (const string& disassemble_output);
  646.  
  647.     // Handle 'pwd' information
  648.     static void process_pwd             (string& pwd_output);
  649.  
  650.     // Handle 'use' information
  651.     static void process_use             (string& use_output);
  652.  
  653.     // Process the remainder of an output line
  654.     static void check_remainder         (string& info_output);
  655.  
  656.     // Set frame manually: ARG = 0: POS, ARG = +/- N: down/up N levels
  657.     static void set_frame_pos(int arg, int pos = 0);
  658.  
  659.     // Set frame manually to function FUNC; return True if found
  660.     static bool set_frame_func(const string& func);
  661.  
  662.     // Find S in current source; select it at TIME.
  663.     enum SearchDirection {forward, backward};
  664.  
  665.     static void find(const string& s,
  666.              SearchDirection direction = forward,
  667.              bool words_only = false,
  668.              bool case_sensitive = false,
  669.              Time time = CurrentTime);
  670.  
  671.     // Locate function S; if S is omitted, locate last execution position.
  672.     static void lookup(string s, bool silent = false);
  673.  
  674.     // Read file FILE_NAME; place cursor at INITIAL_LINE.
  675.     static void read_file(string file_name,
  676.               int initial_line = 1,
  677.               bool force_reload = false,
  678.               bool silent = false);
  679.  
  680.     // Reload current file
  681.     static void reload();
  682.  
  683.     // Return source cursor position in <source>:<line> format.
  684.     static string line_of_cursor();
  685.  
  686.     // Return file cursor position in <file>:<line> format.
  687.     static string file_of_cursor();
  688.  
  689.     // Callbacks for menu bar
  690.     static void EditBreakpointsCB(Widget, XtPointer, XtPointer);
  691.     static void ViewStackFramesCB(Widget, XtPointer, XtPointer);
  692.     static void ViewRegistersCB(Widget, XtPointer, XtPointer);
  693.     static void ViewThreadsCB(Widget, XtPointer, XtPointer);
  694.  
  695.     // Refreshing dialogs
  696.     static void refresh_stack_frames();
  697.     static void refresh_registers();
  698.     static void refresh_threads(bool all_threadgroups);
  699.  
  700.     // Refreshing commands
  701.     static string refresh_registers_command();
  702.  
  703.     // Check whether specific commands are required at next prompt
  704.     static bool where_required();
  705.     static bool register_required();
  706.     static bool thread_required();
  707.  
  708.     // Check whether we can go up or down
  709.     static bool can_go_up();
  710.     static bool can_go_down();
  711.  
  712.     // Check whether source files and code are to be cached
  713.     static bool cache_source_files;
  714.     static bool cache_machine_code;
  715.  
  716.     // Set whether glyphs are to be displayed
  717.     static void set_display_glyphs(bool value);
  718.  
  719.     // Set whether line numbers are to be displayed
  720.     static void set_display_line_numbers(bool value);
  721.  
  722.     // Set whether machine code is to be displayed
  723.     static void set_disassemble(bool value);
  724.  
  725.     // Set whether all registers are to be displayed
  726.     static void set_all_registers(bool value);
  727.  
  728.     // Set the tab width
  729.     static void set_tab_width(int width);
  730.  
  731.     // Set the indentation
  732.     static void set_indent(int source_indent, int code_indent);
  733.  
  734.     // Set the max number of glyphs
  735.     static void set_max_glyphs(int max_glyphs);
  736.  
  737.     // Whether to cache glyph images
  738.     static bool cache_glyph_images;
  739.  
  740.     // Maximum length of expr in source popup
  741.     static int max_popup_expr_length;
  742.  
  743.     // The indenting amounts
  744.     static int source_indent_amount;         // Source
  745.     static int code_indent_amount;           // Machine code
  746.     static int line_indent_amount;           // Extra columns for line numbers
  747.     static int script_indent_amount;         // Minimum for scripts
  748.  
  749.     // The scrolling amounts
  750.     static int lines_above_cursor;           // Lines to keep before cursor
  751.     static int lines_below_cursor;           // Lines to keep after cursor
  752.  
  753.     // The maximum breakpoint number when saving states
  754.     static int max_breakpoint_number;
  755.  
  756.     // The next breakpoint number (the highest last seen + 1)
  757.     static int next_breakpoint_number();
  758.  
  759.     // Create or clear a breakpoint at position A.  If SET, create a
  760.     // breakpoint; if not SET, delete it.  If TEMP, make the
  761.     // breakpoint temporary.  If COND is given, break only iff COND
  762.     // evals to true.  ORIGIN is the origin.
  763.     static void set_bp(const string& a, bool set, bool temp, 
  764.                const string& cond = "", Widget origin = 0);
  765.  
  766.     // Custom calls
  767.     static void create_bp(const string& a, Widget origin = 0);
  768.     static void create_temp_bp(const string& a, Widget origin = 0);
  769.     static void clear_bp(const string& a, Widget origin = 0);
  770.  
  771.     // Create a temporary breakpoint at A and continue execution.
  772.     static void temp_n_cont(const string& a, Widget origin = 0);
  773.  
  774.     // Enable/Disable/Delete/Edit breakpoints
  775.     static void enable_bps     (IntArray& nrs, Widget origin = 0);
  776.     static void disable_bps    (IntArray& nrs, Widget origin = 0);
  777.     static void delete_bps     (IntArray& nrs, Widget origin = 0);
  778.     static void edit_bps       (IntArray& nrs, Widget origin = 0);
  779.  
  780.     inline static void enable_bp(int nr, Widget origin = 0)
  781.     {
  782.     IntArray nrs;
  783.     nrs += nr;
  784.     enable_bps(nrs, origin);
  785.     }
  786.  
  787.     inline static void disable_bp(int nr, Widget origin = 0)
  788.     {
  789.     IntArray nrs;
  790.     nrs += nr;
  791.     disable_bps(nrs, origin);
  792.     }
  793.  
  794.     inline static void delete_bp(int nr, Widget origin = 0)
  795.     {
  796.     IntArray nrs;
  797.     nrs += nr;
  798.     delete_bps(nrs, origin);
  799.     }
  800.  
  801.     inline static void edit_bp(int nr, Widget origin = 0)
  802.     {
  803.     IntArray nrs;
  804.     nrs += nr;
  805.     edit_bps(nrs, origin);
  806.     }
  807.  
  808.     // Set breakpoint commands
  809.     static void set_bp_commands(IntArray& nrs, const StringArray& commands,
  810.                 Widget origin = 0);
  811.     inline static void set_bp_commands(int nr, const StringArray& commands,
  812.                        Widget origin = 0)
  813.     {
  814.     IntArray nrs;
  815.     nrs += nr;
  816.     set_bp_commands(nrs, commands, origin);
  817.     }
  818.  
  819.     static string numbers(const IntArray& nrs);
  820.     static string all_numbers(const IntArray& nrs);
  821.     static bool all_bps(const IntArray& nrs);
  822.         
  823.     // Move PC to ADDRESS; return true if changed.
  824.     static bool move_pc(const string& address, Widget origin = 0);
  825.  
  826.     // Return `clear ARG' command.  If CLEAR_NEXT is set, attempt to
  827.     // guess the next event number and clear this one as well.
  828.     // Consider only breakpoints whose number is >= FIRST_BP.
  829.     static string clear_command(string arg, bool clear_next = false,
  830.                 int first_bp = 0);
  831.     // Return `delete N' command.
  832.     static string delete_command(int bp_nr);
  833.  
  834.     // Return `{ COMMAND; }'
  835.     static string command_list(string cmd);
  836.  
  837.     // Return current directory
  838.     static string pwd() { return current_pwd; }
  839.  
  840.     // Return current class path
  841.     static string class_path() { return current_class_path; }
  842.  
  843.     // Return current source file name
  844.     static string name_of_source() { return current_source_name(); }
  845.  
  846.     // Return source text and machine code widget (read-only)
  847.     static Widget source() { return source_text_w; }
  848.     static Widget code()   { return code_text_w; }
  849.  
  850.     // Return source and machine code forms (read-only)
  851.     static Widget source_form() { return source_form_w; }
  852.     static Widget code_form()   { return code_form_w; }
  853.  
  854.     // Clear caches
  855.     static void clear_file_cache();
  856.     static void clear_code_cache();
  857.  
  858.     // Get the line at POSITION
  859.     static string get_line(string position);
  860.  
  861.     // Get a help string for GLYPH; return 0 if none
  862.     static MString help_on_glyph(Widget glyph, bool detailed);
  863.     static MString help_on_pos(Widget w, XmTextPosition pos, 
  864.                    XmTextPosition& ref, bool detailed);
  865.  
  866.     // Get the position of breakpoint NUM
  867.     static string bp_pos(int num);
  868.  
  869.     // Return the breakpoint at POS (0 if none)
  870.     static BreakPoint *breakpoint_at(string pos);
  871.  
  872.     // Return the watchpoint at EXPR (0 if none)
  873.     static BreakPoint *watchpoint_at(string expr);
  874.  
  875.     // Get the word at position of EVENT
  876.     static string get_word_at_event(Widget w,
  877.                     XEvent *event,
  878.                     XmTextPosition& first_pos,
  879.                     XmTextPosition& last_pos);
  880.  
  881.     // Get the word at position POS
  882.     static string get_word_at_pos(Widget w,
  883.                   XmTextPosition pos,
  884.                   XmTextPosition& startpos,
  885.                   XmTextPosition& endpos);
  886.  
  887.     // Examine DDD state
  888.  
  889.     // True iff we have some source text
  890.     static bool have_source() { return current_source.length() != 0; }
  891.  
  892.     // True iff we have some execution position
  893.     static bool have_exec_pos() { return last_execution_file != ""; }
  894.  
  895.     // True iff we have some program counter
  896.     static bool have_pc() { return last_execution_pc != ""; }
  897.  
  898.     // True iff we have some selection
  899.     static bool have_selection();
  900.  
  901.     // True iff we need the current program counter
  902.     static bool need_pc() { return disassemble; }
  903.  
  904.     // Return current frame (-1 if unknown)
  905.     static int get_frame() { return current_frame; }
  906.  
  907.     // Return debugger command(s) to restore current state (breakpoints, etc.)
  908.     static bool get_state(ostream& os);
  909.  
  910.     // Clear entire state, using GDB commands
  911.     static void reset();
  912.  
  913.     // Helpers
  914.     static string full_path(string file);
  915.     static const char *basename(const char *);
  916.  
  917.     // Edit breakpoint properties.
  918.     static void edit_breakpoint_properties(int bp_nr);
  919.  
  920.     // Update glyphs for widget W (0: all)
  921.     static void update_glyphs(Widget w = 0);
  922.  
  923.     // Goto history entry
  924.     static void goto_entry(const string& file, int line,
  925.                const string& address, bool exec_pos);
  926.  
  927.     // Set or unset showing earlier state
  928.     static void showing_earlier_state(bool set);
  929. };
  930.  
  931. inline void SourceView::create_bp(const string& a, Widget w)
  932. {
  933.     set_bp(a, true, false, "", w);
  934. }
  935.  
  936. inline void SourceView::create_temp_bp(const string& a, Widget w)
  937. {
  938.     set_bp(a, true, true, "", w);
  939. }
  940.  
  941. inline void SourceView::clear_bp(const string& a, Widget w)
  942. {
  943.     set_bp(a, false, false, "", w);
  944. }
  945.  
  946. #endif // _DDD_SourceView_h
  947. // DON'T ADD ANYTHING BEHIND THIS #endif
  948.