3f66f6a5b3
This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
175 lines
6.5 KiB
C++
175 lines
6.5 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// 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 dependant 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_
|