X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c70155b8ee6cdf24966de6bf24370b0454a045ab..632c86a3e6a8e5e7e16617a53b1419d394cedb30:/include/wx/private/textmeasure.h diff --git a/include/wx/private/textmeasure.h b/include/wx/private/textmeasure.h index dbd89136b3..69fbf85ab2 100644 --- a/include/wx/private/textmeasure.h +++ b/include/wx/private/textmeasure.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxTextMeasure class // Author: Manuel Martin // Created: 2012-10-05 -// RCS-ID: $Id: // Copyright: (c) 1997-2012 wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -11,8 +10,6 @@ #ifndef _WX_PRIVATE_TEXTMEASURE_H_ #define _WX_PRIVATE_TEXTMEASURE_H_ -#include "wx/vector.h" - class WXDLLIMPEXP_FWD_CORE wxDC; class WXDLLIMPEXP_FWD_CORE wxFont; class WXDLLIMPEXP_FWD_CORE wxWindow; @@ -25,7 +22,8 @@ class wxTextMeasureBase { public: // The first ctor argument must be non-NULL, i.e. each object of this class - // is associated with either a valid wxDC or a valid wxWindow. + // is associated with either a valid wxDC or a valid wxWindow. The font can + // be NULL to use the current DC/window font or can be specified explicitly. wxTextMeasureBase(const wxDC *dc, const wxFont *theFont); wxTextMeasureBase(const wxWindow *win, const wxFont *theFont); @@ -48,9 +46,11 @@ public: wxCoord *heightOneLine = NULL); // Find the dimensions of the largest string. - void GetLargestStringExtent(const wxVector& strings, - wxCoord *width, - wxCoord *height); + wxSize GetLargestStringExtent(size_t n, const wxString* strings); + wxSize GetLargestStringExtent(const wxArrayString& strings) + { + return GetLargestStringExtent(strings.size(), &strings[0]); + } // Fill the array with the widths for each "0..N" substrings for N from 1 // to text.length(). @@ -61,30 +61,39 @@ public: wxArrayInt& widths, double scaleX); -protected: + // These functions are called by our public methods before and after each // call to DoGetTextExtent(). Derived classes may override them to prepare // for -- possibly several -- subsequent calls to DoGetTextExtent(). // // As these calls must be always paired, they're never called directly but // only by our friend MeasuringGuard class. + // + // NB: They're public only to allow VC6 to compile this code, there doesn't + // seem to be any way to give MeasuringGuard access to them (FIXME-VC6) virtual void BeginMeasuring() { } virtual void EndMeasuring() { } - friend class MeasuringGuard; + // This is another method which is only used by MeasuringGuard. + bool IsUsingDCImpl() const { return m_useDCImpl; } +protected: // RAII wrapper for the two methods above. class MeasuringGuard { public: MeasuringGuard(wxTextMeasureBase& tm) : m_tm(tm) { - m_tm.BeginMeasuring(); + // BeginMeasuring() should only be called if we have a native DC, + // so don't call it if we delegate to a DC of unknown type. + if ( !m_tm.IsUsingDCImpl() ) + m_tm.BeginMeasuring(); } ~MeasuringGuard() { - m_tm.EndMeasuring(); + if ( !m_tm.IsUsingDCImpl() ) + m_tm.EndMeasuring(); } private: @@ -93,7 +102,7 @@ protected: // The main function of this class, to be implemented in platform-specific - // way used by all our public methods except GetLargestStringExtents(). + // way used by all our public methods. // // The width and height pointers here are never NULL and the input string // is not empty. @@ -111,12 +120,36 @@ protected: wxArrayInt& widths, double scaleX) = 0; + // Call either DoGetTextExtent() or wxDC::GetTextExtent() depending on the + // value of m_useDCImpl. + // + // This must be always used instead of calling DoGetTextExtent() directly! + void CallGetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL); + + // Return a valid font: if one was given to us in the ctor, use this one, + // otherwise use the current font of the associated wxDC or wxWindow. + wxFont GetFont() const; + // Exactly one of m_dc and m_win is non-NULL for any given object of this // class. const wxDC* const m_dc; const wxWindow* const m_win; + // If this is true, simply forward to wxDC::GetTextExtent() from our + // CallGetTextExtent() instead of calling our own DoGetTextExtent(). + // + // We need this because our DoGetTextExtent() typically only works with + // native DCs, i.e. those having an HDC under Windows or using Pango under + // GTK+. However wxTextMeasure object can be constructed for any wxDC, not + // necessarily a native one and in this case we must call back into the DC + // implementation of text measuring itself. + bool m_useDCImpl; + // This one can be NULL or not. const wxFont* const m_font;