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

  1. // $Id: DispGraph.h,v 1.25 1998/11/17 11:22:33 zeller Exp $
  2. // Store information about all displayed display expressions
  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_DispGraph_h
  30. #define _DDD_DispGraph_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. //-----------------------------------------------------------------------------
  37. // The `DispGraph' class keeps all displayed display expressions
  38. //-----------------------------------------------------------------------------
  39.  
  40. // Misc includes
  41. #include "strclass.h"
  42. #include "bool.h" 
  43. #include "Graph.h" 
  44. #include "HandlerL.h"
  45. #include "LineGraphE.h"
  46. #include "PosGraphN.h"
  47. #include "GraphNPA.h"
  48. #include "DispNodeM.h"
  49.  
  50. //-----------------------------------------------------------------------------
  51.  
  52. enum Displaying {Both, Enabled, Disabled};
  53.  
  54. // Event types
  55. const unsigned DispGraph_Empty = 0;          // DispGraph is empty
  56. const unsigned NoEnabled  = DispGraph_Empty + 1;
  57. const unsigned NoDisabled = NoEnabled + 1;
  58.  
  59. const unsigned DispGraph_NTypes = NoDisabled + 1;
  60.  
  61. class DispGraph: public Graph {
  62. public:
  63.     DECLARE_TYPE_INFO
  64.  
  65. private:
  66.     DispNodeMap  idMap;
  67.     HandlerList  handlers;
  68.     bool         no_enabled;
  69.     bool         no_disabled;
  70.  
  71. public:
  72.     static bool hide_inactive_displays;
  73.  
  74.     // Constructor
  75.     DispGraph();
  76.  
  77.     // Clear all nodes
  78.     void clear();
  79.     
  80.     // Destructor
  81.     ~DispGraph();
  82.  
  83.     int count_all ()             const { return idMap.length(); }
  84.     int count_all (Displaying e) const;
  85.     int count_selected() const;
  86.     bool has_enabled() const { return !no_enabled; }
  87.     bool has_disabled() const { return !no_disabled; }
  88.  
  89.  
  90.     void addHandler (unsigned    type,
  91.              HandlerProc proc,
  92.              void*       client_data = 0);
  93.  
  94.     void removeHandler (unsigned    type,
  95.             HandlerProc proc,
  96.             void        *client_data = 0);
  97.     void callHandlers();
  98.  
  99.  
  100.     // Insert a new display DN named DISP_NR dependent on DEPENDS_ON.
  101.     // Return new display number, or 0 iff failure.
  102.     int insert(int disp_nr, DispNode* dn, int depends_on = 0);
  103.  
  104.     // Make DISP_NR an alias of ALIAS_DISP_NR.  Suppress
  105.     // ALIAS_DISP_NR.  Return true iff changed.
  106.     bool alias (Widget w, int disp_nr, int alias_disp_nr);
  107.  
  108.     // Un-alias ALIAS_DISP_NR.  Unsuppress ALIAS_DISP_NR.  Return true
  109.     // iff changed.
  110.     bool unalias (int alias_disp_nr);
  111.  
  112.     // (In)activate display NODE.  Return true iff changed.
  113.     bool make_active (DispNode *node);
  114.     bool make_inactive (DispNode *node);
  115.  
  116.     // (Un)cluster display NODE into CLUSTER
  117.     void cluster(DispNode *node, int cluster);
  118.     inline void uncluster(DispNode *node)
  119.     {
  120.     cluster(node, 0);
  121.     }
  122.  
  123.     // Determine default positions for NEW_NODE
  124.     BoxPoint default_pos(DispNode *new_node, Widget w, 
  125.              int depends_on = 0) const;
  126.  
  127.     // Delete DISP_NR; return false if non-existent
  128.     bool del (int disp_nr);
  129.  
  130.     // Return node of display DISP_NR
  131.     DispNode* get (int disp_nr) const { return idMap.get (disp_nr); }
  132.  
  133.     // Return number of display NAME
  134.     int get_by_name(const string& name) const;
  135.  
  136.     // Return number of node NODEPTR
  137.     int get_nr(BoxGraphNode *nodeptr) const;
  138.  
  139.     // Return true iff display has a display numbered DISP_NR
  140.     bool contains (int disp_nr) const { return idMap.contains (disp_nr); }
  141.     
  142.     // Return first/next node; return 0 if non-existent
  143.     DispNode* first (MapRef& ref, Displaying e = Both) const;
  144.     DispNode* next  (MapRef& ref, Displaying e = Both) const;
  145.  
  146.     // Return first/next node number; return 0 if non-existent
  147.     int first_nr (MapRef& ref, Displaying e = Both) const;
  148.     int next_nr  (MapRef& ref, Displaying e = Both) const;
  149.  
  150.     // Print graph to OS
  151.     void print(ostream& os, const GraphGC& gc = GraphGC()) const
  152.     {
  153.     Graph::print(os, gc);
  154.     }
  155.  
  156.     // Print plots to FILENAME
  157.     void print_plots(const string& filename, 
  158.              const GraphGC& gc = GraphGC()) const;
  159.  
  160.     // Refresh title settings
  161.     bool refresh_titles() const;
  162.  
  163. protected:
  164.     BoxPoint adjust_position (DispNode *new_node,
  165.                   Widget w,
  166.                   BoxPoint pos,
  167.                   BoxPoint offset,
  168.                   BoxPoint grid) const;
  169.  
  170.     // Add a new alias edge
  171.     void add_alias_edge(Widget w, int alias_disp_nr,
  172.             GraphNode *from, GraphNode *to,
  173.             EdgeAnnotation *anno);
  174.  
  175.     // Remove node or edge from memory as well as from graph
  176.     void delete_node(GraphNode *node);
  177.     void delete_edge(GraphEdge *edge);
  178.  
  179. private:
  180.     static void disp_node_disabledHP(void *, void *, void *);
  181.  
  182.     // Alias edge routing stuff
  183.     // True iff R->P1 and R->P2 have the same angle
  184.     static bool same_angle(const BoxPoint& r,
  185.                const BoxPoint& p1, const BoxPoint& p2);
  186.  
  187.     // True iff NODE is attached to an edge with the same angle as P
  188.     static bool has_angle(PosGraphNode *node, const BoxPoint& p);
  189.  
  190.     void add_edge(DispNode *from, DispNode *to);
  191.     
  192.     void add_direct_alias_edge(Widget w, int alias_disp_nr, 
  193.                    GraphNode *from, GraphNode *to,
  194.                    EdgeAnnotation *anno);
  195.     void add_routed_alias_edge(Widget w, int alias_disp_nr, 
  196.                    PosGraphNode *from, PosGraphNode *to,
  197.                    EdgeAnnotation *anno);
  198.  
  199.     bool is_hidden(Widget w, const BoxPoint& p) const;
  200.     static BoxPoint rotate_offset(const BoxPoint& p, int angle);
  201.  
  202.     // Check whether P1 and P2 are okay as hint positions for FROM and TO
  203.     bool hint_positions_ok(Widget w,
  204.                PosGraphNode *from, PosGraphNode *to,
  205.                const BoxPoint& p1, const BoxPoint& p2) const;
  206.  
  207.     // Find all hints in edges leading to NODE; store them in HINTS
  208.     static void find_hints_to(GraphNode *node, GraphNodePointerArray& hints);
  209.  
  210.     // Find all hints in edges coming from NODE; store them in HINTS
  211.     static void find_hints_from(GraphNode *node, GraphNodePointerArray& hints);
  212.  
  213.     // Hide/Unhide all alias edges of NODE according to its status
  214.     void update_alias_edges(DispNode *node);
  215. };
  216.  
  217. #endif // _DDD_DispGraph_h
  218. // DON'T ADD ANYTHING BEHIND THIS #endif
  219.