static void ide_source_snippet_parser_store (IdeSourceSnippetParser *parser) { IdeSourceSnippet *snippet; GList *scope_iter; GList *chunck_iter; ide_source_snippet_parser_flush_chunk (parser); for (scope_iter = parser->scope; scope_iter; scope_iter = scope_iter->next) { snippet = ide_source_snippet_new (parser->cur_name, g_strdup(scope_iter->data)); ide_source_snippet_set_description (snippet, parser->cur_desc); ide_source_snippet_set_snippet_text (snippet, parser->snippet_text->str); for (chunck_iter = parser->chunks; chunck_iter; chunck_iter = chunck_iter->next) { #if 0 g_printerr ("%s: Tab: %02d Link: %02d Text: %s\n", parser->cur_name, ide_source_snippet_chunk_get_tab_stop (chunck_iter->data), ide_source_snippet_chunk_get_linked_chunk (chunck_iter->data), ide_source_snippet_chunk_get_text (chunck_iter->data)); #endif ide_source_snippet_add_chunk (snippet, chunck_iter->data); } parser->snippets = g_list_append (parser->snippets, snippet); } }
static void ide_source_snippet_chunk_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { IdeSourceSnippetChunk *chunk = IDE_SOURCE_SNIPPET_CHUNK (object); switch (prop_id) { case PROP_CONTEXT: g_value_set_object (value, ide_source_snippet_chunk_get_context (chunk)); break; case PROP_SPEC: g_value_set_string (value, ide_source_snippet_chunk_get_spec (chunk)); break; case PROP_TAB_STOP: g_value_set_int (value, ide_source_snippet_chunk_get_tab_stop (chunk)); break; case PROP_TEXT: g_value_set_string (value, ide_source_snippet_chunk_get_text (chunk)); break; case PROP_TEXT_SET: g_value_set_boolean (value, ide_source_snippet_chunk_get_text_set (chunk)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } }
static void ide_source_snippet_update_context (IdeSourceSnippet *self) { IdeSourceSnippetContext *context; IdeSourceSnippetChunk *chunk; const gchar *text; gchar key[12]; guint i; gint tab_stop; g_return_if_fail (IDE_IS_SOURCE_SNIPPET (self)); context = ide_source_snippet_get_context (self); ide_source_snippet_context_emit_changed (context); for (i = 0; i < self->chunks->len; i++) { chunk = g_ptr_array_index (self->chunks, i); tab_stop = ide_source_snippet_chunk_get_tab_stop (chunk); if (tab_stop > 0) { if ((text = ide_source_snippet_chunk_get_text (chunk))) { g_snprintf (key, sizeof key, "%d", tab_stop); key[sizeof key - 1] = '\0'; ide_source_snippet_context_add_variable (context, key, text); } } } ide_source_snippet_context_emit_changed (context); }
gboolean ide_source_snippet_begin (IdeSourceSnippet *self, GtkTextBuffer *buffer, GtkTextIter *iter) { IdeSourceSnippetContext *context; IdeSourceSnippetChunk *chunk; const gchar *text; gboolean ret; gint len; gint i; g_return_val_if_fail (IDE_IS_SOURCE_SNIPPET (self), FALSE); g_return_val_if_fail (!self->buffer, FALSE); g_return_val_if_fail (!self->mark_begin, FALSE); g_return_val_if_fail (!self->mark_end, FALSE); g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); g_return_val_if_fail (iter, FALSE); self->inserted = TRUE; context = ide_source_snippet_get_context (self); ide_source_snippet_update_context (self); ide_source_snippet_context_emit_changed (context); ide_source_snippet_update_context (self); self->buffer = g_object_ref (buffer); self->mark_begin = gtk_text_buffer_create_mark (buffer, NULL, iter, TRUE); g_object_add_weak_pointer (G_OBJECT (self->mark_begin), (gpointer *) &self->mark_begin); gtk_text_buffer_begin_user_action (buffer); for (i = 0; i < self->chunks->len; i++) { chunk = g_ptr_array_index (self->chunks, i); if ((text = ide_source_snippet_chunk_get_text (chunk))) { len = g_utf8_strlen (text, -1); g_array_append_val (self->runs, len); gtk_text_buffer_insert (buffer, iter, text, -1); } } self->mark_end = gtk_text_buffer_create_mark (buffer, NULL, iter, FALSE); g_object_add_weak_pointer (G_OBJECT (self->mark_end), (gpointer *) &self->mark_end); g_object_ref (self->mark_begin); g_object_ref (self->mark_end); gtk_text_buffer_end_user_action (buffer); ret = ide_source_snippet_move_next (self); return ret; }
static void ide_source_snippet_rewrite_updated_chunks (IdeSourceSnippet *self) { IdeSourceSnippetChunk *chunk; const gchar *text; gchar *real_text; gint i; g_return_if_fail (IDE_IS_SOURCE_SNIPPET (self)); for (i = 0; i < self->chunks->len; i++) { chunk = g_ptr_array_index (self->chunks, i); text = ide_source_snippet_chunk_get_text (chunk); real_text = ide_source_snippet_get_nth_text (self, i); if (!!g_strcmp0 (text, real_text)) ide_source_snippet_replace_chunk_text (self, i, text); g_free (real_text); } }