home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / src / common / gdicmn.cpp < prev    next >
C/C++ Source or Header  |  2002-08-27  |  24KB  |  855 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        gdicmn.cpp
  3. // Purpose:     Common GDI classes
  4. // Author:      Julian Smart
  5. // Modified by:
  6. // Created:     01/02/97
  7. // RCS-ID:      $Id: gdicmn.cpp,v 1.73 2002/08/24 18:34:24 SC Exp $
  8. // Copyright:   (c) Julian Smart and Markus Holzem
  9. // Licence:     wxWindows licence
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation "gdicmn.h"
  14. #endif
  15.  
  16. #ifdef __VMS
  17. #define XtDisplay XTDISPLAY
  18. #endif
  19.  
  20. // For compilers that support precompilation, includes "wx.h".
  21. #include "wx/wxprec.h"
  22.  
  23. #ifdef __BORLANDC__
  24. #pragma hdrstop
  25. #endif
  26.  
  27. #include "wx/event.h"
  28. #include "wx/gdicmn.h"
  29. #include "wx/brush.h"
  30. #include "wx/pen.h"
  31. #include "wx/bitmap.h"
  32. #include "wx/icon.h"
  33. #include "wx/cursor.h"
  34. #include "wx/font.h"
  35. #include "wx/palette.h"
  36. #include "wx/app.h"
  37. #include "wx/dc.h"
  38. #include "wx/utils.h"
  39. #include "wx/settings.h"
  40.  
  41. #include "wx/log.h"
  42. #include <string.h>
  43.  
  44. #ifdef __WXMSW__
  45. #include <windows.h>
  46. #endif
  47.  
  48. #ifdef __WXMOTIF__
  49. #ifdef __VMS__
  50. #pragma message disable nosimpint
  51. #endif
  52. #include <Xm/Xm.h>
  53. #ifdef __VMS__
  54. #pragma message enable nosimpint
  55. #endif
  56. #endif
  57.  
  58. #ifdef __WXX11__
  59. #include "X11/Xlib.h"
  60. #endif
  61.  
  62. #ifdef __WXMAC__
  63. #include "wx/mac/private.h"
  64. #include "wx/mac/uma.h"
  65. #endif
  66. IMPLEMENT_CLASS(wxColourDatabase, wxList)
  67. IMPLEMENT_DYNAMIC_CLASS(wxFontList, wxList)
  68. IMPLEMENT_DYNAMIC_CLASS(wxPenList, wxList)
  69. IMPLEMENT_DYNAMIC_CLASS(wxBrushList, wxList)
  70. IMPLEMENT_DYNAMIC_CLASS(wxBitmapList, wxList)
  71. IMPLEMENT_DYNAMIC_CLASS(wxResourceCache, wxList)
  72.  
  73. IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject)
  74.  
  75. wxRect::wxRect(const wxPoint& topLeft, const wxPoint& bottomRight)
  76. {
  77.   x = topLeft.x;
  78.   y = topLeft.y;
  79.   width = bottomRight.x - topLeft.x + 1;
  80.   height = bottomRight.y - topLeft.y + 1;
  81.  
  82.   if (width < 0)
  83.   {
  84.     width = -width;
  85.     x -= width;
  86.   }
  87.  
  88.   if (height < 0)
  89.   {
  90.     height = -height;
  91.     y -= height;
  92.   }
  93. }
  94.  
  95. wxRect::wxRect(const wxPoint& point, const wxSize& size)
  96. {
  97.     x = point.x; y = point.y;
  98.     width = size.x; height = size.y;
  99. }
  100.  
  101. bool wxRect::operator==(const wxRect& rect) const
  102. {
  103.   return ((x == rect.x) &&
  104.           (y == rect.y) &&
  105.           (width == rect.width) &&
  106.           (height == rect.height));
  107. }
  108.  
  109. wxRect& wxRect::operator += (const wxRect& rect)
  110. {
  111.     *this = (*this + rect);
  112.     return ( *this ) ;
  113. }
  114.  
  115. wxRect wxRect::operator + (const wxRect& rect) const
  116. {
  117.     int x1 = wxMin(this->x, rect.x);
  118.     int y1 = wxMin(this->y, rect.y);
  119.     int y2 = wxMax(y+height, rect.height+rect.y);
  120.     int x2 = wxMax(x+width, rect.width+rect.x);
  121.     return wxRect(x1, y1, x2-x1, y2-y1);
  122. }
  123.  
  124. wxRect& wxRect::Inflate(wxCoord dx, wxCoord dy)
  125. {
  126.     x -= dx;
  127.     y -= dy;
  128.     width += 2*dx;
  129.     height += 2*dy;
  130.  
  131.     // check that we didn't make the rectangle invalid by accident (you almost
  132.     // never want to have negative coords and never want negative size)
  133.     if ( x < 0 )
  134.         x = 0;
  135.     if ( y < 0 )
  136.         y = 0;
  137.  
  138.     // what else can we do?
  139.     if ( width < 0 )
  140.         width = 0;
  141.     if ( height < 0 )
  142.         height = 0;
  143.  
  144.     return *this;
  145. }
  146.  
  147. bool wxRect::Inside(int cx, int cy) const
  148. {
  149.     return ( (cx >= x) && (cy >= y)
  150.           && ((cy - y) < height)
  151.           && ((cx - x) < width)
  152.           );
  153. }
  154.  
  155. wxRect& wxRect::Intersect(const wxRect& rect)
  156. {
  157.     int x2 = GetRight(),
  158.         y2 = GetBottom();
  159.  
  160.     if ( x < rect.x )
  161.         x = rect.x;
  162.     if ( y < rect.y )
  163.         y = rect.y;
  164.     if ( x2 > rect.GetRight() )
  165.         x2 = rect.GetRight();
  166.     if ( y2 > rect.GetBottom() )
  167.         y2 = rect.GetBottom();
  168.  
  169.     width = x2 - x + 1;
  170.     height = y2 - y + 1;
  171.  
  172.     if ( width <= 0 || height <= 0 )
  173.     {
  174.         width =
  175.         height = 0;
  176.     }
  177.  
  178.     return *this;
  179. }
  180.  
  181. bool wxRect::Intersects(const wxRect& rect) const
  182. {
  183.     wxRect r = Intersect(rect);
  184.  
  185.     // if there is no intersection, both width and height are 0
  186.     return r.width != 0;
  187. }
  188.  
  189. wxColourDatabase::wxColourDatabase (int type) : wxList (type)
  190. {
  191. }
  192.  
  193. wxColourDatabase::~wxColourDatabase ()
  194. {
  195.   // Cleanup Colour allocated in Initialize()
  196.   wxNode *node = First ();
  197.   while (node)
  198.     {
  199.       wxColour *col = (wxColour *) node->Data ();
  200.       wxNode *next = node->Next ();
  201.       delete col;
  202.       node = next;
  203.     }
  204. #ifdef __WXPM__
  205.     delete [] m_palTable;
  206. #endif
  207. }
  208.  
  209. // Colour database stuff
  210. void wxColourDatabase::Initialize ()
  211. {
  212.     static const struct wxColourDesc
  213.     {
  214.         const wxChar *name;
  215.         int r,g,b;
  216.     }
  217.     wxColourTable[] =
  218.     {
  219.         {wxT("AQUAMARINE"),112, 219, 147},
  220.         {wxT("BLACK"),0, 0, 0},
  221.         {wxT("BLUE"), 0, 0, 255},
  222.         {wxT("BLUE VIOLET"), 159, 95, 159},
  223.         {wxT("BROWN"), 165, 42, 42},
  224.         {wxT("CADET BLUE"), 95, 159, 159},
  225.         {wxT("CORAL"), 255, 127, 0},
  226.         {wxT("CORNFLOWER BLUE"), 66, 66, 111},
  227.         {wxT("CYAN"), 0, 255, 255},
  228.         {wxT("DARK GREY"), 47, 47, 47},   // ?
  229.  
  230.         {wxT("DARK GREEN"), 47, 79, 47},
  231.         {wxT("DARK OLIVE GREEN"), 79, 79, 47},
  232.         {wxT("DARK ORCHID"), 153, 50, 204},
  233.         {wxT("DARK SLATE BLUE"), 107, 35, 142},
  234.         {wxT("DARK SLATE GREY"), 47, 79, 79},
  235.         {wxT("DARK TURQUOISE"), 112, 147, 219},
  236.         {wxT("DIM GREY"), 84, 84, 84},
  237.         {wxT("FIREBRICK"), 142, 35, 35},
  238.         {wxT("FOREST GREEN"), 35, 142, 35},
  239.         {wxT("GOLD"), 204, 127, 50},
  240.         {wxT("GOLDENROD"), 219, 219, 112},
  241.         {wxT("GREY"), 128, 128, 128},
  242.         {wxT("GREEN"), 0, 255, 0},
  243.         {wxT("GREEN YELLOW"), 147, 219, 112},
  244.         {wxT("INDIAN RED"), 79, 47, 47},
  245.         {wxT("KHAKI"), 159, 159, 95},
  246.         {wxT("LIGHT BLUE"), 191, 216, 216},
  247.         {wxT("LIGHT GREY"), 192, 192, 192},
  248.         {wxT("LIGHT STEEL BLUE"), 143, 143, 188},
  249.         {wxT("LIME GREEN"), 50, 204, 50},
  250.         {wxT("LIGHT MAGENTA"), 255, 0, 255},
  251.         {wxT("MAGENTA"), 255, 0, 255},
  252.         {wxT("MAROON"), 142, 35, 107},
  253.         {wxT("MEDIUM AQUAMARINE"), 50, 204, 153},
  254.         {wxT("MEDIUM GREY"), 100, 100, 100},
  255.         {wxT("MEDIUM BLUE"), 50, 50, 204},
  256.         {wxT("MEDIUM FOREST GREEN"), 107, 142, 35},
  257.         {wxT("MEDIUM GOLDENROD"), 234, 234, 173},
  258.         {wxT("MEDIUM ORCHID"), 147, 112, 219},
  259.         {wxT("MEDIUM SEA GREEN"), 66, 111, 66},
  260.         {wxT("MEDIUM SLATE BLUE"), 127, 0, 255},
  261.         {wxT("MEDIUM SPRING GREEN"), 127, 255, 0},
  262.         {wxT("MEDIUM TURQUOISE"), 112, 219, 219},
  263.         {wxT("MEDIUM VIOLET RED"), 219, 112, 147},
  264.         {wxT("MIDNIGHT BLUE"), 47, 47, 79},
  265.         {wxT("NAVY"), 35, 35, 142},
  266.         {wxT("ORANGE"), 204, 50, 50},
  267.         {wxT("ORANGE RED"), 255, 0, 127},
  268.         {wxT("ORCHID"), 219, 112, 219},
  269.         {wxT("PALE GREEN"), 143, 188, 143},
  270.         {wxT("PINK"), 188, 143, 234},
  271.         {wxT("PLUM"), 234, 173, 234},
  272.         {wxT("PURPLE"), 176, 0, 255},
  273.         {wxT("RED"), 255, 0, 0},
  274.         {wxT("SALMON"), 111, 66, 66},
  275.         {wxT("SEA GREEN"), 35, 142, 107},
  276.         {wxT("SIENNA"), 142, 107, 35},
  277.         {wxT("SKY BLUE"), 50, 153, 204},
  278.         {wxT("SLATE BLUE"), 0, 127, 255},
  279.         {wxT("SPRING GREEN"), 0, 255, 127},
  280.         {wxT("STEEL BLUE"), 35, 107, 142},
  281.         {wxT("TAN"), 219, 147, 112},
  282.         {wxT("THISTLE"), 216, 191, 216},
  283.         {wxT("TURQUOISE"), 173, 234, 234},
  284.         {wxT("VIOLET"), 79, 47, 79},
  285.         {wxT("VIOLET RED"), 204, 50, 153},
  286.         {wxT("WHEAT"), 216, 216, 191},
  287.         {wxT("WHITE"), 255, 255, 255},
  288.         {wxT("YELLOW"), 255, 255, 0},
  289.         {wxT("YELLOW GREEN"), 153, 204, 50},
  290.         {wxT("MEDIUM GOLDENROD"), 234, 234, 173},
  291.         {wxT("MEDIUM FOREST GREEN"), 107, 142, 35},
  292.         {wxT("LIGHT MAGENTA"), 255, 0, 255},
  293.         {wxT("MEDIUM GREY"), 100, 100, 100},
  294.     };
  295.  
  296.     size_t      n;
  297.  
  298.     for ( n = 0; n < WXSIZEOF(wxColourTable); n++ )
  299.     {
  300.         const wxColourDesc& cc = wxColourTable[n];
  301.         Append(cc.name, new wxColour(cc.r,cc.g,cc.b));
  302.     }
  303. #ifdef __WXPM__
  304.     m_palTable = new long[n];
  305.     for ( n = 0; n < WXSIZEOF(wxColourTable); n++ )
  306.     {
  307.         const wxColourDesc& cc = wxColourTable[n];
  308.         m_palTable[n] = OS2RGB(cc.r,cc.g,cc.b);
  309.     }
  310.     m_nSize = n;
  311. #endif
  312. }
  313.  
  314. /*
  315.  * Changed by Ian Brown, July 1994.
  316.  *
  317.  * When running under X, the Colour Database starts off empty. The X server
  318.  * is queried for the colour first time after which it is entered into the
  319.  * database. This allows our client to use the server colour database which
  320.  * is hopefully gamma corrected for the display being used.
  321.  */
  322.  
  323. wxColour *wxColourDatabase::FindColour(const wxString& colour)
  324. {
  325.     // VZ: make the comparaison case insensitive and also match both grey and
  326.     //     gray
  327.     wxString colName = colour;
  328.     colName.MakeUpper();
  329.     wxString colName2 = colName;
  330.     if ( !colName2.Replace(_T("GRAY"), _T("GREY")) )
  331.         colName2.clear();
  332.  
  333.     wxNode *node = First();
  334.     while ( node )
  335.     {
  336.         const wxChar *key = node->GetKeyString();
  337.         if ( colName == key || colName2 == key )
  338.         {
  339.             return (wxColour *)node->Data();
  340.         }
  341.  
  342.         node = node->Next();
  343.     }
  344.  
  345. #ifdef __WXMSW__
  346.   return NULL;
  347. #endif
  348. #ifdef __WXPM__
  349.   return NULL;
  350. #endif
  351. #ifdef __WXMGL__
  352.   return NULL;
  353. #endif
  354.  
  355. // TODO for other implementations. This should really go into
  356. // platform-specific directories.
  357. #ifdef __WXMAC__
  358.   return NULL;
  359. #endif
  360. #ifdef __WXSTUBS__
  361.   return NULL;
  362. #endif
  363.  
  364. #ifdef __WXGTK__
  365.   wxColour *col = new wxColour( colour );
  366.  
  367.   if (!(col->Ok())) {
  368.       delete col;
  369.       return (wxColour *) NULL;
  370.   }
  371.   Append( colour, col );
  372.   return col;
  373. #endif
  374.  
  375. #ifdef __X__
  376.     XColor xcolour;
  377.  
  378. #ifdef __WXMOTIF__
  379.     Display *display = XtDisplay((Widget) wxTheApp->GetTopLevelWidget()) ;
  380. #endif
  381. #ifdef __WXX11__
  382.     Display* display = (Display*) wxGetDisplay();
  383. #endif
  384.     /* MATTHEW: [4] Use wxGetMainColormap */
  385.     if (!XParseColor(display, (Colormap) wxTheApp->GetMainColormap((WXDisplay*) display), colour,&xcolour))
  386.       return NULL;
  387.  
  388. #if wxUSE_NANOX
  389.     unsigned char r = (unsigned char)(xcolour.red);
  390.     unsigned char g = (unsigned char)(xcolour.green);
  391.     unsigned char b = (unsigned char)(xcolour.blue);
  392. #else
  393.     unsigned char r = (unsigned char)(xcolour.red >> 8);
  394.     unsigned char g = (unsigned char)(xcolour.green >> 8);
  395.     unsigned char b = (unsigned char)(xcolour.blue >> 8);
  396. #endif
  397.  
  398.     wxColour *col = new wxColour(r, g, b);
  399.     Append(colour, col);
  400.  
  401.     return col;
  402. #endif // __X__
  403. }
  404.  
  405. wxString wxColourDatabase::FindName (const wxColour& colour) const
  406. {
  407.     wxString name;
  408.  
  409.     unsigned char red = colour.Red ();
  410.     unsigned char green = colour.Green ();
  411.     unsigned char blue = colour.Blue ();
  412.  
  413.     for (wxNode * node = First (); node; node = node->Next ())
  414.     {
  415.         wxColour *col = (wxColour *) node->Data ();
  416.  
  417.         if (col->Red () == red && col->Green () == green && col->Blue () == blue)
  418.         {
  419.             const wxChar *found = node->GetKeyString();
  420.             if ( found )
  421.             {
  422.                 name = found;
  423.  
  424.                 break;
  425.             }
  426.         }
  427.     }
  428.  
  429.     return name;
  430. }
  431.  
  432. void wxInitializeStockLists()
  433. {
  434.   wxTheBrushList = new wxBrushList;
  435.   wxThePenList = new wxPenList;
  436.   wxTheFontList = new wxFontList;
  437.   wxTheBitmapList = new wxBitmapList;
  438. }
  439.  
  440. void wxInitializeStockObjects ()
  441. {
  442. #ifdef __WXMOTIF__
  443. #endif
  444. #ifdef __X__
  445.   // TODO
  446.   //  wxFontPool = new XFontPool;
  447. #endif
  448.  
  449.   // why under MSW fonts shouldn't have the standard system size?
  450. /*
  451. #ifdef __WXMSW__
  452.   static const int sizeFont = 10;
  453. #else
  454. #endif
  455. */
  456. #if defined(__WXMAC__)
  457.     int sizeFont = 12;
  458.  
  459.     Str255 fontName ;
  460.     SInt16 fontSize ;
  461.     Style fontStyle ;
  462.  
  463.     GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
  464.     sizeFont = fontSize ;
  465.     p2cstrcpy( (char*) fontName , fontName ) ;
  466.     wxSWISS_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName );
  467. #elif defined(__WXPM__)
  468.   static const int sizeFont = 12;
  469. #else
  470.   wxNORMAL_FONT = new wxFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
  471.   static const int sizeFont = wxNORMAL_FONT->GetPointSize();
  472. #endif
  473.  
  474. #if defined(__WXPM__)
  475.   /*
  476.   // Basic OS/2 has a fairly limited number of fonts and these are as good
  477.   // as I can do to get something that looks halfway "wx" normal
  478.   */
  479.   wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxBOLD);
  480.   wxSMALL_FONT = new wxFont (sizeFont - 4, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
  481.   wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
  482.   wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
  483. #elif defined(__WXMAC__)
  484.     wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxNORMAL);
  485.     wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
  486.     GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
  487.     p2cstrcpy( (char*) fontName , fontName ) ;
  488.     wxSMALL_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName );
  489. #else
  490.   wxSMALL_FONT = new wxFont (sizeFont - 2, wxSWISS, wxNORMAL, wxNORMAL);
  491.   wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
  492.   wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL);
  493. #endif
  494.  
  495.   wxRED_PEN = new wxPen (wxT("RED"), 1, wxSOLID);
  496.   wxCYAN_PEN = new wxPen (wxT("CYAN"), 1, wxSOLID);
  497.   wxGREEN_PEN = new wxPen (wxT("GREEN"), 1, wxSOLID);
  498.   wxBLACK_PEN = new wxPen (wxT("BLACK"), 1, wxSOLID);
  499.   wxWHITE_PEN = new wxPen (wxT("WHITE"), 1, wxSOLID);
  500.   wxTRANSPARENT_PEN = new wxPen (wxT("BLACK"), 1, wxTRANSPARENT);
  501.   wxBLACK_DASHED_PEN = new wxPen (wxT("BLACK"), 1, wxSHORT_DASH);
  502.   wxGREY_PEN = new wxPen (wxT("GREY"), 1, wxSOLID);
  503.   wxMEDIUM_GREY_PEN = new wxPen (wxT("MEDIUM GREY"), 1, wxSOLID);
  504.   wxLIGHT_GREY_PEN = new wxPen (wxT("LIGHT GREY"), 1, wxSOLID);
  505.  
  506.   wxBLUE_BRUSH = new wxBrush (wxT("BLUE"), wxSOLID);
  507.   wxGREEN_BRUSH = new wxBrush (wxT("GREEN"), wxSOLID);
  508.   wxWHITE_BRUSH = new wxBrush (wxT("WHITE"), wxSOLID);
  509.   wxBLACK_BRUSH = new wxBrush (wxT("BLACK"), wxSOLID);
  510.   wxTRANSPARENT_BRUSH = new wxBrush (wxT("BLACK"), wxTRANSPARENT);
  511.   wxCYAN_BRUSH = new wxBrush (wxT("CYAN"), wxSOLID);
  512.   wxRED_BRUSH = new wxBrush (wxT("RED"), wxSOLID);
  513.   wxGREY_BRUSH = new wxBrush (wxT("GREY"), wxSOLID);
  514.   wxMEDIUM_GREY_BRUSH = new wxBrush (wxT("MEDIUM GREY"), wxSOLID);
  515.   wxLIGHT_GREY_BRUSH = new wxBrush (wxT("LIGHT GREY"), wxSOLID);
  516.  
  517.   wxBLACK = new wxColour (wxT("BLACK"));
  518.   wxWHITE = new wxColour (wxT("WHITE"));
  519.   wxRED = new wxColour (wxT("RED"));
  520.   wxBLUE = new wxColour (wxT("BLUE"));
  521.   wxGREEN = new wxColour (wxT("GREEN"));
  522.   wxCYAN = new wxColour (wxT("CYAN"));
  523.   wxLIGHT_GREY = new wxColour (wxT("LIGHT GREY"));
  524.  
  525.   wxSTANDARD_CURSOR = new wxCursor (wxCURSOR_ARROW);
  526.   wxHOURGLASS_CURSOR = new wxCursor (wxCURSOR_WAIT);
  527.   wxCROSS_CURSOR = new wxCursor (wxCURSOR_CROSS);
  528. }
  529.  
  530. void wxDeleteStockObjects ()
  531. {
  532.   wxDELETE(wxNORMAL_FONT);
  533.   wxDELETE(wxSMALL_FONT);
  534.   wxDELETE(wxITALIC_FONT);
  535.   wxDELETE(wxSWISS_FONT);
  536.  
  537.   wxDELETE(wxRED_PEN);
  538.   wxDELETE(wxCYAN_PEN);
  539.   wxDELETE(wxGREEN_PEN);
  540.   wxDELETE(wxBLACK_PEN);
  541.   wxDELETE(wxWHITE_PEN);
  542.   wxDELETE(wxTRANSPARENT_PEN);
  543.   wxDELETE(wxBLACK_DASHED_PEN);
  544.   wxDELETE(wxGREY_PEN);
  545.   wxDELETE(wxMEDIUM_GREY_PEN);
  546.   wxDELETE(wxLIGHT_GREY_PEN);
  547.  
  548.   wxDELETE(wxBLUE_BRUSH);
  549.   wxDELETE(wxGREEN_BRUSH);
  550.   wxDELETE(wxWHITE_BRUSH);
  551.   wxDELETE(wxBLACK_BRUSH);
  552.   wxDELETE(wxTRANSPARENT_BRUSH);
  553.   wxDELETE(wxCYAN_BRUSH);
  554.   wxDELETE(wxRED_BRUSH);
  555.   wxDELETE(wxGREY_BRUSH);
  556.   wxDELETE(wxMEDIUM_GREY_BRUSH);
  557.   wxDELETE(wxLIGHT_GREY_BRUSH);
  558.  
  559.   wxDELETE(wxBLACK);
  560.   wxDELETE(wxWHITE);
  561.   wxDELETE(wxRED);
  562.   wxDELETE(wxBLUE);
  563.   wxDELETE(wxGREEN);
  564.   wxDELETE(wxCYAN);
  565.   wxDELETE(wxLIGHT_GREY);
  566.  
  567.   wxDELETE(wxSTANDARD_CURSOR);
  568.   wxDELETE(wxHOURGLASS_CURSOR);
  569.   wxDELETE(wxCROSS_CURSOR);
  570. }
  571.  
  572. void wxDeleteStockLists()
  573. {
  574.   wxDELETE(wxTheBrushList);
  575.   wxDELETE(wxThePenList);
  576.   wxDELETE(wxTheFontList);
  577.   wxDELETE(wxTheBitmapList);
  578. }
  579.  
  580. // ============================================================================
  581. // wxTheXXXList stuff (semi-obsolete)
  582. // ============================================================================
  583.  
  584. wxBitmapList::wxBitmapList()
  585. {
  586. }
  587.  
  588. wxBitmapList::~wxBitmapList ()
  589. {
  590.   wxNode *node = First ();
  591.   while (node)
  592.     {
  593.       wxBitmap *bitmap = (wxBitmap *) node->Data ();
  594.       wxNode *next = node->Next ();
  595.       if (bitmap->GetVisible())
  596.         delete bitmap;
  597.       node = next;
  598.     }
  599. }
  600.  
  601. // Pen and Brush lists
  602. wxPenList::~wxPenList ()
  603. {
  604.   wxNode *node = First ();
  605.   while (node)
  606.     {
  607.       wxPen *pen = (wxPen *) node->Data ();
  608.       wxNode *next = node->Next ();
  609.       if (pen->GetVisible())
  610.         delete pen;
  611.       node = next;
  612.     }
  613. }
  614.  
  615. void wxPenList::AddPen (wxPen * pen)
  616. {
  617.   Append (pen);
  618. }
  619.  
  620. void wxPenList::RemovePen (wxPen * pen)
  621. {
  622.   DeleteObject (pen);
  623. }
  624.  
  625. wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style)
  626. {
  627.     for (wxNode * node = First (); node; node = node->Next ())
  628.     {
  629.         wxPen *each_pen = (wxPen *) node->Data ();
  630.         if (each_pen &&
  631.                 each_pen->GetVisible() &&
  632.                 each_pen->GetWidth () == width &&
  633.                 each_pen->GetStyle () == style &&
  634.                 each_pen->GetColour ().Red () == colour.Red () &&
  635.                 each_pen->GetColour ().Green () == colour.Green () &&
  636.                 each_pen->GetColour ().Blue () == colour.Blue ())
  637.             return each_pen;
  638.     }
  639.  
  640.     wxPen *pen = new wxPen (colour, width, style);
  641.     if ( !pen->Ok() )
  642.     {
  643.         // don't save the invalid pens in the list
  644.         delete pen;
  645.  
  646.         return NULL;
  647.     }
  648.  
  649.     AddPen(pen);
  650.  
  651.     // we'll delete it ourselves later
  652.     pen->SetVisible(TRUE);
  653.  
  654.     return pen;
  655. }
  656.  
  657. wxBrushList::~wxBrushList ()
  658. {
  659.   wxNode *node = First ();
  660.   while (node)
  661.     {
  662.       wxBrush *brush = (wxBrush *) node->Data ();
  663.       wxNode *next = node->Next ();
  664.       if (brush && brush->GetVisible())
  665.         delete brush;
  666.       node = next;
  667.     }
  668. }
  669.  
  670. void wxBrushList::AddBrush (wxBrush * brush)
  671. {
  672.   Append (brush);
  673. }
  674.  
  675. wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style)
  676. {
  677.     for (wxNode * node = First (); node; node = node->Next ())
  678.     {
  679.         wxBrush *each_brush = (wxBrush *) node->Data ();
  680.         if (each_brush &&
  681.                 each_brush->GetVisible() &&
  682.                 each_brush->GetStyle () == style &&
  683.                 each_brush->GetColour ().Red () == colour.Red () &&
  684.                 each_brush->GetColour ().Green () == colour.Green () &&
  685.                 each_brush->GetColour ().Blue () == colour.Blue ())
  686.             return each_brush;
  687.     }
  688.  
  689.     wxBrush *brush = new wxBrush (colour, style);
  690.  
  691.     if ( !brush->Ok() )
  692.     {
  693.         // don't put the brushes we failed to create into the list
  694.         delete brush;
  695.  
  696.         return NULL;
  697.     }
  698.  
  699.     AddBrush(brush);
  700.  
  701.     // we'll delete it ourselves later
  702.     brush->SetVisible(TRUE);
  703.  
  704.     return brush;
  705. }
  706.  
  707. void wxBrushList::RemoveBrush (wxBrush * brush)
  708. {
  709.   DeleteObject (brush);
  710. }
  711.  
  712. wxFontList::~wxFontList ()
  713. {
  714.     wxNode *node = First ();
  715.     while (node)
  716.     {
  717.         // Only delete objects that are 'visible', i.e.
  718.         // that have been created using FindOrCreate...,
  719.         // where the pointers are expected to be shared
  720.         // (and therefore not deleted by any one part of an app).
  721.         wxFont *font = (wxFont *) node->Data ();
  722.         wxNode *next = node->Next ();
  723.         if (font->GetVisible())
  724.             delete font;
  725.         node = next;
  726.     }
  727. }
  728.  
  729. void wxFontList::AddFont (wxFont * font)
  730. {
  731.   Append (font);
  732. }
  733.  
  734. void wxFontList::RemoveFont (wxFont * font)
  735. {
  736.   DeleteObject (font);
  737. }
  738.  
  739. wxFont *wxFontList::FindOrCreateFont(int pointSize,
  740.                                      int family,
  741.                                      int style,
  742.                                      int weight,
  743.                                      bool underline,
  744.                                      const wxString& facename,
  745.                                      wxFontEncoding encoding)
  746. {
  747.     wxFont *font = (wxFont *)NULL;
  748.     wxNode *node;
  749.     for ( node = First(); node; node = node->Next() )
  750.     {
  751.         font = (wxFont *)node->Data();
  752.         if ( font->GetVisible() &&
  753.              font->Ok() &&
  754.              font->GetPointSize () == pointSize &&
  755.              font->GetStyle () == style &&
  756.              font->GetWeight () == weight &&
  757.              font->GetUnderlined () == underline )
  758.         {
  759.             int fontFamily = font->GetFamily();
  760.  
  761. #if defined(__WXGTK__)
  762.             // under GTK the default family is wxSWISS, so looking for a font
  763.             // with wxDEFAULT family should return a wxSWISS one instead of
  764.             // creating a new one
  765.             bool same = (fontFamily == family) ||
  766.                         (fontFamily == wxSWISS && family == wxDEFAULT);
  767. #else // !GTK
  768.             // VZ: but why elsewhere do we require an exact match? mystery...
  769.             bool same = fontFamily == family;
  770. #endif // GTK/!GTK
  771.  
  772.             // empty facename matches anything at all: this is bad because
  773.             // depending on which fonts are already created, we might get back
  774.             // a different font if we create it with empty facename, but it is
  775.             // still better than never matching anything in the cache at all
  776.             // in this case
  777.             if ( same && !!facename )
  778.             {
  779.                 const wxString& fontFace = font->GetFaceName();
  780.  
  781.                 // empty facename matches everything
  782.                 same = !fontFace || fontFace == facename;
  783.             }
  784.  
  785.             if ( same && (encoding != wxFONTENCODING_DEFAULT) )
  786.             {
  787.                 // have to match the encoding too
  788.                 same = font->GetEncoding() == encoding;
  789.             }
  790.  
  791.             if ( same )
  792.             {
  793.                 return font;
  794.             }
  795.         }
  796.     }
  797.  
  798.     if ( !node )
  799.     {
  800.         // font not found, create the new one
  801.         font = new wxFont(pointSize, family, style, weight,
  802.                           underline, facename, encoding);
  803.  
  804.         AddFont(font);
  805.  
  806.         // and mark it as being cacheable
  807.         font->SetVisible(TRUE);
  808.     }
  809.  
  810.     return font;
  811. }
  812.  
  813. void wxBitmapList::AddBitmap(wxBitmap *bitmap)
  814. {
  815.     Append(bitmap);
  816. }
  817.  
  818. void wxBitmapList::RemoveBitmap(wxBitmap *bitmap)
  819. {
  820.     DeleteObject(bitmap);
  821. }
  822.  
  823. wxSize wxGetDisplaySize()
  824. {
  825.     int x, y;
  826.     wxDisplaySize(& x, & y);
  827.     return wxSize(x, y);
  828. }
  829.  
  830. wxRect wxGetClientDisplayRect()
  831. {
  832.     int x, y, width, height;
  833.     wxClientDisplayRect(&x, &y, &width, &height);  // call plat-specific version
  834.     return wxRect(x, y, width, height);
  835. }
  836.  
  837. wxSize wxGetDisplaySizeMM()
  838. {
  839.     int x, y;
  840.     wxDisplaySizeMM(& x, & y);
  841.     return wxSize(x, y);
  842. }
  843.  
  844. wxResourceCache::~wxResourceCache ()
  845. {
  846.     wxNode *node = First ();
  847.     while (node) {
  848.         wxObject *item = (wxObject *)node->Data();
  849.         delete item;
  850.  
  851.         node = node->Next ();
  852.     }
  853. }
  854.  
  855.