static void hide_search_widget (GeditViewFrame *frame, gboolean cancel) { GtkTextBuffer *buffer; if (frame->priv->disable_popdown) { return; } g_signal_handler_block (frame->priv->search_entry, frame->priv->search_entry_focus_out_id); if (frame->priv->view_scroll_event_id != 0) { g_signal_handler_disconnect (frame->priv->view, frame->priv->view_scroll_event_id); frame->priv->view_scroll_event_id = 0; } if (frame->priv->typeselect_flush_timeout != 0) { g_source_remove (frame->priv->typeselect_flush_timeout); frame->priv->typeselect_flush_timeout = 0; } /* To hide the slider we just set the animation-state property */ g_object_set (G_OBJECT (frame->priv->slider), "animation-state", GEDIT_THEATRICS_ANIMATION_STATE_INTENDING_TO_GO, NULL); if (cancel) { GtkTextBuffer *buffer; GtkTextIter iter; buffer = GTK_TEXT_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view))); gtk_text_buffer_get_iter_at_mark (buffer, &iter, frame->priv->start_mark); gtk_text_buffer_place_cursor (buffer, &iter); gedit_view_scroll_to_cursor (GEDIT_VIEW (frame->priv->view)); } buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view)); gtk_text_buffer_delete_mark (buffer, frame->priv->start_mark); /* Make sure the view is the one who has the focus when we destroy the search widget */ gtk_widget_grab_focus (frame->priv->view); g_signal_handler_unblock (frame->priv->search_entry, frame->priv->search_entry_focus_out_id); }
void _gedit_cmd_edit_redo (GtkAction *action, GeditWindow *window) { GeditView *active_view; GtkSourceBuffer *active_document; gedit_debug (DEBUG_COMMANDS); active_view = gedit_window_get_active_view (window); g_return_if_fail (active_view); active_document = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view))); gtk_source_buffer_redo (active_document); gedit_view_scroll_to_cursor (active_view); gtk_widget_grab_focus (GTK_WIDGET (active_view)); }
void _gedit_cmd_edit_redo (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GeditWindow *window = GEDIT_WINDOW (user_data); GeditView *active_view; GtkSourceBuffer *active_document; gedit_debug (DEBUG_COMMANDS); active_view = gedit_window_get_active_view (window); g_return_if_fail (active_view); active_document = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view))); gtk_source_buffer_redo (active_document); gedit_view_scroll_to_cursor (active_view); gtk_widget_grab_focus (GTK_WIDGET (active_view)); }
static gchar * get_next_misspelled_word (GeditView *view) { GeditDocument *doc; CheckRange *range; gint start, end; gchar *word; GeditSpellChecker *spell; g_return_val_if_fail (view != NULL, NULL); doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); g_return_val_if_fail (doc != NULL, NULL); range = get_check_range (doc); g_return_val_if_fail (range != NULL, NULL); spell = get_spell_checker_from_document (doc); g_return_val_if_fail (spell != NULL, NULL); word = get_current_word (doc, &start, &end); if (word == NULL) return NULL; gedit_debug_message (DEBUG_PLUGINS, "Word to check: %s", word); while (gedit_spell_checker_check_word (spell, word, -1)) { g_free (word); if (!goto_next_word (doc)) return NULL; /* may return null if we reached the end of the selection */ word = get_current_word (doc, &start, &end); if (word == NULL) return NULL; gedit_debug_message (DEBUG_PLUGINS, "Word to check: %s", word); } if (!goto_next_word (doc)) update_current (doc, gtk_text_buffer_get_char_count (GTK_TEXT_BUFFER (doc))); if (word != NULL) { GtkTextIter s, e; range->mw_start = start; range->mw_end = end; gedit_debug_message (DEBUG_PLUGINS, "Select [%d, %d]", start, end); gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (doc), &s, start); gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (doc), &e, end); gtk_text_buffer_select_range (GTK_TEXT_BUFFER (doc), &s, &e); gedit_view_scroll_to_cursor (view); } else { range->mw_start = -1; range->mw_end = -1; } return word; }
static void search_init (GtkWidget *entry, GeditViewFrame *frame) { const gchar *entry_text; /* renew the flush timeout */ if (frame->priv->typeselect_flush_timeout != 0) { g_source_remove (frame->priv->typeselect_flush_timeout); frame->priv->typeselect_flush_timeout = g_timeout_add (GEDIT_VIEW_FRAME_SEARCH_DIALOG_TIMEOUT, (GSourceFunc)search_entry_flush_timeout, frame); } entry_text = gtk_entry_get_text (GTK_ENTRY (entry)); if (frame->priv->search_mode == SEARCH) { update_search (frame); run_search (frame, entry_text, FALSE, frame->priv->wrap_around, TRUE); } else { if (*entry_text != '\0') { gboolean moved, moved_offset; gint line; gint offset_line = 0; gint line_offset = 0; gchar **split_text = NULL; const gchar *text; GtkTextIter iter; GeditDocument *doc; doc = gedit_view_frame_get_document (frame); gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (doc), &iter, frame->priv->start_mark); split_text = g_strsplit (entry_text, ":", -1); if (g_strv_length (split_text) > 1) { text = split_text[0]; } else { text = entry_text; } if (*text == '-') { gint cur_line = gtk_text_iter_get_line (&iter); if (*(text + 1) != '\0') offset_line = MAX (atoi (text + 1), 0); line = MAX (cur_line - offset_line, 0); } else if (*entry_text == '+') { gint cur_line = gtk_text_iter_get_line (&iter); if (*(text + 1) != '\0') offset_line = MAX (atoi (text + 1), 0); line = cur_line + offset_line; } else { line = MAX (atoi (text) - 1, 0); } if (split_text[1] != NULL) { line_offset = atoi (split_text[1]); } g_strfreev (split_text); moved = gedit_document_goto_line (doc, line); moved_offset = gedit_document_goto_line_offset (doc, line, line_offset); gedit_view_scroll_to_cursor (GEDIT_VIEW (frame->priv->view)); if (!moved || !moved_offset) { set_entry_background (frame, frame->priv->search_entry, GEDIT_SEARCH_ENTRY_NOT_FOUND); } else { set_entry_background (frame, frame->priv->search_entry, GEDIT_SEARCH_ENTRY_NORMAL); } } } }
static gboolean run_search (GeditViewFrame *frame, const gchar *entry_text, gboolean search_backward, gboolean wrap_around, gboolean typing) { GtkTextIter start_iter; GtkTextIter match_start; GtkTextIter match_end; gboolean found = FALSE; GeditDocument *doc; g_return_val_if_fail (frame->priv->search_mode == SEARCH, FALSE); doc = gedit_view_frame_get_document (frame); gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (doc), &start_iter, frame->priv->start_mark); if (*entry_text != '\0') { if (!search_backward) { if (!typing) { /* forward and _NOT_ typing */ gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), &start_iter, &match_end); gtk_text_iter_order (&match_end, &start_iter); } /* run search */ found = gedit_document_search_forward (doc, &start_iter, NULL, &match_start, &match_end); } else if (!typing) { /* backward and not typing */ gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), &start_iter, &match_end); /* run search */ found = gedit_document_search_backward (doc, NULL, &start_iter, &match_start, &match_end); } else { /* backward (while typing) */ g_return_val_if_reached (FALSE); } if (!found && wrap_around) { if (!search_backward) { found = gedit_document_search_forward (doc, NULL, NULL, /* FIXME: set the end_inter */ &match_start, &match_end); } else { found = gedit_document_search_backward (doc, NULL, /* FIXME: set the start_inter */ NULL, &match_start, &match_end); } } } else { gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), &start_iter, NULL); } if (found) { gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), &match_start); gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc), "selection_bound", &match_end); } else if (typing) { gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (doc), &start_iter, frame->priv->start_mark); gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), &start_iter); } if (found || (*entry_text == '\0')) { gedit_view_scroll_to_cursor (GEDIT_VIEW (frame->priv->view)); set_entry_background (frame, frame->priv->search_entry, GEDIT_SEARCH_ENTRY_NORMAL); } else { set_entry_background (frame, frame->priv->search_entry, GEDIT_SEARCH_ENTRY_NOT_FOUND); } return found; }