From: Vadim Zeitlin Date: Sun, 16 Apr 2006 22:33:24 +0000 (+0000) Subject: simplify/cleanup wxTheXXXList and wxGDIObject code (patch 1452023 from Paul Cornett) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1de8d512b7c844d67b2dab36addc89868e68c9b6 simplify/cleanup wxTheXXXList and wxGDIObject code (patch 1452023 from Paul Cornett) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 6c543f2642..77c96666f4 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -898,7 +898,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/gtk/dcscreen.h wx/gtk/dnd.h wx/gtk/font.h - wx/gtk/gdiobj.h wx/gtk/icon.h wx/gtk/minifram.h wx/gtk/pen.h @@ -1069,7 +1068,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/gtk1/dcscreen.h wx/gtk1/dnd.h wx/gtk1/font.h - wx/gtk1/gdiobj.h wx/gtk1/icon.h wx/gtk1/minifram.h wx/gtk1/pen.h @@ -1300,7 +1298,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/motif/font.h wx/motif/frame.h wx/motif/gauge.h - wx/motif/gdiobj.h wx/motif/icon.h wx/motif/listbox.h wx/motif/mdi.h @@ -1385,7 +1382,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/x11/dcscreen.h wx/x11/dnd.h wx/x11/font.h - wx/x11/gdiobj.h wx/x11/icon.h wx/x11/minifram.h wx/x11/palette.h @@ -1551,7 +1547,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/msw/frame.h wx/msw/gauge95.h wx/msw/gdiimage.h - wx/msw/gdiobj.h wx/msw/icon.h wx/msw/imaglist.h wx/msw/iniconf.h @@ -1731,7 +1726,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/mgl/dcscreen.h wx/mgl/font.h wx/mgl/fontutil.h - wx/mgl/gdiobj.h wx/mgl/icon.h wx/mgl/palette.h wx/mgl/pen.h @@ -1874,7 +1868,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/os2/frame.h wx/os2/gauge.h wx/os2/gdiimage.h - wx/os2/gdiobj.h wx/os2/helpwin.h wx/os2/icon.h wx/os2/iniconf.h @@ -2069,7 +2062,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/mac/fontdlg.h wx/mac/frame.h wx/mac/gauge.h - wx/mac/gdiobj.h wx/mac/glcanvas.h wx/mac/gsockmac.h wx/mac/helpxxxx.h @@ -2156,7 +2148,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/mac/carbon/fontdlg.h wx/mac/carbon/frame.h wx/mac/carbon/gauge.h - wx/mac/carbon/gdiobj.h wx/mac/carbon/gsockmac.h wx/mac/carbon/helpxxxx.h wx/mac/carbon/icon.h @@ -2361,7 +2352,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/cocoa/fontdlg.h wx/cocoa/frame.h wx/cocoa/gauge.h - wx/cocoa/gdiobj.h wx/cocoa/icon.h wx/cocoa/listbox.h wx/cocoa/log.h diff --git a/docs/latex/wx/brush.tex b/docs/latex/wx/brush.tex index 08b3f0cfbf..3449e8cdf1 100644 --- a/docs/latex/wx/brush.tex +++ b/docs/latex/wx/brush.tex @@ -371,13 +371,6 @@ Constructor. The application should not construct its own brush list: use the object pointer {\bf wxTheBrushList}. -\membersection{wxBrushList::AddBrush}\label{wxbrushlistaddbrush} - -\func{void}{AddBrush}{\param{wxBrush *}{brush}} - -Used internally by wxWidgets to add a brush to the list. - - \membersection{wxBrushList::FindOrCreateBrush}\label{wxbrushlistfindorcreatebrush} \func{wxBrush *}{FindOrCreateBrush}{\param{const wxColour\& }{colour}, \param{int}{ style = wxSOLID}} @@ -392,10 +385,3 @@ to the brush list, and returns it. \docparam{style}{Brush style. See \helpref{wxBrush::SetStyle}{wxbrushsetstyle} for a list of styles.} -\membersection{wxBrushList::RemoveBrush}\label{wxbrushlistremovebrush} - -\func{void}{RemoveBrush}{\param{wxBrush *}{brush}} - -Used by wxWidgets to remove a brush from the list. - - diff --git a/docs/latex/wx/fontlist.tex b/docs/latex/wx/fontlist.tex index cd5785fb2f..592a675779 100644 --- a/docs/latex/wx/fontlist.tex +++ b/docs/latex/wx/fontlist.tex @@ -29,12 +29,6 @@ deleted and their resources freed, eliminating the possibility of `memory leaks' Constructor. The application should not construct its own font list: use the object pointer {\bf wxTheFontList}. -\membersection{wxFontList::AddFont}\label{wxfontlistaddfont} - -\func{void}{AddFont}{\param{wxFont *}{font}} - -Used by wxWidgets to add a font to the list, called in the font constructor. - \membersection{wxFontList::FindOrCreateFont}\label{findorcreatefont} \func{wxFont *}{FindOrCreateFont}{\param{int}{ point\_size}, \param{int}{ family}, \param{int}{ style}, \param{int}{ weight}, \param{bool}{ underline = false}, @@ -43,10 +37,3 @@ Used by wxWidgets to add a font to the list, called in the font constructor. Finds a font of the given specification, or creates one and adds it to the list. See the \helpref{wxFont constructor}{wxfontctor} for details of the arguments. -\membersection{wxFontList::RemoveFont}\label{wxfontlistremovefont} - -\func{void}{RemoveFont}{\param{wxFont *}{font}} - -Used by wxWidgets to remove a font from the list. - - diff --git a/docs/latex/wx/pen.tex b/docs/latex/wx/pen.tex index c92c4834be..ae9677b3ba 100644 --- a/docs/latex/wx/pen.tex +++ b/docs/latex/wx/pen.tex @@ -390,12 +390,6 @@ backward compatibility with earlier versions of wxWidgets. Constructor. The application should not construct its own pen list: use the object pointer {\bf wxThePenList}. -\membersection{wxPenList::AddPen}\label{wxpenlistaddpen} - -\func{void}{AddPen}{\param{wxPen*}{ pen}} - -Used internally by wxWidgets to add a pen to the list. - \membersection{wxPenList::FindOrCreatePen}\label{wxpenlistfindorcreatepen} \func{wxPen*}{FindOrCreatePen}{\param{const wxColour\& }{colour}, \param{int}{ width}, \param{int}{ style}} @@ -417,9 +411,3 @@ to the pen list, and returns it. \docparam{width}{Width of pen.} \docparam{style}{Pen style. See \helpref{wxPen::wxPen}{wxpenctor} for a list of styles.} - -\membersection{wxPenList::RemovePen}\label{wxpenlistremovepen} - -\func{void}{RemovePen}{\param{wxPen*}{ pen}} - -Used by wxWidgets to remove a pen from the list. diff --git a/include/wx/gdicmn.h b/include/wx/gdicmn.h index fd6d6c2543..b1e5d72c18 100644 --- a/include/wx/gdicmn.h +++ b/include/wx/gdicmn.h @@ -452,40 +452,46 @@ public: typedef wxInt8 wxDash; -class WXDLLEXPORT wxPenList : public wxList -{ +class WXDLLIMPEXP_CORE wxGDIObjListBase { public: - wxPenList() { } - ~wxPenList(); + wxGDIObjListBase(); + ~wxGDIObjListBase(); - void AddPen(wxPen *pen); - void RemovePen(wxPen *pen); - wxPen *FindOrCreatePen(const wxColour& colour, int width, int style); +protected: + wxList list; }; -class WXDLLEXPORT wxBrushList : public wxList +class WXDLLIMPEXP_CORE wxPenList: public wxGDIObjListBase { public: - wxBrushList() { } - ~wxBrushList(); + wxPen *FindOrCreatePen(const wxColour& colour, int width, int style); +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddPen(wxPen*) ); + wxDEPRECATED( void RemovePen(wxPen*) ); +#endif +}; - void AddBrush(wxBrush *brush); - void RemoveBrush(wxBrush *brush); +class WXDLLIMPEXP_CORE wxBrushList: public wxGDIObjListBase +{ +public: wxBrush *FindOrCreateBrush(const wxColour& colour, int style = wxSOLID); +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddBrush(wxBrush*) ); + wxDEPRECATED( void RemoveBrush(wxBrush*) ); +#endif }; -class WXDLLEXPORT wxFontList : public wxList +class WXDLLIMPEXP_CORE wxFontList: public wxGDIObjListBase { public: - wxFontList() { } - ~wxFontList(); - - void AddFont(wxFont *font); - void RemoveFont(wxFont *font); wxFont *FindOrCreateFont(int pointSize, int family, int style, int weight, bool underline = false, const wxString& face = wxEmptyString, wxFontEncoding encoding = wxFONTENCODING_DEFAULT); +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddFont(wxFont*) ); + wxDEPRECATED( void RemoveFont(wxFont*) ); +#endif }; WX_DECLARE_STRING_HASH_MAP( wxColour *, wxStringToColourHashMap ); @@ -523,16 +529,6 @@ private: wxStringToColourHashMap *m_map; }; -class WXDLLEXPORT wxBitmapList : public wxList -{ -public: - wxBitmapList(){} - ~wxBitmapList(); - - void AddBitmap(wxBitmap *bitmap); - void RemoveBitmap(wxBitmap *bitmap); -}; - class WXDLLEXPORT wxResourceCache: public wxList { public: @@ -551,7 +547,6 @@ public: extern WXDLLEXPORT_DATA(wxPenList*) wxThePenList; extern WXDLLEXPORT_DATA(wxBrushList*) wxTheBrushList; extern WXDLLEXPORT_DATA(wxFontList*) wxTheFontList; -extern WXDLLEXPORT_DATA(wxBitmapList*) wxTheBitmapList; /* Stock objects diff --git a/include/wx/gdiobj.h b/include/wx/gdiobj.h index aac7facfe1..5c9747694a 100644 --- a/include/wx/gdiobj.h +++ b/include/wx/gdiobj.h @@ -12,29 +12,40 @@ #ifndef _WX_GDIOBJ_H_BASE_ #define _WX_GDIOBJ_H_BASE_ -#include "wx/defs.h" - -#if defined(__WXPALMOS__) -#include "wx/palmos/gdiobj.h" -#elif defined(__WXMSW__) -#include "wx/msw/gdiobj.h" -#elif defined(__WXMOTIF__) -#include "wx/motif/gdiobj.h" -#elif defined(__WXGTK20__) -#include "wx/gtk/gdiobj.h" -#elif defined(__WXGTK__) -#include "wx/gtk1/gdiobj.h" -#elif defined(__WXX11__) -#include "wx/x11/gdiobj.h" -#elif defined(__WXMGL__) -#include "wx/mgl/gdiobj.h" -#elif defined(__WXMAC__) -#include "wx/mac/gdiobj.h" -#elif defined(__WXCOCOA__) -#include "wx/cocoa/gdiobj.h" -#elif defined(__WXPM__) -#include "wx/os2/gdiobj.h" -#endif +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxGDIRefData is the base class for wxXXXData structures which contain the +// real data for the GDI object and are shared among all wxWin objects sharing +// the same native GDI object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIRefData: public wxObjectRefData { }; + +// ---------------------------------------------------------------------------- +// wxGDIObject +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIObject: public wxObject +{ +public: + bool IsNull() const { return m_refData == NULL; } + +#if defined(__WXMSW__) || defined(__WXOS2__) || defined(__WXPALMOS__) + // Creates the resource + virtual bool RealizeResource() { return false; } + + // Frees the resource + virtual bool FreeResource(bool WXUNUSED(force) = false) { return false; } + + virtual bool IsFree() const { return false; } + + // Returns handle. + virtual WXHANDLE GetResourceHandle() const { return 0; } +#endif // defined(__WXMSW__) || defined(__WXOS2__) + + DECLARE_DYNAMIC_CLASS(wxGDIObject) +}; #endif // _WX_GDIOBJ_H_BASE_ diff --git a/src/cocoa/font.cpp b/src/cocoa/font.cpp index bb4a682cc5..af1f3b552b 100644 --- a/src/cocoa/font.cpp +++ b/src/cocoa/font.cpp @@ -97,8 +97,6 @@ bool wxFont::Create(int pointSize, int family, int style, int weight, bool under wxFont::~wxFont() { - if (wxTheFontList) - wxTheFontList->DeleteObject(this); } bool wxFont::RealizeResource() diff --git a/src/common/datacmn.cpp b/src/common/datacmn.cpp index eb7d51cc9b..4e8702cd4e 100644 --- a/src/common/datacmn.cpp +++ b/src/common/datacmn.cpp @@ -48,7 +48,6 @@ int wxPageNumber; wxFontList *wxTheFontList = NULL; wxPenList *wxThePenList = NULL; wxBrushList *wxTheBrushList = NULL; -wxBitmapList *wxTheBitmapList = NULL; wxColourDatabase *wxTheColourDatabase = NULL; // 'Null' objects diff --git a/src/common/gdicmn.cpp b/src/common/gdicmn.cpp index 18320eb5db..cbc45edf1f 100644 --- a/src/common/gdicmn.cpp +++ b/src/common/gdicmn.cpp @@ -719,7 +719,6 @@ void wxInitializeStockLists() wxTheBrushList = new wxBrushList; wxThePenList = new wxPenList; wxTheFontList = new wxFontList; - wxTheBitmapList = new wxBitmapList; } void wxDeleteStockLists() @@ -727,57 +726,30 @@ void wxDeleteStockLists() wxDELETE(wxTheBrushList); wxDELETE(wxThePenList); wxDELETE(wxTheFontList); - wxDELETE(wxTheBitmapList); } // ============================================================================ // wxTheXXXList stuff (semi-obsolete) // ============================================================================ -wxBitmapList::~wxBitmapList () +wxGDIObjListBase::wxGDIObjListBase() { - wxList::compatibility_iterator node = GetFirst (); - while (node) - { - wxBitmap *bitmap = (wxBitmap *) node->GetData (); - wxList::compatibility_iterator next = node->GetNext (); - if (bitmap->GetVisible()) - delete bitmap; - node = next; - } } -// Pen and Brush lists -wxPenList::~wxPenList () +wxGDIObjListBase::~wxGDIObjListBase() { - wxList::compatibility_iterator node = GetFirst (); - while (node) + for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext()) { - wxPen *pen = (wxPen *) node->GetData (); - wxList::compatibility_iterator next = node->GetNext (); - if (pen->GetVisible()) - delete pen; - node = next; + delete wx_static_cast(wxObject*, node->GetData()); } } -void wxPenList::AddPen (wxPen * pen) -{ - Append (pen); -} - -void wxPenList::RemovePen (wxPen * pen) -{ - DeleteObject (pen); -} - wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style) { - for (wxList::compatibility_iterator node = GetFirst (); node; node = node->GetNext ()) + for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext()) { wxPen *each_pen = (wxPen *) node->GetData (); - if (each_pen && - each_pen->GetVisible() && + if ( each_pen->GetWidth () == width && each_pen->GetStyle () == style && each_pen->GetColour ().Red () == colour.Red () && @@ -786,48 +758,23 @@ wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style) return each_pen; } - wxPen *pen = new wxPen (colour, width, style); - if ( !pen->Ok() ) + wxPen* pen = NULL; + wxPen penTmp(colour, width, style); + if (penTmp.Ok()) { - // don't save the invalid pens in the list - delete pen; - - return NULL; + pen = new wxPen(penTmp); + list.Append(pen); } - AddPen(pen); - - // we'll delete it ourselves later - pen->SetVisible(true); - return pen; } -wxBrushList::~wxBrushList () -{ - wxList::compatibility_iterator node = GetFirst (); - while (node) - { - wxBrush *brush = (wxBrush *) node->GetData (); - wxList::compatibility_iterator next = node->GetNext (); - if (brush && brush->GetVisible()) - delete brush; - node = next; - } -} - -void wxBrushList::AddBrush (wxBrush * brush) -{ - Append (brush); -} - wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style) { - for (wxList::compatibility_iterator node = GetFirst (); node; node = node->GetNext ()) + for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext()) { wxBrush *each_brush = (wxBrush *) node->GetData (); - if (each_brush && - each_brush->GetVisible() && + if ( each_brush->GetStyle () == style && each_brush->GetColour ().Red () == colour.Red () && each_brush->GetColour ().Green () == colour.Green () && @@ -835,56 +782,17 @@ wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style) return each_brush; } - wxBrush *brush = new wxBrush (colour, style); - - if ( !brush->Ok() ) + wxBrush* brush = NULL; + wxBrush brushTmp(colour, style); + if (brushTmp.Ok()) { - // don't put the brushes we failed to create into the list - delete brush; - - return NULL; + brush = new wxBrush(brushTmp); + list.Append(brush); } - AddBrush(brush); - - // we'll delete it ourselves later - brush->SetVisible(true); - return brush; } -void wxBrushList::RemoveBrush (wxBrush * brush) -{ - DeleteObject (brush); -} - -wxFontList::~wxFontList () -{ - wxList::compatibility_iterator node = GetFirst (); - while (node) - { - // Only delete objects that are 'visible', i.e. - // that have been created using FindOrCreate..., - // where the pointers are expected to be shared - // (and therefore not deleted by any one part of an app). - wxFont *font = (wxFont *) node->GetData (); - wxList::compatibility_iterator next = node->GetNext (); - if (font->GetVisible()) - delete font; - node = next; - } -} - -void wxFontList::AddFont (wxFont * font) -{ - Append (font); -} - -void wxFontList::RemoveFont (wxFont * font) -{ - DeleteObject (font); -} - wxFont *wxFontList::FindOrCreateFont(int pointSize, int family, int style, @@ -893,13 +801,12 @@ wxFont *wxFontList::FindOrCreateFont(int pointSize, const wxString& facename, wxFontEncoding encoding) { - wxFont *font = (wxFont *)NULL; + wxFont *font; wxList::compatibility_iterator node; - for ( node = GetFirst(); node; node = node->GetNext() ) + for (node = list.GetFirst(); node; node = node->GetNext()) { font = (wxFont *)node->GetData(); - if ( font->GetVisible() && - font->Ok() && + if ( font->GetPointSize () == pointSize && font->GetStyle () == style && font->GetWeight () == weight && @@ -944,30 +851,26 @@ wxFont *wxFontList::FindOrCreateFont(int pointSize, } } - if ( !node ) + // font not found, create the new one + font = NULL; + wxFont fontTmp(pointSize, family, style, weight, underline, facename, encoding); + if (fontTmp.Ok()) { - // font not found, create the new one - font = new wxFont(pointSize, family, style, weight, - underline, facename, encoding); - - AddFont(font); - - // and mark it as being cacheable - font->SetVisible(true); + font = new wxFont(fontTmp); + list.Append(font); } return font; } -void wxBitmapList::AddBitmap(wxBitmap *bitmap) -{ - Append(bitmap); -} - -void wxBitmapList::RemoveBitmap(wxBitmap *bitmap) -{ - DeleteObject(bitmap); -} +#if WXWIN_COMPATIBILITY_2_6 +void wxBrushList::AddBrush(wxBrush*) { } +void wxBrushList::RemoveBrush(wxBrush*) { } +void wxFontList::AddFont(wxFont*) { } +void wxFontList::RemoveFont(wxFont*) { } +void wxPenList::AddPen(wxPen*) { } +void wxPenList::RemovePen(wxPen*) { } +#endif wxSize wxGetDisplaySize() { diff --git a/src/msw/gdiobj.cpp b/src/msw/gdiobj.cpp index 9b7dafc903..ab671b673b 100644 --- a/src/msw/gdiobj.cpp +++ b/src/msw/gdiobj.cpp @@ -28,6 +28,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxGDIObject, wxObject) +#define M_GDIDATA wx_static_cast(wxGDIRefData*, m_refData) + /* void wxGDIObject::IncrementResourceUsage(void) { diff --git a/src/os2/brush.cpp b/src/os2/brush.cpp index defdde2797..acd9b7f57b 100644 --- a/src/os2/brush.cpp +++ b/src/os2/brush.cpp @@ -54,14 +54,10 @@ wxBrushRefData::~wxBrushRefData() // wxBrush::wxBrush() { - if ( wxTheBrushList ) - wxTheBrushList->AddBrush(this); } // end of wxBrush::wxBrush wxBrush::~wxBrush() { - if ( wxTheBrushList ) - wxTheBrushList->RemoveBrush(this); } // end of wxBrush::~wxBrush wxBrush::wxBrush( @@ -77,9 +73,6 @@ wxBrush::wxBrush( memset(&M_BRUSHDATA->m_vBundle, '\0', sizeof(AREABUNDLE)); RealizeResource(); - - if ( wxTheBrushList ) - wxTheBrushList->AddBrush(this); } // end of wxBrush::wxBrush wxBrush::wxBrush( @@ -94,9 +87,6 @@ wxBrush::wxBrush( memset(&M_BRUSHDATA->m_vBundle, '\0', sizeof(AREABUNDLE)); RealizeResource(); - - if ( wxTheBrushList ) - wxTheBrushList->AddBrush(this); } // end of wxBrush::wxBrush bool wxBrush::RealizeResource() diff --git a/src/os2/pen.cpp b/src/os2/pen.cpp index 712a7293ed..b0523de111 100644 --- a/src/os2/pen.cpp +++ b/src/os2/pen.cpp @@ -60,14 +60,10 @@ wxPenRefData::~wxPenRefData() // wxPen::wxPen() { - if ( wxThePenList ) - wxThePenList->AddPen(this); } // end of wxPen::wxPen wxPen::~wxPen() { - if (wxThePenList) - wxThePenList->RemovePen(this); } // end of wxPen::wxPen // Should implement Create @@ -87,9 +83,6 @@ wxPen::wxPen( M_PENDATA->m_hPen = 0L; RealizeResource(); - - if ( wxThePenList ) - wxThePenList->AddPen(this); } // end of wxPen::wxPen wxPen::wxPen( @@ -107,9 +100,6 @@ wxPen::wxPen( M_PENDATA->m_hPen = 0; RealizeResource(); - - if ( wxThePenList ) - wxThePenList->AddPen(this); } // end of wxPen::wxPen int wx2os2PenStyle(