From e7e279e24bd9efdc3d81710f11e39d96e499d222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Sun, 18 Dec 2005 22:08:42 +0000 Subject: [PATCH] made the symbol list document-oriented, so it has not to be generated on every notebook switch page event git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@65 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- src/document.c | 25 +++++++---- src/geany.h | 7 ++- src/treeviews.c | 47 ++++++++++---------- src/treeviews.h | 9 ++-- src/utils.c | 111 +++++++++++++++++++++++++++++------------------- src/utils.h | 2 +- 6 files changed, 118 insertions(+), 83 deletions(-) diff --git a/src/document.c b/src/document.c index 722379754..bac03c92a 100644 --- a/src/document.c +++ b/src/document.c @@ -198,9 +198,14 @@ gint document_create_new_sci(const gchar *filename) gtk_notebook_insert_page_menu(GTK_NOTEBOOK(app->notebook), GTK_WIDGET(sci), hbox, this.tabmenu_label, 0); gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook), 0); iter = treeviews_openfiles_add(new_idx, title); - g_free(title); + this.tag_store = NULL; + this.tag_tree = NULL; + //this.tag_tree = gtk_tree_view_new(); + //gtk_widget_show(this.tag_tree); + //treeviews_prepare_taglist(this.tag_tree, this.tag_store, new_idx); + // "the" SCI signal g_signal_connect((GtkWidget*) sci, "sci-notify", G_CALLBACK(on_editor_notification), GINT_TO_POINTER(new_idx)); // signal for insert-key(works without too, but to update the right status bar) @@ -216,7 +221,6 @@ gint document_create_new_sci(const gchar *filename) this.scid = sciid; this.file_name = (filename) ? g_strdup(filename) : NULL; this.sci = sci; - //this.tab_button = but; this.encoding = NULL; this.tm_file = NULL; this.iter = iter; @@ -228,7 +232,7 @@ gint document_create_new_sci(const gchar *filename) this.do_overwrite = FALSE; this.readonly = FALSE; doc_list[new_idx] = this; - //has_tabs = TRUE; + return new_idx; } @@ -247,6 +251,11 @@ gboolean document_remove(gint page_num) } gtk_notebook_remove_page(GTK_NOTEBOOK(app->notebook), page_num); treeviews_openfiles_remove(doc_list[idx].iter); + if (GTK_IS_WIDGET(doc_list[idx].tag_tree)) + { + g_object_unref(doc_list[idx].tag_tree); + gtk_widget_destroy(doc_list[idx].tag_tree); + } msgwin_status_add(_("File %s closed."), (doc_list[idx].file_name) ? doc_list[idx].file_name : GEANY_STRING_UNTITLED); g_free(doc_list[idx].encoding); @@ -258,7 +267,7 @@ gboolean document_remove(gint page_num) doc_list[idx].tm_file = NULL; if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) == 0) { - utils_update_visible_tag_lists(-1); + utils_update_tag_list(-1, FALSE); //on_notebook1_switch_page(GTK_NOTEBOOK(app->notebook), NULL, 0, NULL); utils_set_window_title(-1); utils_save_buttons_toggle(FALSE); @@ -285,7 +294,7 @@ void document_new_file(filetype *ft) document_set_filetype(idx, (ft) ? ft : filetypes[GEANY_FILETYPES_ALL]); utils_set_window_title(idx); utils_build_show_hide(idx); - //utils_update_visible_tag_lists(idx); + //utils_update_tag_list(idx, FALSE); doc_list[idx].mtime = time(NULL); doc_list[idx].changed = FALSE; document_set_text_changed(idx); @@ -442,7 +451,7 @@ void document_open_file(gint idx, const gchar *filename, gint pos, gboolean read filename, gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)), (readonly) ? _(", read-only") : ""); } - //document_update_tag_list(idx); + //utils_update_tag_list(idx, FALSE); document_set_text_changed(idx); #ifdef GEANY_WIN32 @@ -748,13 +757,13 @@ void document_update_tag_list(gint idx) // parse the file after setting the filetype TM_SOURCE_FILE(doc_list[idx].tm_file)->lang = getNamedLanguage((doc_list[idx].file_type)->name); tm_source_file_update(doc_list[idx].tm_file, TRUE, FALSE, TRUE); - utils_update_visible_tag_lists(idx); + utils_update_tag_list(idx, TRUE); } else { if (tm_source_file_update(doc_list[idx].tm_file, TRUE, FALSE, TRUE)) { - utils_update_visible_tag_lists(idx); + utils_update_tag_list(idx, TRUE); } else { diff --git a/src/geany.h b/src/geany.h index 8c2a411d9..6b1894e3a 100644 --- a/src/geany.h +++ b/src/geany.h @@ -81,6 +81,8 @@ typedef struct document ScintillaObject *sci; GtkWidget *tab_label; GtkWidget *tabmenu_label; + GtkWidget *tag_tree; + GtkTreeStore *tag_store; GtkTreeIter iter; gint scid; gboolean readonly; @@ -103,6 +105,8 @@ typedef struct MyApp gint toolbar_icon_style; gint geometry[4]; gboolean debug_mode; + // represents the state at startup while opening session files + gboolean opening_session_files; gboolean have_vte; gboolean ignore_global_tags; gboolean toolbar_visible; @@ -184,6 +188,8 @@ typedef struct MyApp GtkWidget *find_dialog; GtkWidget *replace_dialog; GtkWidget *build_menu_item_link; + GtkWidget *default_tag_tree; + //GtkTreeStore *default_tag_store; const TMWorkspace *tm_workspace; GQueue *recent_queue; } MyApp; @@ -227,7 +233,6 @@ enum RIGHT }; - // prototype from tagmanager/parse.h, used in document.c, ugly but it works extern langType getNamedLanguage(const char *const name); diff --git a/src/treeviews.c b/src/treeviews.c index c5b93936c..4bbbdc630 100644 --- a/src/treeviews.c +++ b/src/treeviews.c @@ -28,47 +28,44 @@ #include "treeviews.h" -/* does some preparing things to the tag list widget */ -void treeviews_prepare_taglist(void) +/* the following two functions are document-related, but I think they fit better here than in document.c*/ +void treeviews_prepare_taglist(GtkWidget *tree, GtkTreeStore *store) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *select; - tv.tree_taglist = lookup_widget(app->window, "treeview2"); - - tv.store_taglist = gtk_tree_store_new(1, G_TYPE_STRING); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Symbols"), renderer, "text", 0, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(tv.tree_taglist), column); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv.tree_taglist), FALSE); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); - gtk_widget_modify_font(tv.tree_taglist, pango_font_description_from_string(app->tagbar_font)); - gtk_tree_view_set_model(GTK_TREE_VIEW(tv.tree_taglist), GTK_TREE_MODEL(tv.store_taglist)); + gtk_widget_modify_font(tree, pango_font_description_from_string(app->tagbar_font)); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store)); // selection handling - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv.tree_taglist)); + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_taglist_tree_selection_changed), NULL); } -void treeviews_init_tag_list(void) +void treeviews_init_tag_list(gint idx) { - gtk_tree_store_append(tv.store_taglist, &(tv.tag_function), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_function), 0, _("Function"), -1); - gtk_tree_store_append(tv.store_taglist, &(tv.tag_macro), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_macro), 0, _("Macro"), -1); - gtk_tree_store_append(tv.store_taglist, &(tv.tag_member), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_member), 0, _("Members"), -1); - gtk_tree_store_append(tv.store_taglist, &(tv.tag_variable), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_variable), 0, _("Variables"), -1); - gtk_tree_store_append(tv.store_taglist, &(tv.tag_namespace), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_namespace), 0, _("Namespace"), -1); - gtk_tree_store_append(tv.store_taglist, &(tv.tag_struct), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_struct), 0, _("Struct / Typedef"), -1); - gtk_tree_store_append(tv.store_taglist, &(tv.tag_other), NULL); - gtk_tree_store_set(tv.store_taglist, &(tv.tag_other), 0, _("Other"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_function), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_function), 0, _("Function"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_macro), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_macro), 0, _("Macro"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_member), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_member), 0, _("Members"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_variable), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_variable), 0, _("Variables"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_namespace), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_namespace), 0, _("Namespace"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_struct), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_struct), 0, _("Struct / Typedef"), -1); + gtk_tree_store_append(doc_list[idx].tag_store, &(tv.tag_other), NULL); + gtk_tree_store_set(doc_list[idx].tag_store, &(tv.tag_other), 0, _("Other"), -1); } diff --git a/src/treeviews.h b/src/treeviews.h index f4b70e8d9..7d88f4f88 100644 --- a/src/treeviews.h +++ b/src/treeviews.h @@ -28,10 +28,9 @@ typedef struct treeviews { - //GtkListStore *store_taglist; - GtkTreeStore *store_taglist; + //GtkTreeStore *store_taglist; GtkListStore *store_openfiles; - GtkWidget *tree_taglist; + //GtkWidget *tree_taglist; GtkWidget *tree_openfiles; GtkWidget *popup_openfiles; GtkTreeIter tag_function; @@ -47,11 +46,11 @@ treeviews tv; -void treeviews_prepare_taglist(void); +void treeviews_prepare_taglist(GtkWidget *tree, GtkTreeStore *store); gint treeviews_sort_tag_list(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data); -void treeviews_init_tag_list(void); +void treeviews_init_tag_list(gint idx); void treeviews_prepare_openfiles(void); diff --git a/src/utils.c b/src/utils.c index 56931ad25..0dc2f08e9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -655,45 +655,59 @@ void utils_set_fullscreen(void) } -void utils_update_visible_tag_lists(gint idx) +void utils_update_tag_list(gint idx, gboolean update) { GList *tmp; const GList *tags; + if (gtk_bin_get_child(GTK_BIN(app->tagbar))) + gtk_container_remove(GTK_CONTAINER(app->tagbar), gtk_bin_get_child(GTK_BIN(app->tagbar))); + + if (app->default_tag_tree == NULL) + { + GtkTreeIter iter; + GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING); + app->default_tag_tree = gtk_tree_view_new(); + treeviews_prepare_taglist(app->default_tag_tree, store); + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, _("No tags found"), -1); + gtk_widget_show(app->default_tag_tree); + g_object_ref((gpointer)app->default_tag_tree); // to hold it after removing + } + // make all inactive, because there is no more tab left, or something strange occured - if (idx == -1 && app->treeview_symbol_visible) - { - GtkTreeIter iter; - gtk_tree_store_clear(tv.store_taglist); - gtk_tree_store_append(tv.store_taglist, &iter, NULL); - gtk_tree_store_set(tv.store_taglist, &iter, 0, _("No tags found"), -1); - gtk_widget_set_sensitive(app->tagbar, FALSE); - return; - } - - if (! doc_list[idx].file_type->has_tags) + if (idx == -1 || ! app->treeview_symbol_visible || ! doc_list[idx].file_type->has_tags) { gtk_widget_set_sensitive(app->tagbar, FALSE); + gtk_container_add(GTK_CONTAINER(app->tagbar), app->default_tag_tree); return; } + //geany_debug("before %d", update); - // updating the tag list in the left tag window if visisble - if (app->treeview_symbol_visible) - { - GtkTreeIter iter; + if (update) + { // updating the tag list in the left tag window + if (doc_list[idx].tag_tree == NULL) + { + doc_list[idx].tag_store = gtk_tree_store_new(1, G_TYPE_STRING); + doc_list[idx].tag_tree = gtk_tree_view_new(); + treeviews_prepare_taglist(doc_list[idx].tag_tree, doc_list[idx].tag_store); + gtk_widget_show(doc_list[idx].tag_tree); + g_object_ref((gpointer)doc_list[idx].tag_tree); // to hold it after removing + } tags = utils_get_tag_list(idx, tm_tag_max_t); - gtk_tree_store_clear(tv.store_taglist); - - if (doc_list[idx].tm_file && tags) + if (doc_list[idx].tm_file != NULL && tags != NULL) { + GtkTreeIter iter; GtkTreeModel *model; - gtk_widget_set_sensitive(app->tagbar, TRUE); + + gtk_tree_store_clear(doc_list[idx].tag_store); // unref the store to speed up the filling(from TreeView Tutorial) - model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv.tree_taglist)); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(doc_list[idx].tag_tree)); g_object_ref(model); // Make sure the model stays with us after the tree view unrefs it - gtk_tree_view_set_model(GTK_TREE_VIEW(tv.tree_taglist), NULL); // Detach model from view - treeviews_init_tag_list(); + gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), NULL); // Detach model from view + + treeviews_init_tag_list(idx); for (tmp = (GList*)tags; tmp; tmp = g_list_next(tmp)) { switch (((GeanySymbol*)tmp->data)->type) @@ -701,59 +715,70 @@ void utils_update_visible_tag_lists(gint idx) case tm_tag_prototype_t: case tm_tag_function_t: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_function)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_function)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); break; } case tm_tag_macro_t: case tm_tag_macro_with_arg_t: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_macro)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_macro)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); break; } case tm_tag_member_t: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_member)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_member)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); break; } case tm_tag_typedef_t: case tm_tag_struct_t: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_struct)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_struct)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); break; } case tm_tag_variable_t: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_variable)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_variable)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); break; } case tm_tag_namespace_t: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_namespace)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_namespace)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); break; } default: { - gtk_tree_store_append(tv.store_taglist, &iter, &(tv.tag_other)); - gtk_tree_store_set(tv.store_taglist, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_other)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); } } } - gtk_tree_view_set_model(GTK_TREE_VIEW(tv.tree_taglist), model); // Re-attach model to view + gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), model); // Re-attach model to view g_object_unref(model); + gtk_tree_view_expand_all(GTK_TREE_VIEW(doc_list[idx].tag_tree)); + + gtk_widget_set_sensitive(app->tagbar, TRUE); + gtk_container_add(GTK_CONTAINER(app->tagbar), doc_list[idx].tag_tree); + /// TODO why I have to do this here? + g_object_ref((gpointer)doc_list[idx].tag_tree); } else - { - gtk_tree_store_append(tv.store_taglist, &iter, NULL); - gtk_tree_store_set(tv.store_taglist, &iter, 0, _("No tags found"), -1); + { // tags == NULL gtk_widget_set_sensitive(app->tagbar, FALSE); + gtk_container_add(GTK_CONTAINER(app->tagbar), app->default_tag_tree); } } + else + { // update == FALSE + gtk_widget_set_sensitive(app->tagbar, TRUE); + gtk_container_add(GTK_CONTAINER(app->tagbar), doc_list[idx].tag_tree); + } + } @@ -971,7 +996,7 @@ gboolean utils_check_disk_status(gint idx, const gboolean force) { if (force) { - document_open_file(idx, NULL, 0, FALSE); + document_open_file(idx, NULL, 0, doc_list[idx].readonly); } else { @@ -982,7 +1007,7 @@ gboolean utils_check_disk_status(gint idx, const gboolean force) if (dialogs_show_reload_warning(buff)) { - document_open_file(idx, NULL, 0, FALSE); + document_open_file(idx, NULL, 0, doc_list[idx].readonly); doc_list[idx].last_check = t; } else diff --git a/src/utils.h b/src/utils.h index 20fe4f784..471979b24 100644 --- a/src/utils.h +++ b/src/utils.h @@ -85,7 +85,7 @@ void utils_set_fullscreen(void); GtkFileFilter *utils_create_file_filter(filetype *ft); -void utils_update_visible_tag_lists(gint idx); +void utils_update_tag_list(gint idx, gboolean update); gchar *utils_convert_to_utf8(const gchar *buffer, gsize size, gchar **used_encoding);