SF.net SVN: geany:[4308] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Oct 13 17:14:25 UTC 2009


Revision: 4308
          http://geany.svn.sourceforge.net/geany/?rev=4308&view=rev
Author:   ntrel
Date:     2009-10-13 17:14:25 +0000 (Tue, 13 Oct 2009)

Log Message:
-----------
Make Split Window 'Show current document' button have a drop-down menu
to select the other documents.
Add new API function ui_menu_add_document_items().

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/plugins/geanyfunctions.h
    trunk/plugins/splitwindow.c
    trunk/src/notebook.c
    trunk/src/plugindata.h
    trunk/src/plugins.c
    trunk/src/ui_utils.c
    trunk/src/ui_utils.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/ChangeLog	2009-10-13 17:14:25 UTC (rev 4308)
@@ -1,3 +1,12 @@
+2009-10-13  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/notebook.c, src/plugindata.h, src/plugins.c, src/ui_utils.c,
+   src/ui_utils.h, plugins/geanyfunctions.h, plugins/splitwindow.c:
+   Make Split Window 'Show current document' button have a drop-down menu
+   to select the other documents.
+   Add new API function ui_menu_add_document_items().
+
+
 2009-10-13  Lex Trotman  <elextr(at)gmail(dot)com>
 
  * src/build.c:

Modified: trunk/plugins/geanyfunctions.h
===================================================================
--- trunk/plugins/geanyfunctions.h	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/plugins/geanyfunctions.h	2009-10-13 17:14:25 UTC (rev 4308)
@@ -244,6 +244,8 @@
 	geany_functions->p_ui->progress_bar_stop
 #define ui_entry_add_clear_icon \
 	geany_functions->p_ui->entry_add_clear_icon
+#define ui_menu_add_document_items \
+	geany_functions->p_ui->menu_add_document_items
 #define dialogs_show_question \
 	geany_functions->p_dialogs->show_question
 #define dialogs_show_msgbox \

Modified: trunk/plugins/splitwindow.c
===================================================================
--- trunk/plugins/splitwindow.c	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/plugins/splitwindow.c	2009-10-13 17:14:25 UTC (rev 4308)
@@ -263,6 +263,23 @@
 }
 
 
+static void on_doc_menu_item_clicked(gpointer item, GeanyDocument *doc)
+{
+	if (doc->is_valid)
+		set_editor(&edit_window, doc->editor);
+}
+
+
+static void on_doc_menu_show(GtkMenu *menu)
+{
+	/* clear the old menu items */
+	gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback) gtk_widget_destroy, NULL);
+
+	ui_menu_add_document_items(menu, edit_window.editor->document,
+		G_CALLBACK(on_doc_menu_item_clicked));
+}
+
+
 static GtkWidget *create_toolbar(void)
 {
 	GtkWidget *toolbar, *item;
@@ -272,11 +289,17 @@
 	gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), GTK_ICON_SIZE_MENU);
 	gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
 
-	item = ui_tool_button_new(GTK_STOCK_JUMP_TO, "",
-		_("Show the current document"));
+	tool_item = gtk_menu_tool_button_new(NULL, NULL);
+	gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(tool_item), GTK_STOCK_JUMP_TO);
+	item = (GtkWidget*)tool_item;
+	ui_widget_set_tooltip_text(item, _("Show the current document"));
 	gtk_container_add(GTK_CONTAINER(toolbar), item);
 	g_signal_connect(item, "clicked", G_CALLBACK(on_refresh), NULL);
 
+	item = gtk_menu_new();
+	gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(tool_item), item);
+	g_signal_connect(item, "show", G_CALLBACK(on_doc_menu_show), NULL);
+
 	tool_item = gtk_tool_item_new();
 	gtk_tool_item_set_expand(tool_item, TRUE);
 	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(tool_item));

Modified: trunk/src/notebook.c
===================================================================
--- trunk/src/notebook.c	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/src/notebook.c	2009-10-13 17:14:25 UTC (rev 4308)
@@ -192,45 +192,20 @@
 }
 
 
-static GtkMenu *get_tab_bar_popup_menu(void)
+static void show_tab_bar_popup_menu(GdkEventButton *event)
 {
+	GtkWidget *menu_item;
 	static GtkWidget *menu = NULL;
-	GtkWidget *menu_item, *menu_item_label;
-	const GdkColor *color;
-	GeanyDocument *doc;
-	guint i, len;
-	gchar *base_name;
-	GeanyDocument *current_doc = document_get_current();
 
-	if (G_UNLIKELY(menu == NULL))
+	if (menu == NULL)
 		menu = gtk_menu_new();
 
 	/* clear the old menu items */
 	gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback) gtk_widget_destroy, NULL);
 
-	len = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
-	for (i = 0; i < len; i++)
-	{
-		doc = document_get_from_page(i);
-		if (! DOC_VALID(doc))
-			continue;
+	ui_menu_add_document_items(GTK_MENU(menu), document_get_current(),
+		G_CALLBACK(tab_bar_menu_activate_cb));
 
-		base_name = g_path_get_basename(DOC_FILENAME(doc));
-		menu_item = gtk_menu_item_new_with_label(base_name);
-		gtk_widget_show(menu_item);
-		gtk_container_add(GTK_CONTAINER(menu), menu_item);
-		g_signal_connect(menu_item, "activate", G_CALLBACK(tab_bar_menu_activate_cb), doc);
-
-		color = document_get_status_color(doc);
-		menu_item_label = gtk_bin_get_child(GTK_BIN(menu_item));
-		gtk_widget_modify_fg(menu_item_label, GTK_STATE_NORMAL, color);
-		gtk_widget_modify_fg(menu_item_label, GTK_STATE_ACTIVE, color);
-
-		if (doc == current_doc)
-			ui_label_set_markup(GTK_LABEL(menu_item_label), "<b>%s</b>", base_name);
-
-		g_free(base_name);
-	}
 	menu_item = gtk_separator_menu_item_new();
 	gtk_widget_show(menu_item);
 	gtk_container_add(GTK_CONTAINER(menu), menu_item);
@@ -245,7 +220,7 @@
 	gtk_container_add(GTK_CONTAINER(menu), menu_item);
 	g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_all1_activate), NULL);
 
-	return GTK_MENU(menu);
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time);
 }
 
 
@@ -267,8 +242,7 @@
 	}
 	else if (event->button == 3)
 	{
-		gtk_menu_popup(get_tab_bar_popup_menu(), NULL, NULL,
-			NULL, NULL, event->button, event->time);
+		show_tab_bar_popup_menu(event);
 	}
 	return FALSE;
 }

Modified: trunk/src/plugindata.h
===================================================================
--- trunk/src/plugindata.h	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/src/plugindata.h	2009-10-13 17:14:25 UTC (rev 4308)
@@ -50,7 +50,7 @@
 enum {
 	/** The Application Programming Interface (API) version, incremented
 	 * whenever any plugin data types are modified or appended to. */
-	GEANY_API_VERSION = 159,
+	GEANY_API_VERSION = 160,
 
 	/** The Application Binary Interface (ABI) version, incremented whenever
 	 * existing fields in the plugin data types have to be changed or reordered. */
@@ -408,10 +408,7 @@
 {
 	GtkWidget*	(*dialog_vbox_new) (GtkDialog *dialog);
 	GtkWidget*	(*frame_new_with_alignment) (const gchar *label_text, GtkWidget **alignment);
-
-	/* set_statusbar() also appends to the message window status tab if log is TRUE. */
 	void		(*set_statusbar) (gboolean log, const gchar *format, ...) G_GNUC_PRINTF (2, 3);
-
 	void		(*table_add_row) (GtkTable *table, gint row, ...) G_GNUC_NULL_TERMINATED;
 	GtkWidget*	(*path_box_new) (const gchar *title, GtkFileChooserAction action, GtkEntry *entry);
 	GtkWidget*	(*button_new_with_image) (const gchar *stock_id, const gchar *text);
@@ -422,6 +419,8 @@
 	void		(*progress_bar_start) (const gchar *text);
 	void		(*progress_bar_stop) (void);
 	void		(*entry_add_clear_icon) (GtkEntry *entry);
+	void		(*menu_add_document_items) (GtkMenu *menu, struct GeanyDocument *active,
+				GCallback callback);
 }
 UIUtilsFuncs;
 

Modified: trunk/src/plugins.c
===================================================================
--- trunk/src/plugins.c	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/src/plugins.c	2009-10-13 17:14:25 UTC (rev 4308)
@@ -218,7 +218,8 @@
 	&ui_lookup_widget,
 	&ui_progress_bar_start,
 	&ui_progress_bar_stop,
-	&ui_entry_add_clear_icon
+	&ui_entry_add_clear_icon,
+	&ui_menu_add_document_items
 };
 
 static DialogFuncs dialog_funcs = {

Modified: trunk/src/ui_utils.c
===================================================================
--- trunk/src/ui_utils.c	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/src/ui_utils.c	2009-10-13 17:14:25 UTC (rev 4308)
@@ -2108,3 +2108,43 @@
 }
 
 
+/** Add a list of document items to @a menu.
+ * @param menu Menu.
+ * @param active Which document to highlight, or @c NULL.
+ * @param callback is used for each menu item's @c "activate" signal and will be passed
+ * the corresponding document pointer as @c user_data.
+ * @warning You should check @c doc->is_valid in the callback. */
+void ui_menu_add_document_items(GtkMenu *menu, GeanyDocument *active, GCallback callback)
+{
+	GtkWidget *menu_item, *menu_item_label;
+	const GdkColor *color;
+	GeanyDocument *doc;
+	guint i, len;
+	gchar *base_name;
+
+	len = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
+	for (i = 0; i < len; i++)
+	{
+		doc = document_get_from_page(i);
+		if (! DOC_VALID(doc))
+			continue;
+
+		base_name = g_path_get_basename(DOC_FILENAME(doc));
+		menu_item = gtk_menu_item_new_with_label(base_name);
+		gtk_widget_show(menu_item);
+		gtk_container_add(GTK_CONTAINER(menu), menu_item);
+		g_signal_connect(menu_item, "activate", callback, doc);
+
+		color = document_get_status_color(doc);
+		menu_item_label = gtk_bin_get_child(GTK_BIN(menu_item));
+		gtk_widget_modify_fg(menu_item_label, GTK_STATE_NORMAL, color);
+		gtk_widget_modify_fg(menu_item_label, GTK_STATE_ACTIVE, color);
+
+		if (doc == active)
+			ui_label_set_markup(GTK_LABEL(menu_item_label), "<b>%s</b>", base_name);
+
+		g_free(base_name);
+	}
+}
+
+

Modified: trunk/src/ui_utils.h
===================================================================
--- trunk/src/ui_utils.h	2009-10-12 23:54:47 UTC (rev 4307)
+++ trunk/src/ui_utils.h	2009-10-13 17:14:25 UTC (rev 4308)
@@ -216,7 +216,9 @@
 void ui_add_config_file_menu_item(const gchar *real_path, const gchar *label,
 		GtkContainer *parent);
 
+void ui_menu_add_document_items(GtkMenu *menu, GeanyDocument *active, GCallback callback);
 
+
 void ui_set_statusbar(gboolean log, const gchar *format, ...) G_GNUC_PRINTF (2, 3);
 
 void ui_update_statusbar(GeanyDocument *doc, gint pos);


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