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 / MString.h < prev    next >
C/C++ Source or Header  |  1998-03-25  |  6KB  |  264 lines

  1. // $Id: MString.h,v 1.21 1998/03/25 12:43:38 zeller Exp $
  2. // Simple interface to Motif composite strings
  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_MString_h
  30. #define _DDD_MString_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36.  
  37. // An "MString" is but a C++ wrapper around Motif composite strings.
  38.  
  39. #include <Xm/Xm.h>
  40. #include "strclass.h"
  41. #include "assert.h"
  42.  
  43. #ifdef XmFONTLIST_DEFAULT_TAG
  44. #define MSTRING_DEFAULT_CHARSET XmFONTLIST_DEFAULT_TAG
  45. #else
  46. #define MSTRING_DEFAULT_CHARSET XmSTRING_DEFAULT_CHARSET
  47. #endif
  48.  
  49. class MString {
  50. private:
  51.     XmString _mstring;        // Motif internals
  52.  
  53. public:
  54.     // Constructors
  55.     MString(char *text = "", 
  56.         XmStringCharSet charset = MSTRING_DEFAULT_CHARSET):
  57.     _mstring(XmStringCreateLtoR(text, charset))
  58.     {
  59.     assert(OK());
  60.     }
  61.  
  62.     MString(const char *text,
  63.         XmStringCharSet charset = MSTRING_DEFAULT_CHARSET):
  64.     _mstring(XmStringCreateLtoR((char *)text, charset))
  65.     {
  66.     assert(OK());
  67.     }
  68.  
  69.     MString(const string& text, 
  70.         XmStringCharSet charset = MSTRING_DEFAULT_CHARSET):
  71.     _mstring(XmStringCreateLtoR((char *)text, charset))
  72.     {
  73.     assert(OK());
  74.     }
  75.  
  76.     // In Motif 1.1, `XmString' is defined as `char *'; hence the DUMMY parameter
  77.     MString(XmString text, bool /* dummy */):
  78.     _mstring(XmStringCopy(text))
  79.     {
  80.     assert(OK());
  81.     }
  82.  
  83.     // Copy constructor
  84.     MString(const MString& m):
  85.     _mstring(XmStringCopy(m._mstring))
  86.     {
  87.     assert(m.OK());
  88.     assert(OK());
  89.     }
  90.  
  91.     // Destructor
  92.     ~MString()
  93.     {
  94.     assert(OK());
  95.     XmStringFree(_mstring);
  96.     }
  97.  
  98.     // Resources
  99.     Dimension baseline(XmFontList fontlist) const
  100.     {
  101.     return XmStringBaseline(fontlist, _mstring);
  102.     }
  103.  
  104.     Boolean isEmpty() const
  105.     {
  106.     return XmStringEmpty(_mstring);
  107.     }
  108.  
  109.     int lineCount() const
  110.     {
  111.     return XmStringLineCount(_mstring);
  112.     }
  113.  
  114.     void extent(Dimension& x, Dimension& y, XmFontList fontlist) const
  115.     {
  116.     XmStringExtent(fontlist, _mstring, &x, &y);
  117.     }
  118.  
  119.     Dimension height(XmFontList fontlist) const
  120.     {
  121.     return XmStringHeight(fontlist, _mstring);
  122.     }
  123.  
  124.     Dimension width(XmFontList fontlist) const
  125.     {
  126.     return XmStringWidth(fontlist, _mstring);
  127.     }
  128.  
  129.     int length() const
  130.     {
  131.     return XmStringLength(_mstring);
  132.     }
  133.  
  134.     string str(XmStringCharSet charset = MSTRING_DEFAULT_CHARSET) const
  135.     {
  136.     char *text;
  137.     if (XmStringGetLtoR(_mstring, charset, &text))
  138.     {
  139.         string s = text;
  140.         XtFree(text);
  141.         return s;
  142.     }
  143.  
  144.     return "";
  145.     }
  146.  
  147.     // Assignment
  148.     MString& operator=(const MString& m)
  149.     {
  150.     assert(OK());
  151.     assert(m.OK());
  152.  
  153.     // Make sure a = a works
  154.     XmString tmp = XmStringCopy(m._mstring);
  155.     XmStringFree(_mstring);
  156.     _mstring = tmp;
  157.  
  158.     return *this;
  159.     }
  160.  
  161.     // Concatenation
  162.     MString& operator += (const MString& m)
  163.     {
  164.     assert(OK());
  165.     assert(m.OK());
  166.  
  167.     XmString old = _mstring;
  168.     _mstring = XmStringConcat(_mstring, m._mstring);
  169.     XmStringFree(old);
  170.  
  171.     return *this;
  172.     }
  173.     MString& prepend(const MString& m)
  174.     {
  175.     assert(OK());
  176.     assert(m.OK());
  177.  
  178.     XmString old = _mstring;
  179.     _mstring = XmStringConcat(m._mstring, _mstring);
  180.     XmStringFree(old);
  181.  
  182.     return *this;
  183.     }
  184.  
  185.     // Comparison
  186.     Boolean operator == (const MString& m) const
  187.     {
  188.     assert(OK());
  189.     assert(m.OK());
  190.     return XmStringCompare(_mstring, m._mstring);
  191.     }
  192.  
  193.     Boolean operator != (const MString& m) const
  194.     {
  195.     assert(OK());
  196.     assert(m.OK());
  197.     return !XmStringCompare(_mstring, m._mstring);
  198.     }
  199.  
  200.     // Conversions
  201.     operator XmString() const { return _mstring; }
  202.     operator XmString()       { return _mstring; }
  203.     XmString xmstring() const { return _mstring; }
  204.  
  205.     Boolean isNull() const
  206.     {
  207.     return xmstring() == 0;
  208.     }
  209.  
  210.     // Substrings
  211.     Boolean contains(const MString& m) const
  212.     {
  213.     assert(OK());
  214.     assert(m.OK());
  215.     return XmStringHasSubstring(_mstring, m._mstring);
  216.     }
  217.  
  218.     // Invariant
  219.     Boolean OK() const;
  220. };
  221.  
  222.  
  223. // Concatenation
  224. inline MString operator + (const MString& m1, const MString& m2)
  225. {
  226.     assert(m1.OK());
  227.     assert(m2.OK());
  228.  
  229.     return MString(XmStringConcat(m1.xmstring(), m2.xmstring()), true);
  230. }
  231.  
  232. inline MString operator + (const MString& m, const char *s)
  233. {
  234.     return operator + (m, MString(s));
  235. }
  236.  
  237. inline MString operator + (const MString& m, char *s)
  238. {
  239.     return operator + (m, MString(s));
  240. }
  241.  
  242. inline MString operator + (const char *s, const MString& m)
  243. {
  244.     return operator + (MString(s), m);
  245. }
  246.  
  247. inline MString operator + (char *s, const MString& m)
  248. {
  249.     return operator + (MString(s), m);
  250. }
  251.  
  252. inline MString operator + (const MString& m, const string& s)
  253. {
  254.     return operator + (m, MString(s));
  255. }
  256.  
  257. inline MString operator + (const string& s, const MString& m)
  258. {
  259.     return operator + (MString(s), m);
  260. }
  261.  
  262. #endif // _DDD_MString_h
  263. // DON'T ADD ANYTHING BEHIND THIS #endif
  264.