INCOMPATIBLE CHANGES SINCE 2.2.x
================================
+All (GUI):
+
+- wxGridCellAttrProvider class API changed, you will need to update your code
+ if you derived any classes from it
+
wxMSW:
- child frames appear in the taskbar by default now, use wxFRAME_NO_TASKBAR
- wxFindReplaceDialog added (based on work of Markus Greither)
- wxTextCtrl::SetMaxLength() added (wxMSW/wxGTK)
- polygon support in wxRegion (Klaas Holwerda)
+- wxStreamToTextRedirector to allow easily redirect cout to wxTextCtrl added
- fixed bug with using wxExecute() to capture huge amounts of output
wxHTML:
\input stopwtch.tex
\input strmbase.tex
\input stream.tex
+\input strtotxt.tex
\input wxstring.tex
\input propstfv.tex
\input strlist.tex
--- /dev/null
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name: strtotxt.tex
+%% Purpose: wxStreamToTextRedirector documentation
+%% Author: Vadim Zeitlin
+%% Modified by:
+%% Created: 19.10.01
+%% RCS-ID: $Id$
+%% Copyright: (c) 2001 Vadim Zeitlin <vadim@wxwindows.org>
+%% License: wxWindows license
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{\class{wxStreamToTextRedirector}}\label{wxstreamtotextredirector}
+
+This class can be used to (temporarily) redirect all output sent to a C++
+ostream object to a \helpref{wxTextCtrl}{wxtextctrl} instead.
+
+{\bf NB:} Some compilers and/or build configurations don't support multiply
+inheriting \helpref{wxTextCtrl}{wxtextctrl} from {\tt std::streambuf} in which
+case this class is not compiled in. You also must have {\tt wxUSE\_STD\_IOSTREAM}
+option on (i.e. set to $1$) in your setup.h to be able to use it. Under Unix,
+specify {\tt --enable-std\_iostreams} switch when running configure for this.
+
+Example of usage:
+{\small%
+\begin{verbatim}
+ using namespace std;
+
+ wxTextCtrl *text = new wxTextCtrl(...);
+
+ {
+ wxStreamToTextRedirector redirect(text);
+
+ // this goes to the text control
+ cout << "Hello, text!" << endl;
+ }
+
+ // this goes soemwhere else, presumably to stdout
+ cout << "Hello, console!" << endl;
+\end{verbatim}
+}%
+
+\wxheading{Derived from}
+
+No base class
+
+\wxheading{Include files}
+
+<wx/textctrl.h>
+
+\wxheading{See also}
+
+\helpref{wxTextCtrl}{wxtextctrl}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxStreamToTextRedirector::wxStreamToTextRedirector}\label{wxstreamtotextredirectorctor}
+
+\func{}{wxStreamToTextRedirector}{\param{wxTextCtrl }{*text}, \param{ostream *ostr = NULL}}
+
+The constructor starts redirecting output sent to {\it ostr} or {\it cout} for
+the default parameter value to the text control {\it text}.
+
+\wxheading{Parameters}
+
+\docparam{text}{The text control to append output too, must be non NULL}
+
+\docparam{ostr}{The C++ stream to redirect, {\it cout} is used if it is NULL}
+
+\membersection{wxStreamToTextRedirector::\destruct{wxStreamToTextRedirector}}
+
+\func{}{\destruct{wxStreamToTextRedirector}}{\void}
+
+When a wxStreamToTextRedirector object is destroyed, the redirection is ended
+and any output sent to the C++ ostream which had been specified at the time of
+the object construction will go to its original destination.
+
See also \helpref{window styles overview}{windowstyles} and
\helpref{wxTextCtrl::wxTextCtrl}{wxtextctrlconstr}.
-\wxheading{Remarks}
+\wxheading{wxTextCtrl and C++ streams}
-This class multiply-inherits from {\bf streambuf} where compilers allow, allowing code such as
-the following:
+This class multiply-inherits from {\bf streambuf} where compilers allow,
+allowing code such as the following:
{\small%
\begin{verbatim}
\end{verbatim}
}%
-If your compiler does not support derivation from {\bf streambuf} and gives a compile error, define the symbol
-{\bf NO\_TEXT\_WINDOW\_STREAM} in the wxTextCtrl header file.
+If your compiler does not support derivation from {\bf streambuf} and gives a
+compile error, define the symbol {\bf NO\_TEXT\_WINDOW\_STREAM} in the
+wxTextCtrl header file.
+
+Note that independently of this setting you can always use wxTextCtrl itself
+in a stream-like manner:
+
+{\small%
+\begin{verbatim}
+ wxTextCtrl *control = new wxTextCtrl(...);
+
+ *control << 123.456 << " some text\n";
+\end{verbatim}
+}%
+
+always works. However the possibility to create an ostream associated with
+wxTextCtrl may be useful if you need to redirect the output of a function
+taking an ostream as parameter to a text control.
+
+Another commonly requested need is to redirect {\bf std::cout} to the text
+control. This could be done in the following way:
+
+{\small%
+\begin{verbatim}
+ #include <iostream>
+
+ wxTextCtrl *control = new wxTextCtrl(...);
+
+ std::streambuf *sbOld = std::cout.rdbuf();
+ std::cout.rdbuf(*control);
+
+ // use cout as usual, the output appears in the text control
+ ...
+
+ std::cout.rdbuf(sbOld);
+\end{verbatim}
+}%
+
+But wxWindows provides a convenient class to make it even simpler so instead
+you may just do
+
+{\small%
+\begin{verbatim}
+ #include <iostream>
+
+ wxTextCtrl *control = new wxTextCtrl(...);
+
+ wxStreamToTextRedirector redirect(control);
+
+ // all output to cout goes into the text control until the exit from current
+ // scope
+\end{verbatim}
+}%
-% VZ: it is wrong to say that C++ iostreams are deprecated, we need a better
-% wording here - disabling this for now
-%Note that any use of C++ iostreams (including this one) is deprecated and might
-%get completely removed in the future.
+See \helpref{wxStreamToTextRedirector}{wxstreamtotextredirector} for more
+details.
\wxheading{Event handling}
\helpref{SetMaxLength}{wxtextctrlsetmaxlength}.}
\end{twocollist}%
-%\wxheading{See also}
-%
-%\helpref{wxRichTextCtrl}{wxrichtextctrl}
-%
\latexignore{\rtfignore{\wxheading{Members}}}
\membersection{wxTextCtrl::wxTextCtrl}\label{wxtextctrlconstr}
// and streambuf: it complains about deriving a huge class from the huge class
// streambuf. !! Also, can't use streambuf if making or using a DLL :-(
-#if (defined(__BORLANDC__)) || defined(__MWERKS__) || defined(_WINDLL) || defined(WXUSINGDLL) || defined(WXMAKINGDLL)
- #define NO_TEXT_WINDOW_STREAM
-#endif
-
-// the streambuf which is used in the declaration of wxTextCtrlBase below is not compatible
-// with the standard-conforming implementation found in newer egcs versions
-// (that is, the libstdc++ v3 that is shipped with it)
-#if defined(__GNUC__)&&( (__GNUC__>2) ||( (__GNUC__==2)&&(__GNUC_MINOR__>97) ) )
+#if (defined(__BORLANDC__)) || defined(__MWERKS__) || \
+ defined(WXUSINGDLL) || defined(WXMAKINGDLL)
#define NO_TEXT_WINDOW_STREAM
#endif
virtual void SelectAll();
virtual void SetEditable(bool editable) = 0;
- // streambuf methods
+ // override streambuf method
#ifndef NO_TEXT_WINDOW_STREAM
int overflow(int i);
- int sync();
- int underflow();
#endif // NO_TEXT_WINDOW_STREAM
// stream-like insertion operators: these are always available, whether we
// the text style which will be used for any new text added to the control
wxTextAttr m_defaultStyle;
-
-private:
-#ifndef NO_TEXT_WINDOW_STREAM
-#if !wxUSE_IOSTREAMH
- char *m_streambuf;
-#endif
-#endif
};
// ----------------------------------------------------------------------------
#define EVT_TEXT_URL(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_URL, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxTextUrlEventFunction) & fn, (wxObject *) NULL ),
#define EVT_TEXT_MAXLEN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_MAXLEN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
+#ifndef NO_TEXT_WINDOW_STREAM
+
+// ----------------------------------------------------------------------------
+// wxStreamToTextRedirector: this class redirects all data sent to the given
+// C++ stream to the wxTextCtrl given to its ctor during its lifetime.
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStreamToTextRedirector
+{
+public:
+ wxStreamToTextRedirector(wxTextCtrl *text, wxSTD ostream *ostr = NULL)
+ : m_ostr(ostr ? *ostr : wxSTD::cout)
+ {
+ m_sbufOld = m_ostr.rdbuf();
+ m_ostr.rdbuf(text);
+ }
+
+ ~wxStreamToTextRedirector()
+ {
+ m_ostr.rdbuf(m_sbufOld);
+ }
+
+private:
+ // the stream we're redirecting
+ wxSTD ostream& m_ostr;
+
+ // the old streambuf (before we changed it)
+ wxSTD streambuf *m_sbufOld;
+};
+
+#endif // !NO_TEXT_WINDOW_STREAM
+
#endif // wxUSE_TEXTCTRL
#endif
wxTextCtrlBase::wxTextCtrlBase()
{
-#ifndef NO_TEXT_WINDOW_STREAM
- #if wxUSE_IOSTREAMH
- if (allocate())
- setp(base(),ebuf());
- #else
- m_streambuf = new char[64];
- setp(m_streambuf, m_streambuf + 64);
- #endif //wxUSE_IOSTREAMH
-#endif // NO_TEXT_WINDOW_STREAM
}
wxTextCtrlBase::~wxTextCtrlBase()
{
-#ifndef NO_TEXT_WINDOW_STREAM
-#if !wxUSE_IOSTREAMH
- delete[] m_streambuf;
-#endif
-#endif
}
// ----------------------------------------------------------------------------
#ifndef NO_TEXT_WINDOW_STREAM
-int wxTextCtrlBase::overflow( int WXUNUSED(c) )
+int wxTextCtrlBase::overflow(int c)
{
- int len = pptr() - pbase();
- char *txt = new char[len+1];
- strncpy(txt, pbase(), len);
- txt[len] = '\0';
- (*this) << txt;
- setp(pbase(), epptr());
- delete[] txt;
- return EOF;
-}
+ AppendText((wxChar)c);
-int wxTextCtrlBase::sync()
-{
- int len = pptr() - pbase();
- char *txt = new char[len+1];
- strncpy(txt, pbase(), len);
- txt[len] = '\0';
- (*this) << txt;
- setp(pbase(), epptr());
- delete[] txt;
+ // return something different from EOF
return 0;
}
-int wxTextCtrlBase::underflow()
-{
- return EOF;
-}
-
#endif // NO_TEXT_WINDOW_STREAM
// ----------------------------------------------------------------------------