diff --git a/docs/latex/wx/strmfile.tex b/docs/latex/wx/strmfile.tex index fdbf8bae08..8e66bfdcec 100644 --- a/docs/latex/wx/strmfile.tex +++ b/docs/latex/wx/strmfile.tex @@ -3,6 +3,13 @@ % ----------------------------------------------------------------------------- \section{\class{wxFileInputStream}}\label{wxfileinputstream} +This classes represent data streams to and from a file. There are actually +two such groups of classes: those documented here, and another group called +wxFFileInputStream, wxFFileOutputStream and wxFFileStream which are not +based on file descriptors (and their wxWindows equivalent wxFile) but the +FILE* type (and wxFFile). Apart from the different constructor ("FILE *file" +instead if "int fd") their interface is identical. + \wxheading{Derived from} \helpref{wxInputStream}{wxinputstream} diff --git a/docs/latex/wx/txtstrm.tex b/docs/latex/wx/txtstrm.tex index a2e4e54136..559209c182 100644 --- a/docs/latex/wx/txtstrm.tex +++ b/docs/latex/wx/txtstrm.tex @@ -91,14 +91,14 @@ $\backslash$n or $\backslash$r$\backslash$n or $\backslash$r. This class provides functions that write text datas using an output stream. So, you can write \it{text} floats, integers. -For example: +You can also simulate the C++ cout class: \begin{verbatim} - wxFileOutputStream output( "mytext.txt" ); - wxTextOutputStream text( output ); + wxFFileOutputStream output( stderr ); + wxTextOutputStream cout( output ); - output << "This is a text line" << endl; - output << 1234; - output << 1.23456; + cout << "This is a text line" << endl; + cout << 1234; + cout << 1.23456; \end{verbatim} The wxTextOutputStream writes text files (or streams) on DOS, Macintosh diff --git a/include/wx/gtk/textctrl.h b/include/wx/gtk/textctrl.h index 8844ee99fe..c437884c3c 100644 --- a/include/wx/gtk/textctrl.h +++ b/include/wx/gtk/textctrl.h @@ -127,6 +127,7 @@ public: bool IsOwnGtkWindow( GdkWindow *window ); void ApplyWidgetStyle(); void CalculateScrollbar(); + void OnInternalIdle(); void SetModified() { m_modified = TRUE; } diff --git a/include/wx/gtk1/textctrl.h b/include/wx/gtk1/textctrl.h index 8844ee99fe..c437884c3c 100644 --- a/include/wx/gtk1/textctrl.h +++ b/include/wx/gtk1/textctrl.h @@ -127,6 +127,7 @@ public: bool IsOwnGtkWindow( GdkWindow *window ); void ApplyWidgetStyle(); void CalculateScrollbar(); + void OnInternalIdle(); void SetModified() { m_modified = TRUE; } diff --git a/include/wx/txtstrm.h b/include/wx/txtstrm.h index aa2378fb52..afa18e3bce 100644 --- a/include/wx/txtstrm.h +++ b/include/wx/txtstrm.h @@ -20,6 +20,14 @@ #if wxUSE_STREAMS +class WXDLLEXPORT wxTextInputStream; +class WXDLLEXPORT wxTextOutputStream; + +typedef wxTextInputStream& (*__wxTextInputManip)(wxTextInputStream&); +typedef wxTextOutputStream& (*__wxTextOutputManip)(wxTextOutputStream&); + +WXDLLEXPORT wxTextOutputStream &endl( wxTextOutputStream &stream ); + class WXDLLEXPORT wxTextInputStream { public: wxTextInputStream(wxInputStream& s); @@ -40,7 +48,9 @@ public: wxTextInputStream& operator>>(wxUint32& i); wxTextInputStream& operator>>(double& i); wxTextInputStream& operator>>(float& f); - + + wxTextInputStream& operator>>( __wxTextInputManip func) { return func(*this); } + protected: wxInputStream *m_input; @@ -69,12 +79,12 @@ class WXDLLEXPORT wxTextOutputStream { wxTextOutputStream& operator<<(double f); wxTextOutputStream& operator<<(float f); + wxTextOutputStream& operator<<( __wxTextOutputManip func) { return func(*this); } + protected: wxOutputStream *m_output; }; -wxTextOutputStream &endl( wxTextOutputStream &stream ); - #endif // wxUSE_STREAMS diff --git a/include/wx/wfstream.h b/include/wx/wfstream.h index 33217d75b5..49fd49d00a 100644 --- a/include/wx/wfstream.h +++ b/include/wx/wfstream.h @@ -24,6 +24,11 @@ #include "wx/string.h" #include "wx/stream.h" #include "wx/file.h" +#include "wx/ffile.h" + +// ---------------------------------------------------------------------------- +// wxFileStream using wxFile +// ---------------------------------------------------------------------------- class wxFileInputStream: public wxInputStream { public: @@ -81,6 +86,65 @@ class wxFileStream: public wxFileInputStream, public wxFileOutputStream { wxFileStream(const wxString& fileName); }; +// ---------------------------------------------------------------------------- +// wxFFileStream using wxFFile +// ---------------------------------------------------------------------------- + +class wxFFileInputStream: public wxInputStream { + public: + wxFFileInputStream(const wxString& ifileName); + wxFFileInputStream(wxFFile& file); + wxFFileInputStream(FILE *file); + ~wxFFileInputStream(); + + size_t GetSize() const; + + bool Ok() const { return m_file->IsOpened(); } + + protected: + wxFFileInputStream(); + + size_t OnSysRead(void *buffer, size_t size); + off_t OnSysSeek(off_t pos, wxSeekMode mode); + off_t OnSysTell() const; + + protected: + wxFFile *m_file; + bool m_file_destroy; +}; + +class wxFFileOutputStream: public wxOutputStream { + public: + wxFFileOutputStream(const wxString& fileName); + wxFFileOutputStream(wxFFile& file); + wxFFileOutputStream(FILE *file); + virtual ~wxFFileOutputStream(); + + // To solve an ambiguity on GCC +// inline wxOutputStream& Write(const void *buffer, size_t size) +// { return wxOutputStream::Write(buffer, size); } + + void Sync(); + size_t GetSize() const; + + bool Ok() const { return m_file->IsOpened(); } + + protected: + wxFFileOutputStream(); + + size_t OnSysWrite(const void *buffer, size_t size); + off_t OnSysSeek(off_t pos, wxSeekMode mode); + off_t OnSysTell() const; + + protected: + wxFFile *m_file; + bool m_file_destroy; +}; + +class wxFFileStream: public wxFFileInputStream, public wxFFileOutputStream { + public: + wxFFileStream(const wxString& fileName); +}; #endif // wxUSE_STREAMS && wxUSE_FILE diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 85d378f766..e0531d76f8 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -518,9 +518,9 @@ void MyPanel::OnPageChanging( wxNotebookEvent &event ) int selOld = event.GetOldSelection(); if ( selOld == 2 ) { - if ( wxMessageBox("This demonstrates how a program may prevent the " - "page change from taking place - if you select " - "[No] the current page will stay the third one", + if ( wxMessageBox("This demonstrates how a program may prevent the\n" + "page change from taking place - if you select\n" + "[No] the current page will stay the third one\n", "Control sample", wxICON_QUESTION | wxYES_NO) != wxYES ) { diff --git a/samples/text/Makefile.in b/samples/text/Makefile.in index 52eaf8abd2..fc853c6528 100644 --- a/samples/text/Makefile.in +++ b/samples/text/Makefile.in @@ -15,7 +15,7 @@ program_dir = samples/text DATAFILES = text.cpp -PROGRAM=controls +PROGRAM=text OBJECTS=$(PROGRAM).o diff --git a/src/common/wfstream.cpp b/src/common/wfstream.cpp index f9694ca306..b43ddb3fba 100644 --- a/src/common/wfstream.cpp +++ b/src/common/wfstream.cpp @@ -169,6 +169,148 @@ wxFileStream::wxFileStream(const wxString& fileName) { } +// ---------------------------------------------------------------------------- +// wxFFileInputStream +// ---------------------------------------------------------------------------- + +wxFFileInputStream::wxFFileInputStream(const wxString& fileName) + : wxInputStream() +{ + m_file = new wxFFile(fileName, "r"); + m_file_destroy = TRUE; +} + +wxFFileInputStream::wxFFileInputStream() + : wxInputStream() +{ + m_file_destroy = FALSE; + m_file = NULL; +} + +wxFFileInputStream::wxFFileInputStream(wxFFile& file) +{ + m_file = &file; + m_file_destroy = FALSE; +} + +wxFFileInputStream::wxFFileInputStream(FILE *file) +{ + m_file = new wxFFile(file); + m_file_destroy = TRUE; +} + +wxFFileInputStream::~wxFFileInputStream() +{ + if (m_file_destroy) + delete m_file; +} + +size_t wxFFileInputStream::GetSize() const +{ + return m_file->Length(); +} + +size_t wxFFileInputStream::OnSysRead(void *buffer, size_t size) +{ + off_t ret; + + ret = m_file->Read(buffer, size); + + if (m_file->Eof()) + m_lasterror = wxStream_EOF; + if (ret == wxInvalidOffset) { + m_lasterror = wxStream_READ_ERR; + ret = 0; + } + + return ret; +} + +off_t wxFFileInputStream::OnSysSeek(off_t pos, wxSeekMode mode) +{ + return m_file->Seek(pos, mode); +} + +off_t wxFFileInputStream::OnSysTell() const +{ + return m_file->Tell(); +} + +// ---------------------------------------------------------------------------- +// wxFFileOutputStream +// ---------------------------------------------------------------------------- + +wxFFileOutputStream::wxFFileOutputStream(const wxString& fileName) +{ + m_file = new wxFFile(fileName, "w+"); + m_file_destroy = TRUE; +} + +wxFFileOutputStream::wxFFileOutputStream(wxFFile& file) +{ + m_file = &file; + m_file_destroy = FALSE; +} + +wxFFileOutputStream::wxFFileOutputStream() + : wxOutputStream() +{ + m_file_destroy = FALSE; + m_file = NULL; +} + +wxFFileOutputStream::wxFFileOutputStream(FILE *file) +{ + m_file = new wxFFile(file); + m_file_destroy = TRUE; +} + +wxFFileOutputStream::~wxFFileOutputStream() +{ + if (m_file_destroy) { + Sync(); + delete m_file; + } +} + +size_t wxFFileOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + size_t ret = m_file->Write(buffer, size); + if (m_file->Error()) + m_lasterror = wxStream_WRITE_ERR; + else + m_lasterror = wxStream_NOERROR; + return ret; +} + +off_t wxFFileOutputStream::OnSysTell() const +{ + return m_file->Tell(); +} + +off_t wxFFileOutputStream::OnSysSeek(off_t pos, wxSeekMode mode) +{ + return m_file->Seek(pos, mode); +} + +void wxFFileOutputStream::Sync() +{ + wxOutputStream::Sync(); + m_file->Flush(); +} + +size_t wxFFileOutputStream::GetSize() const +{ + return m_file->Length(); +} + +// ---------------------------------------------------------------------------- +// wxFFileStream +// ---------------------------------------------------------------------------- +wxFFileStream::wxFFileStream(const wxString& fileName) + : wxFFileInputStream(fileName), wxFFileOutputStream(*wxFFileInputStream::m_file) +{ +} #endif // wxUSE_STREAMS && wxUSE_FILE diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index d99c53a4b5..fe31b2e16d 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -193,6 +193,13 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis // "select" and "deselect" //----------------------------------------------------------------------------- +static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ); + +static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox ) +{ + gtk_listitem_select_callback( widget, listbox ); +} + static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -310,7 +317,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, if (style & wxLB_MULTIPLE) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), "button_press_event", @@ -480,7 +487,7 @@ void wxListBox::AppendCommon( const wxString &item ) if (HasFlag(wxLB_MULTIPLE)) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), "button_press_event", @@ -917,7 +924,7 @@ void wxListBox::DisableEvents() if (HasFlag(wxLB_MULTIPLE)) gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); child = child->next; } @@ -933,7 +940,7 @@ void wxListBox::EnableEvents() if (HasFlag(wxLB_MULTIPLE)) gtk_signal_connect( GTK_OBJECT(child->data), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); child = child->next; } diff --git a/src/gtk/spinbutt.cpp b/src/gtk/spinbutt.cpp index 898eb4f4b9..762d4cc3be 100644 --- a/src/gtk/spinbutt.cpp +++ b/src/gtk/spinbutt.cpp @@ -189,6 +189,10 @@ void wxSpinButton::SetRange(int minVal, int maxVal) m_adjust->upper = fmax; gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "changed" ); + + // these two calls are required due to some bug in GTK + Refresh(); + SetFocus(); } void wxSpinButton::OnSize( wxSizeEvent &WXUNUSED(event) ) diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 04809dc193..c9c22b2e0f 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -35,7 +35,8 @@ extern bool g_isIdle; // data //----------------------------------------------------------------------------- -extern bool g_blockEventsOnDrag; +extern bool g_blockEventsOnDrag; +extern wxCursor g_globalCursor; //----------------------------------------------------------------------------- // "changed" @@ -248,6 +249,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, SetBackgroundColour( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ); SetForegroundColour( parent->GetForegroundColour() ); + m_cursor = wxCursor( wxCURSOR_IBEAM ); + Show( TRUE ); return TRUE; @@ -922,3 +925,30 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) { event.Enable( CanRedo() ); } + +void wxTextCtrl::OnInternalIdle() +{ + wxCursor cursor = m_cursor; + if (g_globalCursor.Ok()) cursor = g_globalCursor; + + if (cursor.Ok() && m_currentGdkCursor != cursor) + { + m_currentGdkCursor = cursor; + + GdkWindow *window = (GdkWindow*) NULL; + if (HasFlag(wxTE_MULTILINE)) + window = GTK_TEXT(m_text)->text_area; + else + window = GTK_ENTRY(m_text)->text_area; + + if (window) + gdk_window_set_cursor( window, cursor.GetCursor() ); + + if (!g_globalCursor.Ok()) + cursor = *wxSTANDARD_CURSOR; + + window = m_widget->window; + if (window) + gdk_window_set_cursor( window, cursor.GetCursor() ); + } +} diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 93a1debab4..1cc1b40434 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -132,7 +132,7 @@ extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; extern wxCursor g_globalCursor; static wxWindow *g_captureWindow = (wxWindow*) NULL; -wxWindow *g_focusWindow = (wxWindow*) NULL; + wxWindow *g_focusWindow = (wxWindow*) NULL; /* hack: we need something to pass to gtk_menu_popup, so we store the time of the last click here */ diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index d99c53a4b5..fe31b2e16d 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -193,6 +193,13 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis // "select" and "deselect" //----------------------------------------------------------------------------- +static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ); + +static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox ) +{ + gtk_listitem_select_callback( widget, listbox ); +} + static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -310,7 +317,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, if (style & wxLB_MULTIPLE) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), "button_press_event", @@ -480,7 +487,7 @@ void wxListBox::AppendCommon( const wxString &item ) if (HasFlag(wxLB_MULTIPLE)) gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), "button_press_event", @@ -917,7 +924,7 @@ void wxListBox::DisableEvents() if (HasFlag(wxLB_MULTIPLE)) gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); child = child->next; } @@ -933,7 +940,7 @@ void wxListBox::EnableEvents() if (HasFlag(wxLB_MULTIPLE)) gtk_signal_connect( GTK_OBJECT(child->data), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); + GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); child = child->next; } diff --git a/src/gtk1/spinbutt.cpp b/src/gtk1/spinbutt.cpp index 898eb4f4b9..762d4cc3be 100644 --- a/src/gtk1/spinbutt.cpp +++ b/src/gtk1/spinbutt.cpp @@ -189,6 +189,10 @@ void wxSpinButton::SetRange(int minVal, int maxVal) m_adjust->upper = fmax; gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "changed" ); + + // these two calls are required due to some bug in GTK + Refresh(); + SetFocus(); } void wxSpinButton::OnSize( wxSizeEvent &WXUNUSED(event) ) diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 04809dc193..c9c22b2e0f 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -35,7 +35,8 @@ extern bool g_isIdle; // data //----------------------------------------------------------------------------- -extern bool g_blockEventsOnDrag; +extern bool g_blockEventsOnDrag; +extern wxCursor g_globalCursor; //----------------------------------------------------------------------------- // "changed" @@ -248,6 +249,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, SetBackgroundColour( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ); SetForegroundColour( parent->GetForegroundColour() ); + m_cursor = wxCursor( wxCURSOR_IBEAM ); + Show( TRUE ); return TRUE; @@ -922,3 +925,30 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) { event.Enable( CanRedo() ); } + +void wxTextCtrl::OnInternalIdle() +{ + wxCursor cursor = m_cursor; + if (g_globalCursor.Ok()) cursor = g_globalCursor; + + if (cursor.Ok() && m_currentGdkCursor != cursor) + { + m_currentGdkCursor = cursor; + + GdkWindow *window = (GdkWindow*) NULL; + if (HasFlag(wxTE_MULTILINE)) + window = GTK_TEXT(m_text)->text_area; + else + window = GTK_ENTRY(m_text)->text_area; + + if (window) + gdk_window_set_cursor( window, cursor.GetCursor() ); + + if (!g_globalCursor.Ok()) + cursor = *wxSTANDARD_CURSOR; + + window = m_widget->window; + if (window) + gdk_window_set_cursor( window, cursor.GetCursor() ); + } +} diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 93a1debab4..1cc1b40434 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -132,7 +132,7 @@ extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; extern wxCursor g_globalCursor; static wxWindow *g_captureWindow = (wxWindow*) NULL; -wxWindow *g_focusWindow = (wxWindow*) NULL; + wxWindow *g_focusWindow = (wxWindow*) NULL; /* hack: we need something to pass to gtk_menu_popup, so we store the time of the last click here */