% -----------------------------------------------------------------------------
\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}
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
bool IsOwnGtkWindow( GdkWindow *window );
void ApplyWidgetStyle();
void CalculateScrollbar();
+ void OnInternalIdle();
void SetModified() { m_modified = TRUE; }
bool IsOwnGtkWindow( GdkWindow *window );
void ApplyWidgetStyle();
void CalculateScrollbar();
+ void OnInternalIdle();
void SetModified() { m_modified = TRUE; }
#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);
wxTextInputStream& operator>>(wxUint32& i);
wxTextInputStream& operator>>(double& i);
wxTextInputStream& operator>>(float& f);
-
+
+ wxTextInputStream& operator>>( __wxTextInputManip func) { return func(*this); }
+
protected:
wxInputStream *m_input;
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
#include "wx/string.h"
#include "wx/stream.h"
#include "wx/file.h"
+#include "wx/ffile.h"
+
+// ----------------------------------------------------------------------------
+// wxFileStream using wxFile
+// ----------------------------------------------------------------------------
class wxFileInputStream: public wxInputStream {
public:
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
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 )
{
DATAFILES = text.cpp
-PROGRAM=controls
+PROGRAM=text
OBJECTS=$(PROGRAM).o
{
}
+// ----------------------------------------------------------------------------
+// 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
// "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();
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",
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",
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;
}
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;
}
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) )
// data
//-----------------------------------------------------------------------------
-extern bool g_blockEventsOnDrag;
+extern bool g_blockEventsOnDrag;
+extern wxCursor g_globalCursor;
//-----------------------------------------------------------------------------
// "changed"
SetBackgroundColour( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) );
SetForegroundColour( parent->GetForegroundColour() );
+ m_cursor = wxCursor( wxCURSOR_IBEAM );
+
Show( TRUE );
return TRUE;
{
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() );
+ }
+}
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 */
// "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();
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",
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",
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;
}
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;
}
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) )
// data
//-----------------------------------------------------------------------------
-extern bool g_blockEventsOnDrag;
+extern bool g_blockEventsOnDrag;
+extern wxCursor g_globalCursor;
//-----------------------------------------------------------------------------
// "changed"
SetBackgroundColour( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) );
SetForegroundColour( parent->GetForegroundColour() );
+ m_cursor = wxCursor( wxCURSOR_IBEAM );
+
Show( TRUE );
return TRUE;
{
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() );
+ }
+}
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 */