コード例 #1
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static void
gb_vim_command_split_cb (GObject      *object,
                         GAsyncResult *result,
                         gpointer      user_data)
{
  IdeWorkbench *workbench = (IdeWorkbench *)object;
  SplitCallbackData *split_callback_data = user_data;
  GtkWidget *active_widget;
  const gchar *file_path;
  GVariant *variant;
  g_autoptr(GError) error = NULL;

  g_assert (IDE_IS_WORKBENCH (workbench));
  g_assert (split_callback_data != NULL);

  if (ide_workbench_open_finish (workbench, result, &error))
    {
      active_widget = split_callback_data->active_widget;
      file_path = split_callback_data->file_path;
      variant = g_variant_new_string (file_path);

      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "split-page", variant);
    }

  g_clear_object (&split_callback_data->active_widget);
  g_clear_pointer (&split_callback_data->file_path, g_free);
  g_slice_free (SplitCallbackData, split_callback_data);
}
コード例 #2
0
static void
gb_vim_command_vsplit_cb (GObject      *object,
                          GAsyncResult *result,
                          gpointer      user_data)
{
  SplitCallbackData *split_callback_data = (SplitCallbackData *)user_data;
  IdeWorkbench *workbench;
  GtkWidget *active_widget;
  const gchar *file_path;
  GVariant *variant;
  g_autoptr(GError) error = NULL;

  workbench = IDE_WORKBENCH (object);
  if (ide_workbench_open_files_finish (workbench,result, &error))
    {
      active_widget = split_callback_data->active_widget;
      file_path = split_callback_data->file_path;
      variant = g_variant_new_string (file_path);

      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "open-in-new-frame", variant);
    }

  g_object_unref (split_callback_data->active_widget);
  g_free (split_callback_data->file_path);
  g_slice_free (SplitCallbackData, split_callback_data);
}
コード例 #3
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_quit (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  g_assert (GTK_IS_WIDGET (active_widget));

  if (IDE_IS_EDITOR_PAGE (active_widget))
    {
      IdeSourceView *source_view = ide_editor_page_get_view (IDE_EDITOR_PAGE (active_widget));

      dzl_gtk_widget_action (GTK_WIDGET (source_view), "editor-page", "save", NULL);
    }

  dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "close-page", NULL);

  return TRUE;
}
コード例 #4
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_buffers (GtkWidget      *active_widget,
                        const gchar    *command,
                        const gchar    *options,
                        GError        **error)
{
  g_assert (GTK_IS_WIDGET (active_widget));

  dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "show-list", NULL);

  return TRUE;
}
コード例 #5
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_make (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  g_assert (GTK_IS_WIDGET (active_widget));

  /* TODO: check for an open project */
  dzl_gtk_widget_action (GTK_WIDGET (active_widget), "build-manager", "build", NULL);

  return TRUE;
}
コード例 #6
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_tabe (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  g_assert (GTK_IS_WIDGET (active_widget));

  if (!ide_str_empty0 (options))
    return gb_vim_command_edit (active_widget, command, options, error);

  dzl_gtk_widget_action (GTK_WIDGET (active_widget), "editor", "new-file", NULL);

  return TRUE;
}
コード例 #7
0
static gboolean
gb_vim_command_help (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  GVariant *param;

  g_assert (GTK_IS_WIDGET (active_widget));

  param = g_variant_new_string (options);
  dzl_gtk_widget_action (GTK_WIDGET (active_widget), "workbench", "search-docs", param);

  return TRUE;
}
コード例 #8
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_bprevious (GtkWidget      *active_widget,
                          const gchar    *command,
                          const gchar    *options,
                          GError        **error)
{
  IdeFrame *frame_;

  g_assert (GTK_IS_WIDGET (active_widget));

  if ((frame_ = (IdeFrame *)gtk_widget_get_ancestor (active_widget, IDE_TYPE_FRAME)) &&
      g_list_model_get_n_items (G_LIST_MODEL (frame_)) > 0)
    dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "previous-page", NULL);

  return TRUE;
}
コード例 #9
0
static gboolean
gb_vim_command_edit (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  IdeWorkbench *workbench;
  IdeContext *context;
  IdeVcs *vcs;
  GFile *workdir;
  GFile *file = NULL;

  g_assert (GTK_IS_WIDGET (active_widget));

  if (dzl_str_empty0 (options))
    {
      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "win", "open-with-dialog", NULL);
      return TRUE;
    }

  if (!(workbench = ide_widget_get_workbench (active_widget)) ||
      !(context = ide_workbench_get_context (workbench)) ||
      !(vcs = ide_context_get_vcs (context)) ||
      !(workdir = ide_vcs_get_working_directory (vcs)))
    {
      g_set_error (error,
                   GB_VIM_ERROR,
                   GB_VIM_ERROR_NOT_SOURCE_VIEW,
                   _("Failed to locate working directory"));
      return FALSE;
    }

  if (g_path_is_absolute (options))
    file = g_file_new_for_path (options);
  else
    file = g_file_get_child (workdir, options);

  ide_workbench_open_files_async (workbench, &file, 1, "editor", IDE_WORKBENCH_OPEN_FLAGS_NONE, NULL, NULL, NULL);

  g_clear_object (&file);

  return TRUE;
}
コード例 #10
0
static gboolean
gb_vim_command_write (GtkWidget      *active_widget,
                      const gchar    *command,
                      const gchar    *options,
                      GError        **error)
{
  g_assert (GTK_IS_WIDGET (active_widget));

  if (IDE_IS_EDITOR_VIEW (active_widget))
    {
      IdeSourceView *source_view = ide_editor_view_get_view (IDE_EDITOR_VIEW (active_widget));

      dzl_gtk_widget_action (GTK_WIDGET (source_view), "editor-view", "save", NULL);

      return TRUE;
    }
  else
    return gb_vim_set_source_view_error (error);
}
コード例 #11
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static void
gb_vim_command_vsplit_cb (GObject      *object,
                          GAsyncResult *result,
                          gpointer      user_data)
{
  IdeWorkbench *workbench = (IdeWorkbench *)object;
  SplitCallbackData *split_callback_data = user_data;
  g_autoptr(GError) error = NULL;

  g_assert (IDE_IS_WORKBENCH (workbench));
  g_assert (split_callback_data != NULL);

  if (ide_workbench_open_finish (workbench,result, &error))
    dzl_gtk_widget_action (split_callback_data->active_widget,
                           "frame",
                           "open-in-new-frame",
                           g_variant_new_string (split_callback_data->file_path));

  g_clear_object (&split_callback_data->active_widget);
  g_clear_pointer (&split_callback_data->file_path, g_free);
  g_slice_free (SplitCallbackData, split_callback_data);
}
コード例 #12
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_vsplit (GtkWidget    *active_widget,
                       const gchar  *command,
                       const gchar  *options,
                       GError      **error)
{
  GVariant *variant;

  g_assert (GTK_IS_WIDGET (active_widget));

  if (!IDE_IS_PAGE (active_widget))
    return gb_vim_set_no_view_error (error);

  if (ide_str_empty0 (options))
    {
      variant = g_variant_new_string ("");
      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "open-in-new-frame", variant);

      return TRUE;
    }
  else
    return load_split_async (active_widget, options, gb_vim_command_vsplit_cb, error);
}
コード例 #13
0
static gboolean
gb_vim_command_bprevious (GtkWidget      *active_widget,
                          const gchar    *command,
                          const gchar    *options,
                          GError        **error)
{
  IdeWorkbench *workbench;
  IdeContext *context;
  IdeBufferManager *bufmgr;
  guint n_buffers;

  g_assert (GTK_IS_WIDGET (active_widget));

  workbench = ide_widget_get_workbench (GTK_WIDGET (active_widget));
  context = ide_workbench_get_context (workbench);
  bufmgr = ide_context_get_buffer_manager (context);
  n_buffers = ide_buffer_manager_get_n_buffers (bufmgr);

  if (n_buffers > 0)
    dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "previous-view", NULL);

  return TRUE;
}
コード例 #14
0
static gboolean
gb_vim_command_split (GtkWidget    *active_widget,
                      const gchar  *command,
                      const gchar  *options,
                      GError      **error)
{
  GVariant *variant;

  g_assert (GTK_IS_WIDGET (active_widget));

  if (!IDE_IS_LAYOUT_VIEW (active_widget))
    return gb_vim_set_no_view_error (error);

  if (dzl_str_empty0 (options))
    {
      variant = g_variant_new_string ("");
      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "split-view", variant);

      return TRUE;
    }
  else
    return load_split_async (active_widget, options, gb_vim_command_split_cb, error);
}
コード例 #15
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_edit (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  g_autoptr(GFile) workdir = NULL;
  g_autoptr(GFile) file = NULL;
  IdeWorkbench *workbench;

  g_assert (GTK_IS_WIDGET (active_widget));

  if (ide_str_empty0 (options))
    {
      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "workbench", "open", NULL);
      return TRUE;
    }

  if (!(workdir = find_workdir (active_widget)))
    {
      g_set_error (error,
                   GB_VIM_ERROR,
                   GB_VIM_ERROR_NOT_SOURCE_VIEW,
                   _("Failed to locate working directory"));
      return FALSE;
    }

  if (g_path_is_absolute (options))
    file = g_file_new_for_path (options);
  else
    file = g_file_get_child (workdir, options);

  workbench = ide_widget_get_workbench (active_widget);
  ide_workbench_open_async (workbench, file, "editor", 0, NULL, NULL, NULL);

  return TRUE;
}
コード例 #16
0
static void
open_project (GSimpleAction *action,
              GVariant      *param,
              gpointer       user_data)
{
  GbpGreeterApplicationAddin *self = user_data;
  g_autoptr(IdeWorkbench) workbench = NULL;
  IdeGreeterWorkspace *workspace;

  g_assert (!action || G_IS_SIMPLE_ACTION (action));
  g_assert (!param || g_variant_is_of_type (param, G_VARIANT_TYPE_STRING));
  g_assert (GBP_IS_GREETER_APPLICATION_ADDIN (self));
  g_assert (IDE_IS_APPLICATION (self->application));

  workbench = ide_workbench_new ();
  ide_application_add_workbench (self->application, workbench);

  workspace = ide_greeter_workspace_new (self->application);
  ide_workbench_add_workspace (workbench, IDE_WORKSPACE (workspace));

  ide_workbench_focus_workspace (workbench, IDE_WORKSPACE (workspace));

  dzl_gtk_widget_action (GTK_WIDGET (workspace), "win", "open", NULL);
}
コード例 #17
0
ファイル: gb-vim.c プロジェクト: GNOME/gnome-builder
static gboolean
gb_vim_command_substitute (GtkWidget    *active_widget,
                           const gchar  *command,
                           const gchar  *options,
                           GError      **error)
{
  IdeSourceView  *source_view;
  GtkTextBuffer *buffer;
  const gchar *search_begin = NULL;
  const gchar *search_end = NULL;
  const gchar *replace_begin = NULL;
  const gchar *replace_end = NULL;
  g_autofree gchar *search_text = NULL;
  g_autofree gchar *replace_text = NULL;
  GtkTextIter *substitute_begin = NULL;
  GtkTextIter *substitute_end = NULL;
  gunichar separator;
  gboolean replace_in_every_line = FALSE;
  gboolean replace_every_occurence_in_line = FALSE;
  gboolean replace_ask_for_confirmation = FALSE;
  GtkTextIter selection_begin, selection_end;

  g_assert (GTK_IS_WIDGET (active_widget));
  g_assert (g_str_has_prefix (command, "%s") || g_str_has_prefix (command, "s"));

  if (IDE_IS_EDITOR_PAGE (active_widget))
    source_view = ide_editor_page_get_view (IDE_EDITOR_PAGE (active_widget));
  else
    return gb_vim_set_source_view_error (error);

  if (command[0] == '%')
    {
      replace_in_every_line = TRUE;
      command++;
    }

  command++;

  separator = g_utf8_get_char (command);
  if (!separator)
    goto invalid_request;

  search_begin = command = g_utf8_next_char (command);

  for (; *command; command = g_utf8_next_char (command))
    {
      if (*command == '\\')
        {
          command = g_utf8_next_char (command);
          if (!*command)
            goto invalid_request;
          continue;
        }

      if (g_utf8_get_char (command) == separator)
        {
          search_end = command;
          break;
        }
    }

  if (search_end == NULL)
    {
      search_text = g_strdup (search_begin);
      replace_text = g_strdup ("");
    }
  else
    {
      search_text = g_strndup (search_begin, search_end - search_begin);

      replace_begin = command = g_utf8_next_char (command);

      for (; *command; command = g_utf8_next_char (command))
        {
          if (*command == '\\')
            {
              command = g_utf8_next_char (command);
              if (!*command)
                goto invalid_request;
              continue;
            }

          if (g_utf8_get_char (command) == separator)
            {
              replace_end = command;
              break;
            }
        }

      if (replace_end == NULL)
        replace_text = g_strdup (replace_begin);
      else
        {
          replace_text = g_strndup (replace_begin, replace_end - replace_begin);
          command = g_utf8_next_char (command);
        }

      if (*command)
        {
          for (; *command; command++)
            {
              switch (*command)
                {
                case 'c':
                  replace_ask_for_confirmation = TRUE;
                  break;

                case 'g':
                  replace_every_occurence_in_line = TRUE;
                  break;

                /* what other options are supported? */
                default:
                  break;
                }
            }
        }
    }

  if (replace_ask_for_confirmation)
    {
      GVariant *variant;
      GVariantBuilder builder;

      g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
      g_variant_builder_add (&builder, "s", search_text);
      g_variant_builder_add (&builder, "s", replace_text);
      variant = g_variant_builder_end (&builder);

      dzl_gtk_widget_action (active_widget, "editor-page", "replace-confirm", variant);

      return TRUE;
    }

  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view));

  if (gtk_text_buffer_get_has_selection (buffer))
    {
      gtk_text_buffer_get_selection_bounds (buffer, &selection_begin, &selection_end);
      substitute_begin = &selection_begin;
      substitute_end = &selection_end;
    }

  gtk_text_buffer_begin_user_action (buffer);
  gb_vim_do_substitute (buffer, substitute_begin, substitute_end, search_text, replace_text, replace_every_occurence_in_line, replace_in_every_line);
  gtk_text_buffer_end_user_action (buffer);

  return TRUE;

invalid_request:
  g_set_error (error,
               GB_VIM_ERROR,
               GB_VIM_ERROR_UNKNOWN_OPTION,
               _("Invalid search and replace request"));
  return FALSE;
}