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 / RegionGN.C < prev    next >
C/C++ Source or Header  |  1998-03-25  |  4KB  |  139 lines

  1. // $Id: RegionGN.C,v 1.9 1998/03/25 12:44:06 zeller Exp $
  2. // RegionGraphNode class
  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 RegionGraphNode_rcsid[] = 
  30.     "$Id: RegionGN.C,v 1.9 1998/03/25 12:44:06 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include <iostream.h>
  37. #include <string.h>
  38.  
  39. #include <X11/X.h>
  40. #include <X11/Xlib.h>
  41. #include <X11/Intrinsic.h>
  42.  
  43. #include "RegionGN.h"
  44. #include "printBox.h"
  45.  
  46. DEFINE_TYPE_INFO_1(RegionGraphNode, PosGraphNode)
  47.  
  48. // Center around position
  49. void RegionGraphNode::center()
  50. {
  51.     _region.origin() = pos() - (_region.space() / 2);
  52. }
  53.  
  54. // Compute position for ORIGIN
  55. BoxPoint RegionGraphNode::originToPos(const BoxPoint& origin,
  56.                       const GraphGC& gc) const
  57. {
  58.     return origin + region(gc).space() / 2;
  59. }
  60.  
  61.  
  62. // Draw a RegionGraphNode
  63. void RegionGraphNode::draw(Widget w, 
  64.                const BoxRegion& exposed, 
  65.                const GraphGC& gc) const
  66. {
  67.     const BoxRegion& r = region(gc);
  68.  
  69.     // if not exposed or invisible, return
  70.     if (!(r <= exposed) || r.space(X) == 0 || r.space(Y) == 0)
  71.     return;
  72.  
  73.     Display *display = XtDisplay(w);
  74.     Window window = XtWindow(w);
  75.  
  76.     // clear the area
  77.     XFillRectangle(display, window, gc.clearGC,
  78.            r.origin(X), r.origin(Y),
  79.            r.space(X), r.space(Y));
  80.  
  81.     // draw contents
  82.     forceDraw(w, exposed, gc);
  83.  
  84.     // if selected, invert area
  85.     if (selected())
  86.     {
  87.     const BoxRegion& h = highlightRegion(gc);
  88.  
  89.     XFillRectangle(display, window, gc.invertGC,
  90.                h.origin(X), h.origin(Y),
  91.                h.space(X), h.space(Y));
  92.     }
  93. };
  94.  
  95.  
  96.  
  97. // cleanRegion
  98. // clean a region with white ink
  99. //
  100. static void cleanRegion (ostream& os, const GraphGC& gc, BoxRegion region)
  101. {
  102.       BoxPoint origin = region.origin();
  103.       BoxPoint width = region.space();
  104.  
  105.       if (gc.printGC->isPostScript())
  106.       {
  107.       os << origin[X] << " " << origin[Y] << " ";
  108.       os << origin[X] + width[X] << " " << origin[Y];
  109.       os << " ";
  110.       os << origin[X] + width[X] << " ";
  111.       os << origin[Y] + width[Y] << " ";
  112.       os << origin[X] << " " << origin[Y] + width[Y];
  113.       os << " clean*\n";
  114.       }
  115.       else if (gc.printGC->isFig())
  116.       {
  117.       os << CLEANHEAD;
  118.       os << origin[X] << " " << origin[Y] << " ";
  119.       os << origin[X] + width[X] << " " << origin[Y];
  120.       os << " ";
  121.       os << origin[X] + width[X] << " ";
  122.       os << origin[Y] + width[Y] << " ";
  123.       os << origin[X] << " " << origin[Y] + width[Y];
  124.       os << " ";
  125.       os << origin[X] << " "<< origin[Y] << " 9999 9999\n";
  126.       }      
  127. }
  128.  
  129. // Print a RegionGraphNode
  130. void RegionGraphNode::_print(ostream& os, const GraphGC& gc) const
  131. {
  132.     cleanRegion(os, gc, region(gc));
  133. }
  134.  
  135. // Handlers
  136. static bool Yes(RegionGraphNode *, const BoxSize&) { return true; }
  137.  
  138. bool (*RegionGraphNode::ResizeCB)(RegionGraphNode *, const BoxSize&) = Yes;
  139.