X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/206d3a16caa7a4e626395ae52cc8f7e0225e202d..da98e15760bfcad41a5579e64955caadc2e535f3:/samples/widgets/textctrl.cpp?ds=sidebyside diff --git a/samples/widgets/textctrl.cpp b/samples/widgets/textctrl.cpp index f20eaf5cb7..02c94cdc0c 100644 --- a/samples/widgets/textctrl.cpp +++ b/samples/widgets/textctrl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Program: wxWindows Widgets Sample +// Program: wxWidgets Widgets Sample // Name: textctrl.cpp // Purpose: part of the widgets sample showing wxTextCtrl // Author: Vadim Zeitlin @@ -36,9 +36,11 @@ #include "wx/statbox.h" #include "wx/stattext.h" #include "wx/textctrl.h" + #include "wx/msgdlg.h" #endif #include "wx/sizer.h" +#include "wx/ioswrap.h" #include "widgets.h" @@ -59,6 +61,8 @@ enum TextPage_Clear, TextPage_Load, + TextPage_StreamRedirector, + TextPage_Password, TextPage_WrapLines, TextPage_Textctrl @@ -68,7 +72,18 @@ enum enum TextLines { TextLines_Single, - TextLines_Multi + TextLines_Multi, + TextLines_Max +}; + +// wrap style radio box +enum WrapStyle +{ + WrapStyle_None, + WrapStyle_Word, + WrapStyle_Char, + WrapStyle_Best, + WrapStyle_Max }; #ifdef __WXMSW__ @@ -78,7 +93,8 @@ enum TextKind { TextKind_Plain, TextKind_Rich, - TextKind_Rich2 + TextKind_Rich2, + TextKind_Max }; #endif // __WXMSW__ @@ -87,9 +103,12 @@ enum TextKind static const struct ControlValues { TextLines textLines; + bool password; - bool wraplines; bool readonly; + + WrapStyle wrapStyle; + #ifdef __WXMSW__ TextKind textKind; #endif // __WXMSW__ @@ -97,8 +116,8 @@ static const struct ControlValues { TextLines_Multi, // multiline false, // not password - true, // do wrap lines false, // not readonly + WrapStyle_Word, // wrap on word boundaries #ifdef __WXMSW__ TextKind_Plain // plain EDIT control #endif // __WXMSW__ @@ -113,8 +132,10 @@ class TextWidgetsPage : public WidgetsPage { public: // ctor(s) and dtor - TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist); - virtual ~TextWidgetsPage(); + TextWidgetsPage(wxBookCtrl *book, wxImageList *imaglist); + virtual ~TextWidgetsPage(){}; + + virtual wxControl *GetWidget() const { return m_text; } protected: // create an info text contorl @@ -136,6 +157,7 @@ protected: void OnButtonClear(wxCommandEvent& event); void OnButtonLoad(wxCommandEvent& event); + void OnStreamRedirector(wxCommandEvent& event); void OnButtonQuit(wxCommandEvent& event); void OnText(wxCommandEvent& event); @@ -170,9 +192,11 @@ protected: // the radiobox to choose between single and multi line wxRadioBox *m_radioTextLines; + // and another one to choose the wrapping style + wxRadioBox *m_radioWrap; + // the checkboxes controlling text ctrl styles wxCheckBox *m_chkPassword, - *m_chkWrapLines, *m_chkReadonly; // under MSW we test rich edit controls as well here @@ -203,11 +227,68 @@ protected: wxString m_range10_20; private: - // any class wishing to process wxWindows events must use this macro + // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() DECLARE_WIDGETS_PAGE(TextWidgetsPage) }; +// ---------------------------------------------------------------------------- +// WidgetsTextCtrl +// ---------------------------------------------------------------------------- + +class WidgetsTextCtrl : public wxTextCtrl +{ +public: + WidgetsTextCtrl(wxWindow *parent, + wxWindowID id, + const wxString& value, + int flags) + : wxTextCtrl(parent, id, value, wxDefaultPosition, wxDefaultSize, flags) + { + } + +protected: + void OnRightClick(wxMouseEvent& event) + { + wxString where; + wxTextCoord x, y; + switch ( HitTest(event.GetPosition(), &x, &y) ) + { + default: + wxFAIL_MSG( _T("unexpected HitTest() result") ); + // fall through + + case wxTE_HT_UNKNOWN: + x = y = -1; + where = _T("nowhere near"); + break; + + case wxTE_HT_BEFORE: + where = _T("before"); + break; + + case wxTE_HT_BELOW: + where = _T("below"); + break; + + case wxTE_HT_BEYOND: + where = _T("beyond"); + break; + + case wxTE_HT_ON_TEXT: + where = _T("at"); + break; + } + + wxLogMessage(_T("Mouse is %s (%ld, %ld)"), where.c_str(), x, y); + + event.Skip(); + } + +private: + DECLARE_EVENT_TABLE() +}; + // ---------------------------------------------------------------------------- // event tables // ---------------------------------------------------------------------------- @@ -217,6 +298,8 @@ BEGIN_EVENT_TABLE(TextWidgetsPage, WidgetsPage) EVT_BUTTON(TextPage_Reset, TextWidgetsPage::OnButtonReset) + EVT_BUTTON(TextPage_StreamRedirector, TextWidgetsPage::OnStreamRedirector) + EVT_BUTTON(TextPage_Clear, TextWidgetsPage::OnButtonClear) EVT_BUTTON(TextPage_Set, TextWidgetsPage::OnButtonSet) EVT_BUTTON(TextPage_Add, TextWidgetsPage::OnButtonAdd) @@ -237,6 +320,10 @@ BEGIN_EVENT_TABLE(TextWidgetsPage, WidgetsPage) EVT_RADIOBOX(wxID_ANY, TextWidgetsPage::OnCheckOrRadioBox) END_EVENT_TABLE() +BEGIN_EVENT_TABLE(WidgetsTextCtrl, wxTextCtrl) + EVT_RIGHT_UP(WidgetsTextCtrl::OnRightClick) +END_EVENT_TABLE() + // ============================================================================ // implementation // ============================================================================ @@ -247,8 +334,8 @@ IMPLEMENT_WIDGETS_PAGE(TextWidgetsPage, _T("Text")); // TextWidgetsPage creation // ---------------------------------------------------------------------------- -TextWidgetsPage::TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist) - : WidgetsPage(notebook) +TextWidgetsPage::TextWidgetsPage(wxBookCtrl *book, wxImageList *imaglist) + : WidgetsPage(book) { imaglist->Add(wxBitmap(text_xpm)); @@ -256,10 +343,10 @@ TextWidgetsPage::TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist) #ifdef __WXMSW__ m_radioKind = #endif // __WXMSW__ + m_radioWrap = m_radioTextLines = (wxRadioBox *)NULL; m_chkPassword = - m_chkWrapLines = m_chkReadonly = (wxCheckBox *)NULL; m_text = @@ -295,17 +382,29 @@ TextWidgetsPage::TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist) wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); sizerLeft->Add(m_radioTextLines, 0, wxGROW | wxALL, 5); - sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer + sizerLeft->AddSpacer(5); m_chkPassword = CreateCheckBoxAndAddToSizer( sizerLeft, _T("&Password control"), TextPage_Password ); - m_chkWrapLines = CreateCheckBoxAndAddToSizer( - sizerLeft, _T("Line &wrap"), TextPage_WrapLines - ); m_chkReadonly = CreateCheckBoxAndAddToSizer( sizerLeft, _T("&Read-only mode") ); + sizerLeft->AddSpacer(5); + + static const wxString wrap[] = + { + _T("no wrap"), + _T("word wrap"), + _T("char wrap"), + _T("best wrap"), + }; + + m_radioWrap = new wxRadioBox(this, wxID_ANY, _T("&Wrap style:"), + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(wrap), wrap, + 1, wxRA_SPECIFY_COLS); + sizerLeft->Add(m_radioWrap, 0, wxGROW | wxALL, 5); #ifdef __WXMSW__ static const wxString kinds[] = @@ -320,7 +419,7 @@ TextWidgetsPage::TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist) WXSIZEOF(kinds), kinds, 1, wxRA_SPECIFY_COLS); - sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer + sizerLeft->AddSpacer(5); sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5); #endif // __WXMSW__ @@ -347,6 +446,9 @@ TextWidgetsPage::TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist) btn = new wxButton(this, TextPage_Clear, _T("&Clear")); sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1); + btn = new wxButton(this, TextPage_StreamRedirector, _T("St&ream redirection")); + sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1); + wxStaticBox *box4 = new wxStaticBox(this, wxID_ANY, _T("&Info:")); wxSizer *sizerMiddleDown = new wxStaticBoxSizer(box4, wxVERTICAL); @@ -438,10 +540,6 @@ TextWidgetsPage::TextWidgetsPage(wxNotebook *notebook, wxImageList *imaglist) sizerTop->Fit(this); } -TextWidgetsPage::~TextWidgetsPage() -{ -} - // ---------------------------------------------------------------------------- // creation helpers // ---------------------------------------------------------------------------- @@ -457,7 +555,7 @@ wxTextCtrl *TextWidgetsPage::CreateInfoText() wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, - wxSize(s_maxWidth, -1), + wxSize(s_maxWidth, wxDefaultCoord), wxTE_READONLY); return text; } @@ -488,9 +586,12 @@ wxSizer *TextWidgetsPage::CreateTextWithLabelSizer(const wxString& label, void TextWidgetsPage::Reset() { m_radioTextLines->SetSelection(DEFAULTS.textLines); + m_chkPassword->SetValue(DEFAULTS.password); - m_chkWrapLines->SetValue(DEFAULTS.wraplines); m_chkReadonly->SetValue(DEFAULTS.readonly); + + m_radioWrap->SetSelection(DEFAULTS.wrapStyle); + #ifdef __WXMSW__ m_radioKind->SetSelection(DEFAULTS.textKind); #endif // __WXMSW__ @@ -517,8 +618,29 @@ void TextWidgetsPage::CreateText() flags |= wxTE_PASSWORD; if ( m_chkReadonly->GetValue() ) flags |= wxTE_READONLY; - if ( !m_chkWrapLines->GetValue() ) - flags |= wxHSCROLL; + + switch ( m_radioWrap->GetSelection() ) + { + default: + wxFAIL_MSG( _T("unexpected wrap style radio box selection") ); + + case WrapStyle_None: + flags |= wxTE_DONTWRAP; // same as wxHSCROLL + break; + + case WrapStyle_Word: + flags |= wxTE_WORDWRAP; + break; + + case WrapStyle_Char: + flags |= wxTE_LINEWRAP; + break; + + case WrapStyle_Best: + // this is default but use symbolic file name for consistency + flags |= wxTE_BESTWRAP; + break; + } #ifdef __WXMSW__ switch ( m_radioKind->GetSelection() ) @@ -552,10 +674,7 @@ void TextWidgetsPage::CreateText() valueOld = _T("Hello, Universe!"); } - m_text = new wxTextCtrl(this, TextPage_Textctrl, - valueOld, - wxDefaultPosition, wxDefaultSize, - flags); + m_text = new WidgetsTextCtrl(this, TextPage_Textctrl, valueOld, flags); // cast to int needed to silence gcc warning about different enums m_sizerText->Add(m_text, 1, wxALL | @@ -738,7 +857,7 @@ void TextWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) #endif // __WXMSW__ (m_chkReadonly->GetValue() != DEFAULTS.readonly) || (m_chkPassword->GetValue() != DEFAULTS.password) || - (m_chkWrapLines->GetValue() != DEFAULTS.wraplines) ); + (m_radioWrap->GetSelection() != DEFAULTS.wrapStyle) ); } void TextWidgetsPage::OnText(wxCommandEvent& WXUNUSED(event)) @@ -759,6 +878,7 @@ void TextWidgetsPage::OnText(wxCommandEvent& WXUNUSED(event)) void TextWidgetsPage::OnTextEnter(wxCommandEvent& event) { wxLogMessage(_T("Text entered: '%s'"), event.GetString().c_str()); + event.Skip(); } void TextWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) @@ -766,3 +886,13 @@ void TextWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) CreateText(); } +void TextWidgetsPage::OnStreamRedirector(wxCommandEvent& WXUNUSED(event)) +{ +#if wxHAS_TEXT_WINDOW_STREAM + wxStreamToTextRedirector redirect(m_text); + wxString str( _T("Outputed to cout, appears in wxTextCtrl!") ); + wxSTD cout << str << wxSTD endl; +#else + wxMessageBox(_T("This wxWidgets build does not support wxStreamToTextRedirector")); +#endif +}