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 / Box.C < prev    next >
C/C++ Source or Header  |  1998-11-23  |  4KB  |  213 lines

  1. // $Id: Box.C,v 1.13 1998/11/23 15:00:16 zeller Exp $
  2. // Boxes
  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. #ifdef __GNUG__
  30. #pragma implementation
  31. #endif
  32.  
  33. char Box_rcsid[] = 
  34.     "$Id: Box.C,v 1.13 1998/11/23 15:00:16 zeller Exp $";
  35.  
  36. #include <string.h>
  37.  
  38. #include "assert.h"
  39. #include "return.h"
  40. #include <X11/X.h>
  41. #include <X11/Xlib.h>
  42. #include <X11/Intrinsic.h>
  43.  
  44. #include "Box.h"
  45. #include "TagBox.h"
  46. #include "VSEFlags.h"
  47.  
  48. DEFINE_TYPE_INFO_0(Box)
  49.  
  50.  
  51. // Draw
  52.  
  53. // Draw Box
  54. void Box::draw(Widget w, 
  55.            const BoxRegion& r, 
  56.            const BoxRegion& exposed, 
  57.            GC gc, 
  58.            bool context_selected) const
  59. {
  60.     // Draw only if exposed
  61.     if (!(r <= exposed))
  62.     return;
  63.  
  64.     if (VSEFlag(show_draw))
  65.     cout << "\n[" << r;
  66.  
  67.     // Make sure we have enough space
  68.     assert(!(size() > r.space()));
  69.  
  70.     // Use default GC if needed
  71.     if (gc == 0)
  72.     gc = DefaultGCOfScreen(XtScreen(w));
  73.  
  74.     // Go and draw
  75.     _draw(w, r, exposed, gc, context_selected);
  76.  
  77.     if (VSEFlag(show_draw))
  78.     cout << "]";
  79. }
  80.  
  81.  
  82. // Comparisons
  83.  
  84. // Internal comparison
  85. bool Box::matches(const Box &b, const Box *) const
  86. {
  87.     if (strcmp(type(), b.type()))
  88.     return false;
  89.  
  90.     for (BoxDimension d = X; d <= Y; d++)
  91.     if (extend(d) == 0 && size(d) != b.size(d))
  92.         return false;
  93.  
  94.     return true;
  95. }
  96.  
  97.  
  98. // Public interface
  99. bool Box::operator == (const Box &b) const
  100. {
  101.     if (VSEFlag(show_match_boxes))
  102.     {
  103.     cout << "\nBox match: " << *this << " ? " << b;
  104.     cout.flush();
  105.     }
  106.  
  107.     bool flag = (this == &b) || matchMe().matches(b.matchMe(), &b);
  108.  
  109.     if (VSEFlag(show_match_boxes))
  110.     {
  111.     if (flag)
  112.         cout << "\nBox match: " << *this << " == " << b;
  113.     else
  114.         cout << "\nBox match: " << *this << " != " << b;
  115.  
  116.     cout.flush();
  117.     }
  118.     
  119.     return flag;
  120. }
  121.  
  122.  
  123. // Tags
  124.  
  125. // Tag a box
  126. Box *Box::tag(Data *dta, DataLink *dl)
  127. {
  128.     TagBox *ret = new TagBox(this, dta, dl);
  129.     unlink();
  130.     return ret;
  131. }
  132.  
  133. // Region of the TagBox at P; if P is not given, use top-most tag
  134. BoxRegion Box::region(BoxPoint p) const RETURNS(r)
  135. {
  136.     RETURN_OBJECT(BoxRegion, r);
  137.     const TagBox *t = findTag(p);
  138.     if (t)
  139.     r = t->__region();
  140.     else
  141.     r = BoxRegion(BoxPoint(0,0), BoxSize(0,0));
  142.     RETURN(r);
  143. }
  144.  
  145. // Data of the TagBox at P
  146. Data *Box::data(BoxPoint p) const
  147. {
  148.     const TagBox *t = findTag(p);
  149.     if (t == 0)
  150.     return 0;
  151.     return t->__data();
  152. }
  153.  
  154. // Name of the TagBox at P
  155. string Box::name(BoxPoint p) const RETURNS(name)
  156. {
  157.     RETURN_OBJECT(string, name);
  158.     const TagBox *t = findTag(p);
  159.     if (t)
  160.     name = t->__name();
  161.     else
  162.     name = "";
  163.     RETURN(name);
  164. }
  165.  
  166. // Information of the TagBox at P
  167. string Box::info(BoxPoint p) const RETURNS(info)
  168. {
  169.     RETURN_OBJECT(string, info);
  170.     const TagBox *t = findTag(p);
  171.     if (t)
  172.     info = t->__info();
  173.     else
  174.     info = "";
  175.     RETURN(info);
  176. }
  177.  
  178. // `Selected' property of TagBox at P
  179. bool Box::selected(BoxPoint p) const
  180. {
  181.     const TagBox *t = findTag(p);
  182.     if (t == 0)
  183.     return false;
  184.     return t->__selected();
  185. }
  186.  
  187.  
  188. // Debugging
  189.  
  190. // Dump Box
  191. ostream &operator << (ostream& s, const Box& b)
  192. {
  193.     if (VSEFlags::max_info_nesting != 0)
  194.     {
  195.     VSEFlags::max_info_nesting--;
  196.  
  197.     b.dump(s);
  198.  
  199.     if (VSEFlags::include_id_info)
  200.         s << " (id: " << b.id() << ")";
  201.  
  202.     if (VSEFlags::include_size_info)
  203.         s << " // size = " << b.size() << " corner = " << b.corner() <<
  204.         " extend = " << b.extend() << "\n";
  205.  
  206.     VSEFlags::max_info_nesting++;
  207.     }
  208.     else
  209.     s << "_";
  210.  
  211.     return s;
  212. }
  213.