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
This commit is contained in:
Enrico Tröger 2005-12-18 22:08:42 +00:00
parent 90ca4650d0
commit e7e279e24b
6 changed files with 118 additions and 83 deletions

View File

@ -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
{

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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)
if (update)
{ // updating the tag list in the left tag window
if (doc_list[idx].tag_tree == NULL)
{
GtkTreeIter iter;
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

View File

@ -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);