1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/textmeasure.h
// Purpose: declaration of wxTextMeasure class
// Author: Manuel Martin
// Created: 2012-10-05
// Copyright: (c) 1997-2012 wxWidgets team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_TEXTMEASURE_H_
#define _WX_PRIVATE_TEXTMEASURE_H_
class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxFont;
class WXDLLIMPEXP_FWD_CORE wxWindow;
// ----------------------------------------------------------------------------
// wxTextMeasure: class used to measure text extent.
// ----------------------------------------------------------------------------
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. 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);
// Even though this class is not supposed to be used polymorphically, give
// it a virtual dtor to avoid compiler warnings.
virtual ~wxTextMeasureBase() { }
// Return the extent of a single line string.
void GetTextExtent(const wxString& string,
wxCoord *width,
wxCoord *height,
wxCoord *descent = NULL,
wxCoord *externalLeading = NULL);
// The same for a multiline (with '\n') string.
void GetMultiLineTextExtent(const wxString& text,
wxCoord *width,
wxCoord *height,
wxCoord *heightOneLine = NULL);
// Find the dimensions of the largest string.
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().
//
// The scaleX argument is the horizontal scale used by wxDC and is only
// used in the generic implementation.
bool GetPartialTextExtents(const wxString& text,
wxArrayInt& widths,
double scaleX);
// 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() { }
// 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)
{
// 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()
{
if ( !m_tm.IsUsingDCImpl() )
m_tm.EndMeasuring();
}
private:
wxTextMeasureBase& m_tm;
};
// The main function of this class, to be implemented in platform-specific
// way used by all our public methods.
//
// The width and height pointers here are never NULL and the input string
// is not empty.
virtual void DoGetTextExtent(const wxString& string,
wxCoord *width,
wxCoord *height,
wxCoord *descent = NULL,
wxCoord *externalLeading = NULL) = 0;
// The real implementation of GetPartialTextExtents().
//
// On input, widths array contains text.length() zero elements and the text
// is guaranteed to be non-empty.
virtual bool DoGetPartialTextExtents(const wxString& text,
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;
wxDECLARE_NO_COPY_CLASS(wxTextMeasureBase);
};
// Include the platform dependent class declaration, if any.
#if defined(__WXGTK20__)
#include "wx/gtk/private/textmeasure.h"
#elif defined(__WXMSW__)
#include "wx/msw/private/textmeasure.h"
#else // no platform-specific implementation of wxTextMeasure yet
#include "wx/generic/private/textmeasure.h"
#define wxUSE_GENERIC_TEXTMEASURE 1
#endif
#ifndef wxUSE_GENERIC_TEXTMEASURE
#define wxUSE_GENERIC_TEXTMEASURE 0
#endif
#endif // _WX_PRIVATE_TEXTMEASURE_H_
|