void ide_editor_view_actions_update (IdeEditorView *self) { g_assert (IDE_IS_EDITOR_VIEW (self)); /* Currently a no-op */ }
static void ide_editor_view_actions_print (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeEditorView *self = user_data; GtkWidget *toplevel; g_autoptr(IdeEditorPrintOperation) operation; GtkPrintOperationResult result; g_assert (IDE_IS_EDITOR_VIEW (self)); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); operation = ide_editor_print_operation_new (self->frame1->source_view); /* keep a ref until "done" is emitted */ g_object_ref (operation); g_signal_connect_after (operation, "done", G_CALLBACK (print_done), g_object_ref (self)); result = gtk_print_operation_run (GTK_PRINT_OPERATION (operation), GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW (toplevel), NULL); handle_print_result (self, GTK_PRINT_OPERATION (operation), result); }
static void ide_editor_view_load_addins (IdeEditorView *self) { PeasEngine *engine; g_assert (IDE_IS_EDITOR_VIEW (self)); g_assert (self->extensions == NULL); engine = peas_engine_get_default (); self->extensions = peas_extension_set_new (engine, IDE_TYPE_EDITOR_VIEW_ADDIN, NULL); g_signal_connect_object (self->extensions, "extension-added", G_CALLBACK (ide_editor_view__extension_added), self, 0); g_signal_connect_object (self->extensions, "extension-removed", G_CALLBACK (ide_editor_view__extension_removed), self, 0); peas_extension_set_foreach (self->extensions, ide_editor_view__extension_added, self); }
static void ide_editor_view_goto_line_activate (IdeEditorView *self, const gchar *text, EggSimplePopover *popover) { gint64 value; g_assert (IDE_IS_EDITOR_VIEW (self)); g_assert (EGG_IS_SIMPLE_POPOVER (popover)); if (!ide_str_empty0 (text)) { value = g_ascii_strtoll (text, NULL, 10); if ((value > 0) && (value < G_MAXINT)) { GtkTextIter iter; GtkTextBuffer *buffer = GTK_TEXT_BUFFER (self->document); gtk_widget_grab_focus (GTK_WIDGET (self->frame1->source_view)); gtk_text_buffer_get_iter_at_line (buffer, &iter, value - 1); gtk_text_buffer_select_range (buffer, &iter, &iter); ide_source_view_scroll_to_iter (self->frame1->source_view, &iter, 0.25, TRUE, 1.0, 0.5, TRUE); } } }
static void ide_editor_view__extension_added (PeasExtensionSet *set, PeasPluginInfo *info, PeasExtension *exten, gpointer user_data) { IdeEditorView *self = user_data; IdeEditorViewAddin *addin = (IdeEditorViewAddin *)exten; g_assert (PEAS_IS_EXTENSION_SET (set)); g_assert (info != NULL); g_assert (IDE_IS_EDITOR_VIEW_ADDIN (addin)); g_assert (IDE_IS_EDITOR_VIEW (self)); ide_editor_view_addin_load (addin, self); if (self->document != NULL) { GtkSourceLanguage *language; language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (self->document)); if (language != NULL) { const gchar *language_id; language_id = gtk_source_language_get_id (language); ide_editor_view_addin_language_changed (addin, language_id); } } }
static void ide_editor_perspective_find_source_location (GtkWidget *widget, gpointer user_data) { struct { IdeFile *file; IdeEditorView *view; } *lookup = user_data; IdeBuffer *buffer; IdeFile *file; g_return_if_fail (IDE_IS_LAYOUT_VIEW (widget)); if (lookup->view != NULL) return; if (!IDE_IS_EDITOR_VIEW (widget)) return; buffer = ide_editor_view_get_buffer (IDE_EDITOR_VIEW (widget)); file = ide_buffer_get_file (buffer); if (ide_file_equal (file, lookup->file)) lookup->view = IDE_EDITOR_VIEW (widget); }
static gboolean gb_vim_command_syntax (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)) { GtkSourceView *source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view); if (g_str_equal (options, "enable") || g_str_equal (options, "on")) g_object_set (source_view, "highlight-syntax", TRUE, NULL); else if (g_str_equal (options, "off")) g_object_set (source_view, "highlight-syntax", FALSE, NULL); else { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_UNKNOWN_OPTION, _("Invalid :syntax subcommand: %s"), options); return FALSE; } return TRUE; } else return gb_vim_set_source_view_error (error); }
static void ide_editor_view__buffer_changed_on_volume (IdeEditorView *self, GParamSpec *pspec, IdeBuffer *buffer) { g_assert (IDE_IS_EDITOR_VIEW (self)); g_assert (IDE_IS_BUFFER (buffer)); if (ide_buffer_get_changed_on_volume (buffer)) gtk_revealer_set_reveal_child (self->modified_revealer, TRUE); else if (gtk_revealer_get_reveal_child (self->modified_revealer)) { GtkTextIter iter; gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter); gtk_text_buffer_select_range (GTK_TEXT_BUFFER (buffer), &iter, &iter); /* * FIXME: * * Without this delay, I see a condition with split view where the * non-focused split will just render blank. Well that isn't totally * correct, it renders empty gutters and proper line grid background. But * no textual content. And the adjustment is way out of sync. Even * changing the adjustment manually doesn't help. So whatever, I'll * insert a short delay and we'll pick up after the textview has * stablized. */ g_timeout_add (10, no_really_scroll_to_the_top, g_object_ref (self)); gtk_revealer_set_reveal_child (self->modified_revealer, FALSE); } }
static void ide_editor_view_actions_reload_buffer_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeBufferManager *buffer_manager = (IdeBufferManager *)object; g_autoptr(IdeEditorView) self = user_data; g_autoptr(GError) error = NULL; g_autoptr(IdeBuffer) buffer = NULL; g_assert (IDE_IS_BUFFER_MANAGER (buffer_manager)); g_assert (IDE_IS_EDITOR_VIEW (self)); gtk_revealer_set_reveal_child (self->modified_revealer, FALSE); if (!(buffer = ide_buffer_manager_load_file_finish (buffer_manager, result, &error))) { g_warning ("%s", error->message); } else { g_signal_emit_by_name (self->frame1->source_view, "movement", IDE_SOURCE_VIEW_MOVEMENT_FIRST_LINE, FALSE, TRUE, FALSE); if (self->frame2 != NULL) g_signal_emit_by_name (self->frame2->source_view, "movement", IDE_SOURCE_VIEW_MOVEMENT_FIRST_LINE, FALSE, TRUE, FALSE); } ide_widget_hide_with_fade (GTK_WIDGET (self->progress_bar)); }
/** * ide_editor_view_get_document: * * Returns: (transfer none): An #IdeBuffer. */ IdeBuffer * ide_editor_view_get_document (IdeEditorView *self) { g_return_val_if_fail (IDE_IS_EDITOR_VIEW (self), NULL); return self->document; }
static void ide_editor_view_unload_addins (IdeEditorView *self) { g_assert (IDE_IS_EDITOR_VIEW (self)); g_assert (!self->extensions || PEAS_IS_EXTENSION_SET (self->extensions)); g_clear_object (&self->extensions); }
static void ide_editor_view_hide_reload_bar (IdeEditorView *self, GtkWidget *button) { g_assert (IDE_IS_EDITOR_VIEW (self)); gtk_revealer_set_reveal_child (self->modified_revealer, FALSE); }
static gboolean ide_editor_view_get_modified (IdeLayoutView *view) { IdeEditorView *self = (IdeEditorView *)view; g_assert (IDE_IS_EDITOR_VIEW (self)); return gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (self->document)); }
static void ide_editor_view__buffer_modified_changed (IdeEditorView *self, GParamSpec *pspec, GtkTextBuffer *buffer) { g_assert (IDE_IS_EDITOR_VIEW (self)); g_object_notify (G_OBJECT (self), "modified"); }
static void ide_editor_view__focused_frame_weak_notify (gpointer data, GObject *object) { IdeEditorView *self = data; g_assert (IDE_IS_EDITOR_VIEW (self)); self->last_focused_frame = self->frame1; }
static void ide_editor_view_grab_focus (GtkWidget *widget) { IdeEditorView *self = (IdeEditorView *)widget; g_assert (IDE_IS_EDITOR_VIEW (self)); g_assert (IDE_IS_EDITOR_FRAME (self->last_focused_frame)); gtk_widget_grab_focus (GTK_WIDGET (self->last_focused_frame->source_view)); }
void ide_editor_view_addin_unload (IdeEditorViewAddin *self, IdeEditorView *view) { g_return_if_fail (IDE_IS_EDITOR_VIEW_ADDIN (self)); g_return_if_fail (IDE_IS_EDITOR_VIEW (view)); if (IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload) IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload (self, view); }
static void ide_editor_view_actions_toggle_split (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeEditorView *self = user_data; g_assert (IDE_IS_EDITOR_VIEW (self)); g_timeout_add (0, set_split_view, g_object_ref (self)); }
static gboolean gb_vim_jump_to_line (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)) { GtkSourceView *source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view); GtkTextBuffer *buffer; gboolean extend_selection; gint line; if (!int32_parse (&line, options, 0, G_MAXINT32, "line number", error)) return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); extend_selection = gtk_text_buffer_get_has_selection (buffer); ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), line); if (line == 0) { GtkTextIter iter; /* * Zero is not a valid line number, and IdeSourceView treats * that as a move to the end of the buffer. Instead, we want * line 1 to be like vi/vim. */ gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_select_range (buffer, &iter, &iter); gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (source_view), gtk_text_buffer_get_insert (buffer), 0.0, FALSE, 0.0, 0.0); } else { g_signal_emit_by_name (source_view, "movement", IDE_SOURCE_VIEW_MOVEMENT_NTH_LINE, extend_selection, TRUE, TRUE); } ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), 0); g_signal_emit_by_name (source_view, "save-insert-mark"); return TRUE; } else return gb_vim_set_source_view_error (error); }
static void ide_editor_view_actions_goto_line (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeEditorView *self = user_data; g_assert (IDE_IS_EDITOR_VIEW (self)); gtk_widget_activate (GTK_WIDGET (self->goto_line_button)); }
static gboolean set_split_view (gpointer data) { g_autoptr(IdeEditorView) self = data; g_assert (IDE_IS_EDITOR_VIEW (self)); ide_layout_view_set_split_view (IDE_LAYOUT_VIEW (self), (self->frame2 == NULL)); return G_SOURCE_REMOVE; }
static const gchar * ide_editor_view_get_title (IdeLayoutView *view) { IdeEditorView *self = (IdeEditorView *)view; g_assert (IDE_IS_EDITOR_VIEW (self)); if (self->document) return ide_buffer_get_title (self->document); return NULL; }
static void ide_editor_view_warning_button_clicked (IdeEditorView *self, GtkButton *button) { IdeEditorFrame *frame; g_assert (IDE_IS_EDITOR_VIEW (self)); g_assert (GTK_IS_BUTTON (button)); frame = ide_editor_view_get_last_focused (self); gtk_widget_grab_focus (GTK_WIDGET (frame)); g_signal_emit_by_name (frame->source_view, "move-error", GTK_DIR_DOWN); }
static void ide_editor_view_actions_find_other_file (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeEditorView *self = user_data; IdeFile *file; g_assert (IDE_IS_EDITOR_VIEW (self)); file = ide_buffer_get_file (IDE_BUFFER (self->document)); ide_file_find_other_async (file, NULL, find_other_file_cb, g_object_ref (self)); }
static gboolean gb_vim_command_wq (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)) return (gb_vim_command_write (active_widget, command, options, error) && gb_vim_command_quit (active_widget, command, options, error)); else return gb_vim_set_source_view_error (error); }
static void save_temp_response (GtkWidget *widget, gint response, gpointer user_data) { g_autoptr(IdeEditorView) self = user_data; g_autoptr(GFile) target = NULL; g_autoptr(IdeProgress) progress = NULL; GtkFileChooser *chooser = (GtkFileChooser *)widget; g_assert (GTK_IS_FILE_CHOOSER (chooser)); g_assert (IDE_IS_EDITOR_VIEW (self)); switch (response) { case GTK_RESPONSE_OK: target = gtk_file_chooser_get_file (chooser); break; case GTK_RESPONSE_CANCEL: default: break; } if (target != NULL) { IdeBufferManager *buffer_manager; IdeContext *context; IdeProject *project; IdeBuffer *buffer = IDE_BUFFER (self->document); g_autoptr(IdeFile) file = NULL; context = ide_buffer_get_context (buffer); project = ide_context_get_project (context); buffer_manager = ide_context_get_buffer_manager (context); file = ide_project_get_project_file (project, target); ide_buffer_set_file (buffer, file); ide_buffer_manager_save_file_async (buffer_manager, buffer, file, &progress, NULL, ide_editor_view_actions__save_temp_cb, g_object_ref (self)); } gtk_widget_destroy (widget); }
static IdeLayoutView * ide_editor_view_create_split (IdeLayoutView *view) { IdeEditorView *self = (IdeEditorView *)view; IdeLayoutView *ret; g_assert (IDE_IS_EDITOR_VIEW (self)); ret = g_object_new (IDE_TYPE_EDITOR_VIEW, "document", self->document, "visible", TRUE, NULL); return ret; }
static void ide_editor_view_set_split_view (IdeLayoutView *view, gboolean split_view) { IdeEditorView *self = (IdeEditorView *)view; g_assert (IDE_IS_EDITOR_VIEW (self)); if (split_view && (self->frame2 != NULL)) return; if (!split_view && (self->frame2 == NULL)) return; if (split_view) { self->frame2 = g_object_new (IDE_TYPE_EDITOR_FRAME, "show-ruler", TRUE, "document", self->document, "visible", TRUE, NULL); g_signal_connect_object (self->frame2->source_view, "request-documentation", G_CALLBACK (ide_editor_view_request_documentation), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->frame2->source_view, "focus-in-event", G_CALLBACK (ide_editor_view__focus_in_event), self, G_CONNECT_SWAPPED); gtk_container_add_with_properties (GTK_CONTAINER (self->paned), GTK_WIDGET (self->frame2), "shrink", FALSE, "resize", TRUE, NULL); gtk_widget_grab_focus (GTK_WIDGET (self->frame2)); } else { GtkWidget *copy = GTK_WIDGET (self->frame2); self->frame2 = NULL; gtk_container_remove (GTK_CONTAINER (self->paned), copy); gtk_widget_grab_focus (GTK_WIDGET (self->frame1)); } }
static void ide_editor_view_actions_save_as (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeEditorView *self = user_data; IdeBuffer *buffer; GtkWidget *suggested; GtkWidget *toplevel; GtkWidget *dialog; IdeFile *file; GFile *gfile; g_assert (IDE_IS_EDITOR_VIEW (self)); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_SAVE, "do-overwrite-confirmation", TRUE, "local-only", FALSE, "modal", TRUE, "select-multiple", FALSE, "show-hidden", FALSE, "transient-for", toplevel, "title", _("Save Document As"), NULL); buffer = IDE_BUFFER (self->document); file = ide_buffer_get_file (buffer); gfile = ide_file_get_file (file); if (gfile != NULL) gtk_file_chooser_set_file (GTK_FILE_CHOOSER (dialog), gfile, NULL); gtk_dialog_add_buttons (GTK_DIALOG (dialog), _("Cancel"), GTK_RESPONSE_CANCEL, _("Save"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); suggested = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_style_context_add_class (gtk_widget_get_style_context (suggested), GTK_STYLE_CLASS_SUGGESTED_ACTION); g_signal_connect (dialog, "response", G_CALLBACK (save_as_response), g_object_ref (self)); gtk_window_present (GTK_WINDOW (dialog)); }
void _ide_editor_perspective_show_properties (IdeEditorPerspective *self, IdeEditorView *view) { IdeLayoutTransientSidebar *sidebar; g_return_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self)); g_return_if_fail (!view || IDE_IS_EDITOR_VIEW (view)); sidebar = ide_editor_perspective_get_transient_sidebar (self); ide_editor_properties_set_view (self->properties, view); ide_layout_transient_sidebar_set_view (sidebar, (IdeLayoutView *)view); ide_layout_transient_sidebar_set_panel (sidebar, GTK_WIDGET (self->properties)); g_object_set (self, "right-visible", view != NULL, NULL); }