IX. Créer un nouveau document▲
IX-A. Aperçu▲
IX-B. Nouveau fichier▲
Maintenant que l'utilisateur peut ouvrir et fermer un fichier, il est intéressant de lui donner la possibilité d'en créer un nouveau. Je ne reviens pas sur la création du bouton (ça devrait déjà être fait :D), passons directement à la fonction cb_new :
void
cb_new (
GtkWidget *
p_widget, gpointer user_data)
{
/* Pour l'instant il faut allouer la memoire, par la suite on modifiera
simplement le pointeur */
docs.actif =
g_malloc (
sizeof
(*
docs.actif));
docs.actif->
chemin =
NULL
;
/* Pour l'instant, on se contente de stocker le seul GtkTextView qui existe,
par la suite, il faudra en creer un nouveau ! */
docs.actif->
p_text_view =
GTK_TEXT_VIEW (
user_data);
/* Le document vient d'etre cree, il n'est donc pas modifie */
docs.actif->
sauve =
TRUE;
gtk_widget_set_sensitive (
GTK_WIDGET (
docs.actif->
p_text_view), TRUE);
}
Je ne sais pas vous, mais pour ma part j'ai fait un copier/coller de la fonction open_file ! Eh oui, ouvrir un document peut se résumer à créer un document vide puis remplir le GtkTextView avec le fichier souhaité ! On peut donc simplifier notre fonction open_file ainsi :
static
void
open_file (
const
gchar *
file_name, GtkTextView *
p_text_view)
{
g_return_if_fail (
file_name &&
p_text_view);
{
gchar *
contents =
NULL
;
if
(
g_file_get_contents (
file_name, &
contents, NULL
, NULL
))
{
/* Copie de contents dans le GtkTextView */
GtkTextIter iter;
GtkTextBuffer *
p_text_buffer =
NULL
;
cb_new (
NULL
, p_text_view);
gtk_widget_set_sensitive (
GTK_WIDGET (
docs.actif->
p_text_view), TRUE);
p_text_buffer =
gtk_text_view_get_buffer (
p_text_view);
gtk_text_buffer_get_iter_at_line (
p_text_buffer, &
iter, 0
);
gtk_text_buffer_insert (
p_text_buffer, &
iter, contents, -
1
);
/* Nous sommes obliges de remettre sauve a TRUE, car l'insertion du contenu
du fichier dans le GtkTextView a appele cb_modfie */
docs.actif->
sauve =
TRUE;
}
else
{
print_warning (
"
Impossible d'ouvrir le fichier %s
\n
"
, file_name);
}
}
}
C'est beau la factorisation du code ! Par contre nous sommes obligés de remettre sauve à TRUE, car nous avons modifié le GtkTextBuffer.