From 255c07b4df512ff4f844f4d604787b5ea8999530 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 31 May 2009 20:12:07 +0000 Subject: [PATCH] extracted wxTextWrapper in its own header and made it public git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60848 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- build/bakefiles/files.bkl | 1 + docs/changes.txt | 1 + include/wx/private/stattext.h | 55 ------------------- include/wx/textwrapper.h | 68 +++++++++++++++++++++++ interface/wx/textwrapper.h | 100 ++++++++++++++++++++++++++++++++++ src/common/dlgcmn.cpp | 2 +- src/common/stattextcmn.cpp | 1 + 7 files changed, 172 insertions(+), 56 deletions(-) create mode 100644 include/wx/textwrapper.h create mode 100644 interface/wx/textwrapper.h diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index b1dfad3049..37f419d39c 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -841,6 +841,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/textctrl.h wx/textdlg.h wx/textentry.h + wx/textwrapper.h wx/toolbar.h wx/validate.h wx/valtext.h diff --git a/docs/changes.txt b/docs/changes.txt index ee3eab7fb9..914e7348a2 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -342,6 +342,7 @@ All (GUI): - Building OpenGL library is now enabled by default. - Improve wxTreeCtrl::ScrollTo() in generic version (Raanan Barzel). - Added wxDC::CopyAttributes() and use it in wxBufferedDC. +- Added wxTextWrapper helper class useful for wrapping lines of text. MSW: diff --git a/include/wx/private/stattext.h b/include/wx/private/stattext.h index 1618315881..8c8966d64c 100644 --- a/include/wx/private/stattext.h +++ b/include/wx/private/stattext.h @@ -14,61 +14,6 @@ #include "wx/window.h" -#if wxUSE_STATTEXT - -// ---------------------------------------------------------------------------- -// wxTextWrapper -// ---------------------------------------------------------------------------- - -// this class is used to wrap the text on word boundary: wrapping is done by -// calling OnStartLine() and OnOutputLine() functions -class wxTextWrapper -{ -public: - wxTextWrapper() { m_eol = false; } - - // win is used for getting the font, text is the text to wrap, width is the - // max line width or -1 to disable wrapping - void Wrap(wxWindow *win, const wxString& text, int widthMax); - - // we don't need it, but just to avoid compiler warnings - virtual ~wxTextWrapper() { } - -protected: - // line may be empty - virtual void OnOutputLine(const wxString& line) = 0; - - // called at the start of every new line (except the very first one) - virtual void OnNewLine() { } - -private: - // call OnOutputLine() and set m_eol to true - void DoOutputLine(const wxString& line) - { - OnOutputLine(line); - - m_eol = true; - } - - // this function is a destructive inspector: when it returns true it also - // resets the flag to false so calling it again woulnd't return true any - // more - bool IsStartOfNewLine() - { - if ( !m_eol ) - return false; - - m_eol = false; - - return true; - } - - - bool m_eol; -}; - -#endif // wxUSE_STATTEXT - enum { wxMARKUP_ENTITY_AMP, diff --git a/include/wx/textwrapper.h b/include/wx/textwrapper.h new file mode 100644 index 0000000000..cb2c0972f8 --- /dev/null +++ b/include/wx/textwrapper.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textwrapper.h +// Purpose: declaration of wxTextWrapper class +// Author: Vadim Zeitlin +// Created: 2009-05-31 (extracted from dlgcmn.cpp via wx/private/stattext.h) +// RCS-ID: $Id$ +// Copyright: (c) 1999, 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTWRAPPER_H_ +#define _WX_TEXTWRAPPER_H_ + +// ---------------------------------------------------------------------------- +// wxTextWrapper +// ---------------------------------------------------------------------------- + +// this class is used to wrap the text on word boundary: wrapping is done by +// calling OnStartLine() and OnOutputLine() functions +class wxTextWrapper +{ +public: + wxTextWrapper() { m_eol = false; } + + // win is used for getting the font, text is the text to wrap, width is the + // max line width or -1 to disable wrapping + void Wrap(wxWindow *win, const wxString& text, int widthMax); + + // we don't need it, but just to avoid compiler warnings + virtual ~wxTextWrapper() { } + +protected: + // line may be empty + virtual void OnOutputLine(const wxString& line) = 0; + + // called at the start of every new line (except the very first one) + virtual void OnNewLine() { } + +private: + // call OnOutputLine() and set m_eol to true + void DoOutputLine(const wxString& line) + { + OnOutputLine(line); + + m_eol = true; + } + + // this function is a destructive inspector: when it returns true it also + // resets the flag to false so calling it again wouldn't return true any + // more + bool IsStartOfNewLine() + { + if ( !m_eol ) + return false; + + m_eol = false; + + return true; + } + + + bool m_eol; + + wxDECLARE_NO_COPY_CLASS(wxTextWrapper); +}; + +#endif // _WX_TEXTWRAPPER_H_ + diff --git a/interface/wx/textwrapper.h b/interface/wx/textwrapper.h new file mode 100644 index 0000000000..dd830ed3e3 --- /dev/null +++ b/interface/wx/textwrapper.h @@ -0,0 +1,100 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/textwrapper.h +// Purpose: documentation of wxTextWrapper interface +// Author: Vadim Zeitlin +// RCS-ID: $Id$ +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +/** + @class wxTextWrapper + + Helps wrap lines of text to given width. + + This is a generic purpose class which can be used to wrap lines of text to + the specified width. It doesn't do anything by itself but simply calls its + virtual OnOutputLine() and OnNewLine() methods for each wrapped line of + text, you need to implement them in your derived class to actually do + something useful. + + Here is an example function using this class which inserts hard line breaks + into a string of text at the positions where it would be wrapped: + @code +wxString WrapText(wxWindow *win, const wxString& text, int widthMax) +{ + class HardBreakWrapper : public wxTextWrapper + { + public: + HardBreakWrapper(wxWindow *win, const wxString& text, int widthMax) + { + Wrap(win, text, widthMax); + } + + wxString const& GetWrapped() const { return m_wrapped; } + + protected: + virtual void OnOutputLine(const wxString& line) + { + m_wrapped += line; + } + + virtual void OnNewLine() + { + m_wrapped += '\n'; + } + + private: + wxString m_wrapped; + }; + + HardBreakWrapper wrapper(win, text, widthMax); + return wrapper.GetWrapped(); +} + @endcode + + @library{none} + @category{gdi} + */ +class wxTextWrapper +{ +public: + /** + Trivial default constructor. + */ + wxTextWrapper(); + + /** + Wrap the given text. + + This method will call OnOutputLine() for every line of wrapped text and + OnNewLine() before the beginning of every new line after the first one + (so it might be never called at all if the width of entire @a text is + less than @a widthMax). + + @param win + A non-@NULL window used for measuring the text extents. + @param text + The text to wrap. + @param widthMax + Maximal width of each line of text or @c -1 to disable wrapping. + */ + void Wrap(wxWindow *win, const wxString& text, int widthMax); + +protected: + /** + Called by Wrap() for each wrapped line of text. + + This method will always be called at least once by Wrap(). Notice that + @a line may be empty if the text passed to Wrap() was empty itself. + */ + virtual void OnOutputLine(const wxString& line) = 0; + + /** + Called at the start of each subsequent line of text by Wrap(). + + This method may not be called at all if the entire text passed to + Wrap() fits into the specified width. + */ + virtual void OnNewLine(); +}; diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index d53ee12801..7c5ef85837 100644 --- a/src/common/dlgcmn.cpp +++ b/src/common/dlgcmn.cpp @@ -40,9 +40,9 @@ #include "wx/statline.h" #include "wx/sysopt.h" #include "wx/module.h" -#include "wx/private/stattext.h" #include "wx/bookctrl.h" #include "wx/scrolwin.h" +#include "wx/textwrapper.h" #if wxUSE_DISPLAY #include "wx/display.h" diff --git a/src/common/stattextcmn.cpp b/src/common/stattextcmn.cpp index 9558d2dfdd..89d7eb03f2 100644 --- a/src/common/stattextcmn.cpp +++ b/src/common/stattextcmn.cpp @@ -24,6 +24,7 @@ #pragma hdrstop #endif +#include "wx/textwrapper.h" #include "wx/private/stattext.h" #ifndef WX_PRECOMP -- 2.45.2