1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
5
* Copyright (C) 1998, 1999, 2000 Alex Roberts, Evan Lawrence, Jason Leach, Jose M Celorio
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
24
#include <libgnomevfs/gnome-vfs.h>
36
typedef void (*gedit_document_signal) (GtkObject *, gpointer, gpointer);
37
static GnomeMDIChildClass *parent_class = NULL;
39
static gchar* gedit_document_get_config_string (GnomeMDIChild *child);
40
static gint remove_child_cb (GnomeMDI *mdi, GeditDocument *doc);
42
static GtkWidget* gedit_document_create_view (GnomeMDIChild *child);
43
static void gedit_document_destroy (GtkObject *obj);
44
static void gedit_document_class_init (GeditDocumentClass *class);
45
static void gedit_document_init (GeditDocument *doc);
46
GtkType gedit_document_get_type (void);
48
/* ----- Local structs ------------ */
50
struct _GeditDocumentClass
52
GnomeMDIChildClass parent_class;
54
void (*document_changed)(GeditDocument *, gpointer);
69
* gedit_document_insert_text: Inserts text to a document and hadles all the details like
70
* adding the data to the undo stack and adding it to multiple views
71
* Provides an abstraction layer between gedit and the text widget.
72
* @doc: document to insert text
73
* @text: null terminated text to insert
74
* @position: position to insert the text at
75
* @undoable: if this insertion gets added to the undo stack or not.
80
gedit_document_insert_text (GeditDocument *doc, const guchar *text, guint position, gint undoable)
86
gint exclude_this_view;
90
g_return_if_fail (text!=NULL);
91
view = g_list_nth_data (doc->views, 0);
92
g_return_if_fail (view!=NULL);
93
text_widget = GTK_TEXT (view->text);
94
g_return_if_fail (text_widget!=NULL);
95
editable = GTK_WIDGET (text_widget);
96
g_return_if_fail (editable!=NULL);
97
length = strlen (text);
98
exclude_this_view = FALSE;
100
doc_insert_text_real_cb (editable, text, length, &position, view, exclude_this_view, undoable);
104
* gedit_document_delete_text: Deletes text from a document and hadles all the details like
105
* adding the data to the undo stack and deleting it from multiple views
106
* Provides an abstraction layer between gedit and the text widget.
107
* @doc: document to delete text from
108
* @position: position to delete the text from
109
* @length: length of the text to delete
110
* @undoable: if this deletion gets added to the undo stack or not.
115
gedit_document_delete_text (GeditDocument *doc, guint position, gint length, gint undoable)
118
GtkText *text_widget;
120
gint exclude_this_view;
125
view = g_list_nth_data (doc->views, 0);
126
g_return_if_fail (view!=NULL);
127
text_widget = GTK_TEXT (view->text);
128
g_return_if_fail (text_widget!=NULL);
129
editable = GTK_WIDGET (text_widget);
130
g_return_if_fail (editable!=NULL);
131
exclude_this_view = FALSE;
133
doc_delete_text_real_cb (editable, position, position+length, view, exclude_this_view, undoable);
137
* gedit_document_replace_text:
144
* is equivalent to delete_text + insert_text
147
gedit_document_replace_text (GeditDocument *doc, const guchar * text_to_insert,
148
gint length, guint position, gint undoable)
150
gchar *text_to_delete;
152
gedit_debug (DEBUG_DOCUMENT, "");
154
g_return_if_fail (doc != NULL);
155
g_return_if_fail (text_to_insert != NULL);
157
text_to_delete = gedit_document_get_chars (doc, position, position + length);
159
g_return_if_fail (text_to_delete != NULL);
163
gint text_to_delete_length;
164
gint text_to_insert_length;
166
text_to_delete_length = strlen (text_to_delete);
167
text_to_insert_length = strlen (text_to_insert);
169
gedit_undo_add (text_to_delete,
172
GEDIT_UNDO_ACTION_REPLACE_DELETE,
176
gedit_undo_add (text_to_insert,
178
position + text_to_insert_length,
179
GEDIT_UNDO_ACTION_REPLACE_INSERT,
184
gedit_document_delete_text (doc, position, length, FALSE);
185
gedit_document_insert_text (doc, text_to_insert, position, FALSE);
188
g_free (text_to_delete);
193
gedit_document_set_readonly (GeditDocument *doc, gint readonly)
195
GeditView * nth_view;
198
gedit_debug (DEBUG_DOCUMENT, "");
200
g_return_if_fail(doc != NULL);
202
doc->readonly = readonly;
203
doc->changed = FALSE;
205
for (n = 0; n < g_list_length (doc->views); n++)
207
nth_view = g_list_nth_data (doc->views, n);
208
gedit_view_set_readonly (nth_view, doc->readonly);
214
gedit_document_text_changed_signal_connect (GeditDocument *doc)
219
for (n = 0; n < g_list_length (doc->views); n++)
221
nth_view = g_list_nth_data (doc->views, n);
223
g_return_if_fail (nth_view != NULL);
225
nth_view->view_text_changed_signal =
226
gtk_signal_connect (GTK_OBJECT(nth_view->text), "changed",
227
GTK_SIGNAL_FUNC (gedit_view_text_changed_cb), nth_view);
235
* gedit_document_get_tab_name:
238
* determines the correct tab name for doc and assings a untitled
239
* number if necessary
241
* Return Value: a potiner to a newly allocated string
244
gedit_document_get_tab_name (GeditDocument *doc, gboolean star)
246
GeditDocument *nth_doc;
250
gedit_debug (DEBUG_DOCUMENT, "");
252
g_return_val_if_fail (doc != NULL, g_strdup ("?"));
254
if (doc->filename != NULL)
256
gchar * tab_name = NULL;
257
gchar * unescaped_str = gnome_vfs_unescape_string_for_display (doc->filename);
259
if(unescaped_str == NULL)
261
g_warning ("unescaped_str == NULL in gedit_document_get_tab_name ()");
262
unescaped_str = g_strdup (doc->filename);
265
if (!doc->changed || !star)
267
tab_name = g_strdup_printf ("%s%s", doc->readonly?_("RO - "):"", g_basename(unescaped_str));
271
tab_name = g_strdup_printf ("%s%s*", doc->readonly?_("RO - "):"", g_basename(unescaped_str));
274
g_free (unescaped_str);
280
if (doc->untitled_number == 0)
282
for (i = 0; i < g_list_length (mdi->children); i++)
284
nth_doc = (GeditDocument *)g_list_nth_data (mdi->children, i);
286
if (nth_doc->untitled_number > max_number)
288
max_number = nth_doc->untitled_number;
291
doc->untitled_number = max_number + 1;
293
if (!doc->changed || !star)
295
return _(g_strdup_printf ("%s %d", _("Untitled"), doc->untitled_number));
299
return _(g_strdup_printf ("%s %d*", _("Untitled"), doc->untitled_number));
305
gedit_document_get_chars (GeditDocument *doc, guint start_pos, guint end_pos)
311
gedit_debug (DEBUG_DOCUMENT, "");
313
g_return_val_if_fail (doc!=NULL, NULL);
314
g_return_val_if_fail (end_pos > start_pos, NULL);
315
view = g_list_nth_data (doc->views, 0);
316
g_return_val_if_fail (view!=NULL, NULL);
318
text = GTK_TEXT (view->text);
320
buffer = gtk_editable_get_chars ( GTK_EDITABLE ( text ),
327
* gedit_document_get_buffer:
330
* returns a newly allocated buffer containg the text inside doc
335
gedit_document_get_buffer (GeditDocument *doc)
342
gedit_debug (DEBUG_DOCUMENT, "");
344
g_return_val_if_fail (doc!=NULL, NULL);
345
view = g_list_nth_data (doc->views, 0);
346
g_return_val_if_fail (view!=NULL, NULL);
348
text = GTK_TEXT (view->text);
350
length = gtk_text_get_length (text);
351
buffer = gtk_editable_get_chars ( GTK_EDITABLE ( text ),
358
gedit_document_get_buffer_length (GeditDocument *doc)
363
gedit_debug (DEBUG_DOCUMENT, "");
365
g_return_val_if_fail (doc!=NULL, 0);
366
view = g_list_nth_data (doc->views, 0);
367
g_return_val_if_fail (view!=NULL, 0);
369
length = gtk_text_get_length (GTK_TEXT (view->text));
375
gedit_document_new (void)
379
gedit_debug (DEBUG_DOCUMENT, "");
381
doc = gtk_type_new (gedit_document_get_type ());
383
g_return_val_if_fail (doc != NULL, NULL);
385
gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
386
gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
388
gedit_window_set_widgets_sensitivity (TRUE);
389
gedit_window_set_toolbar_labels (GEDIT_VIEW(doc->views->data)->app);
395
gedit_document_new_with_title (const gchar *title)
399
gedit_debug (DEBUG_DOCUMENT, "");
401
g_return_val_if_fail (title != NULL, NULL);
402
doc = gtk_type_new (gedit_document_get_type ());
403
g_return_val_if_fail (doc != NULL, NULL);
405
doc->filename = g_strdup (title);
407
gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
408
gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
410
gedit_window_set_widgets_sensitivity (TRUE);
416
gedit_document_new_with_file (const gchar *file_name)
420
gedit_debug (DEBUG_DOCUMENT, "");
422
doc = gedit_document_current();
425
if (doc->changed || doc->filename)
428
if (gedit_file_open (doc, file_name) == 1)
431
gedit_window_set_widgets_sensitivity (TRUE);
438
gedit_document_current (void)
440
GeditDocument *current_document = NULL;
442
if (mdi->active_child)
443
current_document = GEDIT_DOCUMENT (mdi->active_child);
445
return current_document;
449
gedit_document_get_config_string (GnomeMDIChild *child)
451
gedit_debug (DEBUG_DOCUMENT, "");
452
return g_strdup_printf ("%d", GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (child))));
456
remove_child_cb (GnomeMDI *mdi, GeditDocument *doc)
458
gedit_debug (DEBUG_DOCUMENT, "start");
460
if (!gedit_view_active())
462
gedit_debug (DEBUG_DOCUMENT, "returning since views are NULL");
468
GtkWidget *msgbox, *w;
469
gchar *fname = NULL, *msg = NULL;
472
w = GTK_WIDGET (g_list_nth_data(doc->views, 0));
475
gnome_mdi_set_active_view (mdi, w);
477
fname = gedit_document_get_tab_name (doc, FALSE);
479
msg = g_strdup_printf (_("``%s'' has been modified. Do you wish to save it?"),
482
msgbox = gnome_message_box_new (msg,
483
GNOME_MESSAGE_BOX_QUESTION,
484
GNOME_STOCK_BUTTON_YES,
485
GNOME_STOCK_BUTTON_NO,
486
GNOME_STOCK_BUTTON_CANCEL,
488
gnome_dialog_set_default (GNOME_DIALOG (msgbox), 2);
489
ret = gnome_dialog_run_and_close (GNOME_DIALOG (msgbox));
497
return file_save_document (doc);
501
gedit_close_all_flag_clear();
506
gedit_debug (DEBUG_DOCUMENT, "end");
512
gedit_document_create_view (GnomeMDIChild *child)
516
gedit_debug (DEBUG_DOCUMENT, "");
518
g_return_val_if_fail (child != NULL, NULL);
519
g_return_val_if_fail (GNOME_IS_MDI_CHILD (child), NULL);
521
new_view = GEDIT_VIEW (gedit_view_new (GEDIT_DOCUMENT (child)));
523
gedit_view_set_font (new_view, settings->font);
524
gedit_view_set_readonly (new_view, GEDIT_DOCUMENT (child)->readonly);
526
return GTK_WIDGET (new_view);
530
gedit_document_destroy (GtkObject *obj)
532
GeditDocument *doc = GEDIT_DOCUMENT (obj);
534
gedit_debug (DEBUG_DOCUMENT, "");
536
g_list_free (doc->views);
537
g_free (doc->filename);
538
gedit_undo_free_list (&doc->undo);
539
gedit_undo_free_list (&doc->redo);
541
if (GTK_OBJECT_CLASS (parent_class)->destroy)
542
(* GTK_OBJECT_CLASS (parent_class)->destroy)(GTK_OBJECT (doc));
547
gedit_document_class_init (GeditDocumentClass *class)
549
GtkObjectClass *object_class;
550
GnomeMDIChildClass *child_class;
552
object_class = (GtkObjectClass*)class;
553
child_class = GNOME_MDI_CHILD_CLASS (class);
555
gedit_debug (DEBUG_DOCUMENT, "");
557
object_class->destroy = gedit_document_destroy;
559
child_class->create_view = (GnomeMDIChildViewCreator)(gedit_document_create_view);
560
child_class->get_config_string = (GnomeMDIChildConfigFunc)(gedit_document_get_config_string);
562
parent_class = gtk_type_class (gnome_mdi_child_get_type ());
567
gedit_document_init (GeditDocument *doc)
569
gedit_debug (DEBUG_DOCUMENT, "");
571
doc->filename = NULL;
572
doc->changed = FALSE;
577
gnome_mdi_child_set_menu_template (GNOME_MDI_CHILD (doc), doc_menu);
581
gedit_document_get_type (void)
583
static GtkType doc_type = 0;
587
static const GtkTypeInfo doc_info =
590
sizeof (GeditDocument),
591
sizeof (GeditDocumentClass),
592
(GtkClassInitFunc) gedit_document_class_init,
593
(GtkObjectInitFunc) gedit_document_init,
594
(GtkArgSetFunc) NULL,
595
(GtkArgGetFunc) NULL,
598
doc_type = gtk_type_unique (gnome_mdi_child_get_type (),
607
gedit_mdi_init (void)
609
gedit_debug (DEBUG_DOCUMENT, "start");
612
mdi = GNOME_MDI (gnome_mdi_new ("gedit", "gedit "VESION));
614
mdi = GNOME_MDI (gnome_mdi_new ("gedit", "gedit "));
616
mdi->tab_pos = settings->tab_pos;
618
gnome_mdi_set_menubar_template (mdi, gedit_menu);
619
gnome_mdi_set_toolbar_template (mdi, toolbar_data);
621
gnome_mdi_set_child_menu_path (mdi, GNOME_MENU_FILE_STRING);
622
gnome_mdi_set_child_list_path (mdi, D_("_Documents/"));
624
/* connect signals */
625
gtk_signal_connect (GTK_OBJECT (mdi), "remove_child",
626
GTK_SIGNAL_FUNC (remove_child_cb), NULL);
627
gedit_mdi_destroy_signal =
628
gtk_signal_connect (GTK_OBJECT (mdi), "destroy",
629
GTK_SIGNAL_FUNC (file_quit_cb), NULL);
630
gtk_signal_connect (GTK_OBJECT (mdi), "view_changed",
631
GTK_SIGNAL_FUNC (gedit_view_changed_cb), NULL);
632
gtk_signal_connect (GTK_OBJECT (mdi), "app_created",
633
GTK_SIGNAL_FUNC (gedit_window_new), NULL);
635
gnome_mdi_set_mode (mdi, settings->mdi_mode);
636
gnome_mdi_open_toplevel (mdi);
638
/* Loads the structure gedit_toolbar with the widgets */
639
gedit_window_set_toolbar_labels (mdi->active_window);
640
gedit_window_set_view_menu_sensitivity (mdi->active_window);
642
gedit_debug (DEBUG_DOCUMENT, "end");
647
gedit_document_load (GList *file_list)
650
gboolean can_be_created;
652
gedit_debug (DEBUG_DOCUMENT, "");
654
gedit_file_stdin (NULL);
656
/* create a file for each document in the parameter list */
657
for (;file_list; file_list = file_list->next)
661
GnomeVFSURI *uri = gnome_vfs_uri_new (file_list->data);
665
g_print("Wrong URI: %s\n", (gchar*)file_list->data);
669
scheme = gnome_vfs_uri_get_scheme (uri);
671
if ((scheme != NULL) && (strcmp (scheme, "file") == 0))
676
can_be_created = TRUE;
678
tmp_str = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD);
679
tmp_str2 = gnome_vfs_unescape_string_for_display (tmp_str);
681
file_name = gedit_file_convert_to_full_pathname (tmp_str);
686
gnome_vfs_uri_unref (uri);
687
uri = gnome_vfs_uri_new (file_name);
691
/* FIXME: hide password */
692
can_be_created = FALSE;
693
file_name = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
697
if (gnome_vfs_uri_exists (uri))
699
gedit_document_new_with_file ((gchar *) file_name);
705
gedit_file_create_popup ((guchar *) file_name);
709
/* If you try to open a non existant remote file */
710
gchar *errstr = g_strdup_printf (_("An error was encountered while opening the file: \n\n%s\n\n"
711
"Please make sure the file exists."), file_name);
713
gnome_app_warning (gedit_window_active_app(), errstr);
719
gnome_vfs_uri_unref(uri);
722
if (gedit_document_current() == NULL)
723
gedit_document_new ();
725
g_return_val_if_fail(gedit_window_active_app() != NULL, FALSE);
726
g_return_val_if_fail(gedit_document_current() != NULL, FALSE);
728
gedit_window_set_widgets_sensitivity_ro (gedit_window_active_app(), gedit_document_current()->readonly);
735
* @docname: Document name in a string, the new title
737
* Set the title to "$docname - $gedit_ver" and if the document has
738
* changed, lets show that it has.
741
gedit_document_set_title (GeditDocument *doc)
746
gedit_debug (DEBUG_DOCUMENT, "");
752
if (doc->filename == NULL) {
753
docname = g_strdup_printf (_("Untitled %i"), doc->untitled_number);
756
docname = g_strdup (g_basename (doc->filename));
758
docname = gnome_vfs_unescape_string_for_display (doc->filename);
763
title = g_strdup_printf ("gedit: %s %s", docname, _("(modified)"));
764
} else if (doc->readonly) {
765
title = g_strdup_printf ("gedit: %s %s", docname, _("(readonly)"));
767
title = g_strdup_printf ("gedit: %s", docname);
771
title = g_strdup_printf ("gedit - [%s] %s", docname, _("(modified)"));
772
} else if (doc->readonly) {
773
title = g_strdup_printf ("gedit - [%s] %s", docname, _("(readonly)"));
775
title = g_strdup_printf ("gedit - [%s]", docname);
779
gtk_window_set_title (gedit_window_active(), title);
785
gedit_debug (DEBUG_DOCUMENT, "end");
790
* gedit_document_swap_hc_cb:
792
* if .c file is open, then open the related .h file and v.v.
794
* TODO: if a .h file is open, do we swap to a .c or a .cpp? we
795
* should put a check in there. if both exist, then probably open
799
gedit_document_swap_hc_cb (GtkWidget *widget, gpointer data)
802
gchar *new_file_name;
803
GeditDocument *doc, *nth_doc;
806
gedit_debug (DEBUG_DOCUMENT, "");
808
doc = gedit_document_current();
809
if (!doc || !doc->filename)
812
new_file_name = NULL;
813
len = strlen (doc->filename);
817
if (doc->filename[len] == '.')
824
gchar *errstr = g_strdup (_("This file does not end with a valid extension\n"));
825
gnome_app_error (gedit_window_active_app(), errstr);
831
if (doc->filename[len] == 'h')
833
new_file_name = g_strdup (doc->filename);
834
new_file_name[len] = 'c';
836
else if (doc->filename[len] == 'H')
838
new_file_name = g_strdup (doc->filename);
839
new_file_name[len] = 'C';
841
else if (doc->filename[len] == 'c')
843
new_file_name = g_strdup (doc->filename);
844
new_file_name[len] = 'h';
846
if (len < strlen(doc->filename) && strcmp(doc->filename + len, "cpp") == 0)
847
new_file_name[len+1] = '\0';
849
else if (doc->filename[len] == 'C')
851
new_file_name = g_strdup (doc->filename);
853
if (len < strlen(doc->filename) && strcmp(doc->filename + len, "CPP") == 0)
855
new_file_name[len] = 'H';
856
new_file_name[len+1] = '\0';
859
new_file_name[len] = 'H';
864
gchar *errstr = g_strdup (_("This file does not end with a valid extension\n"));
865
gnome_app_error (gedit_window_active_app(), errstr);
870
if (!g_file_exists (new_file_name))
872
gchar *errstr = g_strdup_printf (_("The file %s was not found."), new_file_name);
873
gnome_app_error (gedit_window_active_app(), errstr);
878
/* Scan the documents to see if the file we are looking for is allready open */
879
for (n = 0; n < g_list_length (mdi->children); n++)
881
nth_doc = (GeditDocument *)g_list_nth_data (mdi->children, n);
883
if (strcmp(nth_doc->filename, new_file_name) == 0)
886
view = g_list_nth_data (nth_doc->views, 0);
887
g_return_if_fail (view != NULL);
888
gnome_mdi_set_active_view (mdi, GTK_WIDGET (view));
894
gedit_document_new_with_file (new_file_name);
898
gedit_document_set_undo (GeditDocument *doc, gint undo_state, gint redo_state)
903
gedit_debug (DEBUG_DOCUMENT, "");
905
g_return_if_fail (GEDIT_IS_DOCUMENT(doc));
907
for ( n=0; n < g_list_length (doc->views); n++)
909
nth_view = GEDIT_VIEW (g_list_nth_data (doc->views, n));
910
gedit_view_set_undo (nth_view, undo_state, redo_state);