[gedit-plugins] Port bookmarks plugin to new menu api



commit 5def9e0d9044e0c77d6aa9ebfea5d649827b915b
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Fri Jan 10 21:00:45 2014 +0100

    Port bookmarks plugin to new menu api

 plugins/bookmarks/Makefile.am                      |    2 +
 .../bookmarks/gedit-bookmarks-app-activatable.c    |  163 ++++++++++++++++++++
 .../bookmarks/gedit-bookmarks-app-activatable.h    |   56 +++++++
 plugins/bookmarks/gedit-bookmarks-plugin.c         |  147 ++++++++----------
 4 files changed, 290 insertions(+), 78 deletions(-)
---
diff --git a/plugins/bookmarks/Makefile.am b/plugins/bookmarks/Makefile.am
index df5f97f..d668a49 100644
--- a/plugins/bookmarks/Makefile.am
+++ b/plugins/bookmarks/Makefile.am
@@ -12,6 +12,8 @@ plugin_LTLIBRARIES = libbookmarks.la
 libbookmarks_la_SOURCES = \
        gedit-bookmarks-plugin.h                                \
        gedit-bookmarks-plugin.c                                \
+       gedit-bookmarks-app-activatable.h                       \
+       gedit-bookmarks-app-activatable.c                       \
        messages/gedit-bookmarks-message-add.c                  \
        messages/gedit-bookmarks-message-add.h                  \
        messages/gedit-bookmarks-message-goto-next.c            \
diff --git a/plugins/bookmarks/gedit-bookmarks-app-activatable.c 
b/plugins/bookmarks/gedit-bookmarks-app-activatable.c
new file mode 100644
index 0000000..10a4fc1
--- /dev/null
+++ b/plugins/bookmarks/gedit-bookmarks-app-activatable.c
@@ -0,0 +1,163 @@
+/*
+ * gedit-bookmarks-app-activatable.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2014 - Ignacio Casal Quinteiro
+ *
+ * gedit is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gedit is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gedit. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "gedit-bookmarks-app-activatable.h"
+#include <gedit/gedit-app-activatable.h>
+#include <gedit/gedit-app.h>
+#include <libpeas/peas-object-module.h>
+
+
+typedef struct _GeditBookmarksAppActivatablePrivate
+{
+       GeditApp *app;
+} GeditBookmarksAppActivatablePrivate;
+
+enum
+{
+       PROP_0,
+       PROP_APP
+};
+
+static void gedit_app_activatable_iface_init (GeditAppActivatableInterface *iface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (GeditBookmarksAppActivatable,
+                                gedit_bookmarks_app_activatable,
+                                G_TYPE_OBJECT,
+                                0,
+                                G_ADD_PRIVATE_DYNAMIC (GeditBookmarksAppActivatable)
+                                G_IMPLEMENT_INTERFACE_DYNAMIC (GEDIT_TYPE_APP_ACTIVATABLE,
+                                                               gedit_app_activatable_iface_init))
+
+static void
+gedit_bookmarks_app_activatable_dispose (GObject *object)
+{
+       GeditBookmarksAppActivatable *activatable = GEDIT_BOOKMARKS_APP_ACTIVATABLE (object);
+       GeditBookmarksAppActivatablePrivate *priv = gedit_bookmarks_app_activatable_get_instance_private 
(activatable);
+
+       g_clear_object (&priv->app);
+
+       G_OBJECT_CLASS (gedit_bookmarks_app_activatable_parent_class)->dispose (object);
+}
+
+static void
+gedit_bookmarks_app_activatable_set_property (GObject      *object,
+                                              guint         prop_id,
+                                              const GValue *value,
+                                              GParamSpec   *pspec)
+{
+       GeditBookmarksAppActivatable *activatable = GEDIT_BOOKMARKS_APP_ACTIVATABLE (object);
+       GeditBookmarksAppActivatablePrivate *priv = gedit_bookmarks_app_activatable_get_instance_private 
(activatable);
+
+       switch (prop_id)
+       {
+               case PROP_APP:
+                       priv->app = GEDIT_APP (g_value_dup_object (value));
+                       break;
+
+               default:
+                       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                       break;
+       }
+}
+
+static void
+gedit_bookmarks_app_activatable_get_property (GObject    *object,
+                                              guint       prop_id,
+                                              GValue     *value,
+                                              GParamSpec *pspec)
+{
+       GeditBookmarksAppActivatable *activatable = GEDIT_BOOKMARKS_APP_ACTIVATABLE (object);
+       GeditBookmarksAppActivatablePrivate *priv = gedit_bookmarks_app_activatable_get_instance_private 
(activatable);
+
+       switch (prop_id)
+       {
+               case PROP_APP:
+                       g_value_set_object (value, priv->app);
+                       break;
+
+               default:
+                       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                       break;
+       }
+}
+
+static void
+gedit_bookmarks_app_activatable_class_init (GeditBookmarksAppActivatableClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->dispose = gedit_bookmarks_app_activatable_dispose;
+       object_class->set_property = gedit_bookmarks_app_activatable_set_property;
+       object_class->get_property = gedit_bookmarks_app_activatable_get_property;
+
+       g_object_class_override_property (object_class, PROP_APP, "app");
+}
+
+static void
+gedit_bookmarks_app_activatable_class_finalize (GeditBookmarksAppActivatableClass *klass)
+{
+}
+
+static void
+gedit_bookmarks_app_activatable_init (GeditBookmarksAppActivatable *self)
+{
+}
+
+static void
+gedit_bookmarks_app_activatable_activate (GeditAppActivatable *activatable)
+{
+       GeditBookmarksAppActivatable *app_activatable = GEDIT_BOOKMARKS_APP_ACTIVATABLE (activatable);
+       GeditBookmarksAppActivatablePrivate *priv = gedit_bookmarks_app_activatable_get_instance_private 
(app_activatable);
+
+       gtk_application_add_accelerator (GTK_APPLICATION (priv->app), "<Primary><Alt>B", 
"win.bookmark-toggle", NULL);
+       gtk_application_add_accelerator (GTK_APPLICATION (priv->app), "<Primary>B", "win.bookmark-next", 
NULL);
+       gtk_application_add_accelerator (GTK_APPLICATION (priv->app), "<Primary><Shift>B", 
"win.bookmark-prev", NULL);
+}
+
+static void
+gedit_bookmarks_app_activatable_deactivate (GeditAppActivatable *activatable)
+{
+       GeditBookmarksAppActivatable *app_activatable = GEDIT_BOOKMARKS_APP_ACTIVATABLE (activatable);
+       GeditBookmarksAppActivatablePrivate *priv = gedit_bookmarks_app_activatable_get_instance_private 
(app_activatable);
+
+       gtk_application_remove_accelerator (GTK_APPLICATION (priv->app), "win.bookmark-toggle", NULL);
+       gtk_application_remove_accelerator (GTK_APPLICATION (priv->app), "win.bookmark-next", NULL);
+       gtk_application_remove_accelerator (GTK_APPLICATION (priv->app), "win.bookmark-prev", NULL);
+}
+
+static void
+gedit_app_activatable_iface_init (GeditAppActivatableInterface *iface)
+{
+       iface->activate = gedit_bookmarks_app_activatable_activate;
+       iface->deactivate = gedit_bookmarks_app_activatable_deactivate;
+}
+
+void
+gedit_bookmarks_app_activatable_register (GTypeModule *module)
+{
+       gedit_bookmarks_app_activatable_register_type (module);
+
+       peas_object_module_register_extension_type (PEAS_OBJECT_MODULE (module),
+                                                   GEDIT_TYPE_APP_ACTIVATABLE,
+                                                   GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE);
+}
+
+/* ex:ts=8:noet: */
diff --git a/plugins/bookmarks/gedit-bookmarks-app-activatable.h 
b/plugins/bookmarks/gedit-bookmarks-app-activatable.h
new file mode 100644
index 0000000..96e394a
--- /dev/null
+++ b/plugins/bookmarks/gedit-bookmarks-app-activatable.h
@@ -0,0 +1,56 @@
+/*
+ * gedit-bookmarks-app-activatable.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 2014 - Ignacio Casal Quinteiro
+ *
+ * gedit is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gedit is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gedit. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __GEDIT_BOOKMARKS_APP_ACTIVATABLE_H__
+#define __GEDIT_BOOKMARKS_APP_ACTIVATABLE_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE           (gedit_bookmarks_app_activatable_get_type ())
+#define GEDIT_BOOKMARKS_APP_ACTIVATABLE(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE, GeditBookmarksAppActivatable))
+#define GEDIT_BOOKMARKS_APP_ACTIVATABLE_CONST(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE, GeditBookmarksAppActivatable const))
+#define GEDIT_BOOKMARKS_APP_ACTIVATABLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), 
GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE, GeditBookmarksAppActivatableClass))
+#define GEDIT_IS_BOOKMARKS_APP_ACTIVATABLE(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE))
+#define GEDIT_IS_BOOKMARKS_APP_ACTIVATABLE_CLASS(klass)        (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE))
+#define GEDIT_BOOKMARKS_APP_ACTIVATABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GEDIT_TYPE_BOOKMARKS_APP_ACTIVATABLE, GeditBookmarksAppActivatableClass))
+
+typedef struct _GeditBookmarksAppActivatable           GeditBookmarksAppActivatable;
+typedef struct _GeditBookmarksAppActivatableClass      GeditBookmarksAppActivatableClass;
+
+struct _GeditBookmarksAppActivatable
+{
+       GObject parent;
+};
+
+struct _GeditBookmarksAppActivatableClass
+{
+       GObjectClass parent_class;
+};
+
+GType          gedit_bookmarks_app_activatable_get_type (void) G_GNUC_CONST;
+
+void           gedit_bookmarks_app_activatable_register (GTypeModule *module);
+
+G_END_DECLS
+
+#endif /* __GEDIT_BOOKMARKS_APP_ACTIVATABLE_H__ */
diff --git a/plugins/bookmarks/gedit-bookmarks-plugin.c b/plugins/bookmarks/gedit-bookmarks-plugin.c
index 2a0a38e..278a681 100644
--- a/plugins/bookmarks/gedit-bookmarks-plugin.c
+++ b/plugins/bookmarks/gedit-bookmarks-plugin.c
@@ -23,6 +23,7 @@
 #endif
 
 #include "gedit-bookmarks-plugin.h"
+#include "gedit-bookmarks-app-activatable.h"
 #include "messages/messages.h"
 
 #include <stdlib.h>
@@ -81,11 +82,14 @@ static void on_begin_user_action            (GtkTextBuffer *buffer,
 static void on_end_user_action                 (GtkTextBuffer *buffer,
                                                 InsertData    *data);
 
-static void on_toggle_bookmark_activate        (GtkAction            *action,
+static void on_toggle_bookmark_activate        (GAction              *action,
+                                                 GVariant             *parameter,
                                                 GeditBookmarksPlugin *plugin);
-static void on_next_bookmark_activate          (GtkAction            *action,
+static void on_next_bookmark_activate          (GAction              *action,
+                                                 GVariant             *parameter,
                                                 GeditBookmarksPlugin *plugin);
-static void on_previous_bookmark_activate      (GtkAction            *action,
+static void on_previous_bookmark_activate      (GAction              *action,
+                                                 GVariant             *parameter,
                                                 GeditBookmarksPlugin *plugin);
 static void on_tab_added                       (GeditWindow          *window,
                                                 GeditTab             *tab,
@@ -111,8 +115,10 @@ struct _GeditBookmarksPluginPrivate
 {
        GeditWindow *window;
 
-       GtkActionGroup *action_group;
-       guint ui_id;
+       GSimpleAction *action_toggle;
+       GSimpleAction *action_next;
+       GSimpleAction *action_prev;
+       GeditMenuExtension *menu;
 };
 
 enum
@@ -133,20 +139,15 @@ static void
 gedit_bookmarks_plugin_dispose (GObject *object)
 {
        GeditBookmarksPlugin *plugin = GEDIT_BOOKMARKS_PLUGIN (object);
+       GeditBookmarksPluginPrivate *priv = plugin->priv;
 
        gedit_debug_message (DEBUG_PLUGINS, "GeditBookmarksPlugin disposing");
 
-       if (plugin->priv->action_group != NULL)
-       {
-               g_object_unref (plugin->priv->action_group);
-               plugin->priv->action_group = NULL;
-       }
-
-       if (plugin->priv->window != NULL)
-       {
-               g_object_unref (plugin->priv->window);
-               plugin->priv->window = NULL;
-       }
+       g_clear_object (&priv->action_toggle);
+       g_clear_object (&priv->action_next);
+       g_clear_object (&priv->action_prev);
+       g_clear_object (&priv->menu);
+       g_clear_object (&priv->window);
 
        G_OBJECT_CLASS (gedit_bookmarks_plugin_parent_class)->dispose (object);
 }
@@ -197,76 +198,57 @@ free_insert_data (InsertData *data)
        g_slice_free (InsertData, data);
 }
 
-static GtkActionEntry const action_entries[] = {
-       {"ToggleBookmark", NULL, N_("Toggle Bookmark"), "<Control><Alt>B",
-        N_("Toggle bookmark status of the current line"),
-        G_CALLBACK (on_toggle_bookmark_activate)},
-       {"NextBookmark", NULL, N_("Goto Next Bookmark"), "<Control>B",
-        N_("Goto the next bookmark"),
-        G_CALLBACK (on_next_bookmark_activate)},
-       {"PreviousBookmark", NULL, N_("Goto Previous Bookmark"), "<Control><Shift>B",
-        N_("Goto the previous bookmark"),
-        G_CALLBACK (on_previous_bookmark_activate)}
-};
-
-static gchar const uidefinition[] = ""
-"<ui>"
-"  <menubar name='MenuBar'>"
-"    <menu name='EditMenu' action='Edit'>"
-"      <placeholder name='EditOps_6'>"
-"        <menuitem action='ToggleBookmark'/>"
-"        <menuitem action='PreviousBookmark'/>"
-"        <menuitem action='NextBookmark'/>"
-"      </placeholder>"
-"    </menu>"
-"  </menubar>"
-"</ui>";
-
 static void
 install_menu (GeditBookmarksPlugin *plugin)
 {
        GeditBookmarksPluginPrivate *priv;
-       GtkUIManager *manager;
-       GError *error = NULL;
+       GMenuItem *item;
 
        priv = plugin->priv;
 
-       manager = gedit_window_get_ui_manager (priv->window);
-       priv->action_group = gtk_action_group_new ("GeditBookmarksPluginActions");
-
-       gtk_action_group_set_translation_domain (priv->action_group,
-                                                GETTEXT_PACKAGE);
-
-       gtk_action_group_add_actions (priv->action_group,
-                                     action_entries,
-                                     G_N_ELEMENTS (action_entries),
-                                     plugin);
-
-       gtk_ui_manager_insert_action_group (manager, priv->action_group, -1);
-       priv->ui_id = gtk_ui_manager_add_ui_from_string (manager, uidefinition, -1, &error);
-
-       if (!priv->ui_id)
-       {
-               g_warning ("Could not load UI: %s", error->message);
-               g_error_free (error);
-       }
+       priv->action_toggle = g_simple_action_new ("bookmark-toggle", NULL);
+       g_signal_connect (priv->action_toggle, "activate",
+                         G_CALLBACK (on_toggle_bookmark_activate), plugin);
+       g_action_map_add_action (G_ACTION_MAP (priv->window),
+                                G_ACTION (priv->action_toggle));
+
+       priv->action_next = g_simple_action_new ("bookmark-next", NULL);
+       g_signal_connect (priv->action_next, "activate",
+                         G_CALLBACK (on_next_bookmark_activate), plugin);
+       g_action_map_add_action (G_ACTION_MAP (priv->window),
+                                G_ACTION (priv->action_next));
+
+       priv->action_prev = g_simple_action_new ("bookmark-prev", NULL);
+       g_signal_connect (priv->action_prev, "activate",
+                         G_CALLBACK (on_previous_bookmark_activate), plugin);
+       g_action_map_add_action (G_ACTION_MAP (priv->window),
+                                G_ACTION (priv->action_prev));
+
+       priv->menu = gedit_window_activatable_extend_gear_menu (GEDIT_WINDOW_ACTIVATABLE (plugin),
+                                                               "ext3");
+       item = g_menu_item_new (_("Toggle Bookmark"), "win.bookmark-toggle");
+       gedit_menu_extension_append_menu_item (priv->menu, item);
+       g_object_unref (item);
+
+       item = g_menu_item_new (_("Goto Next Bookmark"), "win.bookmark-next");
+       gedit_menu_extension_append_menu_item (priv->menu, item);
+       g_object_unref (item);
+
+       item = g_menu_item_new (_("Goto Previous Bookmark"), "win.bookmark-prev");
+       gedit_menu_extension_append_menu_item (priv->menu, item);
+       g_object_unref (item);
 }
 
 static void
 uninstall_menu (GeditBookmarksPlugin *plugin)
 {
        GeditBookmarksPluginPrivate *priv;
-       GtkUIManager *manager;
 
        priv = plugin->priv;
 
-       manager = gedit_window_get_ui_manager (priv->window);
-
-       gtk_ui_manager_remove_ui (manager, priv->ui_id);
-       gtk_ui_manager_remove_action_group (manager, priv->action_group);
-
-       g_object_unref (priv->action_group);
-       priv->action_group = NULL;
+       g_action_map_remove_action (G_ACTION_MAP (priv->window), "bookmark-toggle");
+       g_action_map_remove_action (G_ACTION_MAP (priv->window), "bookmark-next");
+       g_action_map_remove_action (G_ACTION_MAP (priv->window), "bookmark-prev");
 }
 
 static void
@@ -782,10 +764,15 @@ static void
 gedit_bookmarks_plugin_update_state (GeditWindowActivatable *activatable)
 {
        GeditBookmarksPluginPrivate *priv;
+       gboolean enabled;
 
        priv = GEDIT_BOOKMARKS_PLUGIN (activatable)->priv;
-       gtk_action_group_set_sensitive (priv->action_group,
-                                       gedit_window_get_active_view (priv->window) != NULL);
+
+       enabled = gedit_window_get_active_view (priv->window) != NULL;
+
+       g_simple_action_set_enabled (priv->action_toggle, enabled);
+       g_simple_action_set_enabled (priv->action_next, enabled);
+       g_simple_action_set_enabled (priv->action_prev, enabled);
 }
 
 static void
@@ -1135,8 +1122,9 @@ toggle_bookmark (GtkSourceBuffer *buffer,
 }
 
 static void
-on_toggle_bookmark_activate (GtkAction            *action,
-                            GeditBookmarksPlugin *plugin)
+on_toggle_bookmark_activate (GAction              *action,
+                             GVariant             *parameter,
+                             GeditBookmarksPlugin *plugin)
 {
        GtkSourceBuffer *buffer;
 
@@ -1146,8 +1134,9 @@ on_toggle_bookmark_activate (GtkAction            *action,
 }
 
 static void
-on_next_bookmark_activate (GtkAction            *action,
-                          GeditBookmarksPlugin *plugin)
+on_next_bookmark_activate (GAction              *action,
+                           GVariant             *parameter,
+                           GeditBookmarksPlugin *plugin)
 {
        goto_bookmark (plugin->priv->window,
                       NULL,
@@ -1157,8 +1146,9 @@ on_next_bookmark_activate (GtkAction            *action,
 }
 
 static void
-on_previous_bookmark_activate (GtkAction            *action,
-                              GeditBookmarksPlugin *plugin)
+on_previous_bookmark_activate (GAction              *action,
+                               GVariant             *parameter,
+                               GeditBookmarksPlugin *plugin)
 {
        goto_bookmark (plugin->priv->window,
                       NULL,
@@ -1242,6 +1232,7 @@ G_MODULE_EXPORT void
 peas_register_types (PeasObjectModule *module)
 {
        gedit_bookmarks_plugin_register_type (G_TYPE_MODULE (module));
+       gedit_bookmarks_app_activatable_register (G_TYPE_MODULE (module));
 
        peas_object_module_register_extension_type (module,
                                                    GEDIT_TYPE_WINDOW_ACTIVATABLE,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]