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 / BoxGraphN.C < prev    next >
C/C++ Source or Header  |  1998-09-21  |  5KB  |  195 lines

  1. // $Id: BoxGraphN.C,v 1.15 1998/09/21 20:22:56 zeller Exp $
  2. // BoxGraphNode class: RegionGraphNode with box
  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. char BoxGraphNode_rcsid[] = 
  30.     "$Id: BoxGraphN.C,v 1.15 1998/09/21 20:22:56 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "BoxGraphN.h"
  37. #include "printBox.h"
  38. #include "CompositeB.h"
  39. #include "ColorBox.h"
  40.  
  41.  
  42. DEFINE_TYPE_INFO_1(BoxGraphNode, RegionGraphNode)
  43.  
  44. // Draw a BoxGraphNode
  45. void BoxGraphNode::forceDraw(Widget w, 
  46.                  const BoxRegion& /* exposed */,
  47.                  const GraphGC& gc) const
  48. {
  49.     assert(box() != 0);
  50.     // assert(box()->OK());
  51.  
  52.     // We do not check for exposures here --
  53.     // boxes are usually small and partial display
  54.     // doesn't work well with scrolling
  55.     static BoxRegion exposed(BoxPoint(0, 0), BoxSize(INT_MAX, INT_MAX));
  56.  
  57.     if (selected() && highlight())
  58.     {
  59.     box()->draw(w, region(gc), exposed, gc.nodeGC, false);
  60.  
  61.     bool use_color = ColorBox::use_color;
  62.     ColorBox::use_color = false;
  63.     BoxRegion r = highlightRegion(gc);
  64.  
  65.     if (r <= exposed)
  66.     {
  67.         XFillRectangle(XtDisplay(w), XtWindow(w), gc.clearGC,
  68.                r.origin(X), r.origin(Y),
  69.                r.space(X), r.space(Y));
  70.         highlight()->draw(w, r, r, gc.nodeGC, false);
  71.     }
  72.     ColorBox::use_color = use_color;
  73.     }
  74.     else if (selected())
  75.     {
  76.     bool use_color = ColorBox::use_color;
  77.     ColorBox::use_color = false;
  78.     box()->draw(w, region(gc), exposed, gc.nodeGC, false);
  79.     ColorBox::use_color = use_color;
  80.     }
  81.     else
  82.     {
  83.     box()->draw(w, region(gc), exposed, gc.nodeGC, false);
  84.     }
  85. }
  86.  
  87.  
  88. // mark the following objects as one XFIG compound object
  89. static void startCompound(ostream& os, BoxRegion region)
  90. {
  91.     BoxPoint origin = region.origin();
  92.     BoxPoint width = region.space();
  93.  
  94.     os << CMPHEAD;
  95.     os << origin[X] + width[X] + 1 << " " << origin[Y] - 1 << " ";
  96.     os << origin[X] - 1 << " " << origin[Y] + width[Y] + 1 << "\n";
  97. }
  98.  
  99. static void endCompound(ostream& os)
  100. {
  101.     os << CMPTAIL;
  102. }
  103.  
  104.  
  105. // Print a BoxGraphNode
  106. void BoxGraphNode::_print(ostream& os, const GraphGC& gc) const
  107. {
  108.     assert (box() != 0);
  109.  
  110.     if (gc.printGC->isFig())
  111.     startCompound(os, region(gc));
  112.  
  113.     RegionGraphNode::_print(os, gc);
  114.     box()->_print(os, region(gc), *gc.printGC);
  115.  
  116.     if (gc.printGC->isFig())
  117.     endCompound(os);
  118. }
  119.  
  120. // MARK is a MarkBox in SRC.  Find equivalent box in DUP.
  121. MarkBox *BoxGraphNode::find_mark(Box *dup, Box *src, Box *mark)
  122. {
  123.     assert (box() != 0);
  124.  
  125.     if (mark == 0)
  126.     return 0;
  127.  
  128.     if (src == mark)
  129.     {
  130.     MarkBox *dup_mb = ptr_cast(MarkBox, dup);
  131.     assert(dup_mb != 0);
  132.     return dup_mb;
  133.     }
  134.  
  135.     // Try Composite children
  136.     CompositeBox *src_cb = ptr_cast(CompositeBox, src);
  137.     if (src_cb != 0)
  138.     {
  139.     CompositeBox *dup_cb = ptr_cast(CompositeBox, dup);
  140.     assert(dup_cb != 0);
  141.     assert(src_cb->nchildren() == dup_cb->nchildren());
  142.  
  143.     for (int i = 0; i < src_cb->nchildren(); i++)
  144.     {
  145.         MarkBox *mb = 
  146.         find_mark((*dup_cb)[i], (*src_cb)[i], mark);
  147.         if (mb)
  148.         return mb;
  149.     }
  150.  
  151.     return 0;
  152.     }
  153.  
  154.     // Try HatBox child
  155.     HatBox *src_hb = ptr_cast(HatBox, src);
  156.     if (src_hb != 0)
  157.     {
  158.     HatBox *dup_hb = ptr_cast(HatBox, dup);
  159.     assert(dup_hb != 0);
  160.  
  161.     return find_mark(dup_hb->box(), src_hb->box(), mark);
  162.     }
  163.  
  164.     return 0;
  165. }
  166.  
  167.  
  168. // Set the box.
  169. void BoxGraphNode::setBox(Box *b)
  170. {
  171.     assert(b == 0 || b->OK());
  172.  
  173.     setHighlight(0);
  174.  
  175.     Box *old = _box;
  176.     if (b)
  177.     _box = b->link();
  178.     else
  179.     _box = 0;
  180.  
  181.     if (old)
  182.     old->unlink();
  183.  
  184.     if (b)
  185.     resize(b->size());
  186. }
  187.  
  188.  
  189. // Copy Constructor
  190. BoxGraphNode::BoxGraphNode(const BoxGraphNode& node):
  191.     RegionGraphNode(node),
  192.     _box(node._box ? node._box->dup() : 0),
  193.     _highlight(node._box ? find_mark(_box, node._box, node._highlight) : 0)
  194. {}
  195.