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 / StringBox.C < prev    next >
C/C++ Source or Header  |  1998-11-23  |  6KB  |  212 lines

  1. // $Id: StringBox.C,v 1.10 1998/11/23 17:43:34 zeller Exp $ 
  2. // StringBox 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 StringBox_rcsid[] = 
  30.     "$Id: StringBox.C,v 1.10 1998/11/23 17:43:34 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36.  
  37. #include "StringBox.h"
  38. #include "printBox.h"
  39.  
  40. #include "strclass.h"
  41. #include "assert.h"
  42. #include "cook.h"
  43.  
  44. #include <X11/Xlib.h>
  45. #include <X11/Intrinsic.h>
  46. #include <ctype.h>
  47. #include <strstream.h>
  48. #include <iomanip.h>
  49.  
  50. #include "VSEFlags.h"
  51.  
  52. // set this to 1 if you want to have the box a font-specific height
  53. #define USE_MAX_BOUNDS 1
  54.  
  55.  
  56. DEFINE_TYPE_INFO_1(StringBox, PrimitiveBox)
  57.  
  58. // StringBox
  59.  
  60. FontTable *StringBox::fontTable = 0;
  61. bool StringBox::quoted = false;
  62.  
  63. // Recompute size
  64. Box *StringBox::resize()
  65. {
  66.     if (_font != 0)
  67.     {
  68.     int direction, font_ascent, font_descent;
  69.     XCharStruct overall;
  70.  
  71.     XTextExtents(_font, (char *)_string, _string.length(),
  72.         &direction, &font_ascent, &font_descent, &overall);
  73.  
  74. #if USE_MAX_BOUNDS
  75.     XCharStruct max_bounds = _font->max_bounds;
  76.  
  77.     _ascent = max_bounds.ascent;
  78.     thesize() = BoxSize(overall.width, 
  79.                 max_bounds.ascent + max_bounds.descent);
  80. #else
  81.     _ascent = font_ascent;
  82.     thesize() = BoxSize(overall.width, font_ascent + font_descent);
  83. #endif
  84.     }
  85.  
  86.     return this;
  87. }
  88.  
  89. // Draw
  90. void StringBox::_draw(Widget w, 
  91.               const BoxRegion& r, 
  92.               const BoxRegion&, 
  93.               GC gc,
  94.               bool) const
  95. {
  96.     BoxPoint origin = r.origin();
  97.  
  98.     if (_font != 0)
  99.     XSetFont(XtDisplay(w), gc, _font->fid);
  100.  
  101.     XDrawString(XtDisplay(w), XtWindow(w), gc, origin[X], origin[Y] + _ascent,
  102.     (char *)_string, _string.length());
  103. }
  104.  
  105.  
  106. void StringBox::dump(ostream& s) const
  107. {
  108.     char *quote = "\"";
  109.     if (StringBox::quoted)
  110.     quote = "\\\"";
  111.  
  112.     s << quote;
  113.     for (unsigned i = 0; i < _string.length(); i++)
  114.     {
  115.     if (_string[i] == '\"')
  116.         s << quote;
  117.     else
  118.         s << _string[i];
  119.     }
  120.     s << quote;
  121.  
  122.     if (VSEFlags::include_font_info)
  123.     s << " (font: \"" << _fontname << "\")";
  124. }
  125.  
  126. void StringBox::newFont(const string& fontname)
  127. {
  128.     _fontname = fontname;
  129.     if (fontTable != 0)
  130.     _newFont((*fontTable)[_fontname]);
  131. }
  132.  
  133. // Print
  134. typedef struct fontmap {
  135.     char *xfont ;
  136.     char *psfont ;
  137.     int figfont ;
  138. } FONTMAP ;
  139.  
  140. // mapping between X11 fonts, PostScript fonts and xfig font numbers
  141. static FONTMAP map[] = {
  142. {"fixed",                                "/Courier",                     12},
  143. {"-*-times-medium-r-*-",                 "/Times-Roman",                  0},
  144. {"-*-times-medium-*-*-",                 "/Times-Italic",                 1},
  145. {"-*-times-bold-r-*-",                   "/Times-Bold",                   2},
  146. {"-*-times-bold-*-*-",                   "/Times-BoldItalic",             3},
  147. {"-*-courier-medium-r-*-",               "/Courier",                     12},
  148. {"-*-courier-medium-*-*-",               "/Courier-Oblique",             13},
  149. {"-*-courier-bold-r-*-",                 "/Courier-Bold",                14},
  150. {"-*-courier-bold-*-*-",                 "/Courier-BoldOblique",         15},
  151. {"-*-helvetica-medium-r-*-",             "/Helvetica-Narrow",            16},
  152. {"-*-helvetica-medium-*-*-",             "/Helvetica-NarrowOblique",     17},
  153. {"-*-helvetica-bold-r-*-",               "/Helvetica",                   18},
  154. {"-*-helvetica-bold-*-*-",               "/Helvetica-Oblique",           19},
  155. {"-*-lucidatypewriter-medium-r-*-",      "/Courier",                     12},
  156. {"-*-lucidatypewriter-medium-*-*-",      "/Courier-Oblique",             13},
  157. {"-*-lucidatypewriter-bold-r-*-",        "/Courier-Bold",                14},
  158. {"-*-lucidatypewriter-bold-*-*-",        "/Courier-BoldOblique",         15},
  159. {"-*-new century schoolbook-bold-*-",    "/NewCenturySchlbk-BoldItalic", 27},
  160. {"-*-new century schoolbook-bold-r-*",   "/NewCenturySchlbk-Bold",       26},
  161. {"-*-new century schoolbook-medium-*-*", "/NewCenturySchlbk-Italic",     25},
  162. {"-*-new century schoolbook-medium-r-*", "/NewCenturySchlbk-Roman",      24},
  163. {"-*-symbol-medium-",                    "/Symbol",                      32},
  164. };
  165.  
  166. static int mappings = sizeof (map) / sizeof (FONTMAP) ;
  167.  
  168. /*
  169.  * matchFont
  170.  */
  171.  
  172. static FONTMAP *matchFont(char *xfont) 
  173. {
  174.     FONTMAP *fmap = &map[0] ;
  175.     int match = 1;
  176.     int i = 0;
  177.     
  178.     while (i < mappings && match != 0) {
  179.     match = strncmp (map[i].xfont, xfont, strlen(map[i].xfont)) ;
  180.     i++ ;
  181.     } 
  182.     if (match == 0) {
  183.     fmap = &map[--i] ;
  184.     }
  185.     return fmap;
  186. }
  187.  
  188.  
  189. void StringBox::_print(ostream& os, 
  190.                const BoxRegion& region, 
  191.                const PrintGC& gc) const
  192. {
  193.     // Don't draw empty strings
  194.     if (str() == "")
  195.     return;
  196.  
  197.     BoxPoint origin = region.origin() ;
  198.     FONTMAP *fmap = matchFont (fontName());
  199.  
  200.     if (gc.isFig()) {
  201.     os << TEXTHEAD1 << fmap->figfont << " "
  202.        << size(Y) - 3 << " " << TEXTHEAD2
  203.        << size(X) << " " << size(Y) << " "
  204.        << origin[X] << " " << origin [Y] + size(Y) - 2 << " "
  205.        << str() << "\001\n";
  206.     } else if (gc.isPostScript()) {
  207.     os << fmap->psfont << " " << size(X) << " " << size(Y)
  208.        << " " << origin[X] << " " << origin[Y] + size(Y) << " "
  209.        << "(" << pscook(str()) << ") text*\n";
  210.     }
  211. }   
  212.