| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945 |
- /////////////////////////////////////////////////////////////////////////////
- // Program: wxWidgets Widgets Sample
- // Name: textctrl.cpp
- // Purpose: part of the widgets sample showing wxTextCtrl
- // Author: Vadim Zeitlin
- // Created: 27.03.01
- // Copyright: (c) 2001 Vadim Zeitlin
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- // ============================================================================
- // declarations
- // ============================================================================
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- // for compilers that support precompilation, includes "wx/wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- // for all others, include the necessary headers
- #ifndef WX_PRECOMP
- #include "wx/log.h"
- #include "wx/timer.h"
- #include "wx/bitmap.h"
- #include "wx/button.h"
- #include "wx/checkbox.h"
- #include "wx/radiobox.h"
- #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"
- #include "icons/text.xpm"
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // control ids
- enum
- {
- TextPage_Reset = wxID_HIGHEST,
- TextPage_Set,
- TextPage_Add,
- TextPage_Insert,
- TextPage_Clear,
- TextPage_Load,
- TextPage_StreamRedirector,
- TextPage_Password,
- TextPage_WrapLines,
- TextPage_Textctrl
- };
- // textctrl line number radiobox values
- enum TextLines
- {
- TextLines_Single,
- TextLines_Multi,
- TextLines_Max
- };
- // wrap style radio box
- enum WrapStyle
- {
- WrapStyle_None,
- WrapStyle_Word,
- WrapStyle_Char,
- WrapStyle_Best,
- WrapStyle_Max
- };
- #ifdef __WXMSW__
- // textctrl kind values
- enum TextKind
- {
- TextKind_Plain,
- TextKind_Rich,
- TextKind_Rich2,
- TextKind_Max
- };
- #endif // __WXMSW__
- // default values for the controls
- static const struct ControlValues
- {
- TextLines textLines;
- bool password;
- bool readonly;
- bool processEnter;
- bool filename;
- WrapStyle wrapStyle;
- #ifdef __WXMSW__
- TextKind textKind;
- #endif // __WXMSW__
- } DEFAULTS =
- {
- TextLines_Multi, // multiline
- false, // not password
- false, // not readonly
- true, // do process enter
- false, // not filename
- WrapStyle_Word, // wrap on word boundaries
- #ifdef __WXMSW__
- TextKind_Plain // plain EDIT control
- #endif // __WXMSW__
- };
- // ----------------------------------------------------------------------------
- // TextWidgetsPage
- // ----------------------------------------------------------------------------
- // Define a new frame type: this is going to be our main frame
- class TextWidgetsPage : public WidgetsPage
- {
- public:
- // ctor(s) and dtor
- TextWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
- virtual ~TextWidgetsPage(){};
- virtual wxControl *GetWidget() const { return m_text; }
- virtual wxTextEntryBase *GetTextEntry() const { return m_text; }
- virtual void RecreateWidget() { CreateText(); }
- // lazy creation of the content
- virtual void CreateContent();
- protected:
- // create an info text contorl
- wxTextCtrl *CreateInfoText();
- // create a horz sizer holding a static text and this text control
- wxSizer *CreateTextWithLabelSizer(const wxString& label,
- wxTextCtrl *text,
- const wxString& label2 = wxEmptyString,
- wxTextCtrl *text2 = NULL);
- // event handlers
- void OnButtonReset(wxCommandEvent& event);
- void OnButtonClearLog(wxCommandEvent& event);
- void OnButtonSet(wxCommandEvent& event);
- void OnButtonAdd(wxCommandEvent& event);
- void OnButtonInsert(wxCommandEvent& event);
- void OnButtonClear(wxCommandEvent& event);
- void OnButtonLoad(wxCommandEvent& event);
- void OnStreamRedirector(wxCommandEvent& event);
- void OnButtonQuit(wxCommandEvent& event);
- void OnText(wxCommandEvent& event);
- void OnTextEnter(wxCommandEvent& event);
- void OnTextPasted(wxClipboardTextEvent& event);
- void OnCheckOrRadioBox(wxCommandEvent& event);
- void OnUpdateUIClearButton(wxUpdateUIEvent& event);
- void OnUpdateUIPasswordCheckbox(wxUpdateUIEvent& event);
- void OnUpdateUIWrapLinesCheckbox(wxUpdateUIEvent& event);
- void OnUpdateUIResetButton(wxUpdateUIEvent& event);
- void OnIdle(wxIdleEvent& event);
- // reset the textctrl parameters
- void Reset();
- // (re)create the textctrl
- void CreateText();
- // is the control currently single line?
- bool IsSingleLine() const
- {
- return m_radioTextLines->GetSelection() == TextLines_Single;
- }
- // the controls
- // ------------
- // 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_chkReadonly,
- *m_chkProcessEnter,
- *m_chkFilename;
- // under MSW we test rich edit controls as well here
- #ifdef __WXMSW__
- wxRadioBox *m_radioKind;
- #endif // __WXMSW__
- // the textctrl itself and the sizer it is in
- wxTextCtrl *m_text;
- wxSizer *m_sizerText;
- // the information text zones
- wxTextCtrl *m_textPosCur,
- *m_textRowCur,
- *m_textColCur,
- *m_textPosLast,
- *m_textLineLast,
- *m_textSelFrom,
- *m_textSelTo,
- *m_textRange;
- // and the data to show in them
- long m_posCur,
- m_posLast,
- m_selFrom,
- m_selTo;
- wxString m_range10_20;
- private:
- // any class wishing to process wxWidgets events must use this macro
- wxDECLARE_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( wxT("unexpected HitTest() result") );
- // fall through
- case wxTE_HT_UNKNOWN:
- x = y = -1;
- where = wxT("nowhere near");
- break;
- case wxTE_HT_BEFORE:
- where = wxT("before");
- break;
- case wxTE_HT_BELOW:
- where = wxT("below");
- break;
- case wxTE_HT_BEYOND:
- where = wxT("beyond");
- break;
- case wxTE_HT_ON_TEXT:
- where = wxT("at");
- break;
- }
- wxLogMessage(wxT("Mouse is %s (%ld, %ld)"), where.c_str(), x, y);
- event.Skip();
- }
- private:
- wxDECLARE_EVENT_TABLE();
- };
- // ----------------------------------------------------------------------------
- // event tables
- // ----------------------------------------------------------------------------
- wxBEGIN_EVENT_TABLE(TextWidgetsPage, WidgetsPage)
- EVT_IDLE(TextWidgetsPage::OnIdle)
- 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)
- EVT_BUTTON(TextPage_Insert, TextWidgetsPage::OnButtonInsert)
- EVT_BUTTON(TextPage_Load, TextWidgetsPage::OnButtonLoad)
- EVT_UPDATE_UI(TextPage_Clear, TextWidgetsPage::OnUpdateUIClearButton)
- EVT_UPDATE_UI(TextPage_Password, TextWidgetsPage::OnUpdateUIPasswordCheckbox)
- EVT_UPDATE_UI(TextPage_WrapLines, TextWidgetsPage::OnUpdateUIWrapLinesCheckbox)
- EVT_UPDATE_UI(TextPage_Reset, TextWidgetsPage::OnUpdateUIResetButton)
- EVT_TEXT(TextPage_Textctrl, TextWidgetsPage::OnText)
- EVT_TEXT_ENTER(TextPage_Textctrl, TextWidgetsPage::OnTextEnter)
- EVT_TEXT_PASTE(TextPage_Textctrl, TextWidgetsPage::OnTextPasted)
- EVT_CHECKBOX(wxID_ANY, TextWidgetsPage::OnCheckOrRadioBox)
- EVT_RADIOBOX(wxID_ANY, TextWidgetsPage::OnCheckOrRadioBox)
- wxEND_EVENT_TABLE()
- wxBEGIN_EVENT_TABLE(WidgetsTextCtrl, wxTextCtrl)
- EVT_RIGHT_UP(WidgetsTextCtrl::OnRightClick)
- wxEND_EVENT_TABLE()
- // ============================================================================
- // implementation
- // ============================================================================
- #if defined(__WXX11__)
- #define FAMILY_CTRLS NATIVE_CTRLS
- #elif defined(__WXUNIVERSAL__)
- #define FAMILY_CTRLS UNIVERSAL_CTRLS
- #else
- #define FAMILY_CTRLS NATIVE_CTRLS
- #endif
- IMPLEMENT_WIDGETS_PAGE(TextWidgetsPage, wxT("Text"),
- FAMILY_CTRLS | EDITABLE_CTRLS
- );
- // ----------------------------------------------------------------------------
- // TextWidgetsPage creation
- // ----------------------------------------------------------------------------
- TextWidgetsPage::TextWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist)
- : WidgetsPage(book, imaglist, text_xpm)
- {
- // init everything
- #ifdef __WXMSW__
- m_radioKind =
- #endif // __WXMSW__
- m_radioWrap =
- m_radioTextLines = (wxRadioBox *)NULL;
- m_chkPassword =
- m_chkReadonly =
- m_chkProcessEnter =
- m_chkFilename = (wxCheckBox *)NULL;
- m_text =
- m_textPosCur =
- m_textRowCur =
- m_textColCur =
- m_textPosLast =
- m_textLineLast =
- m_textSelFrom =
- m_textSelTo =
- m_textRange = (wxTextCtrl *)NULL;
- m_sizerText = (wxSizer *)NULL;
- m_posCur =
- m_posLast =
- m_selFrom =
- m_selTo = -2; // not -1 which means "no selection"
- }
- void TextWidgetsPage::CreateContent()
- {
- // left pane
- static const wxString modes[] =
- {
- wxT("single line"),
- wxT("multi line"),
- };
- wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set textctrl parameters"));
- m_radioTextLines = new wxRadioBox(this, wxID_ANY, wxT("&Number of lines:"),
- wxDefaultPosition, wxDefaultSize,
- WXSIZEOF(modes), modes,
- 1, wxRA_SPECIFY_COLS);
- wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
- sizerLeft->Add(m_radioTextLines, 0, wxGROW | wxALL, 5);
- sizerLeft->AddSpacer(5);
- m_chkPassword = CreateCheckBoxAndAddToSizer(
- sizerLeft, wxT("&Password control"), TextPage_Password
- );
- m_chkReadonly = CreateCheckBoxAndAddToSizer(
- sizerLeft, wxT("&Read-only mode")
- );
- m_chkProcessEnter = CreateCheckBoxAndAddToSizer(
- sizerLeft, wxT("Process &Enter")
- );
- m_chkFilename = CreateCheckBoxAndAddToSizer(
- sizerLeft, wxT("&Filename control")
- );
- m_chkFilename->Disable(); // not implemented yet
- sizerLeft->AddSpacer(5);
- static const wxString wrap[] =
- {
- wxT("no wrap"),
- wxT("word wrap"),
- wxT("char wrap"),
- wxT("best wrap"),
- };
- m_radioWrap = new wxRadioBox(this, wxID_ANY, wxT("&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[] =
- {
- wxT("plain edit"),
- wxT("rich edit"),
- wxT("rich edit 2.0"),
- };
- m_radioKind = new wxRadioBox(this, wxID_ANY, wxT("Control &kind"),
- wxDefaultPosition, wxDefaultSize,
- WXSIZEOF(kinds), kinds,
- 1, wxRA_SPECIFY_COLS);
- sizerLeft->AddSpacer(5);
- sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5);
- #endif // __WXMSW__
- wxButton *btn = new wxButton(this, TextPage_Reset, wxT("&Reset"));
- sizerLeft->Add(2, 2, 0, wxGROW | wxALL, 1); // spacer
- sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
- // middle pane
- wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, wxT("&Change contents:"));
- wxSizer *sizerMiddleUp = new wxStaticBoxSizer(box2, wxVERTICAL);
- btn = new wxButton(this, TextPage_Set, wxT("&Set text value"));
- sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1);
- btn = new wxButton(this, TextPage_Add, wxT("&Append text"));
- sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1);
- btn = new wxButton(this, TextPage_Insert, wxT("&Insert text"));
- sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1);
- btn = new wxButton(this, TextPage_Load, wxT("&Load file"));
- sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1);
- btn = new wxButton(this, TextPage_Clear, wxT("&Clear"));
- sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1);
- btn = new wxButton(this, TextPage_StreamRedirector, wxT("St&ream redirection"));
- sizerMiddleUp->Add(btn, 0, wxALL | wxGROW, 1);
- wxStaticBox *box4 = new wxStaticBox(this, wxID_ANY, wxT("&Info:"));
- wxSizer *sizerMiddleDown = new wxStaticBoxSizer(box4, wxVERTICAL);
- m_textPosCur = CreateInfoText();
- m_textRowCur = CreateInfoText();
- m_textColCur = CreateInfoText();
- wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
- sizerRow->Add(CreateTextWithLabelSizer
- (
- wxT("Current pos:"),
- m_textPosCur
- ),
- 0, wxRIGHT, 5);
- sizerRow->Add(CreateTextWithLabelSizer
- (
- wxT("Col:"),
- m_textColCur
- ),
- 0, wxLEFT | wxRIGHT, 5);
- sizerRow->Add(CreateTextWithLabelSizer
- (
- wxT("Row:"),
- m_textRowCur
- ),
- 0, wxLEFT, 5);
- sizerMiddleDown->Add(sizerRow, 0, wxALL, 5);
- m_textLineLast = CreateInfoText();
- m_textPosLast = CreateInfoText();
- sizerMiddleDown->Add
- (
- CreateTextWithLabelSizer
- (
- wxT("Number of lines:"),
- m_textLineLast,
- wxT("Last position:"),
- m_textPosLast
- ),
- 0, wxALL, 5
- );
- m_textSelFrom = CreateInfoText();
- m_textSelTo = CreateInfoText();
- sizerMiddleDown->Add
- (
- CreateTextWithLabelSizer
- (
- wxT("Selection: from"),
- m_textSelFrom,
- wxT("to"),
- m_textSelTo
- ),
- 0, wxALL, 5
- );
- m_textRange = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxTE_READONLY);
- sizerMiddleDown->Add
- (
- CreateTextWithLabelSizer
- (
- wxT("Range 10..20:"),
- m_textRange
- ),
- 0, wxALL, 5
- );
- wxSizer *sizerMiddle = new wxBoxSizer(wxVERTICAL);
- sizerMiddle->Add(sizerMiddleUp, 0, wxGROW);
- sizerMiddle->Add(sizerMiddleDown, 1, wxGROW | wxTOP, 5);
- // right pane
- wxStaticBox *box3 = new wxStaticBox(this, wxID_ANY, wxT("&Text:"));
- m_sizerText = new wxStaticBoxSizer(box3, wxHORIZONTAL);
- Reset();
- CreateText();
- m_sizerText->SetMinSize(150, 0);
- // the 3 panes panes compose the upper part of the window
- wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
- sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
- sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10);
- sizerTop->Add(m_sizerText, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
- SetSizer(sizerTop);
- }
- // ----------------------------------------------------------------------------
- // creation helpers
- // ----------------------------------------------------------------------------
- wxTextCtrl *TextWidgetsPage::CreateInfoText()
- {
- static int s_maxWidth = 0;
- if ( !s_maxWidth )
- {
- // calc it once only
- GetTextExtent(wxT("9999999"), &s_maxWidth, NULL);
- }
- wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
- wxDefaultPosition,
- wxSize(s_maxWidth, wxDefaultCoord),
- wxTE_READONLY);
- return text;
- }
- wxSizer *TextWidgetsPage::CreateTextWithLabelSizer(const wxString& label,
- wxTextCtrl *text,
- const wxString& label2,
- wxTextCtrl *text2)
- {
- wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
- sizerRow->Add(new wxStaticText(this, wxID_ANY, label), 0,
- wxALIGN_CENTRE_VERTICAL | wxRIGHT, 5);
- sizerRow->Add(text, 0, wxALIGN_CENTRE_VERTICAL);
- if ( text2 )
- {
- sizerRow->Add(new wxStaticText(this, wxID_ANY, label2), 0,
- wxALIGN_CENTRE_VERTICAL | wxLEFT | wxRIGHT, 5);
- sizerRow->Add(text2, 0, wxALIGN_CENTRE_VERTICAL);
- }
- return sizerRow;
- }
- // ----------------------------------------------------------------------------
- // operations
- // ----------------------------------------------------------------------------
- void TextWidgetsPage::Reset()
- {
- m_radioTextLines->SetSelection(DEFAULTS.textLines);
- m_chkPassword->SetValue(DEFAULTS.password);
- m_chkReadonly->SetValue(DEFAULTS.readonly);
- m_chkProcessEnter->SetValue(DEFAULTS.processEnter);
- m_chkFilename->SetValue(DEFAULTS.filename);
- m_radioWrap->SetSelection(DEFAULTS.wrapStyle);
- #ifdef __WXMSW__
- m_radioKind->SetSelection(DEFAULTS.textKind);
- #endif // __WXMSW__
- }
- void TextWidgetsPage::CreateText()
- {
- int flags = ms_defaultFlags;
- switch ( m_radioTextLines->GetSelection() )
- {
- default:
- wxFAIL_MSG( wxT("unexpected lines radio box selection") );
- case TextLines_Single:
- break;
- case TextLines_Multi:
- flags |= wxTE_MULTILINE;
- m_chkPassword->SetValue(false);
- break;
- }
- if ( m_chkPassword->GetValue() )
- flags |= wxTE_PASSWORD;
- if ( m_chkReadonly->GetValue() )
- flags |= wxTE_READONLY;
- if ( m_chkProcessEnter->GetValue() )
- flags |= wxTE_PROCESS_ENTER;
- switch ( m_radioWrap->GetSelection() )
- {
- default:
- wxFAIL_MSG( wxT("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_CHARWRAP;
- break;
- case WrapStyle_Best:
- // this is default but use symbolic file name for consistency
- flags |= wxTE_BESTWRAP;
- break;
- }
- #ifdef __WXMSW__
- switch ( m_radioKind->GetSelection() )
- {
- default:
- wxFAIL_MSG( wxT("unexpected kind radio box selection") );
- case TextKind_Plain:
- break;
- case TextKind_Rich:
- flags |= wxTE_RICH;
- break;
- case TextKind_Rich2:
- flags |= wxTE_RICH2;
- break;
- }
- #endif // __WXMSW__
- wxString valueOld;
- if ( m_text )
- {
- valueOld = m_text->GetValue();
- m_sizerText->Detach( m_text );
- delete m_text;
- }
- else
- {
- valueOld = wxT("Hello, Universe!");
- }
- m_text = new WidgetsTextCtrl(this, TextPage_Textctrl, valueOld, flags);
- #if 0
- if ( m_chkFilename->GetValue() )
- ;
- #endif // TODO
- // cast to int needed to silence gcc warning about different enums
- m_sizerText->Add(m_text, 1, wxALL |
- (flags & wxTE_MULTILINE ? (int)wxGROW
- : wxALIGN_TOP), 5);
- m_sizerText->Layout();
- }
- // ----------------------------------------------------------------------------
- // event handlers
- // ----------------------------------------------------------------------------
- void TextWidgetsPage::OnIdle(wxIdleEvent& WXUNUSED(event))
- {
- // update all info texts
- if ( m_textPosCur )
- {
- long posCur = m_text->GetInsertionPoint();
- if ( posCur != m_posCur )
- {
- m_textPosCur->Clear();
- m_textRowCur->Clear();
- m_textColCur->Clear();
- long col, row;
- m_text->PositionToXY(posCur, &col, &row);
- *m_textPosCur << posCur;
- *m_textRowCur << row;
- *m_textColCur << col;
- m_posCur = posCur;
- }
- }
- if ( m_textPosLast )
- {
- long posLast = m_text->GetLastPosition();
- if ( posLast != m_posLast )
- {
- m_textPosLast->Clear();
- *m_textPosLast << posLast;
- m_posLast = posLast;
- }
- }
- if ( m_textLineLast )
- {
- m_textLineLast->SetValue(
- wxString::Format(wxT("%d"), m_text->GetNumberOfLines()) );
- }
- if ( m_textSelFrom && m_textSelTo )
- {
- long selFrom, selTo;
- m_text->GetSelection(&selFrom, &selTo);
- if ( selFrom != m_selFrom )
- {
- m_textSelFrom->Clear();
- *m_textSelFrom << selFrom;
- m_selFrom = selFrom;
- }
- if ( selTo != m_selTo )
- {
- m_textSelTo->Clear();
- *m_textSelTo << selTo;
- m_selTo = selTo;
- }
- }
- if ( m_textRange )
- {
- wxString range = m_text->GetRange(10, 20);
- if ( range != m_range10_20 )
- {
- m_range10_20 = range;
- m_textRange->SetValue(range);
- }
- }
- }
- void TextWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
- {
- Reset();
- CreateText();
- }
- void TextWidgetsPage::OnButtonSet(wxCommandEvent& WXUNUSED(event))
- {
- m_text->SetValue(m_text->GetWindowStyle() & wxTE_MULTILINE
- ? wxT("Here,\nthere and\neverywhere")
- : wxT("Yellow submarine"));
- m_text->SetFocus();
- }
- void TextWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
- {
- if ( m_text->GetWindowStyle() & wxTE_MULTILINE )
- {
- m_text->AppendText(wxT("We all live in a\n"));
- }
- m_text->AppendText(wxT("Yellow submarine"));
- }
- void TextWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
- {
- m_text->WriteText(wxT("Is there anybody going to listen to my story"));
- if ( m_text->GetWindowStyle() & wxTE_MULTILINE )
- {
- m_text->WriteText(wxT("\nall about the girl who came to stay"));
- }
- }
- void TextWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
- {
- m_text->Clear();
- m_text->SetFocus();
- }
- void TextWidgetsPage::OnButtonLoad(wxCommandEvent& WXUNUSED(event))
- {
- // search for the file in several dirs where it's likely to be
- wxPathList pathlist;
- pathlist.Add(wxT("."));
- pathlist.Add(wxT(".."));
- pathlist.Add(wxT("../../../samples/widgets"));
- wxString filename = pathlist.FindValidPath(wxT("textctrl.cpp"));
- if ( !filename )
- {
- wxLogError(wxT("File textctrl.cpp not found."));
- }
- else // load it
- {
- wxStopWatch sw;
- if ( !m_text->LoadFile(filename) )
- {
- // this is not supposed to happen ...
- wxLogError(wxT("Error loading file."));
- }
- else
- {
- long elapsed = sw.Time();
- wxLogMessage(wxT("Loaded file '%s' in %lu.%us"),
- filename.c_str(), elapsed / 1000,
- (unsigned int) elapsed % 1000);
- }
- }
- }
- void TextWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
- {
- event.Enable(!m_text->GetValue().empty());
- }
- void TextWidgetsPage::OnUpdateUIWrapLinesCheckbox(wxUpdateUIEvent& event)
- {
- event.Enable( !IsSingleLine() );
- }
- void TextWidgetsPage::OnUpdateUIPasswordCheckbox(wxUpdateUIEvent& event)
- {
- // can't put multiline control in password mode
- event.Enable( IsSingleLine() );
- }
- void TextWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
- {
- event.Enable( (m_radioTextLines->GetSelection() != DEFAULTS.textLines) ||
- #ifdef __WXMSW__
- (m_radioKind->GetSelection() != DEFAULTS.textKind) ||
- #endif // __WXMSW__
- (m_chkPassword->GetValue() != DEFAULTS.password) ||
- (m_chkReadonly->GetValue() != DEFAULTS.readonly) ||
- (m_chkProcessEnter->GetValue() != DEFAULTS.processEnter) ||
- (m_chkFilename->GetValue() != DEFAULTS.filename) ||
- (m_radioWrap->GetSelection() != DEFAULTS.wrapStyle) );
- }
- void TextWidgetsPage::OnText(wxCommandEvent& WXUNUSED(event))
- {
- // small hack to suppress the very first message: by then the logging is
- // not yet redirected and so initial setting of the text value results in
- // an annoying message box
- static bool s_firstTime = true;
- if ( s_firstTime )
- {
- s_firstTime = false;
- return;
- }
- wxLogMessage(wxT("Text ctrl value changed"));
- }
- void TextWidgetsPage::OnTextEnter(wxCommandEvent& event)
- {
- wxLogMessage(wxT("Text entered: '%s'"), event.GetString().c_str());
- event.Skip();
- }
- void TextWidgetsPage::OnTextPasted(wxClipboardTextEvent& event)
- {
- wxLogMessage("Text pasted from clipboard.");
- event.Skip();
- }
- void TextWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
- {
- CreateText();
- }
- void TextWidgetsPage::OnStreamRedirector(wxCommandEvent& WXUNUSED(event))
- {
- #if wxHAS_TEXT_WINDOW_STREAM
- wxStreamToTextRedirector redirect(m_text);
- wxString str( wxT("Outputed to cout, appears in wxTextCtrl!") );
- wxSTD cout << str << wxSTD endl;
- #else
- wxMessageBox(wxT("This wxWidgets build does not support wxStreamToTextRedirector"));
- #endif
- }
|