1 /* gbp-code-index-workbench-addin.c
2  *
3  * Copyright 2018-2019 Christian Hergert <chergert@redhat.com>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  * SPDX-License-Identifier: GPL-3.0-or-later
19  */
20 
21 #define G_LOG_DOMAIN "gbp-code-index-workbench-addin"
22 
23 #include "config.h"
24 
25 #include <dazzle.h>
26 #include <libide-foundry.h>
27 #include <libide-gui.h>
28 #include <libide-plugins.h>
29 
30 #include "gbp-code-index-service.h"
31 #include "gbp-code-index-workbench-addin.h"
32 
33 struct _GbpCodeIndexWorkbenchAddin
34 {
35   GObject       parent_instance;
36   IdeWorkbench *workbench;
37 };
38 
39 static void gbp_code_index_workbench_addin_notify_paused (GbpCodeIndexWorkbenchAddin *self,
40                                                           GParamSpec                 *pspec,
41                                                           GbpCodeIndexService        *service);
42 
43 static void
gbp_code_index_workbench_addin_load(IdeWorkbenchAddin * addin,IdeWorkbench * workbench)44 gbp_code_index_workbench_addin_load (IdeWorkbenchAddin *addin,
45                                      IdeWorkbench      *workbench)
46 {
47   GbpCodeIndexWorkbenchAddin *self = (GbpCodeIndexWorkbenchAddin *)addin;
48 
49   g_assert (IDE_IS_MAIN_THREAD ());
50   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (self));
51   g_assert (IDE_IS_WORKBENCH (workbench));
52 
53   self->workbench = workbench;
54 }
55 
56 static void
gbp_code_index_workbench_addin_unload(IdeWorkbenchAddin * addin,IdeWorkbench * workbench)57 gbp_code_index_workbench_addin_unload (IdeWorkbenchAddin *addin,
58                                        IdeWorkbench      *workbench)
59 {
60   GbpCodeIndexWorkbenchAddin *self = (GbpCodeIndexWorkbenchAddin *)addin;
61 
62   g_assert (IDE_IS_MAIN_THREAD ());
63   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (self));
64   g_assert (IDE_IS_WORKBENCH (workbench));
65 
66   if (ide_workbench_has_project (workbench))
67     {
68       GbpCodeIndexService *service;
69       IdeContext *context;
70 
71       context = ide_workbench_get_context (workbench);
72       service = gbp_code_index_service_from_context (context);
73       ide_object_destroy (IDE_OBJECT (service));
74     }
75 
76   self->workbench = NULL;
77 }
78 
79 static void
gbp_code_index_workbench_addin_project_loaded(IdeWorkbenchAddin * addin,IdeProjectInfo * project_info)80 gbp_code_index_workbench_addin_project_loaded (IdeWorkbenchAddin *addin,
81                                                IdeProjectInfo    *project_info)
82 {
83   GbpCodeIndexWorkbenchAddin *self = (GbpCodeIndexWorkbenchAddin *)addin;
84   GbpCodeIndexService *service;
85   IdeContext *context;
86 
87   g_assert (IDE_IS_MAIN_THREAD ());
88   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (self));
89   g_assert (IDE_IS_PROJECT_INFO (project_info));
90 
91   context = ide_workbench_get_context (self->workbench);
92   service = gbp_code_index_service_from_context (context);
93   g_signal_connect_object (service,
94                            "notify::paused",
95                            G_CALLBACK (gbp_code_index_workbench_addin_notify_paused),
96                            self,
97                            G_CONNECT_SWAPPED);
98   gbp_code_index_workbench_addin_notify_paused (self, NULL, service);
99 }
100 
101 static void
gbp_code_index_workbench_addin_workspace_added(IdeWorkbenchAddin * addin,IdeWorkspace * workspace)102 gbp_code_index_workbench_addin_workspace_added (IdeWorkbenchAddin *addin,
103                                                 IdeWorkspace      *workspace)
104 {
105   GbpCodeIndexWorkbenchAddin *self = (GbpCodeIndexWorkbenchAddin *)addin;
106 
107   g_assert (IDE_IS_MAIN_THREAD ());
108   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (self));
109   g_assert (IDE_IS_WORKSPACE (workspace));
110 
111   gtk_widget_insert_action_group (GTK_WIDGET (workspace), "code-index", G_ACTION_GROUP (self));
112 }
113 
114 static void
gbp_code_index_workbench_addin_workspace_removed(IdeWorkbenchAddin * addin,IdeWorkspace * workspace)115 gbp_code_index_workbench_addin_workspace_removed (IdeWorkbenchAddin *addin,
116                                                   IdeWorkspace      *workspace)
117 {
118   g_assert (IDE_IS_MAIN_THREAD ());
119   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (addin));
120   g_assert (IDE_IS_WORKSPACE (workspace));
121 
122   gtk_widget_insert_action_group (GTK_WIDGET (workspace), "code-index", NULL);
123 }
124 
125 static void
workbench_addin_iface_init(IdeWorkbenchAddinInterface * iface)126 workbench_addin_iface_init (IdeWorkbenchAddinInterface *iface)
127 {
128   iface->load = gbp_code_index_workbench_addin_load;
129   iface->unload = gbp_code_index_workbench_addin_unload;
130   iface->project_loaded = gbp_code_index_workbench_addin_project_loaded;
131   iface->workspace_added = gbp_code_index_workbench_addin_workspace_added;
132   iface->workspace_removed = gbp_code_index_workbench_addin_workspace_removed;
133 }
134 
135 static void
gbp_code_index_workbench_addin_paused(GbpCodeIndexWorkbenchAddin * self,GVariant * state)136 gbp_code_index_workbench_addin_paused (GbpCodeIndexWorkbenchAddin *self,
137                                        GVariant                   *state)
138 {
139   GbpCodeIndexService *service;
140   IdeContext *context;
141 
142   g_assert (IDE_IS_MAIN_THREAD ());
143   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (self));
144 
145   if (state == NULL || !g_variant_is_of_type (state, G_VARIANT_TYPE_BOOLEAN))
146     return;
147 
148   context = ide_workbench_get_context (self->workbench);
149   service = gbp_code_index_service_from_context (context);
150   gbp_code_index_service_set_paused (service, g_variant_get_boolean (state));
151 }
152 
153 DZL_DEFINE_ACTION_GROUP (GbpCodeIndexWorkbenchAddin, gbp_code_index_workbench_addin, {
154   { "paused", NULL, NULL, "false", gbp_code_index_workbench_addin_paused },
155 })
156 
G_DEFINE_FINAL_TYPE_WITH_CODE(GbpCodeIndexWorkbenchAddin,gbp_code_index_workbench_addin,G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP,gbp_code_index_workbench_addin_init_action_group)G_IMPLEMENT_INTERFACE (IDE_TYPE_WORKBENCH_ADDIN,workbench_addin_iface_init))157 G_DEFINE_FINAL_TYPE_WITH_CODE (GbpCodeIndexWorkbenchAddin, gbp_code_index_workbench_addin, G_TYPE_OBJECT,
158                          G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP,
159                                                 gbp_code_index_workbench_addin_init_action_group)
160                          G_IMPLEMENT_INTERFACE (IDE_TYPE_WORKBENCH_ADDIN, workbench_addin_iface_init))
161 
162 static void
163 gbp_code_index_workbench_addin_class_init (GbpCodeIndexWorkbenchAddinClass *klass)
164 {
165 }
166 
167 static void
gbp_code_index_workbench_addin_init(GbpCodeIndexWorkbenchAddin * self)168 gbp_code_index_workbench_addin_init (GbpCodeIndexWorkbenchAddin *self)
169 {
170 }
171 
172 static void
gbp_code_index_workbench_addin_notify_paused(GbpCodeIndexWorkbenchAddin * self,GParamSpec * pspec,GbpCodeIndexService * service)173 gbp_code_index_workbench_addin_notify_paused (GbpCodeIndexWorkbenchAddin *self,
174                                               GParamSpec                 *pspec,
175                                               GbpCodeIndexService        *service)
176 {
177   gboolean paused;
178 
179   g_assert (IDE_IS_MAIN_THREAD ());
180   g_assert (GBP_IS_CODE_INDEX_WORKBENCH_ADDIN (self));
181   g_assert (GBP_IS_CODE_INDEX_SERVICE (service));
182 
183   paused = gbp_code_index_service_get_paused (service);
184   gbp_code_index_workbench_addin_set_action_state (self,
185                                                    "paused",
186                                                    g_variant_new_boolean (paused));
187 }
188 
189