static gboolean locate_current_tag(Tdocument *doc, const GtkTextIter *iter) { GtkTextIter gtiter, ltiter; gboolean ltfound, gtfound; Tin_html_tag iht; gtiter = ltiter = *iter; rec_tag.found = FALSE; /* backward search for tag start */ iht.findchar = '>'; iht.prevchar = '\n'; iht.ignore_if_prevchar = 0; gtfound = gtk_text_iter_backward_find_char(>iter,(GtkTextCharPredicate)iter_char_search_lcb, &iht,NULL); /* perhaps we should limit the search fto 50 charcters or so */ iht.findchar = '<'; iht.prevchar = '\n'; iht.ignore_if_prevchar = '?'; ltfound = gtk_text_iter_backward_find_char(<iter,(GtkTextCharPredicate)iter_char_search_lcb, &iht,NULL); rec_tag.so = rec_tag.eo = -1; rec_tag.doc = doc; if ((ltfound && gtfound && gtk_text_iter_compare(<iter,>iter) > 0) || (ltfound && !gtfound)) { rec_tag.so = gtk_text_iter_get_offset(<iter); DEBUG_MSG("a tag is started on the left side at %d\n",rec_tag.so); } else { DEBUG_MSG("no tag start found on the left side\n"); } if (rec_tag.so >=0) { /* forward search for end tag */ iht.findchar = 62;/* 62 = > */ iht.prevchar = 10; /* \n */ iht.ignore_if_prevchar = 63 /* ? */; gtfound = gtk_text_iter_forward_find_char(>iter,(GtkTextCharPredicate)iter_char_search_lcb, &iht,NULL); /* perhaps we should limit the search fto 50 charcters or so */ iht.findchar = 60;/* 60 = < */ iht.prevchar = 10; /* \n */ iht.ignore_if_prevchar = 0; ltfound = gtk_text_iter_forward_find_char(<iter,(GtkTextCharPredicate)iter_char_search_lcb, &iht,NULL); if ((ltfound && gtfound && gtk_text_iter_compare(<iter,>iter) > 0) || (gtfound && !ltfound)) { rec_tag.eo = gtk_text_iter_get_offset(>iter)+1; DEBUG_MSG("a tag is ended on the right side at %d\n",rec_tag.eo); rec_tag.found = TRUE; return TRUE; } else { DEBUG_MSG("no tag end found on the right side\n"); } } return FALSE; }
static gboolean locate_color(Tdocument *doc, const GtkTextIter *iter) { Tin_html_tag iht; gboolean retval=FALSE; GtkTextIter leftiter=*iter, rightiter, maxiter = *iter; DEBUG_MSG("locate_color, started\n"); rec_color.found = FALSE; gtk_text_iter_backward_chars(&maxiter, 8); /* first we look to the left for a #, and we look back at max. 8 chars (7 would be good enough) */ iht.findchar = '#'; iht.prevchar = '\n'; iht.ignore_if_prevchar = '\0'; if (gtk_text_iter_backward_find_char(&leftiter, (GtkTextCharPredicate)iter_char_search_lcb,&iht,&maxiter)) { gchar *text; rightiter = leftiter; gtk_text_iter_forward_chars(&rightiter, 7); text = gtk_text_buffer_get_text(doc->buffer,&leftiter,&rightiter,FALSE); DEBUG_MSG("locate_color,is '%s' a color?\n",text); if (text) { retval = string_is_color(text); if (retval) { rec_color.so = gtk_text_iter_get_offset(&leftiter); rec_color.eo = gtk_text_iter_get_offset(&rightiter); rec_color.found = TRUE; rec_color.doc = doc; DEBUG_MSG("found color from so=%d to eo=%d\n",rec_color.so, rec_color.eo); } g_free(text); } } return retval; }
static void ide_source_view_movements_match_special (Movement *mv) { MatchingBracketState state; GtkTextIter copy; gboolean is_forward = FALSE; gboolean ret; copy = mv->insert; state.depth = 1; state.jump_from = gtk_text_iter_get_char (&mv->insert); switch (state.jump_from) { case '{': state.jump_to = '}'; is_forward = TRUE; break; case '[': state.jump_to = ']'; is_forward = TRUE; break; case '(': state.jump_to = ')'; is_forward = TRUE; break; case '}': state.jump_to = '{'; is_forward = FALSE; break; case ']': state.jump_to = '['; is_forward = FALSE; break; case ')': state.jump_to = '('; is_forward = FALSE; break; default: return; } if (is_forward) ret = gtk_text_iter_forward_find_char (&mv->insert, bracket_predicate, &state, NULL); else ret = gtk_text_iter_backward_find_char (&mv->insert, bracket_predicate, &state, NULL); if (!ret) mv->insert = copy; else if (!mv->exclusive) gtk_text_iter_forward_char (&mv->insert); }
CAMLprim value ml_gtk_text_iter_backward_find_char(value i,value fun,value ito) { CAMLparam1(fun); CAMLreturn (Val_bool (gtk_text_iter_backward_find_char(GtkTextIter_val(i), ml_gtk_text_char_predicate, &fun, Option_val(ito,GtkTextIter_val,NULL)))); }
static VALUE rg_backward_find_char(int argc, VALUE *argv, VALUE self) { VALUE limit; volatile VALUE func = rb_block_proc(); rb_scan_args(argc, argv, "01", &limit); return CBOOL2RVAL(gtk_text_iter_backward_find_char(_SELF(self), (GtkTextCharPredicate)char_predicate_func, (gpointer)func, NIL_P(limit) ? NULL : _SELF(limit))); }
static gboolean find_whitepace_region (const GtkTextIter *center, GtkTextIter *start, GtkTextIter *end) { *start = *center; *end = *center; if (gtk_text_iter_backward_find_char (start, is_not_whitespace, NULL, NULL)) gtk_text_iter_forward_char (start); /* we want the first whitespace... */ if (is_whitespace (gtk_text_iter_get_char (end), NULL)) gtk_text_iter_forward_find_char (end, is_not_whitespace, NULL, NULL); return ! gtk_text_iter_equal (start, end); }
static void ide_source_view_movements_previous_match_modifier (Movement *mv) { GtkTextIter insert; GtkTextIter bounds; bounds = insert = mv->insert; gtk_text_iter_set_line_offset (&bounds, 0); if (gtk_text_iter_backward_find_char (&insert, find_match, mv, &bounds)) { if (!mv->exclusive) gtk_text_iter_forward_char (&insert); mv->insert = insert; } }
/* Format->Uncomment Selection */ void action_uncomment_selection(GtkAction *action, I7Document *document) { GtkTextBuffer *buffer = GTK_TEXT_BUFFER(i7_document_get_buffer(document)); GtkTextIter start, end; if(!gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) return; /* Find first [ from the beginning of the selection, then the last ] between there and the end of the selection */ if(gtk_text_iter_get_char(&start) != '[' && !gtk_text_iter_forward_find_char(&start, char_equals, GUINT_TO_POINTER('['), &end)) return; gtk_text_iter_backward_char(&end); if(gtk_text_iter_get_char(&end) != ']' && !gtk_text_iter_backward_find_char(&end, char_equals, GUINT_TO_POINTER(']'), &start)) return; gtk_text_iter_forward_char(&end); gchar *text = gtk_text_buffer_get_text(buffer, &start, &end, TRUE); /* Treat it as one single undo action */ gtk_text_buffer_begin_user_action(buffer); /* Delete the comment and re-insert it without brackets */ gtk_text_buffer_delete(buffer, &start, &end); gchar *newtext = g_strndup(text + 1, strlen(text) - 2); GtkTextMark *tempmark = gtk_text_buffer_create_mark(buffer, NULL, &end, TRUE); gtk_text_buffer_insert(buffer, &end, newtext, -1); gtk_text_buffer_end_user_action(buffer); g_free(text); g_free(newtext); /* Select only the uncommented text again */ gtk_text_buffer_get_iter_at_mark(buffer, &start, tempmark); gtk_text_buffer_select_range(buffer, &start, &end); gtk_text_buffer_delete_mark(buffer, tempmark); }
static void ide_source_view_movement_match_search_char (Movement *mv, gboolean is_next_direction) { GtkTextIter insert; GtkTextIter limit; gboolean is_forward; gboolean is_till; gboolean is_inclusive_mode; gboolean is_selection_positive; const gchar *mode_name; limit = insert = mv->insert; is_forward = (mv->command == 'f' || mv->command == 't'); is_till = (mv->command == 't' || mv->command == 'T'); mode_name = ide_source_view_get_mode_name (mv->self); is_inclusive_mode = (g_str_has_prefix (mode_name, "vim-visual") || g_str_has_prefix (mode_name, "vim-normal-c") || g_str_has_prefix (mode_name, "vim-normal-d")); is_selection_positive = (gtk_text_iter_compare (&insert, &mv->selection) >= 0); if (mv->modifier == 0) return; if ((is_forward && is_next_direction) || (!is_forward && !is_next_direction)) { /* We search to the right */ gtk_text_iter_forward_to_line_end (&limit); if (is_till) gtk_text_iter_forward_char (&insert); if (is_inclusive_mode && is_selection_positive) gtk_text_iter_backward_char (&insert); if (gtk_text_iter_forward_find_char (&insert, find_char, GUINT_TO_POINTER (mv->modifier), &limit)) { if (is_till) gtk_text_iter_backward_char (&insert); is_selection_positive = (gtk_text_iter_compare (&insert, &mv->selection) >= 0); if (is_inclusive_mode && is_selection_positive) gtk_text_iter_forward_char (&insert); mv->insert = insert; } } else { /* We search to the left */ gtk_text_iter_set_line_offset (&limit, 0); if (is_till) gtk_text_iter_backward_char (&insert); if (is_inclusive_mode && is_selection_positive) gtk_text_iter_backward_char (&insert); if (gtk_text_iter_backward_find_char (&insert, find_char, GUINT_TO_POINTER (mv->modifier), &limit)) { if (is_till) gtk_text_iter_forward_char (&insert); is_selection_positive = (gtk_text_iter_compare (&insert, &mv->selection) >= 0); if (is_inclusive_mode && is_selection_positive) gtk_text_iter_forward_char (&insert); mv->insert = insert; } } }