static void ide_editor_frame_actions_exit_search (GSimpleAction *action, GVariant *state, gpointer user_data) { IdeEditorFrame *self = user_data; GtkTextBuffer *buffer; GActionGroup *group; GAction *replace_action; GAction *replace_all_action; g_assert (IDE_IS_EDITOR_FRAME (self)); /* stash the search string for later */ g_free (self->previous_search_string); g_object_get (self->search_entry, "text", &self->previous_search_string, NULL); /* disable the replace and replace all actions */ group = gtk_widget_get_action_group (GTK_WIDGET (self->search_frame), "search-entry"); replace_action = g_action_map_lookup_action (G_ACTION_MAP (group), "replace"); replace_all_action = g_action_map_lookup_action (G_ACTION_MAP (group), "replace-all"); g_simple_action_set_enabled (G_SIMPLE_ACTION (replace_action), FALSE); g_simple_action_set_enabled (G_SIMPLE_ACTION (replace_all_action), FALSE); /* clear the highlights in the source view */ ide_source_view_clear_search (self->source_view); /* disable rubberbanding and ensure insert mark is on screen */ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->source_view)); ide_source_view_set_rubberband_search (self->source_view, FALSE); ide_source_view_scroll_mark_onscreen (self->source_view, gtk_text_buffer_get_insert (buffer), TRUE, 0.5, 0.5); /* finally we can focus the source view */ gtk_widget_grab_focus (GTK_WIDGET (self->source_view)); }
void _ide_source_view_apply_movement (IdeSourceView *self, IdeSourceViewMovement movement, gboolean extend_selection, gboolean exclusive, guint count, gunichar command, gunichar modifier, gunichar search_char, gint *target_offset) { Movement mv = { 0 }; GtkTextBuffer *buffer; GtkTextMark *insert; gsize i; g_return_if_fail (IDE_IS_SOURCE_VIEW (self)); #ifdef IDE_ENABLE_TRACE { GEnumValue *enum_value; GEnumClass *enum_class; enum_class = g_type_class_ref (IDE_TYPE_SOURCE_VIEW_MOVEMENT); enum_value = g_enum_get_value (enum_class, movement); IDE_TRACE_MSG ("movement(%s, extend_selection=%s, exclusive=%s, count=%u)", enum_value->value_nick, extend_selection ? "YES" : "NO", exclusive ? "YES" : "NO", count); g_type_class_unref (enum_class); } #endif buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self)); insert = gtk_text_buffer_get_insert (buffer); mv.self = self; mv.target_offset = target_offset; mv.type = movement; mv.extend_selection = extend_selection; mv.exclusive = exclusive; mv.count = count; mv.ignore_select = FALSE; mv.ignore_target_offset = FALSE; mv.command = command; mv.modifier = modifier; ide_source_view_movements_get_selection (&mv); switch (movement) { case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_OFFSET: gtk_text_iter_backward_chars (&mv.insert, MAX (1, mv.count)); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_OFFSET: gtk_text_iter_forward_chars (&mv.insert, MAX (1, mv.count)); break; case IDE_SOURCE_VIEW_MOVEMENT_NTH_CHAR: ide_source_view_movements_nth_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_CHAR: ide_source_view_movements_previous_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_CHAR: ide_source_view_movements_next_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_FIRST_CHAR: ide_source_view_movements_first_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_FIRST_NONSPACE_CHAR: ide_source_view_movements_first_nonspace_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_MIDDLE_CHAR: ide_source_view_movements_middle_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_LAST_CHAR: ide_source_view_movements_last_char (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_FULL_WORD_START: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_full_word_start (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_FULL_WORD_START: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_full_word_start (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_FULL_WORD_END: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_full_word_end (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_FULL_WORD_END: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_full_word_end (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_SUB_WORD_START: gtk_text_iter_backward_visible_word_starts (&mv.insert, MAX (1, mv.count)); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_SUB_WORD_START: if (!gtk_text_iter_forward_visible_word_ends (&mv.insert, MAX (1, mv.count))) gtk_text_iter_forward_to_line_end (&mv.insert); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_WORD_START: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_word_start (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_WORD_START: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_word_start (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_WORD_END: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_word_end (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_WORD_END: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_word_end (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SENTENCE_START: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_sentence_start (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SENTENCE_END: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_sentence_end (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PARAGRAPH_START: for (i = MAX (1, mv.count); i > 0; i--) { mv.exclusive = exclusive && i == 1; ide_source_view_movements_paragraph_start (&mv); } break; case IDE_SOURCE_VIEW_MOVEMENT_PARAGRAPH_END: for (i = MAX (1, mv.count); i > 0; i--) { mv.exclusive = exclusive && i == 1; ide_source_view_movements_paragraph_end (&mv); } break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_LINE: mv.ignore_target_offset = TRUE; mv.ignore_select = TRUE; for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_line (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_LINE: mv.ignore_target_offset = TRUE; mv.ignore_select = TRUE; for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_line (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_FIRST_LINE: ide_source_view_movements_first_line (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_NTH_LINE: ide_source_view_movements_nth_line (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_LAST_LINE: ide_source_view_movements_last_line (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_LINE_PERCENTAGE: ide_source_view_movements_line_percentage (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_LINE_CHARS: ide_source_view_movements_line_chars (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_LINE_END: ide_source_view_movements_line_end (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_HALF_PAGE_UP: case IDE_SOURCE_VIEW_MOVEMENT_HALF_PAGE_DOWN: case IDE_SOURCE_VIEW_MOVEMENT_PAGE_UP: case IDE_SOURCE_VIEW_MOVEMENT_PAGE_DOWN: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_move_page (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SCREEN_DOWN: case IDE_SOURCE_VIEW_MOVEMENT_SCREEN_UP: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_scroll (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SCREEN_TOP: ide_source_view_movements_screen_top (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SCREEN_MIDDLE: ide_source_view_movements_screen_middle (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SCREEN_BOTTOM: ide_source_view_movements_screen_bottom (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_MATCH_SPECIAL: ide_source_view_movements_match_special (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_SCROLL_SCREEN_TOP: case IDE_SOURCE_VIEW_MOVEMENT_SCROLL_SCREEN_CENTER: case IDE_SOURCE_VIEW_MOVEMENT_SCROLL_SCREEN_BOTTOM: ide_source_view_movements_scroll_center (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_UNMATCHED_BRACE: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_unmatched (&mv, '{', '}'); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_UNMATCHED_BRACE: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_unmatched (&mv, '}', '{'); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_UNMATCHED_PAREN: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_unmatched (&mv, '(', ')'); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_UNMATCHED_PAREN: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_unmatched (&mv, ')', '('); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_MATCH_MODIFIER: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_next_match_modifier (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_MATCH_MODIFIER: for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movements_previous_match_modifier (&mv); break; case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_MATCH_SEARCH_CHAR: mv.modifier = search_char; for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movement_match_search_char (&mv, FALSE); break; case IDE_SOURCE_VIEW_MOVEMENT_NEXT_MATCH_SEARCH_CHAR: mv.modifier = search_char; for (i = MAX (1, mv.count); i > 0; i--) ide_source_view_movement_match_search_char (&mv, TRUE); break; default: g_return_if_reached (); } if (!mv.ignore_select) ide_source_view_movements_select_range (&mv); if (!mv.ignore_target_offset) *target_offset = gtk_text_iter_get_line_offset (&mv.insert); if (!mv.ignore_scroll_to_insert) ide_source_view_scroll_mark_onscreen (self, insert, TRUE, 0.5, 0.5); }