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 / LineGraphE.h < prev    next >
C/C++ Source or Header  |  1998-08-03  |  4KB  |  149 lines

  1. // $Id: LineGraphE.h,v 1.19 1998/08/03 08:31:00 zeller Exp $
  2. // LineGraphEdge class: GraphEdge with drawing capabilities
  3.  
  4. // Copyright (C) 1995 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. #ifndef _DDD_LineGraphEdge_h
  30. #define _DDD_LineGraphEdge_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. #include "GraphEdge.h"
  37. #include "Box.h"
  38. #include "EdgeA.h"
  39. #include "explicit.h"
  40.  
  41. enum Side { North = 1, South = 2, East = 4, West = 8 };
  42.  
  43. class LineGraphEdge: public GraphEdge {
  44. public:
  45.     DECLARE_TYPE_INFO
  46.  
  47. private:
  48.     EdgeAnnotation *_annotation; // The annotation to use
  49.  
  50. protected:
  51.     // Find line from region B1 centered around C1 to region B2 centered
  52.     // around C2.  Resulting line shall be drawn from P1 to P2.
  53.     static void findLine(const BoxPoint& c1, const BoxPoint& c2, 
  54.              const BoxRegion& b1, const BoxRegion& b2,
  55.              BoxPoint& p1, BoxPoint& p2, 
  56.              const GraphGC& gc);
  57.  
  58.     // Draw.
  59.     virtual void _draw(Widget w, 
  60.                const BoxRegion& exposed, 
  61.                const GraphGC& gc) const;
  62.  
  63.     // Draw line.
  64.     virtual void drawLine(Widget w,
  65.               const BoxRegion& exposed,
  66.               const GraphGC& gc) const;
  67.  
  68.     // Draw self edge.
  69.     virtual void drawSelf(Widget w,
  70.               const BoxRegion& exposed,
  71.               const GraphGC& gc) const;
  72.  
  73.     // Draw arrow head at POS.
  74.     virtual void drawArrowHead(Widget w,
  75.                    const BoxRegion& exposed,
  76.                    const GraphGC& gc,
  77.                    const BoxPoint& pos,
  78.                    double alpha) const;
  79.  
  80.     // Print self edge.
  81.     virtual void printSelf(ostream& os, const GraphGC &gc) const;
  82.  
  83.     // Find annotation position.
  84.     virtual BoxPoint annotationPosition(const GraphGC &gc) const;
  85.  
  86.  
  87. private:
  88.     // Clip point P to side SIDE of region B.
  89.     static void moveToSide  (const BoxRegion& b, int side,
  90.                  BoxPoint& p, const BoxPoint& c);
  91.  
  92.     // Clip point P to side SIDE of region B centered around C.
  93.     static void clipToSide  (const BoxRegion& b, int side,
  94.                  BoxPoint& p, const BoxPoint& c);
  95.  
  96.     // Clip point P to side SIDE of region B centered around C.  Assume
  97.     // that B contains a circle.
  98.     static void clipToCircle(const BoxRegion& b, int side, 
  99.                  BoxPoint& p, const BoxPoint& c);
  100.  
  101. public:
  102.     // Constructor
  103.     LineGraphEdge(GraphNode *f, GraphNode *t, EdgeAnnotation *ann = 0):
  104.     GraphEdge(f, t), _annotation(ann)
  105.     {}
  106.  
  107.     // Destructor
  108.     virtual ~LineGraphEdge()
  109.     {
  110.     delete _annotation;
  111.     }
  112.  
  113.     // Resources
  114.     void set_annotation(EdgeAnnotation *a)
  115.     {
  116.     if (a != _annotation)
  117.     {
  118.         delete _annotation;
  119.         _annotation = a;
  120.     }
  121.     }
  122.  
  123.     EdgeAnnotation *annotation() const { return _annotation; }
  124.  
  125. protected:
  126.     // Copy Constructor
  127.     LineGraphEdge(const LineGraphEdge &edge):
  128.     GraphEdge(edge), _annotation(0)
  129.     {
  130.     if (edge.annotation() != 0)
  131.         set_annotation(edge.annotation()->dup());
  132.     }
  133.  
  134. public:
  135.     // Printing
  136.     void _print(ostream& os, const GraphGC &gc) const;
  137.  
  138.     GraphEdge *dup() const
  139.     {
  140.     return new LineGraphEdge(*this);
  141.     }
  142.  
  143.     // Region occupied by edge - if none, BoxRegion()
  144.     virtual BoxRegion region(const GraphGC&) const;
  145. };
  146.  
  147. #endif // _DDD_LineGraphEdge_h
  148. // DON'T ADD ANYTHING BEHIND THIS #endif
  149.