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().



git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@4308 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
Nick Treleaven 2009-10-13 17:14:25 +00:00
parent 563cca15c0
commit 39cdcac742
8 changed files with 90 additions and 40 deletions

View File

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

View File

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

View File

@ -263,6 +263,23 @@ static void on_refresh(void)
}
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 @@ static GtkWidget *create_toolbar(void)
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));

View File

@ -192,45 +192,20 @@ static void tab_bar_menu_activate_cb(GtkMenuItem *menuitem, gpointer data)
}
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 @@ static GtkMenu *get_tab_bar_popup_menu(void)
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 @@ static gboolean notebook_tab_bar_click_cb(GtkWidget *widget, GdkEventButton *eve
}
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;
}

View File

@ -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 @@ typedef struct UIUtilsFuncs
{
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 @@ typedef struct UIUtilsFuncs
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;

View File

@ -218,7 +218,8 @@ static UIUtilsFuncs uiutils_funcs = {
&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 = {

View File

@ -2108,3 +2108,43 @@ GtkWidget *ui_label_set_markup(GtkLabel *label, const gchar *format, ...)
}
/** 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);
}
}

View File

@ -216,6 +216,8 @@ void ui_init_stock_items(void);
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);