+ FILE *fp = (FILE*) NULL;
+ struct stat statb;
+
+ if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG ||
+ !(fp = fopen (FNSTRINGCAST file.fn_str(), "r")))
+ {
+ return FALSE;
+ }
+ else
+ {
+ gint len = statb.st_size;
+ char *text;
+ if (!(text = (char*)malloc ((unsigned) (len + 1))))
+ {
+ fclose (fp);
+ return FALSE;
+ }
+ if (fread (text, sizeof (char), len, fp) != (size_t) len)
+ {
+ }
+ fclose (fp);
+
+ text[len] = 0;
+
+ gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
+ GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
+
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ gint pos = 0;
+ gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos );
+ }
+ else
+ {
+ gtk_entry_set_text( GTK_ENTRY(m_text), text );
+ }
+
+ gtk_signal_connect( GTK_OBJECT(m_text), "changed",
+ GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
+
+ free (text);
+ m_modified = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool wxTextCtrl::SaveFile( const wxString &file )
+{
+ wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+
+ if (file == _T("")) return FALSE;
+
+ FILE *fp;
+
+ if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w")))
+ {
+ return FALSE;
+ }
+ else
+ {
+ char *text = (char*) NULL;
+ gint len = 0;
+
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ len = gtk_text_get_length( GTK_TEXT(m_text) );
+ text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
+ }
+ else
+ {
+ text = gtk_entry_get_text( GTK_ENTRY(m_text) );
+ }
+
+ if (fwrite (text, sizeof (char), len, fp) != (size_t) len)
+ {
+ // Did not write whole file
+ }
+
+ // Make sure newline terminates the file
+ if (text[len - 1] != '\n')
+ fputc ('\n', fp);
+
+ fclose (fp);
+
+ if (m_windowStyle & wxTE_MULTILINE) g_free( text );
+
+ m_modified = FALSE;
+ return TRUE;
+ }
+
+ return TRUE;