SF.net SVN: geany:[3491] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Tue Jan 20 16:34:11 UTC 2009
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.
More information about the Commits
mailing list