1/////////////////////////////////////////////////////////////////////////////// 2// Name: wx/textctrl.h 3// Purpose: wxTextCtrlBase class - the interface of wxTextCtrl 4// Author: Vadim Zeitlin 5// Modified by: 6// Created: 13.07.99 7// RCS-ID: $Id: textctrl.h 53135 2008-04-12 02:31:04Z VZ $ 8// Copyright: (c) Vadim Zeitlin 9// Licence: wxWindows licence 10/////////////////////////////////////////////////////////////////////////////// 11 12#ifndef _WX_TEXTCTRL_H_BASE_ 13#define _WX_TEXTCTRL_H_BASE_ 14 15// ---------------------------------------------------------------------------- 16// headers 17// ---------------------------------------------------------------------------- 18 19#include "wx/defs.h" 20 21#if wxUSE_TEXTCTRL 22 23#include "wx/control.h" // the base class 24#include "wx/dynarray.h" // wxArrayInt 25#include "wx/gdicmn.h" // wxPoint 26 27// Open Watcom 1.3 does allow only ios::rdbuf() while 28// we want something with streambuf parameter 29// Also, can't use streambuf if making or using a DLL :-( 30 31#if defined(__WATCOMC__) || \ 32 defined(__MWERKS__) || \ 33 (defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL))) 34 #define wxHAS_TEXT_WINDOW_STREAM 0 35#elif wxUSE_STD_IOSTREAM 36 #include "wx/ioswrap.h" 37 #define wxHAS_TEXT_WINDOW_STREAM 1 38#else 39 #define wxHAS_TEXT_WINDOW_STREAM 0 40#endif 41 42#if WXWIN_COMPATIBILITY_2_4 && !wxHAS_TEXT_WINDOW_STREAM 43 // define old flag if one could use it somewhere 44 #define NO_TEXT_WINDOW_STREAM 45#endif 46 47class WXDLLIMPEXP_FWD_CORE wxTextCtrl; 48class WXDLLIMPEXP_FWD_CORE wxTextCtrlBase; 49 50// ---------------------------------------------------------------------------- 51// wxTextCtrl types 52// ---------------------------------------------------------------------------- 53 54// wxTextPos is the position in the text 55typedef long wxTextPos; 56 57// wxTextCoord is the line or row number (which should have been unsigned but 58// is long for backwards compatibility) 59typedef long wxTextCoord; 60 61// ---------------------------------------------------------------------------- 62// constants 63// ---------------------------------------------------------------------------- 64 65extern WXDLLEXPORT_DATA(const wxChar) wxTextCtrlNameStr[]; 66 67// this is intentionally not enum to avoid warning fixes with 68// typecasting from enum type to wxTextCoord 69const wxTextCoord wxOutOfRangeTextCoord = -1; 70const wxTextCoord wxInvalidTextCoord = -2; 71 72// ---------------------------------------------------------------------------- 73// wxTextCtrl style flags 74// ---------------------------------------------------------------------------- 75 76#define wxTE_NO_VSCROLL 0x0002 77#define wxTE_AUTO_SCROLL 0x0008 78 79#define wxTE_READONLY 0x0010 80#define wxTE_MULTILINE 0x0020 81#define wxTE_PROCESS_TAB 0x0040 82 83// alignment flags 84#define wxTE_LEFT 0x0000 // 0x0000 85#define wxTE_CENTER wxALIGN_CENTER_HORIZONTAL // 0x0100 86#define wxTE_RIGHT wxALIGN_RIGHT // 0x0200 87#define wxTE_CENTRE wxTE_CENTER 88 89// this style means to use RICHEDIT control and does something only under wxMSW 90// and Win32 and is silently ignored under all other platforms 91#define wxTE_RICH 0x0080 92 93#define wxTE_PROCESS_ENTER 0x0400 94#define wxTE_PASSWORD 0x0800 95 96// automatically detect the URLs and generate the events when mouse is 97// moved/clicked over an URL 98// 99// this is for Win32 richedit and wxGTK2 multiline controls only so far 100#define wxTE_AUTO_URL 0x1000 101 102// by default, the Windows text control doesn't show the selection when it 103// doesn't have focus - use this style to force it to always show it 104#define wxTE_NOHIDESEL 0x2000 105 106// use wxHSCROLL to not wrap text at all, wxTE_CHARWRAP to wrap it at any 107// position and wxTE_WORDWRAP to wrap at words boundary 108// 109// if no wrapping style is given at all, the control wraps at word boundary 110#define wxTE_DONTWRAP wxHSCROLL 111#define wxTE_CHARWRAP 0x4000 // wrap at any position 112#define wxTE_WORDWRAP 0x0001 // wrap only at words boundaries 113#define wxTE_BESTWRAP 0x0000 // this is the default 114 115#if WXWIN_COMPATIBILITY_2_6 116 // obsolete synonym 117 #define wxTE_LINEWRAP wxTE_CHARWRAP 118#endif // WXWIN_COMPATIBILITY_2_6 119 120// force using RichEdit version 2.0 or 3.0 instead of 1.0 (default) for 121// wxTE_RICH controls - can be used together with or instead of wxTE_RICH 122#define wxTE_RICH2 0x8000 123 124// reuse wxTE_RICH2's value for CAPEDIT control on Windows CE 125#if defined(__SMARTPHONE__) || defined(__POCKETPC__) 126#define wxTE_CAPITALIZE wxTE_RICH2 127#else 128#define wxTE_CAPITALIZE 0 129#endif 130 131// ---------------------------------------------------------------------------- 132// wxTextCtrl file types 133// ---------------------------------------------------------------------------- 134 135#define wxTEXT_TYPE_ANY 0 136 137// ---------------------------------------------------------------------------- 138// wxTextCtrl::HitTest return values 139// ---------------------------------------------------------------------------- 140 141// the point asked is ... 142enum wxTextCtrlHitTestResult 143{ 144 wxTE_HT_UNKNOWN = -2, // this means HitTest() is simply not implemented 145 wxTE_HT_BEFORE, // either to the left or upper 146 wxTE_HT_ON_TEXT, // directly on 147 wxTE_HT_BELOW, // below [the last line] 148 wxTE_HT_BEYOND // after [the end of line] 149}; 150// ... the character returned 151 152// ---------------------------------------------------------------------------- 153// Types for wxTextAttr 154// ---------------------------------------------------------------------------- 155 156// Alignment 157 158enum wxTextAttrAlignment 159{ 160 wxTEXT_ALIGNMENT_DEFAULT, 161 wxTEXT_ALIGNMENT_LEFT, 162 wxTEXT_ALIGNMENT_CENTRE, 163 wxTEXT_ALIGNMENT_CENTER = wxTEXT_ALIGNMENT_CENTRE, 164 wxTEXT_ALIGNMENT_RIGHT, 165 wxTEXT_ALIGNMENT_JUSTIFIED 166}; 167 168// Flags to indicate which attributes are being applied 169 170#define wxTEXT_ATTR_TEXT_COLOUR 0x0001 171#define wxTEXT_ATTR_BACKGROUND_COLOUR 0x0002 172#define wxTEXT_ATTR_FONT_FACE 0x0004 173#define wxTEXT_ATTR_FONT_SIZE 0x0008 174#define wxTEXT_ATTR_FONT_WEIGHT 0x0010 175#define wxTEXT_ATTR_FONT_ITALIC 0x0020 176#define wxTEXT_ATTR_FONT_UNDERLINE 0x0040 177#define wxTEXT_ATTR_FONT \ 178 ( wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_SIZE | wxTEXT_ATTR_FONT_WEIGHT | \ 179 wxTEXT_ATTR_FONT_ITALIC | wxTEXT_ATTR_FONT_UNDERLINE ) 180#define wxTEXT_ATTR_ALIGNMENT 0x0080 181#define wxTEXT_ATTR_LEFT_INDENT 0x0100 182#define wxTEXT_ATTR_RIGHT_INDENT 0x0200 183#define wxTEXT_ATTR_TABS 0x0400 184 185// ---------------------------------------------------------------------------- 186// wxTextAttr: a structure containing the visual attributes of a text 187// ---------------------------------------------------------------------------- 188 189class WXDLLEXPORT wxTextAttr 190{ 191public: 192 // ctors 193 wxTextAttr() { Init(); } 194 wxTextAttr(const wxColour& colText, 195 const wxColour& colBack = wxNullColour, 196 const wxFont& font = wxNullFont, 197 wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT); 198 199 // operations 200 void Init(); 201 202 // merges the attributes of the base and the overlay objects and returns 203 // the result; the parameter attributes take precedence 204 // 205 // WARNING: the order of arguments is the opposite of Combine() 206 static wxTextAttr Merge(const wxTextAttr& base, const wxTextAttr& overlay) 207 { 208 return Combine(overlay, base, NULL); 209 } 210 211 // merges the attributes of this object and overlay 212 void Merge(const wxTextAttr& overlay) 213 { 214 *this = Merge(*this, overlay); 215 } 216 217 218 // operators 219 void operator= (const wxTextAttr& attr); 220 221 // setters 222 void SetTextColour(const wxColour& colText) { m_colText = colText; m_flags |= wxTEXT_ATTR_TEXT_COLOUR; } 223 void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR; } 224 void SetFont(const wxFont& font, long flags = wxTEXT_ATTR_FONT) { m_font = font; m_flags |= flags; } 225 void SetAlignment(wxTextAttrAlignment alignment) { m_textAlignment = alignment; m_flags |= wxTEXT_ATTR_ALIGNMENT; } 226 void SetTabs(const wxArrayInt& tabs) { m_tabs = tabs; m_flags |= wxTEXT_ATTR_TABS; } 227 void SetLeftIndent(int indent, int subIndent = 0) { m_leftIndent = indent; m_leftSubIndent = subIndent; m_flags |= wxTEXT_ATTR_LEFT_INDENT; } 228 void SetRightIndent(int indent) { m_rightIndent = indent; m_flags |= wxTEXT_ATTR_RIGHT_INDENT; } 229 void SetFlags(long flags) { m_flags = flags; } 230 231 // accessors 232 bool HasTextColour() const { return m_colText.Ok() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; } 233 bool HasBackgroundColour() const { return m_colBack.Ok() && HasFlag(wxTEXT_ATTR_BACKGROUND_COLOUR) ; } 234 bool HasFont() const { return m_font.Ok() && HasFlag(wxTEXT_ATTR_FONT) ; } 235 bool HasAlignment() const { return (m_textAlignment != wxTEXT_ALIGNMENT_DEFAULT) && ((m_flags & wxTEXT_ATTR_ALIGNMENT) != 0) ; } 236 bool HasTabs() const { return (m_flags & wxTEXT_ATTR_TABS) != 0 ; } 237 bool HasLeftIndent() const { return (m_flags & wxTEXT_ATTR_LEFT_INDENT) != 0 ; } 238 bool HasRightIndent() const { return (m_flags & wxTEXT_ATTR_RIGHT_INDENT) != 0 ; } 239 bool HasFlag(long flag) const { return (m_flags & flag) != 0; } 240 241 const wxColour& GetTextColour() const { return m_colText; } 242 const wxColour& GetBackgroundColour() const { return m_colBack; } 243 const wxFont& GetFont() const { return m_font; } 244 wxTextAttrAlignment GetAlignment() const { return m_textAlignment; } 245 const wxArrayInt& GetTabs() const { return m_tabs; } 246 long GetLeftIndent() const { return m_leftIndent; } 247 long GetLeftSubIndent() const { return m_leftSubIndent; } 248 long GetRightIndent() const { return m_rightIndent; } 249 long GetFlags() const { return m_flags; } 250 251 // returns false if we have any attributes set, true otherwise 252 bool IsDefault() const 253 { 254 return !HasTextColour() && !HasBackgroundColour() && !HasFont() && !HasAlignment() && 255 !HasTabs() && !HasLeftIndent() && !HasRightIndent() ; 256 } 257 258 // return the attribute having the valid font and colours: it uses the 259 // attributes set in attr and falls back first to attrDefault and then to 260 // the text control font/colours for those attributes which are not set 261 static wxTextAttr Combine(const wxTextAttr& attr, 262 const wxTextAttr& attrDef, 263 const wxTextCtrlBase *text); 264 265private: 266 long m_flags; 267 wxColour m_colText, 268 m_colBack; 269 wxFont m_font; 270 wxTextAttrAlignment m_textAlignment; 271 wxArrayInt m_tabs; // array of int: tab stops in 1/10 mm 272 int m_leftIndent; // left indent in 1/10 mm 273 int m_leftSubIndent; // left indent for all but the first 274 // line in a paragraph relative to the 275 // first line, in 1/10 mm 276 int m_rightIndent; // right indent in 1/10 mm 277}; 278 279// ---------------------------------------------------------------------------- 280// wxTextCtrl: a single or multiple line text zone where user can enter and 281// edit text 282// ---------------------------------------------------------------------------- 283 284class WXDLLEXPORT wxTextCtrlBase : public wxControl 285#if wxHAS_TEXT_WINDOW_STREAM 286 , public wxSTD streambuf 287#endif 288 289{ 290public: 291 // creation 292 // -------- 293 294 wxTextCtrlBase(){} 295 virtual ~wxTextCtrlBase(){} 296 297 // accessors 298 // --------- 299 300 virtual wxString GetValue() const = 0; 301 virtual bool IsEmpty() const { return GetValue().empty(); } 302 303 virtual void SetValue(const wxString& value) 304 { DoSetValue(value, SetValue_SendEvent); } 305 virtual void ChangeValue(const wxString& value) 306 { DoSetValue(value); } 307 308 virtual wxString GetRange(long from, long to) const; 309 310 virtual int GetLineLength(long lineNo) const = 0; 311 virtual wxString GetLineText(long lineNo) const = 0; 312 virtual int GetNumberOfLines() const = 0; 313 314 virtual bool IsModified() const = 0; 315 virtual bool IsEditable() const = 0; 316 317 // more readable flag testing methods 318 bool IsSingleLine() const { return !HasFlag(wxTE_MULTILINE); } 319 bool IsMultiLine() const { return !IsSingleLine(); } 320 321 // If the return values from and to are the same, there is no selection. 322 virtual void GetSelection(long* from, long* to) const = 0; 323 324 virtual wxString GetStringSelection() const; 325 326 // operations 327 // ---------- 328 329 // editing 330 virtual void Clear() = 0; 331 virtual void Replace(long from, long to, const wxString& value) = 0; 332 virtual void Remove(long from, long to) = 0; 333 334 // load/save the control's contents from/to a file 335 bool LoadFile(const wxString& file, int fileType = wxTEXT_TYPE_ANY) { return DoLoadFile(file, fileType); } 336 bool SaveFile(const wxString& file = wxEmptyString, int fileType = wxTEXT_TYPE_ANY); 337 338 // implementation for loading/saving 339 virtual bool DoLoadFile(const wxString& file, int fileType); 340 virtual bool DoSaveFile(const wxString& file, int fileType); 341 342 // sets/clears the dirty flag 343 virtual void MarkDirty() = 0; 344 virtual void DiscardEdits() = 0; 345 void SetModified(bool modified) 346 { 347 if ( modified ) 348 MarkDirty(); 349 else 350 DiscardEdits(); 351 } 352 353 // set the max number of characters which may be entered in a single line 354 // text control 355 virtual void SetMaxLength(unsigned long WXUNUSED(len)) { } 356 357 // writing text inserts it at the current position, appending always 358 // inserts it at the end 359 virtual void WriteText(const wxString& text) = 0; 360 virtual void AppendText(const wxString& text) = 0; 361 362 // insert the character which would have resulted from this key event, 363 // return true if anything has been inserted 364 virtual bool EmulateKeyPress(const wxKeyEvent& event); 365 366 // text control under some platforms supports the text styles: these 367 // methods allow to apply the given text style to the given selection or to 368 // set/get the style which will be used for all appended text 369 virtual bool SetStyle(long start, long end, const wxTextAttr& style); 370 virtual bool GetStyle(long position, wxTextAttr& style); 371 virtual bool SetDefaultStyle(const wxTextAttr& style); 372 virtual const wxTextAttr& GetDefaultStyle() const; 373 374 // translate between the position (which is just an index in the text ctrl 375 // considering all its contents as a single strings) and (x, y) coordinates 376 // which represent column and line. 377 virtual long XYToPosition(long x, long y) const = 0; 378 virtual bool PositionToXY(long pos, long *x, long *y) const = 0; 379 380 virtual void ShowPosition(long pos) = 0; 381 382 // find the character at position given in pixels 383 // 384 // NB: pt is in device coords (not adjusted for the client area origin nor 385 // scrolling) 386 virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; 387 virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, 388 wxTextCoord *col, 389 wxTextCoord *row) const; 390 391 // Clipboard operations 392 virtual void Copy() = 0; 393 virtual void Cut() = 0; 394 virtual void Paste() = 0; 395 396 virtual bool CanCopy() const; 397 virtual bool CanCut() const; 398 virtual bool CanPaste() const; 399 400 // Undo/redo 401 virtual void Undo() = 0; 402 virtual void Redo() = 0; 403 404 virtual bool CanUndo() const = 0; 405 virtual bool CanRedo() const = 0; 406 407 // Insertion point 408 virtual void SetInsertionPoint(long pos) = 0; 409 virtual void SetInsertionPointEnd() = 0; 410 virtual long GetInsertionPoint() const = 0; 411 virtual wxTextPos GetLastPosition() const = 0; 412 413 virtual void SetSelection(long from, long to) = 0; 414 virtual void SelectAll(); 415 virtual void SetEditable(bool editable) = 0; 416 417 // stream-like insertion operators: these are always available, whether we 418 // were, or not, compiled with streambuf support 419 wxTextCtrl& operator<<(const wxString& s); 420 wxTextCtrl& operator<<(int i); 421 wxTextCtrl& operator<<(long i); 422 wxTextCtrl& operator<<(float f); 423 wxTextCtrl& operator<<(double d); 424 wxTextCtrl& operator<<(const wxChar c); 425 426 // generate the wxEVT_COMMAND_TEXT_UPDATED event, like SetValue() does 427 void SendTextUpdatedEvent(); 428 429 // do the window-specific processing after processing the update event 430 virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); 431 432 virtual bool ShouldInheritColours() const { return false; } 433 434protected: 435 // override streambuf method 436#if wxHAS_TEXT_WINDOW_STREAM 437 int overflow(int i); 438#endif // wxHAS_TEXT_WINDOW_STREAM 439 440 // flags for DoSetValue(): common part of SetValue() and ChangeValue() and 441 // also used to implement WriteText() in wxMSW 442 enum 443 { 444 SetValue_SendEvent = 1, 445 SetValue_SelectionOnly = 2 446 }; 447 448 virtual void DoSetValue(const wxString& value, int flags = 0) = 0; 449 450 451 // the name of the last file loaded with LoadFile() which will be used by 452 // SaveFile() by default 453 wxString m_filename; 454 455 // the text style which will be used for any new text added to the control 456 wxTextAttr m_defaultStyle; 457 458 DECLARE_NO_COPY_CLASS(wxTextCtrlBase) 459 DECLARE_ABSTRACT_CLASS(wxTextCtrlBase) 460}; 461 462// ---------------------------------------------------------------------------- 463// include the platform-dependent class definition 464// ---------------------------------------------------------------------------- 465 466#if defined(__WXX11__) 467 #include "wx/x11/textctrl.h" 468#elif defined(__WXUNIVERSAL__) 469 #include "wx/univ/textctrl.h" 470#elif defined(__SMARTPHONE__) && defined(__WXWINCE__) 471 #include "wx/msw/wince/textctrlce.h" 472#elif defined(__WXMSW__) 473 #include "wx/msw/textctrl.h" 474#elif defined(__WXMOTIF__) 475 #include "wx/motif/textctrl.h" 476#elif defined(__WXGTK20__) 477 #include "wx/gtk/textctrl.h" 478#elif defined(__WXGTK__) 479 #include "wx/gtk1/textctrl.h" 480#elif defined(__WXMAC__) 481 #include "wx/mac/textctrl.h" 482#elif defined(__WXCOCOA__) 483 #include "wx/cocoa/textctrl.h" 484#elif defined(__WXPM__) 485 #include "wx/os2/textctrl.h" 486#endif 487 488// ---------------------------------------------------------------------------- 489// wxTextCtrl events 490// ---------------------------------------------------------------------------- 491 492#if !WXWIN_COMPATIBILITY_EVENT_TYPES 493 494BEGIN_DECLARE_EVENT_TYPES() 495 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED, 7) 496 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER, 8) 497 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_URL, 13) 498 DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_MAXLEN, 14) 499END_DECLARE_EVENT_TYPES() 500 501#endif // !WXWIN_COMPATIBILITY_EVENT_TYPES 502 503class WXDLLEXPORT wxTextUrlEvent : public wxCommandEvent 504{ 505public: 506 wxTextUrlEvent(int winid, const wxMouseEvent& evtMouse, 507 long start, long end) 508 : wxCommandEvent(wxEVT_COMMAND_TEXT_URL, winid) 509 , m_evtMouse(evtMouse), m_start(start), m_end(end) 510 { } 511 512 // get the mouse event which happend over the URL 513 const wxMouseEvent& GetMouseEvent() const { return m_evtMouse; } 514 515 // get the start of the URL 516 long GetURLStart() const { return m_start; } 517 518 // get the end of the URL 519 long GetURLEnd() const { return m_end; } 520 521protected: 522 // the corresponding mouse event 523 wxMouseEvent m_evtMouse; 524 525 // the start and end indices of the URL in the text control 526 long m_start, 527 m_end; 528 529private: 530 DECLARE_DYNAMIC_CLASS_NO_COPY(wxTextUrlEvent) 531 532public: 533 // for wxWin RTTI only, don't use 534 wxTextUrlEvent() : m_evtMouse(), m_start(0), m_end(0) { } 535}; 536 537typedef void (wxEvtHandler::*wxTextUrlEventFunction)(wxTextUrlEvent&); 538 539#define wxTextEventHandler(func) wxCommandEventHandler(func) 540#define wxTextUrlEventHandler(func) \ 541 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTextUrlEventFunction, &func) 542 543#define wx__DECLARE_TEXTEVT(evt, id, fn) \ 544 wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextEventHandler(fn)) 545 546#define wx__DECLARE_TEXTURLEVT(evt, id, fn) \ 547 wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextUrlEventHandler(fn)) 548 549#define EVT_TEXT(id, fn) wx__DECLARE_TEXTEVT(UPDATED, id, fn) 550#define EVT_TEXT_ENTER(id, fn) wx__DECLARE_TEXTEVT(ENTER, id, fn) 551#define EVT_TEXT_URL(id, fn) wx__DECLARE_TEXTURLEVT(URL, id, fn) 552#define EVT_TEXT_MAXLEN(id, fn) wx__DECLARE_TEXTEVT(MAXLEN, id, fn) 553 554#if wxHAS_TEXT_WINDOW_STREAM 555 556// ---------------------------------------------------------------------------- 557// wxStreamToTextRedirector: this class redirects all data sent to the given 558// C++ stream to the wxTextCtrl given to its ctor during its lifetime. 559// ---------------------------------------------------------------------------- 560 561class WXDLLEXPORT wxStreamToTextRedirector 562{ 563private: 564 void Init(wxTextCtrl *text) 565 { 566 m_sbufOld = m_ostr.rdbuf(); 567 m_ostr.rdbuf(text); 568 } 569 570public: 571 wxStreamToTextRedirector(wxTextCtrl *text) 572 : m_ostr(wxSTD cout) 573 { 574 Init(text); 575 } 576 577 wxStreamToTextRedirector(wxTextCtrl *text, wxSTD ostream *ostr) 578 : m_ostr(*ostr) 579 { 580 Init(text); 581 } 582 583 ~wxStreamToTextRedirector() 584 { 585 m_ostr.rdbuf(m_sbufOld); 586 } 587 588private: 589 // the stream we're redirecting 590 wxSTD ostream& m_ostr; 591 592 // the old streambuf (before we changed it) 593 wxSTD streambuf *m_sbufOld; 594}; 595 596#endif // wxHAS_TEXT_WINDOW_STREAM 597 598#endif // wxUSE_TEXTCTRL 599 600#endif 601 // _WX_TEXTCTRL_H_BASE_ 602