[anjuta] MessageManager: Moved tabs of message views into grip to save space (requires latest gdl)
- From: Johannes Schmid <jhs src gnome org>
- To: svn-commits-list gnome org
- Subject: [anjuta] MessageManager: Moved tabs of message views into grip to save space (requires latest gdl)
- Date: Fri, 5 Jun 2009 08:30:23 -0400 (EDT)
commit 4174917061f0eaaaa42db1568d2adcc5cb526c59
Author: Johannes Schmid <jhs gnome org>
Date: Fri Jun 5 14:28:50 2009 +0200
MessageManager: Moved tabs of message views into grip to save space (requires latest gdl)
---
libanjuta/anjuta-shell.c | 28 +++++++
libanjuta/anjuta-shell.h | 17 ++++-
plugins/message-view/anjuta-msgman.c | 147 +++++++++++++++++++++++++---------
plugins/message-view/anjuta-msgman.h | 2 +
plugins/message-view/plugin.c | 12 +++-
src/anjuta-app.c | 126 +++++++++++++++++++----------
6 files changed, 249 insertions(+), 83 deletions(-)
diff --git a/libanjuta/anjuta-shell.c b/libanjuta/anjuta-shell.c
index 64a039d..babb0f8 100644
--- a/libanjuta/anjuta-shell.c
+++ b/libanjuta/anjuta-shell.c
@@ -294,6 +294,34 @@ anjuta_shell_add_widget_full (AnjutaShell *shell,
}
/**
+ * anjuta_shell_add_widget_full:
+ * @shell: A #AnjutaShell interface.
+ * @widget: Then widget to add
+ * @name: Name of the widget. None translated string used to identify it in
+ * the shell.
+ * @title: title of the widget (translated)
+ * @label: Label widget to use
+ * @placement: Placement of the widget in shell.
+ * @error: Error propagation object.
+ *
+ * Adds @widget in the shell. The @placement tells where the widget should
+ * appear, but generally it will be overridden by the container
+ * (dock, notebook, GtkContainer etc.) saved layout.
+ * use locking. Using this method you can pass a custom widget as label
+ */
+void anjuta_shell_add_widget_custom (AnjutaShell *shell,
+ GtkWidget *widget,
+ const char *name,
+ const char *title,
+ GtkWidget *label,
+ AnjutaShellPlacement placement,
+ GError **error)
+{
+ ANJUTA_SHELL_GET_IFACE (shell)->add_widget_custom (shell, widget, name, title, label,
+ placement, error);
+}
+
+/**
* anjuta_shell_remove_widget:
* @shell: A #AnjutaShell interface
* @widget: The widget to remove
diff --git a/libanjuta/anjuta-shell.h b/libanjuta/anjuta-shell.h
index ec4e165..c812041 100644
--- a/libanjuta/anjuta-shell.h
+++ b/libanjuta/anjuta-shell.h
@@ -82,7 +82,7 @@ struct _AnjutaShellIface {
AnjutaProfileManager* (*get_profile_manager) (AnjutaShell *shell,
GError **err);
- void (*add_widget_full) (AnjutaShell *shell,
+ void (*add_widget_full) (AnjutaShell *shell,
GtkWidget *widget,
const char *name,
const char *title,
@@ -90,6 +90,13 @@ struct _AnjutaShellIface {
AnjutaShellPlacement placement,
gboolean locked,
GError **error);
+ void (*add_widget_custom) (AnjutaShell *shell,
+ GtkWidget *widget,
+ const char *name,
+ const char *title,
+ GtkWidget *label,
+ AnjutaShellPlacement placement,
+ GError **error);
void (*remove_widget) (AnjutaShell *shell,
GtkWidget *widget,
@@ -142,6 +149,14 @@ void anjuta_shell_add_widget (AnjutaShell *shell,
AnjutaShellPlacement placement,
GError **error);
+void anjuta_shell_add_widget_custom (AnjutaShell *shell,
+ GtkWidget *widget,
+ const char *name,
+ const char *title,
+ GtkWidget *label,
+ AnjutaShellPlacement placement,
+ GError **error);
+
void anjuta_shell_add_widget_full (AnjutaShell *shell,
GtkWidget *widget,
const char *name,
diff --git a/plugins/message-view/anjuta-msgman.c b/plugins/message-view/anjuta-msgman.c
index 903ad81..8a642a6 100644
--- a/plugins/message-view/anjuta-msgman.c
+++ b/plugins/message-view/anjuta-msgman.c
@@ -30,6 +30,9 @@ struct _AnjutaMsgmanPriv
GtkWidget* popup_menu;
GtkWidget* tab_popup;
GList *views;
+
+ GtkWidget* hbox;
+ GSList* button_group;
};
struct _AnjutaMsgmanPage
@@ -37,14 +40,38 @@ struct _AnjutaMsgmanPage
GtkWidget *widget;
GtkWidget *pixmap;
GtkWidget *label;
- GtkWidget *box;
GtkWidget *button;
+ GtkWidget *box;
+ GtkWidget *close_button;
GtkWidget *close_icon;
};
typedef struct _AnjutaMsgmanPage AnjutaMsgmanPage;
static void
+on_page_button_toggled (GtkToggleButton* button,
+ AnjutaMsgman* msgman)
+{
+ AnjutaMsgmanPage* page;
+ int page_num;
+
+ page = g_object_get_data (G_OBJECT (button), "__page");
+ page_num = gtk_notebook_page_num (GTK_NOTEBOOK(msgman), page->widget);
+
+ if (page_num == gtk_notebook_get_current_page (GTK_NOTEBOOK(msgman)))
+ {
+ if (!gtk_toggle_button_get_active (button))
+ {
+ g_signal_handlers_block_by_func (button, on_page_button_toggled, msgman);
+ gtk_toggle_button_set_active (button, TRUE);
+ g_signal_handlers_unblock_by_func (button, on_page_button_toggled, msgman);
+ }
+ }
+ else
+ gtk_notebook_set_current_page (GTK_NOTEBOOK(msgman), page_num);
+}
+
+static void
on_msgman_close_page (GtkButton* button,
AnjutaMsgman *msgman)
{
@@ -106,6 +133,7 @@ anjuta_msgman_page_new (GtkWidget * view, const gchar * name,
{
AnjutaMsgmanPage *page;
int h, w;
+ GtkWidget* box;
g_return_val_if_fail (view != NULL, NULL);
@@ -114,8 +142,8 @@ anjuta_msgman_page_new (GtkWidget * view, const gchar * name,
page->label = gtk_label_new (name);
gtk_misc_set_alignment (GTK_MISC(page->label), 0.0, 0.5);
- page->box = gtk_hbox_new (FALSE, 0);
- gtk_box_set_spacing (GTK_BOX (page->box), 5);
+ box = gtk_hbox_new (FALSE, 0);
+ gtk_box_set_spacing (GTK_BOX (box), 5);
if (pixmap && strlen(pixmap))
{
GtkStockItem unused;
@@ -127,48 +155,97 @@ anjuta_msgman_page_new (GtkWidget * view, const gchar * name,
{
page->pixmap = anjuta_res_get_image_sized (pixmap, 16, 16);
}
- gtk_box_pack_start (GTK_BOX (page->box), page->pixmap, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (box), page->pixmap, FALSE, FALSE, 0);
}
- gtk_box_pack_start (GTK_BOX (page->box), page->label, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (box), page->label, TRUE, TRUE, 0);
gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
page->close_icon = gtk_image_new_from_stock(GTK_STOCK_CLOSE,
GTK_ICON_SIZE_MENU);
gtk_widget_set_size_request(page->close_icon, w, h);
- page->button = gtk_button_new();
- gtk_container_add(GTK_CONTAINER(page->button), page->close_icon);
- gtk_widget_set_size_request (page->button, w, h);
- gtk_button_set_focus_on_click (GTK_BUTTON (page->button), FALSE);
- gtk_button_set_relief(GTK_BUTTON(page->button), GTK_RELIEF_NONE);
+ page->close_button = gtk_button_new();
+ gtk_container_add(GTK_CONTAINER(page->close_button), page->close_icon);
+ gtk_widget_set_size_request (page->close_button, w, h);
+ gtk_button_set_focus_on_click (GTK_BUTTON (page->close_button), FALSE);
+ gtk_button_set_relief(GTK_BUTTON(page->close_button), GTK_RELIEF_NONE);
/* This style is created int the document-manager which we simply
* assume is loaded before this plugin
*/
- gtk_widget_set_name (page->button, "anjuta-tab-close-button");
-
- gtk_box_pack_start (GTK_BOX (page->box), page->button, FALSE, FALSE, 0);
-
- g_object_set_data (G_OBJECT (page->button), "message_view", page->widget);
- g_signal_connect (GTK_OBJECT (page->button), "clicked",
+ gtk_widget_set_name (page->close_button, "anjuta-tab-close-button");
+
+ g_object_set_data (G_OBJECT (page->close_button), "message_view", page->widget);
+ g_signal_connect (GTK_OBJECT (page->close_button), "clicked",
G_CALLBACK(on_msgman_close_page),
msgman);
+
+ page->button = gtk_toggle_button_new ();
+ g_signal_connect (page->button, "toggled", G_CALLBACK(on_page_button_toggled),
+ msgman);
+ g_object_set_data (G_OBJECT(page->button), "__page", page);
+ gtk_container_add (GTK_CONTAINER (page->button), box);
+
+ page->box = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(page->box), page->button, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(page->box), page->close_button, FALSE, FALSE, 0);
+
+
+ gtk_widget_show_all (page->box);
+
return page;
}
static void
anjuta_msgman_page_destroy (AnjutaMsgmanPage * page)
{
+ gtk_widget_destroy (page->box);
g_free (page);
}
+static AnjutaMsgmanPage *
+anjuta_msgman_page_from_widget (AnjutaMsgman * msgman, MessageView * mv)
+{
+ GList *node;
+ node = msgman->priv->views;
+ while (node)
+ {
+ AnjutaMsgmanPage *page;
+ page = node->data;
+ g_assert (page);
+ if (page->widget == GTK_WIDGET (mv))
+ return page;
+ node = g_list_next (node);
+ }
+ return NULL;
+}
+
static void
on_notebook_switch_page (GtkNotebook * notebook,
- GtkNotebookPage * page,
+ GtkNotebookPage * npage,
gint page_num, AnjutaMsgman * msgman)
{
+ GList* node;
+ AnjutaMsgmanPage* page = anjuta_msgman_page_from_widget(msgman,
+ MESSAGE_VIEW (gtk_notebook_get_nth_page(GTK_NOTEBOOK(msgman), page_num)));
+
g_return_if_fail (notebook != NULL);
g_return_if_fail (page != NULL);
g_return_if_fail (msgman != NULL);
-
+
+ for (node = msgman->priv->views; node != NULL; node = g_list_next (node))
+ {
+ AnjutaMsgmanPage* cur_page = node->data;
+ g_signal_handlers_block_by_func (cur_page->button, on_page_button_toggled, msgman);
+ if (cur_page != page)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cur_page->button), FALSE);
+ }
+ else
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cur_page->button), TRUE);
+ }
+ g_signal_handlers_unblock_by_func (cur_page->button, on_page_button_toggled, msgman);
+ }
+
anjuta_msgman_set_current_view(msgman, NULL);
}
@@ -202,6 +279,8 @@ anjuta_msgman_instance_init (AnjutaMsgman * msgman)
msgman->priv = g_new0(AnjutaMsgmanPriv, 1);
msgman->priv->views = NULL;
msgman->priv->tab_popup = create_tab_popup_menu(msgman);
+ msgman->priv->hbox = gtk_hbox_new (FALSE, 5);
+ msgman->priv->button_group = NULL;
g_signal_connect(GTK_OBJECT(msgman), "popup-menu",
G_CALLBACK(on_msgman_popup_menu), msgman);
g_signal_connect(GTK_OBJECT(msgman), "button-press-event",
@@ -268,7 +347,7 @@ GtkWidget*
anjuta_msgman_new (GtkWidget *popup_menu)
{
GtkWidget *msgman = NULL;
- msgman = gtk_widget_new (ANJUTA_TYPE_MSGMAN, NULL);
+ msgman = gtk_widget_new (ANJUTA_TYPE_MSGMAN, "show-tabs", FALSE, NULL);
if (msgman)
{
ANJUTA_MSGMAN (msgman)->priv->popup_menu = popup_menu;
@@ -280,23 +359,6 @@ anjuta_msgman_new (GtkWidget *popup_menu)
ANJUTA_TYPE_BEGIN (AnjutaMsgman, anjuta_msgman, GTK_TYPE_NOTEBOOK);
ANJUTA_TYPE_END;
-static AnjutaMsgmanPage *
-anjuta_msgman_page_from_widget (AnjutaMsgman * msgman, MessageView * mv)
-{
- GList *node;
- node = msgman->priv->views;
- while (node)
- {
- AnjutaMsgmanPage *page;
- page = node->data;
- g_assert (page);
- if (page->widget == GTK_WIDGET (mv))
- return page;
- node = g_list_next (node);
- }
- return NULL;
-}
-
static void
on_message_view_destroy (MessageView *view, AnjutaMsgman *msgman)
{
@@ -334,6 +396,7 @@ anjuta_msgman_append_view (AnjutaMsgman * msgman, GtkWidget *mv,
const gchar * name, const gchar * pixmap)
{
AnjutaMsgmanPage *page;
+ int page_num;
g_return_if_fail (msgman != NULL);
g_return_if_fail (mv != NULL);
@@ -341,7 +404,6 @@ anjuta_msgman_append_view (AnjutaMsgman * msgman, GtkWidget *mv,
gtk_widget_show_all (mv);
page = anjuta_msgman_page_new (mv, name, pixmap, msgman);
- gtk_widget_show_all (page->box);
g_signal_handlers_block_by_func (GTK_OBJECT (msgman),
G_CALLBACK
@@ -349,14 +411,16 @@ anjuta_msgman_append_view (AnjutaMsgman * msgman, GtkWidget *mv,
msgman->priv->views =
g_list_prepend (msgman->priv->views, (gpointer) page);
- gtk_notebook_prepend_page (GTK_NOTEBOOK (msgman), mv, page->box);
- gtk_notebook_set_current_page (GTK_NOTEBOOK (msgman), 0);
+ page_num = gtk_notebook_append_page (GTK_NOTEBOOK (msgman), mv, NULL);
+
+ gtk_box_pack_start (GTK_BOX(msgman->priv->hbox), page->box, FALSE, FALSE, 0);
g_signal_connect (G_OBJECT (mv), "destroy",
G_CALLBACK (on_message_view_destroy), msgman);
g_signal_handlers_unblock_by_func (GTK_OBJECT (msgman),
G_CALLBACK
(on_notebook_switch_page), msgman);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (page->button), TRUE);
g_signal_emit_by_name(G_OBJECT(msgman), "view_changed");
}
@@ -570,3 +634,8 @@ anjuta_msgman_deserialize (AnjutaMsgman *msgman, AnjutaSerializer *serializer)
}
return TRUE;
}
+
+GtkWidget* anjuta_msgman_get_hbox (AnjutaMsgman* msgman)
+{
+ return msgman->priv->hbox;
+}
diff --git a/plugins/message-view/anjuta-msgman.h b/plugins/message-view/anjuta-msgman.h
index 3abfebc..cdad12c 100644
--- a/plugins/message-view/anjuta-msgman.h
+++ b/plugins/message-view/anjuta-msgman.h
@@ -79,6 +79,8 @@ gboolean anjuta_msgman_serialize (AnjutaMsgman *msgman,
gboolean anjuta_msgman_deserialize (AnjutaMsgman *msgman,
AnjutaSerializer *serializer);
+GtkWidget* anjuta_msgman_get_hbox (AnjutaMsgman* msgman);
+
void
on_notify_message_pref (AnjutaPreferences* prefs, const gchar* key,
const gchar* value, gpointer user_data);
diff --git a/plugins/message-view/plugin.c b/plugins/message-view/plugin.c
index 6c1c482..f4d2ba3 100644
--- a/plugins/message-view/plugin.c
+++ b/plugins/message-view/plugin.c
@@ -321,9 +321,17 @@ ianjuta_msgman_add_view (IAnjutaMessageManager *plugin,
GtkWidget *msgman = ANJUTA_PLUGIN_MESSAGE_VIEW (plugin)->msgman;
if (ANJUTA_PLUGIN_MESSAGE_VIEW (plugin)->widget_shown == FALSE)
{
- anjuta_shell_add_widget (shell, msgman,
+ GtkWidget* label = gtk_label_new (_("Messages"));
+ GtkImage* image = gtk_image_new_from_stock ("message-manager-plugin-icon",
+ GTK_ICON_SIZE_MENU);
+ GtkWidget* hbox = anjuta_msgman_get_hbox (msgman);
+ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_widget_show_all (hbox);
+
+ anjuta_shell_add_widget_custom (shell, msgman,
"AnjutaMessageView", _("Messages"),
- "message-manager-plugin-icon",
+ hbox,
ANJUTA_SHELL_PLACEMENT_BOTTOM, NULL);
ANJUTA_PLUGIN_MESSAGE_VIEW (plugin)->widget_shown = TRUE;
}
diff --git a/src/anjuta-app.c b/src/anjuta-app.c
index c6ae648..5144ed7 100644
--- a/src/anjuta-app.c
+++ b/src/anjuta-app.c
@@ -856,6 +856,58 @@ on_widget_removed_from_hash (gpointer widget)
g_object_unref (G_OBJECT (widget));
}
+static void
+anjuta_app_setup_widget (AnjutaApp* app,
+ const gchar* name,
+ GtkWidget *widget,
+ GtkWidget* item,
+ const gchar* title,
+ gboolean locked)
+{
+ GtkCheckMenuItem* menuitem;
+
+
+ /* Add the widget to hash */
+ if (app->widgets == NULL)
+ {
+ app->widgets = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free,
+ on_widget_removed_from_hash);
+ }
+ g_hash_table_insert (app->widgets, g_strdup (name), widget);
+ g_object_ref (widget);
+
+ /* Add toggle button for the widget */
+ menuitem = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new_with_label (title));
+ gtk_widget_show (GTK_WIDGET (menuitem));
+ gtk_check_menu_item_set_active (menuitem, TRUE);
+ gtk_menu_shell_append (GTK_MENU_SHELL (app->view_menu), GTK_WIDGET (menuitem));
+
+ if (locked)
+ g_object_set( G_OBJECT(menuitem), "visible", FALSE, NULL);
+
+
+ g_object_set_data (G_OBJECT (widget), "app-object", app);
+ g_object_set_data (G_OBJECT (widget), "menuitem", menuitem);
+ g_object_set_data (G_OBJECT (widget), "dockitem", item);
+
+ /* For toggling widget view on/off */
+ g_signal_connect (G_OBJECT (menuitem), "toggled",
+ G_CALLBACK (on_toggle_widget_view), item);
+
+ /*
+ Watch for widget removal/destruction so that it could be
+ removed from widgets hash.
+ */
+ g_signal_connect (G_OBJECT (item), "remove",
+ G_CALLBACK (on_widget_remove), app);
+ g_signal_connect_after (G_OBJECT (widget), "destroy",
+ G_CALLBACK (on_widget_destroy), app);
+
+ gtk_widget_show_all (item);
+}
+
+
static void
anjuta_app_add_widget_full (AnjutaShell *shell,
GtkWidget *widget,
@@ -868,7 +920,6 @@ anjuta_app_add_widget_full (AnjutaShell *shell,
{
AnjutaApp *app;
GtkWidget *item;
- GtkCheckMenuItem* menuitem;
g_return_if_fail (ANJUTA_IS_APP (shell));
g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -877,21 +928,6 @@ anjuta_app_add_widget_full (AnjutaShell *shell,
app = ANJUTA_APP (shell);
- /*
- anjuta_shell_add (shell, name, G_TYPE_FROM_INSTANCE (widget),
- widget, NULL);
- */
-
- /* Add the widget to hash */
- if (app->widgets == NULL)
- {
- app->widgets = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free,
- on_widget_removed_from_hash);
- }
- g_hash_table_insert (app->widgets, g_strdup (name), widget);
- g_object_ref (widget);
-
/* Add the widget to dock */
if (stock_id == NULL)
item = gdl_dock_item_new (name, title, GDL_DOCK_ITEM_BEH_NORMAL);
@@ -914,35 +950,42 @@ anjuta_app_add_widget_full (AnjutaShell *shell,
if (locked)
gdl_dock_item_set_default_position(GDL_DOCK_ITEM(item), GDL_DOCK_OBJECT(app->dock));
-
- gtk_widget_show_all (item);
-
- /* Add toggle button for the widget */
- menuitem = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new_with_label (title));
- gtk_widget_show (GTK_WIDGET (menuitem));
- gtk_check_menu_item_set_active (menuitem, TRUE);
- gtk_menu_shell_append (GTK_MENU_SHELL (app->view_menu), GTK_WIDGET (menuitem));
- if (locked)
- g_object_set( G_OBJECT(menuitem), "visible", FALSE, NULL);
+ anjuta_app_setup_widget (app, name, widget, item, title, locked);
+}
+static void
+anjuta_app_add_widget_custom (AnjutaShell *shell,
+ GtkWidget *widget,
+ const char *name,
+ const char *title,
+ GtkWidget *label,
+ AnjutaShellPlacement placement,
+ GError **error)
+{
+ AnjutaApp *app;
+ GtkWidget *item;
+ GtkWidget *grip;
- g_object_set_data (G_OBJECT (widget), "app-object", app);
- g_object_set_data (G_OBJECT (widget), "menuitem", menuitem);
- g_object_set_data (G_OBJECT (widget), "dockitem", item);
-
- /* For toggling widget view on/off */
- g_signal_connect (G_OBJECT (menuitem), "toggled",
- G_CALLBACK (on_toggle_widget_view), item);
+ g_return_if_fail (ANJUTA_IS_APP (shell));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (title != NULL);
+
+ app = ANJUTA_APP (shell);
+
+ /* Add the widget to dock */
+ item = gdl_dock_item_new (name, title, GDL_DOCK_ITEM_BEH_NORMAL);
+
+ gtk_container_add (GTK_CONTAINER (item), widget);
+ gdl_dock_add_item (GDL_DOCK (app->dock),
+ GDL_DOCK_ITEM (item), placement);
- /*
- Watch for widget removal/destruction so that it could be
- removed from widgets hash.
- */
- g_signal_connect (G_OBJECT (item), "remove",
- G_CALLBACK (on_widget_remove), app);
- g_signal_connect_after (G_OBJECT (widget), "destroy",
- G_CALLBACK (on_widget_destroy), app);
+ grip = gdl_dock_item_get_grip (GDL_DOCK_ITEM (item));
+
+ gdl_dock_item_grip_set_label (GDL_DOCK_ITEM_GRIP (grip), label);
+
+ anjuta_app_setup_widget (app, name, widget, item, title, FALSE);
}
static void
@@ -1055,6 +1098,7 @@ static void
anjuta_shell_iface_init (AnjutaShellIface *iface)
{
iface->add_widget_full = anjuta_app_add_widget_full;
+ iface->add_widget_custom = anjuta_app_add_widget_custom;
iface->remove_widget = anjuta_app_remove_widget;
iface->present_widget = anjuta_app_present_widget;
iface->add_value = anjuta_app_add_value;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]