home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / common / gdicmn.cpp < prev    next >
C/C++ Source or Header  |  2002-11-04  |  24KB  |  856 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.2.1 2002/11/03 19:08:56 RR 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.   {
  369.       delete col;
  370.       return (wxColour *) NULL;
  371.   }
  372.   Append( colour, col );
  373.   return col;
  374. #endif
  375.  
  376. #ifdef __X__
  377.     XColor xcolour;
  378.  
  379. #ifdef __WXMOTIF__
  380.     Display *display = XtDisplay((Widget) wxTheApp->GetTopLevelWidget()) ;
  381. #endif
  382. #ifdef __WXX11__
  383.     Display* display = (Display*) wxGetDisplay();
  384. #endif
  385.     /* MATTHEW: [4] Use wxGetMainColormap */
  386.     if (!XParseColor(display, (Colormap) wxTheApp->GetMainColormap((WXDisplay*) display), colour.ToAscii() ,&xcolour))
  387.       return NULL;
  388.  
  389. #if wxUSE_NANOX
  390.     unsigned char r = (unsigned char)(xcolour.red);
  391.     unsigned char g = (unsigned char)(xcolour.green);
  392.     unsigned char b = (unsigned char)(xcolour.blue);
  393. #else
  394.     unsigned char r = (unsigned char)(xcolour.red >> 8);
  395.     unsigned char g = (unsigned char)(xcolour.green >> 8);
  396.     unsigned char b = (unsigned char)(xcolour.blue >> 8);
  397. #endif
  398.  
  399.     wxColour *col = new wxColour(r, g, b);
  400.     Append(colour, col);
  401.  
  402.     return col;
  403. #endif // __X__
  404. }
  405.  
  406. wxString wxColourDatabase::FindName (const wxColour& colour) const
  407. {
  408.     wxString name;
  409.  
  410.     unsigned char red = colour.Red ();
  411.     unsigned char green = colour.Green ();
  412.     unsigned char blue = colour.Blue ();
  413.  
  414.     for (wxNode * node = First (); node; node = node->Next ())
  415.     {
  416.         wxColour *col = (wxColour *) node->Data ();
  417.  
  418.         if (col->Red () == red && col->Green () == green && col->Blue () == blue)
  419.         {
  420.             const wxChar *found = node->GetKeyString();
  421.             if ( found )
  422.             {
  423.                 name = found;
  424.  
  425.                 break;
  426.             }
  427.         }
  428.     }
  429.  
  430.     return name;
  431. }
  432.  
  433. void wxInitializeStockLists()
  434. {
  435.   wxTheBrushList = new wxBrushList;
  436.   wxThePenList = new wxPenList;
  437.   wxTheFontList = new wxFontList;
  438.   wxTheBitmapList = new wxBitmapList;
  439. }
  440.  
  441. void wxInitializeStockObjects ()
  442. {
  443. #ifdef __WXMOTIF__
  444. #endif
  445. #ifdef __X__
  446.   // TODO
  447.   //  wxFontPool = new XFontPool;
  448. #endif
  449.  
  450.   // why under MSW fonts shouldn't have the standard system size?
  451. /*
  452. #ifdef __WXMSW__
  453.   static const int sizeFont = 10;
  454. #else
  455. #endif
  456. */
  457. #if defined(__WXMAC__)
  458.     int sizeFont = 12;
  459.  
  460.     Str255 fontName ;
  461.     SInt16 fontSize ;
  462.     Style fontStyle ;
  463.  
  464.     GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
  465.     sizeFont = fontSize ;
  466.     p2cstrcpy( (char*) fontName , fontName ) ;
  467.     wxSWISS_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName );
  468. #elif defined(__WXPM__)
  469.   static const int sizeFont = 12;
  470. #else
  471.   wxNORMAL_FONT = new wxFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
  472.   static const int sizeFont = wxNORMAL_FONT->GetPointSize();
  473. #endif
  474.  
  475. #if defined(__WXPM__)
  476.   /*
  477.   // Basic OS/2 has a fairly limited number of fonts and these are as good
  478.   // as I can do to get something that looks halfway "wx" normal
  479.   */
  480.   wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxBOLD);
  481.   wxSMALL_FONT = new wxFont (sizeFont - 4, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
  482.   wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
  483.   wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
  484. #elif defined(__WXMAC__)
  485.     wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxNORMAL);
  486.     wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
  487.     GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
  488.     p2cstrcpy( (char*) fontName , fontName ) ;
  489.     wxSMALL_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName );
  490. #else
  491.   wxSMALL_FONT = new wxFont (sizeFont - 2, wxSWISS, wxNORMAL, wxNORMAL);
  492.   wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
  493.   wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL);
  494. #endif
  495.  
  496.   wxRED_PEN = new wxPen (wxT("RED"), 1, wxSOLID);
  497.   wxCYAN_PEN = new wxPen (wxT("CYAN"), 1, wxSOLID);
  498.   wxGREEN_PEN = new wxPen (wxT("GREEN"), 1, wxSOLID);
  499.   wxBLACK_PEN = new wxPen (wxT("BLACK"), 1, wxSOLID);
  500.   wxWHITE_PEN = new wxPen (wxT("WHITE"), 1, wxSOLID);
  501.   wxTRANSPARENT_PEN = new wxPen (wxT("BLACK"), 1, wxTRANSPARENT);
  502.   wxBLACK_DASHED_PEN = new wxPen (wxT("BLACK"), 1, wxSHORT_DASH);
  503.   wxGREY_PEN = new wxPen (wxT("GREY"), 1, wxSOLID);
  504.   wxMEDIUM_GREY_PEN = new wxPen (wxT("MEDIUM GREY"), 1, wxSOLID);
  505.   wxLIGHT_GREY_PEN = new wxPen (wxT("LIGHT GREY"), 1, wxSOLID);
  506.  
  507.   wxBLUE_BRUSH = new wxBrush (wxT("BLUE"), wxSOLID);
  508.   wxGREEN_BRUSH = new wxBrush (wxT("GREEN"), wxSOLID);
  509.   wxWHITE_BRUSH = new wxBrush (wxT("WHITE"), wxSOLID);
  510.   wxBLACK_BRUSH = new wxBrush (wxT("BLACK"), wxSOLID);
  511.   wxTRANSPARENT_BRUSH = new wxBrush (wxT("BLACK"), wxTRANSPARENT);
  512.   wxCYAN_BRUSH = new wxBrush (wxT("CYAN"), wxSOLID);
  513.   wxRED_BRUSH = new wxBrush (wxT("RED"), wxSOLID);
  514.   wxGREY_BRUSH = new wxBrush (wxT("GREY"), wxSOLID);
  515.   wxMEDIUM_GREY_BRUSH = new wxBrush (wxT("MEDIUM GREY"), wxSOLID);
  516.   wxLIGHT_GREY_BRUSH = new wxBrush (wxT("LIGHT GREY"), wxSOLID);
  517.  
  518.   wxBLACK = new wxColour (wxT("BLACK"));
  519.   wxWHITE = new wxColour (wxT("WHITE"));
  520.   wxRED = new wxColour (wxT("RED"));
  521.   wxBLUE = new wxColour (wxT("BLUE"));
  522.   wxGREEN = new wxColour (wxT("GREEN"));
  523.   wxCYAN = new wxColour (wxT("CYAN"));
  524.   wxLIGHT_GREY = new wxColour (wxT("LIGHT GREY"));
  525.  
  526.   wxSTANDARD_CURSOR = new wxCursor (wxCURSOR_ARROW);
  527.   wxHOURGLASS_CURSOR = new wxCursor (wxCURSOR_WAIT);
  528.   wxCROSS_CURSOR = new wxCursor (wxCURSOR_CROSS);
  529. }
  530.  
  531. void wxDeleteStockObjects ()
  532. {
  533.   wxDELETE(wxNORMAL_FONT);
  534.   wxDELETE(wxSMALL_FONT);
  535.   wxDELETE(wxITALIC_FONT);
  536.   wxDELETE(wxSWISS_FONT);
  537.  
  538.   wxDELETE(wxRED_PEN);
  539.   wxDELETE(wxCYAN_PEN);
  540.   wxDELETE(wxGREEN_PEN);
  541.   wxDELETE(wxBLACK_PEN);
  542.   wxDELETE(wxWHITE_PEN);
  543.   wxDELETE(wxTRANSPARENT_PEN);
  544.   wxDELETE(wxBLACK_DASHED_PEN);
  545.   wxDELETE(wxGREY_PEN);
  546.   wxDELETE(wxMEDIUM_GREY_PEN);
  547.   wxDELETE(wxLIGHT_GREY_PEN);
  548.  
  549.   wxDELETE(wxBLUE_BRUSH);
  550.   wxDELETE(wxGREEN_BRUSH);
  551.   wxDELETE(wxWHITE_BRUSH);
  552.   wxDELETE(wxBLACK_BRUSH);
  553.   wxDELETE(wxTRANSPARENT_BRUSH);
  554.   wxDELETE(wxCYAN_BRUSH);
  555.   wxDELETE(wxRED_BRUSH);
  556.   wxDELETE(wxGREY_BRUSH);
  557.   wxDELETE(wxMEDIUM_GREY_BRUSH);
  558.   wxDELETE(wxLIGHT_GREY_BRUSH);
  559.  
  560.   wxDELETE(wxBLACK);
  561.   wxDELETE(wxWHITE);
  562.   wxDELETE(wxRED);
  563.   wxDELETE(wxBLUE);
  564.   wxDELETE(wxGREEN);
  565.   wxDELETE(wxCYAN);
  566.   wxDELETE(wxLIGHT_GREY);
  567.  
  568.   wxDELETE(wxSTANDARD_CURSOR);
  569.   wxDELETE(wxHOURGLASS_CURSOR);
  570.   wxDELETE(wxCROSS_CURSOR);
  571. }
  572.  
  573. void wxDeleteStockLists()
  574. {
  575.   wxDELETE(wxTheBrushList);
  576.   wxDELETE(wxThePenList);
  577.   wxDELETE(wxTheFontList);
  578.   wxDELETE(wxTheBitmapList);
  579. }
  580.  
  581. // ============================================================================
  582. // wxTheXXXList stuff (semi-obsolete)
  583. // ============================================================================
  584.  
  585. wxBitmapList::wxBitmapList()
  586. {
  587. }
  588.  
  589. wxBitmapList::~wxBitmapList ()
  590. {
  591.   wxNode *node = First ();
  592.   while (node)
  593.     {
  594.       wxBitmap *bitmap = (wxBitmap *) node->Data ();
  595.       wxNode *next = node->Next ();
  596.       if (bitmap->GetVisible())
  597.         delete bitmap;
  598.       node = next;
  599.     }
  600. }
  601.  
  602. // Pen and Brush lists
  603. wxPenList::~wxPenList ()
  604. {
  605.   wxNode *node = First ();
  606.   while (node)
  607.     {
  608.       wxPen *pen = (wxPen *) node->Data ();
  609.       wxNode *next = node->Next ();
  610.       if (pen->GetVisible())
  611.         delete pen;
  612.       node = next;
  613.     }
  614. }
  615.  
  616. void wxPenList::AddPen (wxPen * pen)
  617. {
  618.   Append (pen);
  619. }
  620.  
  621. void wxPenList::RemovePen (wxPen * pen)
  622. {
  623.   DeleteObject (pen);
  624. }
  625.  
  626. wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style)
  627. {
  628.     for (wxNode * node = First (); node; node = node->Next ())
  629.     {
  630.         wxPen *each_pen = (wxPen *) node->Data ();
  631.         if (each_pen &&
  632.                 each_pen->GetVisible() &&
  633.                 each_pen->GetWidth () == width &&
  634.                 each_pen->GetStyle () == style &&
  635.                 each_pen->GetColour ().Red () == colour.Red () &&
  636.                 each_pen->GetColour ().Green () == colour.Green () &&
  637.                 each_pen->GetColour ().Blue () == colour.Blue ())
  638.             return each_pen;
  639.     }
  640.  
  641.     wxPen *pen = new wxPen (colour, width, style);
  642.     if ( !pen->Ok() )
  643.     {
  644.         // don't save the invalid pens in the list
  645.         delete pen;
  646.  
  647.         return NULL;
  648.     }
  649.  
  650.     AddPen(pen);
  651.  
  652.     // we'll delete it ourselves later
  653.     pen->SetVisible(TRUE);
  654.  
  655.     return pen;
  656. }
  657.  
  658. wxBrushList::~wxBrushList ()
  659. {
  660.   wxNode *node = First ();
  661.   while (node)
  662.     {
  663.       wxBrush *brush = (wxBrush *) node->Data ();
  664.       wxNode *next = node->Next ();
  665.       if (brush && brush->GetVisible())
  666.         delete brush;
  667.       node = next;
  668.     }
  669. }
  670.  
  671. void wxBrushList::AddBrush (wxBrush * brush)
  672. {
  673.   Append (brush);
  674. }
  675.  
  676. wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style)
  677. {
  678.     for (wxNode * node = First (); node; node = node->Next ())
  679.     {
  680.         wxBrush *each_brush = (wxBrush *) node->Data ();
  681.         if (each_brush &&
  682.                 each_brush->GetVisible() &&
  683.                 each_brush->GetStyle () == style &&
  684.                 each_brush->GetColour ().Red () == colour.Red () &&
  685.                 each_brush->GetColour ().Green () == colour.Green () &&
  686.                 each_brush->GetColour ().Blue () == colour.Blue ())
  687.             return each_brush;
  688.     }
  689.  
  690.     wxBrush *brush = new wxBrush (colour, style);
  691.  
  692.     if ( !brush->Ok() )
  693.     {
  694.         // don't put the brushes we failed to create into the list
  695.         delete brush;
  696.  
  697.         return NULL;
  698.     }
  699.  
  700.     AddBrush(brush);
  701.  
  702.     // we'll delete it ourselves later
  703.     brush->SetVisible(TRUE);
  704.  
  705.     return brush;
  706. }
  707.  
  708. void wxBrushList::RemoveBrush (wxBrush * brush)
  709. {
  710.   DeleteObject (brush);
  711. }
  712.  
  713. wxFontList::~wxFontList ()
  714. {
  715.     wxNode *node = First ();
  716.     while (node)
  717.     {
  718.         // Only delete objects that are 'visible', i.e.
  719.         // that have been created using FindOrCreate...,
  720.         // where the pointers are expected to be shared
  721.         // (and therefore not deleted by any one part of an app).
  722.         wxFont *font = (wxFont *) node->Data ();
  723.         wxNode *next = node->Next ();
  724.         if (font->GetVisible())
  725.             delete font;
  726.         node = next;
  727.     }
  728. }
  729.  
  730. void wxFontList::AddFont (wxFont * font)
  731. {
  732.   Append (font);
  733. }
  734.  
  735. void wxFontList::RemoveFont (wxFont * font)
  736. {
  737.   DeleteObject (font);
  738. }
  739.  
  740. wxFont *wxFontList::FindOrCreateFont(int pointSize,
  741.                                      int family,
  742.                                      int style,
  743.                                      int weight,
  744.                                      bool underline,
  745.                                      const wxString& facename,
  746.                                      wxFontEncoding encoding)
  747. {
  748.     wxFont *font = (wxFont *)NULL;
  749.     wxNode *node;
  750.     for ( node = First(); node; node = node->Next() )
  751.     {
  752.         font = (wxFont *)node->Data();
  753.         if ( font->GetVisible() &&
  754.              font->Ok() &&
  755.              font->GetPointSize () == pointSize &&
  756.              font->GetStyle () == style &&
  757.              font->GetWeight () == weight &&
  758.              font->GetUnderlined () == underline )
  759.         {
  760.             int fontFamily = font->GetFamily();
  761.  
  762. #if defined(__WXGTK__)
  763.             // under GTK the default family is wxSWISS, so looking for a font
  764.             // with wxDEFAULT family should return a wxSWISS one instead of
  765.             // creating a new one
  766.             bool same = (fontFamily == family) ||
  767.                         (fontFamily == wxSWISS && family == wxDEFAULT);
  768. #else // !GTK
  769.             // VZ: but why elsewhere do we require an exact match? mystery...
  770.             bool same = fontFamily == family;
  771. #endif // GTK/!GTK
  772.  
  773.             // empty facename matches anything at all: this is bad because
  774.             // depending on which fonts are already created, we might get back
  775.             // a different font if we create it with empty facename, but it is
  776.             // still better than never matching anything in the cache at all
  777.             // in this case
  778.             if ( same && !!facename )
  779.             {
  780.                 const wxString& fontFace = font->GetFaceName();
  781.  
  782.                 // empty facename matches everything
  783.                 same = !fontFace || fontFace == facename;
  784.             }
  785.  
  786.             if ( same && (encoding != wxFONTENCODING_DEFAULT) )
  787.             {
  788.                 // have to match the encoding too
  789.                 same = font->GetEncoding() == encoding;
  790.             }
  791.  
  792.             if ( same )
  793.             {
  794.                 return font;
  795.             }
  796.         }
  797.     }
  798.  
  799.     if ( !node )
  800.     {
  801.         // font not found, create the new one
  802.         font = new wxFont(pointSize, family, style, weight,
  803.                           underline, facename, encoding);
  804.  
  805.         AddFont(font);
  806.  
  807.         // and mark it as being cacheable
  808.         font->SetVisible(TRUE);
  809.     }
  810.  
  811.     return font;
  812. }
  813.  
  814. void wxBitmapList::AddBitmap(wxBitmap *bitmap)
  815. {
  816.     Append(bitmap);
  817. }
  818.  
  819. void wxBitmapList::RemoveBitmap(wxBitmap *bitmap)
  820. {
  821.     DeleteObject(bitmap);
  822. }
  823.  
  824. wxSize wxGetDisplaySize()
  825. {
  826.     int x, y;
  827.     wxDisplaySize(& x, & y);
  828.     return wxSize(x, y);
  829. }
  830.  
  831. wxRect wxGetClientDisplayRect()
  832. {
  833.     int x, y, width, height;
  834.     wxClientDisplayRect(&x, &y, &width, &height);  // call plat-specific version
  835.     return wxRect(x, y, width, height);
  836. }
  837.  
  838. wxSize wxGetDisplaySizeMM()
  839. {
  840.     int x, y;
  841.     wxDisplaySizeMM(& x, & y);
  842.     return wxSize(x, y);
  843. }
  844.  
  845. wxResourceCache::~wxResourceCache ()
  846. {
  847.     wxNode *node = First ();
  848.     while (node) {
  849.         wxObject *item = (wxObject *)node->Data();
  850.         delete item;
  851.  
  852.         node = node->Next ();
  853.     }
  854. }
  855.  
  856.