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