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 / DispNode.h < prev    next >
C/C++ Source or Header  |  1998-11-17  |  7KB  |  233 lines

  1. // $Id: DispNode.h,v 1.41 1998/11/17 10:51:16 zeller Exp $
  2. // Store information about a single display espression
  3.  
  4. // Copyright (C) 1995 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_DispNode_h
  30. #define _DDD_DispNode_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. //-----------------------------------------------------------------------------
  37. // A DispNode keeps all information about a single data display
  38. //-----------------------------------------------------------------------------
  39.  
  40. // Misc includes
  41. #include "strclass.h"
  42. #include "assert.h"
  43. #include "bool.h"
  44. #include "GraphNode.h"
  45. #include "HandlerL.h"
  46. #include "BoxGraphN.h"
  47. #include "DispValue.h"
  48.  
  49. class DispBox;
  50.  
  51. // Event types
  52. const unsigned DispNode_Disabled   = 0;
  53.  
  54. const unsigned DispNode_NTypes  = DispNode_Disabled + 1;
  55.  
  56. //-----------------------------------------------------------------------------
  57. // Non-class functions
  58. //-----------------------------------------------------------------------------
  59.  
  60. // Return true iff S is a user command display (`status display')
  61. inline bool is_user_command(const string& s)
  62. {
  63.     return s.length() >= 2 && s[0] == '`' && s[s.length() - 1] == '`';
  64. }
  65.  
  66. // Return user command from S
  67. string user_command(const string& s);
  68.  
  69. //-----------------------------------------------------------------------------
  70. // The DispNode class
  71. //-----------------------------------------------------------------------------
  72.  
  73. class DispNode: public BoxGraphNode {
  74. public:
  75.     DECLARE_TYPE_INFO
  76.  
  77. private:
  78.     int           mydisp_nr;          // Display number
  79.     string        myname;          // Display expression
  80.     string        myaddr;          // Location of expression
  81.     string        myscope;          // Program location where created
  82.     string        mydepends_on;          // Display we depend upon (when deferred)
  83.     bool          myactive;          // Flag: is display active (in scope)?
  84.     bool          saved_node_hidden;  // Saved `hidden' flag of node
  85.     bool          mydeferred;          // Flag: is display deferred?
  86.     int           myclustered;          // Flag: is display clustered?
  87.     bool          myplotted;          // Flag: is display plotted?
  88.     bool          myconstant;          // Flag: is display constant?
  89.     DispValue*    disp_value;          // Associated value
  90.     DispValue*    myselected_value;   // Selected value within DISP_VALUE
  91.     DispBox*      disp_box;          // Associated box within DISP_VALUE
  92.     int           mylast_change;      // Last value or address change
  93.     int           mylast_refresh;     // Last refresh
  94.  
  95.     static int tics;              // Shared change and refresh counter
  96.  
  97. public:
  98.     int           alias_of;          // Alias of another display
  99.  
  100. protected:
  101.     static HandlerList handlers;
  102.     static class TagBox *findTagBox(const Box *box, DispValue *dv);
  103.     
  104.     virtual string str() const { return myname; }
  105.  
  106.     DispNode(const DispNode& node);
  107.  
  108.     virtual void refresh_plot_state() const;
  109.  
  110. private:
  111.     // Prohibit assignment
  112.     DispNode& operator = (const DispNode&) { assert(0); return *this; }
  113.  
  114. public:
  115.     // Create a new display numbered DISP_NR, named NAME, created at
  116.     // SCOPE (a function name or "") with a value of VALUE.
  117.     DispNode(int disp_nr,
  118.          const string& name,
  119.          const string& scope,
  120.          const string& value,
  121.          bool plotted);
  122.  
  123.     // Destructor
  124.     ~DispNode();
  125.  
  126.     // Duplication
  127.     GraphNode *dup() const
  128.     {
  129.     return new DispNode(*this);
  130.     }
  131.  
  132.     // Resources
  133.     int disp_nr()  const             { return mydisp_nr; }
  134.     const string& name() const       { return myname; }
  135.     const string& addr() const       { return myaddr; }
  136.     const string& scope() const      { return myscope; }
  137.     const string& depends_on() const 
  138.     {
  139.     assert(deferred()); 
  140.     return mydepends_on;
  141.     }
  142.     string& depends_on()
  143.     { 
  144.     assert(deferred()); 
  145.     return mydepends_on;
  146.     }
  147.  
  148.     bool enabled()  const { return value() != 0 && value()->enabled(); }
  149.     bool disabled() const { return !enabled(); }
  150.     bool active() const   { return myactive; }
  151.     bool deferred() const { return mydeferred; }
  152.     bool& deferred()      { return mydeferred; }
  153.     int clustered() const { return myclustered; }
  154.     bool plotted() const  { return myplotted; }
  155.     bool& plotted()       { return myplotted; }
  156.     bool constant() const { return myconstant; }
  157.     bool& constant()      { return myconstant; }
  158.  
  159.     int last_change() const  { return mylast_change; }
  160.     int last_refresh() const { return mylast_refresh; }
  161.  
  162.     // These can be used to force updates
  163.     void set_last_change(int value = 0)  { mylast_change  = value; }
  164.     void set_last_refresh(int value = 0) { mylast_refresh = value; }
  165.  
  166.     bool is_user_command() const { return ::is_user_command(name()); }
  167.     string user_command() const  { return ::user_command(name()); }
  168.  
  169.     // Return `true' if this expression can be aliased
  170.     bool alias_ok() const;
  171.  
  172.     DispValue* value()          const { return disp_value; }
  173.     DispValue* selected_value() const { return myselected_value; }
  174.  
  175.     // Handlers
  176.     static void addHandler (unsigned    type,
  177.                 HandlerProc proc,
  178.                 void*       client_data = 0);
  179.  
  180.     static void removeHandler (unsigned    type,
  181.                    HandlerProc proc,
  182.                    void        *client_data = 0);
  183.  
  184.  
  185.  
  186.     // Update with NEW_VALUE; return false if value is unchanged
  187.     bool update (string& new_value);
  188.  
  189.     // Update address with NEW_ADDR
  190.     void set_addr(const string& new_addr);
  191.  
  192.     // Re-create the box from old DISP_VALUE
  193.     void refresh();
  194.  
  195.     // Highlights the box related to the display value DV
  196.     void select (DispValue *dv = 0);
  197.  
  198.     // Copy selection state from SRC
  199.     void copy_selection_state(const DispNode& src);
  200.  
  201.     // Disable and enable manually
  202.     void disable();
  203.     void enable();
  204.  
  205.     // Show and hide manually
  206.     void make_active();
  207.     void make_inactive();
  208.  
  209.     // Cluster display into TARGET
  210.     void cluster(int target);
  211.     inline void uncluster() { cluster(0); }
  212.  
  213.     // Toggle titles.  Return true iff changed.
  214.     bool set_title(bool set);
  215.  
  216.     // Print plots to FILENAME
  217.     void print_plots(const string& filename, 
  218.              const GraphGC& gc = GraphGC()) const;
  219. };
  220.  
  221. // Clustering stuff
  222.  
  223. // The command to use for clusters
  224. #define CLUSTER_COMMAND "displays"
  225.  
  226. inline bool is_cluster(DispNode *dn)
  227. {
  228.     return dn->is_user_command() && dn->user_command() == CLUSTER_COMMAND;
  229. }
  230.  
  231. #endif // _DDD_DispNode_h
  232. // DON'T ADD ANYTHING BEHIND THIS #endif
  233.