Revision: 3491 http://geany.svn.sourceforge.net/geany/?rev=3491&view=rev Author: ntrel Date: 2009-01-20 16:34:11 +0000 (Tue, 20 Jan 2009)
Log Message: ----------- Disable documents popup menu items when invalid. Make close, save menu items work for all children when a parent row is selected.
Modified Paths: -------------- trunk/ChangeLog trunk/src/treeviews.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-01-19 19:30:18 UTC (rev 3490) +++ trunk/ChangeLog 2009-01-20 16:34:11 UTC (rev 3491) @@ -1,3 +1,11 @@ +2009-01-20 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/treeviews.c: + Disable documents popup menu items when invalid. + Make close, save menu items work for all children when a parent row + is selected. + + 2009-01-19 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/document.c, src/utils.c:
Modified: trunk/src/treeviews.c =================================================================== --- trunk/src/treeviews.c 2009-01-19 19:30:18 UTC (rev 3490) +++ trunk/src/treeviews.c 2009-01-20 16:34:11 UTC (rev 3491) @@ -44,6 +44,14 @@
SidebarTreeviews tv;
+static struct +{ + GtkWidget *close; + GtkWidget *save; + GtkWidget *reload; +} +doc_items = {NULL, NULL, NULL}; + enum { TREEVIEW_SYMBOL = 0, @@ -73,10 +81,12 @@ static void on_openfiles_tree_selection_changed(GtkTreeSelection *selection, gpointer data); static void on_openfiles_document_action(GtkMenuItem *menuitem, gpointer user_data); static gboolean on_taglist_tree_selection_changed(GtkTreeSelection *selection); -static gboolean on_treeviews_button_press_event(GtkWidget *widget, GdkEventButton *event, - gpointer user_data); +static gboolean on_symbols_button_press_event(GtkWidget *widget, GdkEventButton *event, + gpointer user_data); +static gboolean on_documents_button_release_event(GtkWidget *widget, GdkEventButton *event, + gpointer user_data); static gboolean on_treeviews_key_press_event(GtkWidget *widget, GdkEventKey *event, - gpointer user_data); + gpointer user_data); static void on_list_document_activate(GtkCheckMenuItem *item, gpointer user_data); static void on_list_symbol_activate(GtkCheckMenuItem *item, gpointer user_data);
@@ -110,9 +120,9 @@ g_object_unref(store);
g_signal_connect(tree, "button-press-event", - G_CALLBACK(on_treeviews_button_press_event), GINT_TO_POINTER(TREEVIEW_SYMBOL)); + G_CALLBACK(on_symbols_button_press_event), NULL); g_signal_connect(tree, "key-press-event", - G_CALLBACK(on_treeviews_key_press_event), GINT_TO_POINTER(TREEVIEW_SYMBOL)); + G_CALLBACK(on_treeviews_key_press_event), GINT_TO_POINTER(TREEVIEW_SYMBOL));
gtk_tree_view_set_enable_search(GTK_TREE_VIEW(tree), FALSE);
@@ -140,7 +150,7 @@ { if (event->button == 3) { - on_treeviews_button_press_event(widget, event, GINT_TO_POINTER(TREEVIEW_SYMBOL)); + on_symbols_button_press_event(widget, event, NULL); } return FALSE; } @@ -244,8 +254,8 @@ if (gtk_check_version(2, 12, 0) == NULL) g_object_set(tv.tree_openfiles, "has-tooltip", TRUE, "tooltip-column", DOCUMENTS_FILENAME, NULL);
- g_signal_connect(tv.tree_openfiles, "button-press-event", - G_CALLBACK(on_treeviews_button_press_event), GINT_TO_POINTER(TREEVIEW_OPENFILES)); + g_signal_connect(tv.tree_openfiles, "button-release-event", + G_CALLBACK(on_documents_button_release_event), NULL);
/* selection handling */ select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv.tree_openfiles)); @@ -490,6 +500,7 @@ gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), item); g_signal_connect(item, "activate", G_CALLBACK(on_openfiles_document_action), GINT_TO_POINTER(OPENFILES_ACTION_REMOVE)); + doc_items.close = item;
item = gtk_separator_menu_item_new(); gtk_widget_show(item); @@ -500,6 +511,7 @@ gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), item); g_signal_connect(item, "activate", G_CALLBACK(on_openfiles_document_action), GINT_TO_POINTER(OPENFILES_ACTION_SAVE)); + doc_items.save = item;
item = gtk_image_menu_item_new_with_mnemonic(_("_Reload")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), @@ -508,6 +520,7 @@ gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), item); g_signal_connect(item, "activate", G_CALLBACK(on_openfiles_document_action), GINT_TO_POINTER(OPENFILES_ACTION_RELOAD)); + doc_items.reload = item;
sidebar_add_common_menu_items(GTK_MENU(tv.popup_openfiles)); } @@ -556,35 +569,60 @@
/* callbacks */
+static void document_action(GeanyDocument *doc, gint action) +{ + if (!DOC_VALID(doc)) + return; + + switch (action) + { + case OPENFILES_ACTION_REMOVE: + { + document_close(doc); + break; + } + case OPENFILES_ACTION_SAVE: + { + document_save_file(doc, FALSE); + break; + } + case OPENFILES_ACTION_RELOAD: + { + on_toolbutton_reload_clicked(NULL, NULL); + break; + } + } + +} + + static void on_openfiles_document_action(GtkMenuItem *menuitem, gpointer user_data) { GtkTreeIter iter; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv.tree_openfiles)); GtkTreeModel *model; GeanyDocument *doc; + gint action = GPOINTER_TO_INT(user_data);
if (gtk_tree_selection_get_selected(selection, &model, &iter)) { gtk_tree_model_get(model, &iter, DOCUMENTS_DOCUMENT, &doc, -1); - if (DOC_VALID(doc)) + if (doc) { - switch (GPOINTER_TO_INT(user_data)) + document_action(doc, action); + } + else + { + /* parent item selected */ + GtkTreeIter child; + gint i = gtk_tree_model_iter_n_children(model, &iter) - 1; + + while (i >= 0 && gtk_tree_model_iter_nth_child(model, &child, &iter, i)) { - case OPENFILES_ACTION_REMOVE: - { - document_close(doc); - break; - } - case OPENFILES_ACTION_SAVE: - { - document_save_file(doc, FALSE); - break; - } - case OPENFILES_ACTION_RELOAD: - { - on_toolbutton_reload_clicked(NULL, NULL); - break; - } + gtk_tree_model_get(model, &child, DOCUMENTS_DOCUMENT, &doc, -1); + + document_action(doc, action); + i--; } } } @@ -671,16 +709,18 @@ }
-static gboolean on_treeviews_button_press_event(GtkWidget *widget, GdkEventButton *event, - gpointer user_data) +static gboolean on_symbols_button_press_event(GtkWidget *widget, GdkEventButton *event, + G_GNUC_UNUSED gpointer user_data) { - if (event->type == GDK_2BUTTON_PRESS && GPOINTER_TO_INT(user_data) == TREEVIEW_SYMBOL) + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + + if (event->type == GDK_2BUTTON_PRESS) { /* double click on parent node(section) expands/collapses it */ GtkTreeModel *model; - GtkTreeSelection *selection; GtkTreeIter iter;
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (gtk_tree_model_iter_has_child(model, &iter)) @@ -697,31 +737,64 @@ } } } - else if (event->button == 1 && GPOINTER_TO_INT(user_data) == TREEVIEW_SYMBOL) + else if (event->button == 1) { /* allow reclicking of taglist treeview item */ - GtkTreeSelection *select = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); /* delay the query of selection state because this callback is executed before GTK * changes the selection (g_signal_connect_after would be better but it doesn't work) */ - g_idle_add((GSourceFunc) on_taglist_tree_selection_changed, select); + g_idle_add((GSourceFunc) on_taglist_tree_selection_changed, selection); } else if (event->button == 3) - { /* update & show popup menus */ - if (GPOINTER_TO_INT(user_data) == TREEVIEW_OPENFILES) - { - gtk_menu_popup(GTK_MENU(tv.popup_openfiles), NULL, NULL, NULL, NULL, - event->button, event->time); - } - else if (GPOINTER_TO_INT(user_data) == TREEVIEW_SYMBOL) - { - gtk_menu_popup(GTK_MENU(tv.popup_taglist), NULL, NULL, NULL, NULL, - event->button, event->time); - return TRUE; /* prevent selection changed signal for symbol tags */ - } + { + gtk_menu_popup(GTK_MENU(tv.popup_taglist), NULL, NULL, NULL, NULL, + event->button, event->time); + return TRUE; /* prevent selection changed signal for symbol tags */ } return FALSE; }
+static void documents_menu_update(GtkTreeSelection *selection) +{ + GtkTreeModel *model; + GtkTreeIter iter; + gboolean sel, path; + gchar *shortname = NULL; + GeanyDocument *doc = NULL; + + /* maybe no selection e.g. if ctrl-click deselected */ + sel = gtk_tree_selection_get_selected(selection, &model, &iter); + if (sel) + { + gtk_tree_model_get(model, &iter, DOCUMENTS_DOCUMENT, &doc, + DOCUMENTS_SHORTNAME, &shortname, -1); + } + path = NZV(shortname) && g_path_is_absolute(shortname); + + /* can close all, save all (except shortname), but only reload individually ATM */ + gtk_widget_set_sensitive(doc_items.close, sel); + gtk_widget_set_sensitive(doc_items.save, (doc && doc->real_path) || path); + gtk_widget_set_sensitive(doc_items.reload, doc && doc->real_path); + g_free(shortname); +} + + +static gboolean on_documents_button_release_event(GtkWidget *widget, GdkEventButton *event, + gpointer user_data) +{ + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + + if (event->button == 3) + { + documents_menu_update(selection); + gtk_menu_popup(GTK_MENU(tv.popup_openfiles), NULL, NULL, NULL, NULL, + event->button, event->time); + } + return FALSE; +} + + void treeviews_init() { tv.default_tag_tree = NULL;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.