~ubuntu-branches/debian/stretch/gnome-builder/stretch

« back to all changes in this revision

Viewing changes to src/workbench/gb-workbench-actions.c

  • Committer: Package Import Robot
  • Author(s): Andreas Henriksson
  • Date: 2015-10-11 12:38:45 UTC
  • Revision ID: package-import@ubuntu.com-20151011123845-a0hvkz01se0p1p5a
Tags: upstream-3.16.3
ImportĀ upstreamĀ versionĀ 3.16.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* gb-workbench-actions.c
 
2
 *
 
3
 * Copyright (C) 2015 Christian Hergert <christian@hergert.me>
 
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
 
 
19
#define G_LOG_DOMAIN "gb-workbench-actions"
 
20
 
 
21
#include <glib/gi18n.h>
 
22
#include <gtk/gtk.h>
 
23
 
 
24
#include "gb-workbench.h"
 
25
#include "gb-workbench-actions.h"
 
26
#include "gb-workbench-private.h"
 
27
 
 
28
static void
 
29
gb_workbench_actions_build (GSimpleAction *action,
 
30
                            GVariant      *parameter,
 
31
                            gpointer       user_data)
 
32
{
 
33
  GbWorkbench *self = user_data;
 
34
 
 
35
  g_assert (GB_IS_WORKBENCH (self));
 
36
 
 
37
  gb_workbench_build_async (self, FALSE, NULL, NULL, NULL);
 
38
}
 
39
 
 
40
static void
 
41
gb_workbench_actions_rebuild (GSimpleAction *action,
 
42
                              GVariant      *parameter,
 
43
                              gpointer       user_data)
 
44
{
 
45
  GbWorkbench *self = user_data;
 
46
 
 
47
  g_assert (GB_IS_WORKBENCH (self));
 
48
 
 
49
  gb_workbench_build_async (self, TRUE, NULL, NULL, NULL);
 
50
}
 
51
 
 
52
static void
 
53
gb_workbench_actions_new_document (GSimpleAction *action,
 
54
                                   GVariant      *parameter,
 
55
                                   gpointer       user_data)
 
56
{
 
57
  GbWorkbench *self = user_data;
 
58
 
 
59
  g_assert (GB_IS_WORKBENCH (self));
 
60
 
 
61
  gb_workbench_add_temporary_buffer (self);
 
62
}
 
63
 
 
64
static void
 
65
gb_workbench_actions_global_search (GSimpleAction *action,
 
66
                                    GVariant      *parameter,
 
67
                                    gpointer       user_data)
 
68
{
 
69
  GbWorkbench *self = user_data;
 
70
 
 
71
  g_assert (GB_IS_WORKBENCH (self));
 
72
 
 
73
  gtk_widget_grab_focus (GTK_WIDGET (self->search_box));
 
74
}
 
75
 
 
76
static void
 
77
gb_workbench_actions_open_uri_list (GSimpleAction *action,
 
78
                                    GVariant      *parameter,
 
79
                                    gpointer       user_data)
 
80
{
 
81
  GbWorkbench *self = user_data;
 
82
  const gchar **uri_list;
 
83
 
 
84
  g_assert (GB_IS_WORKBENCH (self));
 
85
 
 
86
  uri_list = g_variant_get_strv (parameter, NULL);
 
87
 
 
88
  if (uri_list != NULL)
 
89
    {
 
90
      gb_workbench_open_uri_list (self, (const gchar * const *)uri_list);
 
91
      g_free (uri_list);
 
92
    }
 
93
}
 
94
 
 
95
static void
 
96
gb_workbench_actions_open_response (GtkFileChooser *chooser,
 
97
                                    gint            response_id,
 
98
                                    gpointer        user_data)
 
99
{
 
100
  g_autoptr(GbWorkbench) self = user_data;
 
101
 
 
102
  g_assert (GB_IS_WORKBENCH (self));
 
103
 
 
104
  gtk_widget_hide (GTK_WIDGET (chooser));
 
105
 
 
106
  switch (response_id)
 
107
    {
 
108
    case GTK_RESPONSE_OK:
 
109
      {
 
110
        GSList *files;
 
111
        GSList *iter;
 
112
        gchar *file_uri;
 
113
        gchar *uri;
 
114
 
 
115
        file_uri = gtk_file_chooser_get_uri (chooser);
 
116
        uri = g_path_get_dirname (file_uri);
 
117
        if (g_strcmp0 (self->current_folder_uri, uri) != 0)
 
118
          {
 
119
            g_free (self->current_folder_uri);
 
120
            self->current_folder_uri = uri;
 
121
            uri = NULL;
 
122
          }
 
123
        g_free (uri);
 
124
        g_free (file_uri);
 
125
 
 
126
        files = gtk_file_chooser_get_files (chooser);
 
127
        for (iter = files; iter; iter = iter->next)
 
128
          {
 
129
            gb_workbench_open (self, G_FILE (iter->data));
 
130
            g_clear_object (&iter->data);
 
131
          }
 
132
        g_slist_free (files);
 
133
      }
 
134
      break;
 
135
 
 
136
    case GTK_RESPONSE_CANCEL:
 
137
    default:
 
138
      break;
 
139
    }
 
140
 
 
141
  gtk_widget_destroy (GTK_WIDGET (chooser));
 
142
}
 
143
 
 
144
static void
 
145
gb_workbench_actions_open (GSimpleAction *action,
 
146
                           GVariant      *param,
 
147
                           gpointer       user_data)
 
148
{
 
149
  GbWorkbench *self = user_data;
 
150
  GtkDialog *dialog;
 
151
  GtkWidget *suggested;
 
152
 
 
153
  g_assert (GB_IS_WORKBENCH (self));
 
154
 
 
155
  dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
 
156
                         "action", GTK_FILE_CHOOSER_ACTION_OPEN,
 
157
                         "local-only", FALSE,
 
158
                         "modal", TRUE,
 
159
                         "select-multiple", TRUE,
 
160
                         "show-hidden", FALSE,
 
161
                         "transient-for", self,
 
162
                         "title", _("Open Document"),
 
163
                         NULL);
 
164
 
 
165
  if (self->current_folder_uri != NULL)
 
166
    gtk_file_chooser_set_current_folder_uri  (GTK_FILE_CHOOSER (dialog), self->current_folder_uri);
 
167
 
 
168
  gtk_dialog_add_buttons (GTK_DIALOG (dialog),
 
169
                          _("Cancel"), GTK_RESPONSE_CANCEL,
 
170
                          _("Open"), GTK_RESPONSE_OK,
 
171
                          NULL);
 
172
 
 
173
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
 
174
 
 
175
  suggested = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
 
176
  gtk_style_context_add_class (gtk_widget_get_style_context (suggested),
 
177
                               GTK_STYLE_CLASS_SUGGESTED_ACTION);
 
178
 
 
179
  g_signal_connect (dialog,
 
180
                    "response",
 
181
                    G_CALLBACK (gb_workbench_actions_open_response),
 
182
                    g_object_ref (self));
 
183
 
 
184
  gtk_window_present (GTK_WINDOW (dialog));
 
185
}
 
186
 
 
187
static void
 
188
gb_workbench_actions_save_all (GSimpleAction *action,
 
189
                               GVariant      *parameter,
 
190
                               gpointer       user_data)
 
191
{
 
192
  GbWorkbench *self = user_data;
 
193
  IdeBufferManager *buffer_manager;
 
194
 
 
195
  g_assert (GB_IS_WORKBENCH (self));
 
196
 
 
197
  buffer_manager = ide_context_get_buffer_manager (self->context);
 
198
  ide_buffer_manager_save_all_async (buffer_manager, NULL, NULL, NULL);
 
199
}
 
200
 
 
201
static void
 
202
save_all_quit_cb (GObject      *object,
 
203
                  GAsyncResult *result,
 
204
                  gpointer      user_data)
 
205
{
 
206
  IdeBufferManager *buffer_manager = (IdeBufferManager *)object;
 
207
  g_autoptr(GbWorkbench) self = user_data;
 
208
 
 
209
  g_assert (GB_IS_WORKBENCH (self));
 
210
  g_assert (IDE_IS_BUFFER_MANAGER (buffer_manager));
 
211
 
 
212
  /* TODO: We should find a way to propagate error info back.
 
213
   *       Right now, save_all doesn't.
 
214
   */
 
215
 
 
216
  ide_buffer_manager_save_all_finish (buffer_manager, result, NULL);
 
217
  gtk_window_close (GTK_WINDOW (self));
 
218
}
 
219
 
 
220
static void
 
221
gb_workbench_actions_save_all_quit (GSimpleAction *action,
 
222
                                    GVariant      *parameter,
 
223
                                    gpointer       user_data)
 
224
{
 
225
  GbWorkbench *self = user_data;
 
226
  IdeBufferManager *buffer_manager;
 
227
 
 
228
  g_assert (GB_IS_WORKBENCH (self));
 
229
 
 
230
  buffer_manager = ide_context_get_buffer_manager (self->context);
 
231
  ide_buffer_manager_save_all_async (buffer_manager, NULL, save_all_quit_cb, g_object_ref (self));
 
232
}
 
233
 
 
234
static void
 
235
gb_workbench_actions_show_command_bar (GSimpleAction *action,
 
236
                                       GVariant      *parameter,
 
237
                                       gpointer       user_data)
 
238
{
 
239
  GbWorkbench *self = user_data;
 
240
 
 
241
  g_assert (GB_IS_WORKBENCH (self));
 
242
 
 
243
  gb_command_bar_show (self->command_bar);
 
244
}
 
245
 
 
246
static void
 
247
gb_workbench_actions_nighthack (GSimpleAction *action,
 
248
                                GVariant      *parameter,
 
249
                                gpointer       user_data)
 
250
{
 
251
  g_autoptr(GSettings) settings = NULL;
 
252
 
 
253
  g_object_set (gtk_settings_get_default (),
 
254
                "gtk-application-prefer-dark-theme", TRUE,
 
255
                NULL);
 
256
 
 
257
  settings = g_settings_new ("org.gnome.builder.editor");
 
258
  g_settings_set_string (settings, "style-scheme-name", "builder-dark");
 
259
}
 
260
 
 
261
static void
 
262
gb_workbench_actions_dayhack (GSimpleAction *action,
 
263
                              GVariant      *parameter,
 
264
                              gpointer       user_data)
 
265
{
 
266
  g_autoptr(GSettings) settings = NULL;
 
267
 
 
268
  g_object_set (gtk_settings_get_default (),
 
269
                "gtk-application-prefer-dark-theme", FALSE,
 
270
                NULL);
 
271
 
 
272
  settings = g_settings_new ("org.gnome.builder.editor");
 
273
  g_settings_set_string (settings, "style-scheme-name", "builder");
 
274
}
 
275
 
 
276
static void
 
277
gb_workbench_actions_search_docs (GSimpleAction *action,
 
278
                                  GVariant      *parameter,
 
279
                                  gpointer       user_data)
 
280
{
 
281
  GbWorkbench *self = user_data;
 
282
  const gchar *str;
 
283
 
 
284
  g_return_if_fail (GB_IS_WORKBENCH (self));
 
285
 
 
286
  str = g_variant_get_string (parameter, NULL);
 
287
  gb_editor_workspace_search_help (self->editor_workspace, str);
 
288
}
 
289
 
 
290
static void
 
291
gb_workbench_actions_show_gear_menu (GSimpleAction *action,
 
292
                                     GVariant      *parameter,
 
293
                                     gpointer       user_data)
 
294
{
 
295
  GbWorkbench *self = user_data;
 
296
 
 
297
  g_assert (GB_IS_WORKBENCH (self));
 
298
 
 
299
  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->gear_menu_button), TRUE);
 
300
}
 
301
 
 
302
static const GActionEntry GbWorkbenchActions[] = {
 
303
  { "build",            gb_workbench_actions_build },
 
304
  { "dayhack",          gb_workbench_actions_dayhack },
 
305
  { "global-search",    gb_workbench_actions_global_search },
 
306
  { "new-document",     gb_workbench_actions_new_document },
 
307
  { "nighthack",        gb_workbench_actions_nighthack },
 
308
  { "open",             gb_workbench_actions_open },
 
309
  { "open-uri-list",    gb_workbench_actions_open_uri_list, "as" },
 
310
  { "rebuild",          gb_workbench_actions_rebuild },
 
311
  { "save-all",         gb_workbench_actions_save_all },
 
312
  { "save-all-quit",    gb_workbench_actions_save_all_quit },
 
313
  { "search-docs",      gb_workbench_actions_search_docs, "s" },
 
314
  { "show-command-bar", gb_workbench_actions_show_command_bar },
 
315
  { "show-gear-menu",   gb_workbench_actions_show_gear_menu },
 
316
};
 
317
 
 
318
void
 
319
gb_workbench_actions_init (GbWorkbench *self)
 
320
{
 
321
  GSimpleActionGroup *actions;
 
322
  GAction *action;
 
323
 
 
324
  g_assert (GB_IS_WORKBENCH (self));
 
325
 
 
326
  actions = g_simple_action_group_new ();
 
327
  g_action_map_add_action_entries (G_ACTION_MAP (actions), GbWorkbenchActions,
 
328
                                   G_N_ELEMENTS (GbWorkbenchActions), self);
 
329
 
 
330
  action = g_action_map_lookup_action (G_ACTION_MAP (actions), "build");
 
331
  g_object_bind_property (self, "building", action, "enabled",
 
332
                          (G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN));
 
333
 
 
334
  action = g_action_map_lookup_action (G_ACTION_MAP (actions), "rebuild");
 
335
  g_object_bind_property (self, "building", action, "enabled",
 
336
                          (G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN));
 
337
 
 
338
  gtk_widget_insert_action_group (GTK_WIDGET (self), "workbench", G_ACTION_GROUP (actions));
 
339
}