static void insert_function_into_syntax_area (GtkTreeIter iter, GtkWidget *text_view, GtkTreeModel *model, gpointer data ) { GString *string; GValue name_value = {0}; GValue arity_value = {0}; gint arity; gint i; GtkTextBuffer *buffer ; g_return_if_fail (GTK_IS_TEXT_VIEW (text_view)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_tree_model_get_value (model, &iter, COMPUTE_COL_NAME, &name_value); gtk_tree_model_get_value (model, &iter, COMPUTE_COL_ARITY, &arity_value); arity = g_value_get_int (&arity_value); string = g_string_new (g_value_get_string (&name_value)); g_string_append (string, "("); for ( i = 0 ; i < arity -1 ; ++i ) { g_string_append (string, "?,"); } g_string_append (string, "?)"); erase_selection (buffer); gtk_text_buffer_insert_at_cursor (buffer, string->str, string->len); g_value_unset (&name_value); g_value_unset (&arity_value); g_string_free (string, TRUE); /* Now position the cursor over the first '?' */ { GtkTextIter insert; GtkTextIter selectbound; GtkTextMark *cursor = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &insert, cursor); for ( i = 0 ; i < arity ; ++i ) { gtk_text_iter_backward_cursor_position (&insert); gtk_text_iter_backward_cursor_position (&insert); } selectbound = insert; gtk_text_iter_forward_cursor_position (&selectbound); gtk_text_buffer_select_range (buffer, &insert, &selectbound); } }
/******************************************************************************* * Advance the cursor n positions on the tutor text view */ gint cursor_advance (gint n) { gint i; gboolean cursor_out_screen; GtkWidget *wg; GtkTextBuffer *buf; GtkTextIter new_start; GtkTextIter old_start; GtkTextIter end; GtkTextMark *mark; wg = get_wg ("text_tutor"); buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wg)); /* Get current position for the iter old_start */ gtk_text_buffer_get_iter_at_mark (buf, &new_start, gtk_text_buffer_get_insert (buf)); old_start = new_start; /* Get new position for the iter new_start */ if (n > 0) for (i = 0; i < n && gtk_text_iter_forward_cursor_position (&new_start); i++); else for (i = 0; i > n && gtk_text_iter_backward_cursor_position (&new_start); i--); /* Move cursor blinking */ end = new_start; gtk_text_iter_forward_char (&end); gtk_text_buffer_apply_tag_by_name (buf, "cursor_blink", &new_start, &end); end = old_start; gtk_text_iter_forward_char (&end); gtk_text_buffer_remove_tag_by_name (buf, "cursor_blink", &old_start, &end); /* Move cursor */ gtk_text_buffer_place_cursor (buf, &new_start); /* Check need for auto-scrolling */ if (i == n) { end = new_start; gtk_text_iter_forward_line (&end); mark = gtk_text_buffer_create_mark (buf, "aux", &end, FALSE); cursor_out_screen = gtk_text_view_move_mark_onscreen (GTK_TEXT_VIEW (wg), mark); if (cursor_out_screen) { gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (wg), gtk_text_buffer_get_insert (buf), 0.0, TRUE, 0.5, 0.12); } } return (i); }
static gboolean gimp_text_style_editor_update_idle (GimpTextStyleEditor *editor) { GtkTextBuffer *buffer = GTK_TEXT_BUFFER (editor->buffer); if (editor->update_idle_id) { g_source_remove (editor->update_idle_id); editor->update_idle_id = 0; } if (gtk_text_buffer_get_has_selection (buffer)) { GtkTextIter start, end; GtkTextIter iter; GList *list; gboolean any_toggle_active = TRUE; gboolean font_differs = FALSE; gboolean color_differs = FALSE; gboolean size_differs = FALSE; gboolean baseline_differs = FALSE; gboolean kerning_differs = FALSE; GtkTextTag *font_tag = NULL; GtkTextTag *color_tag = NULL; GtkTextTag *size_tag = NULL; GtkTextTag *baseline_tag = NULL; GtkTextTag *kerning_tag = NULL; gtk_text_buffer_get_selection_bounds (buffer, &start, &end); gtk_text_iter_order (&start, &end); /* first, switch all toggles on */ for (list = editor->toggles; list; list = g_list_next (list)) { GtkToggleButton *toggle = list->data; gimp_text_style_editor_set_toggle (editor, toggle, TRUE); } /* and get some initial values */ font_tag = gimp_text_buffer_get_iter_font (editor->buffer, &start, NULL); color_tag = gimp_text_buffer_get_iter_color (editor->buffer, &start, NULL); size_tag = gimp_text_buffer_get_iter_size (editor->buffer, &start, NULL); baseline_tag = gimp_text_buffer_get_iter_baseline (editor->buffer, &start, NULL); kerning_tag = gimp_text_buffer_get_iter_kerning (editor->buffer, &start, NULL); for (iter = start; gtk_text_iter_in_range (&iter, &start, &end); gtk_text_iter_forward_cursor_position (&iter)) { if (any_toggle_active) { any_toggle_active = FALSE; for (list = editor->toggles; list; list = g_list_next (list)) { GtkToggleButton *toggle = list->data; GtkTextTag *tag = g_object_get_data (G_OBJECT (toggle), "tag"); if (! gtk_text_iter_has_tag (&iter, tag)) { gimp_text_style_editor_set_toggle (editor, toggle, FALSE); } else { any_toggle_active = TRUE; } } } if (! font_differs) { GtkTextTag *tag; tag = gimp_text_buffer_get_iter_font (editor->buffer, &iter, NULL); if (tag != font_tag) font_differs = TRUE; } if (! color_differs) { GtkTextTag *tag; tag = gimp_text_buffer_get_iter_color (editor->buffer, &iter, NULL); if (tag != color_tag) color_differs = TRUE; } if (! size_differs) { GtkTextTag *tag; tag = gimp_text_buffer_get_iter_size (editor->buffer, &iter, NULL); if (tag != size_tag) size_differs = TRUE; } if (! baseline_differs) { GtkTextTag *tag; tag = gimp_text_buffer_get_iter_baseline (editor->buffer, &iter, NULL); if (tag != baseline_tag) baseline_differs = TRUE; } if (! kerning_differs) { GtkTextTag *tag; tag = gimp_text_buffer_get_iter_kerning (editor->buffer, &iter, NULL); if (tag != kerning_tag) kerning_differs = TRUE; } if (! any_toggle_active && color_differs && font_differs && size_differs && baseline_differs && kerning_differs) break; } if (font_differs) gimp_text_style_editor_set_font (editor, NULL); else if (font_tag) gimp_text_style_editor_set_font (editor, font_tag); else gimp_text_style_editor_set_default_font (editor); if (color_differs) gimp_text_style_editor_set_color (editor, NULL); else if (color_tag) gimp_text_style_editor_set_color (editor, color_tag); else gimp_text_style_editor_set_default_color (editor); if (size_differs) gimp_text_style_editor_set_size (editor, NULL); else if (size_tag) gimp_text_style_editor_set_size (editor, size_tag); else gimp_text_style_editor_set_default_size (editor); if (baseline_differs) gtk_entry_set_text (GTK_ENTRY (editor->baseline_spinbutton), ""); else gimp_text_style_editor_set_baseline (editor, baseline_tag); if (kerning_differs) gtk_entry_set_text (GTK_ENTRY (editor->kerning_spinbutton), ""); else gimp_text_style_editor_set_kerning (editor, kerning_tag); } else /* no selection */ { GtkTextIter cursor; GSList *tags; GSList *tags_on; GSList *tags_off; GList *list; gtk_text_buffer_get_iter_at_mark (buffer, &cursor, gtk_text_buffer_get_insert (buffer)); tags = gtk_text_iter_get_tags (&cursor); tags_on = gtk_text_iter_get_toggled_tags (&cursor, TRUE); tags_off = gtk_text_iter_get_toggled_tags (&cursor, FALSE); for (list = editor->buffer->font_tags; list; list = g_list_next (list)) { GtkTextTag *tag = list->data; if ((g_slist_find (tags, tag) && ! g_slist_find (tags_on, tag)) || g_slist_find (tags_off, tag)) { gimp_text_style_editor_set_font (editor, tag); break; } } if (! list) gimp_text_style_editor_set_default_font (editor); for (list = editor->buffer->color_tags; list; list = g_list_next (list)) { GtkTextTag *tag = list->data; if ((g_slist_find (tags, tag) && ! g_slist_find (tags_on, tag)) || g_slist_find (tags_off, tag)) { gimp_text_style_editor_set_color (editor, tag); break; } } if (! list) gimp_text_style_editor_set_default_color (editor); for (list = editor->buffer->size_tags; list; list = g_list_next (list)) { GtkTextTag *tag = list->data; if ((g_slist_find (tags, tag) && ! g_slist_find (tags_on, tag)) || g_slist_find (tags_off, tag)) { gimp_text_style_editor_set_size (editor, tag); break; } } if (! list) gimp_text_style_editor_set_default_size (editor); for (list = editor->buffer->baseline_tags; list; list = g_list_next (list)) { GtkTextTag *tag = list->data; if ((g_slist_find (tags, tag) && ! g_slist_find (tags_on, tag)) || g_slist_find (tags_off, tag)) { gimp_text_style_editor_set_baseline (editor, tag); break; } } if (! list) gimp_text_style_editor_set_baseline (editor, NULL); for (list = editor->toggles; list; list = g_list_next (list)) { GtkToggleButton *toggle = list->data; GtkTextTag *tag = g_object_get_data (G_OBJECT (toggle), "tag"); gimp_text_style_editor_set_toggle (editor, toggle, (g_slist_find (tags, tag) && ! g_slist_find (tags_on, tag)) || g_slist_find (tags_off, tag)); } { GtkTextTag *tag; tag = gimp_text_buffer_get_iter_kerning (editor->buffer, &cursor, NULL); gimp_text_style_editor_set_kerning (editor, tag); } g_slist_free (tags); g_slist_free (tags_on); g_slist_free (tags_off); } return FALSE; }