1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/textwrapper.h
3 // Purpose:     declaration of wxTextWrapper class
4 // Author:      Vadim Zeitlin
5 // Created:     2009-05-31 (extracted from dlgcmn.cpp via wx/private/stattext.h)
6 // Copyright:   (c) 1999, 2009 Vadim Zeitlin <vadim@wxwidgets.org>
7 // Licence:     wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
9 
10 #ifndef _WX_TEXTWRAPPER_H_
11 #define _WX_TEXTWRAPPER_H_
12 
13 #include "wx/window.h"
14 
15 // ----------------------------------------------------------------------------
16 // wxTextWrapper
17 // ----------------------------------------------------------------------------
18 
19 // this class is used to wrap the text on word boundary: wrapping is done by
20 // calling OnStartLine() and OnOutputLine() functions
21 class WXDLLIMPEXP_CORE wxTextWrapper
22 {
23 public:
wxTextWrapper()24     wxTextWrapper() { m_eol = false; }
25 
26     // win is used for getting the font, text is the text to wrap, width is the
27     // max line width or -1 to disable wrapping
28     void Wrap(wxWindow *win, const wxString& text, int widthMax);
29 
30     // we don't need it, but just to avoid compiler warnings
~wxTextWrapper()31     virtual ~wxTextWrapper() { }
32 
33 protected:
34     // line may be empty
35     virtual void OnOutputLine(const wxString& line) = 0;
36 
37     // called at the start of every new line (except the very first one)
OnNewLine()38     virtual void OnNewLine() { }
39 
40 private:
41     // call OnOutputLine() and set m_eol to true
DoOutputLine(const wxString & line)42     void DoOutputLine(const wxString& line)
43     {
44         OnOutputLine(line);
45 
46         m_eol = true;
47     }
48 
49     // this function is a destructive inspector: when it returns true it also
50     // resets the flag to false so calling it again wouldn't return true any
51     // more
IsStartOfNewLine()52     bool IsStartOfNewLine()
53     {
54         if ( !m_eol )
55             return false;
56 
57         m_eol = false;
58 
59         return true;
60     }
61 
62 
63     bool m_eol;
64 
65     wxDECLARE_NO_COPY_CLASS(wxTextWrapper);
66 };
67 
68 #if wxUSE_STATTEXT
69 
70 #include "wx/sizer.h"
71 #include "wx/stattext.h"
72 
73 // A class creating a sizer with one static text per line of text. Creation of
74 // the controls used for each line can be customized by overriding
75 // OnCreateLine() function.
76 //
77 // This class is currently private to wxWidgets and used only by wxDialog
78 // itself. We may make it public later if there is sufficient interest.
79 class wxTextSizerWrapper : public wxTextWrapper
80 {
81 public:
wxTextSizerWrapper(wxWindow * win)82     wxTextSizerWrapper(wxWindow *win)
83     {
84         m_win = win;
85         m_hLine = 0;
86     }
87 
CreateSizer(const wxString & text,int widthMax)88     wxSizer *CreateSizer(const wxString& text, int widthMax)
89     {
90         m_sizer = new wxBoxSizer(wxVERTICAL);
91         Wrap(m_win, text, widthMax);
92         return m_sizer;
93     }
94 
GetParent()95     wxWindow *GetParent() const { return m_win; }
96 
97 protected:
OnCreateLine(const wxString & line)98     virtual wxWindow *OnCreateLine(const wxString& line)
99     {
100         return new wxStaticText(m_win, wxID_ANY,
101                                 wxControl::EscapeMnemonics(line));
102     }
103 
OnOutputLine(const wxString & line)104     virtual void OnOutputLine(const wxString& line) wxOVERRIDE
105     {
106         if ( !line.empty() )
107         {
108             m_sizer->Add(OnCreateLine(line));
109         }
110         else // empty line, no need to create a control for it
111         {
112             if ( !m_hLine )
113                 m_hLine = m_win->GetCharHeight();
114 
115             m_sizer->Add(5, m_hLine);
116         }
117     }
118 
119 private:
120     wxWindow *m_win;
121     wxSizer *m_sizer;
122     int m_hLine;
123 };
124 
125 #endif // wxUSE_STATTEXT
126 
127 #endif // _WX_TEXTWRAPPER_H_
128 
129