static void recursive_attach_view (int depth, GtkTextView *view, GtkTextChildAnchor *anchor) { GtkWidget *child_view; GtkWidget *event_box; GdkColor color; GtkWidget *align; if (depth > 4) return; child_view = gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view)); /* Event box is to add a black border around each child view */ event_box = gtk_event_box_new (); gdk_color_parse ("black", &color); gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, &color); align = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); gtk_container_set_border_width (GTK_CONTAINER (align), 1); gtk_container_add (GTK_CONTAINER (event_box), align); gtk_container_add (GTK_CONTAINER (align), child_view); gtk_text_view_add_child_at_anchor (view, event_box, anchor); recursive_attach_view (depth + 1, GTK_TEXT_VIEW (child_view), anchor); }
void _gcr_display_view_start_details (GcrDisplayView *self, GcrRenderer *renderer) { GtkTextChildAnchor *anchor; GcrDisplayItem *item; GtkTextIter iter; g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); item = lookup_display_item (self, renderer); g_return_if_fail (item); if (item->details) { g_warning ("A GcrRenderer implementation has called %s twice in one render", G_STRFUNC); return; } item->extra_tag = item->details_tag; item->details = TRUE; gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), item->details_widget, anchor); gtk_widget_show_all (item->details_widget); gtk_text_buffer_insert (self->pv->buffer, &iter, "\n", 1); }
static void recursive_attach_view (int depth, GtkTextView *view, GtkTextChildAnchor *anchor) { GtkWidget *child_view; GtkWidget *event_box; GdkRGBA color; if (depth > 4) return; child_view = gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view)); /* Event box is to add a black border around each child view */ event_box = gtk_event_box_new (); gdk_rgba_parse (&color, "black"); gtk_widget_override_background_color (event_box, 0, &color); gtk_widget_set_halign (child_view, GTK_ALIGN_FILL); gtk_widget_set_valign (child_view, GTK_ALIGN_FILL); gtk_container_add (GTK_CONTAINER (event_box), child_view); gtk_text_view_add_child_at_anchor (view, event_box, anchor); recursive_attach_view (depth + 1, GTK_TEXT_VIEW (child_view), anchor); }
static void mimeview_show_mime_part(MimeView *mimeview, MimeInfo *partinfo) { TextView *textview = mimeview->textview; GtkTextBuffer *buffer; GtkTextIter iter; GtkTextChildAnchor *anchor; GtkWidget *vbbox; GtkWidget *button; gchar buf[BUFFSIZE]; if (!partinfo) return; textview_set_font(textview, NULL); textview_clear(textview); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview->text)); gtk_text_buffer_get_start_iter(buffer, &iter); gtk_text_buffer_insert(buffer, &iter, _("Select an action for the attached file:\n"), -1); if (partinfo->filename || partinfo->name) g_snprintf(buf, sizeof(buf), "[%s %s (%s)]\n\n", partinfo->filename ? partinfo->filename : partinfo->name, partinfo->content_type, to_human_readable(partinfo->content_size)); else g_snprintf(buf, sizeof(buf), "[%s (%s)]\n\n", partinfo->content_type, to_human_readable(partinfo->content_size)); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, buf, -1, "mimepart", NULL); vbbox = gtk_vbutton_box_new(); gtk_box_set_spacing(GTK_BOX(vbbox), 5); button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_container_add(GTK_CONTAINER(vbbox), button); g_signal_connect(button, "clicked", G_CALLBACK(open_button_clicked), mimeview); button = gtk_button_new_with_mnemonic(_("Open _with...")); gtk_container_add(GTK_CONTAINER(vbbox), button); g_signal_connect(button, "clicked", G_CALLBACK(open_with_button_clicked), mimeview); button = gtk_button_new_with_mnemonic(_("_Display as text")); gtk_container_add(GTK_CONTAINER(vbbox), button); g_signal_connect(button, "clicked", G_CALLBACK(display_as_text_button_clicked), mimeview); button = gtk_button_new_with_mnemonic(_("_Save as...")); gtk_container_add(GTK_CONTAINER(vbbox), button); g_signal_connect(button, "clicked", G_CALLBACK(save_as_button_clicked), mimeview); gtk_widget_show_all(vbbox); anchor = gtk_text_buffer_create_child_anchor(buffer, &iter); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview->text), vbbox, anchor); }
static VALUE textview_add_child_at_anchor(VALUE self, VALUE child, VALUE anchor) { G_CHILD_ADD(self, child); gtk_text_view_add_child_at_anchor(_SELF(self), GTK_WIDGET(RVAL2GOBJ(child)), GTK_TEXT_CHILD_ANCHOR(RVAL2GOBJ(anchor))); return self; }
void insert_msg_with_emotion_to_textview(GtkTextView *textview, const char *msg) { char file[1024]; char tmp[4]; char *buf; char *str; char *p; char *q; int id; int i; int j; int n; GtkTextChildAnchor *anchor; GtkTextBuffer *buffer; GtkTextIter iter; GtkWidget *img; buffer = gtk_text_view_get_buffer(textview); gtk_text_buffer_get_end_iter(buffer, &iter); buf = (char*)malloc(strlen(msg) + 1); strcpy(buf, msg); str = replace_emotion(buf); i = 0; j = 0; while(str[i] != '\0') { if (str[i] == '#') { p = str + i + 1; q = strchr(p, '#'); if (q != NULL) { n = q - p; if (n == 1 || n == 2) { strncpy(tmp, p, n); tmp[n] = '\0'; id = atoi(tmp); if (id >= 0 && id < 96) { gtk_text_buffer_insert(buffer, &iter, str + j, i - j); j = i + n + 2; i += n + 1; sprintf(file, "pixmaps/faces/%d.gif", id + 1); img = gtk_image_new_from_file(file); gtk_widget_show(img); anchor = gtk_text_buffer_create_child_anchor(buffer, &iter); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview), img, anchor); } } } } i++; } if (j < strlen(str)) { gtk_text_buffer_insert(buffer, &iter, str + j, strlen(str + j)); } gtk_text_buffer_insert(buffer, &iter, "\n", 1); free(buf); }
void tasks_item_selected (GtkTreeSelection *selection, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; gchar *text; GtkTextIter titer; GtkTextBuffer *text_buffer; GtkTextChildAnchor *anchor; GtkWidget *hseparator; guint32 start_date_julian; gchar tmpbuf[BUFFER_SIZE]; GUI *appGUI = (GUI *)data; text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(appGUI->tsk->tasks_desc_textview)); gui_clear_text_buffer (text_buffer, &titer); if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_widget_set_sensitive(gtk_ui_manager_get_widget (appGUI->tsk->tasks_uim_widget, "/toolbar/edit"), TRUE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget (appGUI->tsk->tasks_uim_widget, "/toolbar/delete"), TRUE); gtk_tree_model_get (model, &iter, COLUMN_DESCRIPTION, &text, COLUMN_START_DATE_JULIAN, &start_date_julian, -1); sprintf(tmpbuf, "\n%s: %s\n", _("Started"), julian_to_str(start_date_julian, DATE_FULL)); if (text != NULL) { gtk_text_buffer_insert_with_tags_by_name (text_buffer, &titer, text, -1, "info_font", NULL); gtk_text_buffer_insert(text_buffer, &titer, "\n", -1); } if (start_date_julian) { gtk_text_buffer_insert(text_buffer, &titer, "\n", -1); anchor = gtk_text_buffer_create_child_anchor (text_buffer, &titer); gtk_text_buffer_insert_with_tags_by_name (text_buffer, &titer, tmpbuf, -1, "italic", NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW(appGUI->tsk->tasks_desc_textview), text_buffer); hseparator = gtk_hseparator_new (); gtk_widget_show (hseparator); gtk_widget_set_size_request (hseparator, 240, -1); gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW(appGUI->tsk->tasks_desc_textview), hseparator, anchor); } g_free(text); } else { gtk_widget_set_sensitive(gtk_ui_manager_get_widget (appGUI->tsk->tasks_uim_widget, "/toolbar/edit"), FALSE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget (appGUI->tsk->tasks_uim_widget, "/toolbar/delete"), FALSE); } }
/* * Inserts an xpm image into a textbuffer at the given iter */ void insert_xpm_at_iter(GtkTextView *text_view, GtkTextIter *start, const char **xpm) { GtkTextBuffer *buffer = gtk_text_view_get_buffer(text_view); GdkPixbuf *icon = gdk_pixbuf_new_from_xpm_data((const char **)xpm); GtkWidget *pixmap = gtk_image_new_from_pixbuf(icon); GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, start); gtk_widget_show(pixmap); gtk_text_view_add_child_at_anchor(text_view, pixmap, anchor); }
static void mimeview_show_signature_part(MimeView *mimeview, MimeInfo *partinfo) { TextView *textview = mimeview->textview; GtkTextBuffer *buffer; GtkTextIter iter; GtkTextChildAnchor *anchor; GtkWidget *vbbox; GtkWidget *button; if (!partinfo) return; textview_set_font(textview, NULL); textview_clear(textview); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview->text)); gtk_text_buffer_get_start_iter(buffer, &iter); if (partinfo->sigstatus_full) { gtk_text_buffer_insert (buffer, &iter, partinfo->sigstatus_full, -1); return; } gtk_text_buffer_insert (buffer, &iter, _("This signature has not been checked yet.\n\n"), -1); vbbox = gtk_vbutton_box_new(); gtk_box_set_spacing(GTK_BOX(vbbox), 5); if (rfc2015_is_available()) { button = gtk_button_new_with_mnemonic(_("_Check signature")); gtk_container_add(GTK_CONTAINER(vbbox), button); g_signal_connect(button, "clicked", G_CALLBACK(check_signature_button_clicked), mimeview); } gtk_widget_show_all(vbbox); anchor = gtk_text_buffer_create_child_anchor(buffer, &iter); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview->text), vbbox, anchor); }
static void recursive_attach_view (int depth, GtkTextView *view, GtkTextChildAnchor *anchor) { GtkWidget *child_view, *frame; if (depth > 4) return; child_view = gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view)); /* Frame is to add a black border around each child view */ frame = gtk_frame_new (NULL); gtk_container_add (GTK_CONTAINER (frame), child_view); gtk_text_view_add_child_at_anchor (view, frame, anchor); recursive_attach_view (depth + 1, GTK_TEXT_VIEW (child_view), anchor); }
int main (int argc, char **argv) { GtkWidget *window, *textview, *sw, *button, *button2; GtkTextBuffer *buffer; GtkTextChildAnchor *anchor; gtk_init (); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); sw = gtk_scrolled_window_new (NULL, NULL); textview = g_object_new (my_text_view_get_type (), NULL); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); button = gtk_button_new_with_label ("Fixed Child"); button2 = gtk_button_new_with_label ("Flowed Child"); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_window_set_default_size (GTK_WINDOW (window), 400, 400); create_tags (buffer); anchor = insert_text (buffer); gtk_container_add (GTK_CONTAINER (window), sw); gtk_container_add (GTK_CONTAINER (sw), textview); gtk_text_view_add_child_in_window (GTK_TEXT_VIEW (textview), button, GTK_TEXT_WINDOW_TEXT, 50, 150); gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (textview), button2, anchor); gtk_widget_show (window); gtk_main (); return 0; }
void print_sticker(struct text_view_info *viewinfo, const char* content){ GtkTextIter end; GtkWidget *image; GtkTextChildAnchor *anchor; gtk_text_buffer_get_end_iter(viewinfo->view1_buffer,&end); int flag = 1; if (strcmp(content,"/am") == 0) image = gtk_image_new_from_file("./sticker/am.gif"); else if (strcmp(content,"/dk") == 0) image = gtk_image_new_from_file("./sticker/dk.gif"); else if (strcmp(content,"/fd") == 0) image = gtk_image_new_from_file("./sticker/fd.gif"); else if (strcmp(content,"/sk") == 0) image = gtk_image_new_from_file("./sticker/sk.gif"); else if (strcmp(content,"/wx") == 0) image = gtk_image_new_from_file("./sticker/wx.gif"); else if (strcmp(content,"/zj") == 0) image = gtk_image_new_from_file("./sticker/zj.gif"); else flag = 0; if (flag){ anchor = gtk_text_buffer_create_child_anchor(viewinfo->view1_buffer,&end);//创建子控件的位置标记 gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(viewinfo->view1),image,anchor); gtk_widget_show(image); } else gtk_text_buffer_insert(viewinfo->view1_buffer,&end,content,-1); }
void gw_searchwindow_insert_resultpopup_button (GwSearchWindow *window, LwSearchItem *item, LwResultLine *resultline, GtkTextIter *iter) { //Declarations GwSearchData *sdata; GtkTextView *view; GtkTextBuffer *buffer; GtkTextChildAnchor *anchor; GwResultPopupData *rpdata; sdata = GW_SEARCHDATA (lw_searchitem_get_data (item)); view = GTK_TEXT_VIEW (sdata->view); buffer = gtk_text_view_get_buffer (view); rpdata = gw_resultpopupdata_new (window, item, resultline); if (rpdata != NULL) { gtk_text_buffer_insert (buffer, iter, " ", -1); anchor = gtk_text_buffer_create_child_anchor (buffer, iter); gtk_text_view_add_child_at_anchor (view, GTK_WIDGET (rpdata->button), anchor); gtk_widget_show (GTK_WIDGET (rpdata->button)); } }
static void theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme, EmpathyMessage *msg) { EmpathyChatTextView *view = EMPATHY_CHAT_TEXT_VIEW (theme); EmpathyThemeBoxesPriv*priv = GET_PRIV (theme); EmpathyContact *contact; EmpathyContact *last_contact; GdkPixbuf *avatar = NULL; GtkTextBuffer *buffer; const gchar *name; GtkTextIter iter; GtkWidget *label1, *label2; GtkTextChildAnchor *anchor; GtkWidget *box; gchar *str; time_t time_; gchar *tmp; GtkTextIter start; gboolean color_set; GtkTextTagTable *table; GtkTextTag *tag; GString *str_obj; gboolean consecutive; contact = empathy_message_get_sender (msg); name = empathy_contact_get_alias (contact); last_contact = empathy_chat_text_view_get_last_contact (view); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (theme)); time_ = empathy_message_get_timestamp (msg); consecutive = (time_ - empathy_chat_text_view_get_last_timestamp (view) < MESSAGE_JOIN_PERIOD); DEBUG ("Maybe add fancy header"); /* Only insert a header if * - the previously inserted block is not the same as this one. * - the delay between two messages is lower then MESSAGE_JOIN_PERIOD */ if (empathy_contact_equal (last_contact, contact) && consecutive) { return; } empathy_chat_text_view_append_spacing (view); /* Insert header line */ gtk_text_buffer_get_end_iter (buffer, &iter); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n", -1, EMPATHY_THEME_BOXES_TAG_HEADER_LINE, NULL); gtk_text_buffer_get_end_iter (buffer, &iter); anchor = gtk_text_buffer_create_child_anchor (buffer, &iter); /* Create a hbox for the header and resize it when the view allocation * changes */ box = gtk_hbox_new (FALSE, 0); g_signal_connect_object (view, "size-allocate", G_CALLBACK (table_size_allocate_cb), box, 0); /* Add avatar to the box if needed */ if (priv->show_avatars) { avatar = theme_boxes_get_avatar_pixbuf_with_cache (contact); if (avatar) { GtkWidget *image; image = gtk_image_new_from_pixbuf (avatar); gtk_box_pack_start (GTK_BOX (box), image, FALSE, TRUE, 2); } } /* Add contact alias */ str = g_markup_printf_escaped ("<b>%s</b>", name); label1 = g_object_new (GTK_TYPE_LABEL, "label", str, "use-markup", TRUE, "xalign", 0.0, NULL); g_free (str); /* Add the message receive time */ tmp = empathy_time_to_string_local (time_, EMPATHY_TIME_FORMAT_DISPLAY_SHORT); str = g_strdup_printf ("<i>%s</i>", tmp); label2 = g_object_new (GTK_TYPE_LABEL, "label", str, "use-markup", TRUE, "xalign", 1.0, NULL); str_obj = g_string_new ("\n- "); g_string_append (str_obj, name); g_string_append (str_obj, ", "); g_string_append (str_obj, tmp); g_string_append (str_obj, " -"); g_free (tmp); g_free (str); /* Set foreground color of labels to the same color than the header tag. */ table = gtk_text_buffer_get_tag_table (buffer); tag = gtk_text_tag_table_lookup (table, EMPATHY_THEME_BOXES_TAG_HEADER); g_object_get (tag, "foreground-set", &color_set, NULL); if (color_set) { GdkColor *color; g_object_get (tag, "foreground-gdk", &color, NULL); gtk_widget_modify_fg (label1, GTK_STATE_NORMAL, color); gtk_widget_modify_fg (label2, GTK_STATE_NORMAL, color); gdk_color_free (color); } /* Pack labels into the box */ gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label2), 1.0, 0.5); gtk_box_pack_start (GTK_BOX (box), label1, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), label2, TRUE, TRUE, 0); /* Add the header box to the text view */ g_object_set_data_full (G_OBJECT (box), "str_obj", g_string_free (str_obj, FALSE), g_free); gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (view), box, anchor); gtk_widget_show_all (box); /* Insert a header line */ gtk_text_buffer_get_end_iter (buffer, &iter); start = iter; gtk_text_iter_backward_char (&start); gtk_text_buffer_apply_tag_by_name (buffer, EMPATHY_THEME_BOXES_TAG_HEADER, &start, &iter); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n", -1, EMPATHY_THEME_BOXES_TAG_HEADER, NULL); gtk_text_buffer_get_end_iter (buffer, &iter); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n", -1, EMPATHY_THEME_BOXES_TAG_HEADER_LINE, NULL); }
void WindowMerge::approval_show_diff() // Looks for the differences and shows them in the GUI. { // Create a patch file by running a diff. approve_patch_file = gw_build_filename(workingdirectory, "patch"); ustring command = "diff" + shell_quote_space(approve_master_file) + shell_quote_space(approve_merge_file) + ">" + shell_quote_space(approve_patch_file); if (system(command.c_str())) ; // This one does not work with GwSpawn because of the pipes used. // Clear items. gtk_text_buffer_set_text(approve_buffer, "", 0); approve_buttons.clear(); // Read the patch. vector < Patch > patches = merge_read_patch(approve_patch_file); // Show the master file in the textview, with buttons for approval of patches. ReadText rt(approve_master_file, true, false); for (unsigned int i = 0; i < rt.lines.size(); i++) { // Text iterator. GtkTextIter iter; // Handle new line. string s = merge_new_line_indicator(); if (rt.lines[i].find(trim(s)) != string::npos) { gtk_text_buffer_get_end_iter(approve_buffer, &iter); gtk_text_buffer_insert(approve_buffer, &iter, "\n", -1); continue; } // Skip verse indicators. if (rt.lines[i].find(merge_verse_indicator()) != string::npos) { continue; } // Insert normal text. gtk_text_buffer_get_end_iter(approve_buffer, &iter); gtk_text_buffer_insert(approve_buffer, &iter, rt.lines[i].c_str(), -1); // If there's a patch here, show it. for (unsigned int i2 = 0; i2 < patches.size(); i2++) { if (i + 1 == patches[i2].linenumber) { // (diff starts at line 1, but we start at line 0). // Add a space before the button. gtk_text_buffer_get_end_iter(approve_buffer, &iter); gtk_text_buffer_insert(approve_buffer, &iter, " ", 1); // Insert a button with the patch. gtk_text_buffer_get_end_iter(approve_buffer, &iter); GtkTextChildAnchor *childanchor = gtk_text_buffer_create_child_anchor(approve_buffer, &iter); GtkWidget *button = gtk_button_new(); GtkWidget *alignment; alignment = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_widget_show(alignment); gtk_container_add(GTK_CONTAINER(button), alignment); GtkWidget *hbox; hbox = gtk_hbox_new(FALSE, 2); gtk_widget_show(hbox); gtk_container_add(GTK_CONTAINER(alignment), hbox); GtkWidget *image; if (patches[i2].addition) image = gtk_image_new_from_stock("gtk-add", GTK_ICON_SIZE_BUTTON); else image = gtk_image_new_from_stock("gtk-remove", GTK_ICON_SIZE_BUTTON); gtk_widget_show(image); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); GtkWidget *label; label = gtk_label_new_with_mnemonic(patches[i2].change.c_str()); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview_approval), button, childanchor); gtk_widget_show_all(button); g_signal_connect((gpointer) button, "clicked", G_CALLBACK(on_button_approve_clicked), gpointer(this)); // Store button and patch. ApproveButton approvebutton(0); approvebutton.button = GTK_BUTTON(button); approvebutton.patch = patches[i2]; approve_buttons.push_back(approvebutton); } } // Add space after the text. gtk_text_buffer_get_end_iter(approve_buffer, &iter); gtk_text_buffer_insert(approve_buffer, &iter, " ", 1); } }
void MergeDialog::load_text(ustring text) { // Variables for loading text in the textview. size_t pos; GtkTextIter iter; // Preprocess empty replacements. preprocess_empty_replacements(text); // Goo through the text looking for markers and processing them. pos = text.find(merge_conflict_markup(1)); while (pos != string::npos) { // Insert the bit of text before the first conflict marker. gtk_text_buffer_get_end_iter(textbuffer, &iter); gtk_text_buffer_insert(textbuffer, &iter, text.substr(0, pos).c_str(), -1); text.erase(0, pos + merge_conflict_markup(1).length()); // Retrieve the first alternative. ustring alternative1; pos = text.find(merge_conflict_markup(2)); if (pos != string::npos) { alternative1 = text.substr(1, pos - 2); text.erase(0, pos + merge_conflict_markup(2).length()); if (alternative1.empty()) alternative1 = empty_text(); } // Insert a button with the first alternative as a label. gtk_text_buffer_get_end_iter(textbuffer, &iter); GtkTextChildAnchor *childanchor1 = gtk_text_buffer_create_child_anchor(textbuffer, &iter); GtkWidget *button1 = gtk_button_new_with_label(alternative1.c_str()); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview), button1, childanchor1); gtk_widget_show_all(button1); g_signal_connect((gpointer) button1, "clicked", G_CALLBACK(on_mergebutton_clicked), gpointer(this)); // Store data about first alternative. MergeButton mergebutton1; mergebutton1.childanchor = childanchor1; mergebutton1.button = button1; mergebutton1.text = alternative1; // Retrieve the second alternative. ustring alternative2; pos = text.find(merge_conflict_markup(3)); if (pos != string::npos) { alternative2 = text.substr(1, pos - 2); text.erase(0, pos + merge_conflict_markup(3).length()); if (alternative2.empty()) alternative2 = empty_text(); } // Insert a button with the second alternative as a label. gtk_text_buffer_get_end_iter(textbuffer, &iter); GtkTextChildAnchor *childanchor2 = gtk_text_buffer_create_child_anchor(textbuffer, &iter); GtkWidget *button2 = gtk_button_new_with_label(alternative2.c_str()); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview), button2, childanchor2); gtk_widget_show_all(button2); g_signal_connect((gpointer) button2, "clicked", G_CALLBACK(on_mergebutton_clicked), gpointer(this)); // Store data about second alternative. MergeButton mergebutton2; mergebutton2.childanchor = childanchor2; mergebutton2.button = button2; mergebutton2.text = alternative2; // Store the button pair. MergeButtonPair mergebuttonpair; mergebuttonpair.button1 = mergebutton1; mergebuttonpair.button2 = mergebutton2; buttonpairs.push_back(mergebuttonpair); // Next iteration. pos = text.find(merge_conflict_markup(1)); } // Load remaining text in textview. gtk_text_buffer_get_end_iter(textbuffer, &iter); gtk_text_buffer_insert(textbuffer, &iter, text.substr(0, pos).c_str(), -1); // Scroll to beginning of buffer. gtk_text_buffer_get_start_iter(textbuffer, &iter); gtk_text_buffer_place_cursor(textbuffer, &iter); screen_scroll_to_iterator(GTK_TEXT_VIEW(textview), &iter); }
static void attach_widgets (GtkTextView *text_view) { GtkTextIter iter; GtkTextBuffer *buffer; int i; buffer = gtk_text_view_get_buffer (text_view); gtk_text_buffer_get_start_iter (buffer, &iter); i = 0; while (find_anchor (&iter)) { GtkTextChildAnchor *anchor; GtkWidget *widget; anchor = gtk_text_iter_get_child_anchor (&iter); if (i == 0) { widget = gtk_button_new_with_label ("Click Me"); g_signal_connect (widget, "clicked", G_CALLBACK (easter_egg_callback), NULL); } else if (i == 1) { widget = gtk_combo_box_new_text (); gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "Option 1"); gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "Option 2"); gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "Option 3"); } else if (i == 2) { widget = gtk_hscale_new (NULL); gtk_range_set_range (GTK_RANGE (widget), 0, 100); gtk_widget_set_size_request (widget, 70, -1); } else if (i == 3) { gchar *filename = demo_find_file ("floppybuddy.gif", NULL); widget = gtk_image_new_from_file (filename); g_free (filename); } else if (i == 4) { widget = gtk_entry_new (); } else { widget = NULL; /* avoids a compiler warning */ g_assert_not_reached (); } gtk_text_view_add_child_at_anchor (text_view, widget, anchor); gtk_widget_show_all (widget); ++i; } }
/* * Apply styles to the string based on the tags */ gboolean apply_tag(GtkTextView *text_view, tag in_tag, int ignore) { /* * TODO: Create GTK_TAGs for the following tags: * 2) body: All done except for the width=100% portion */ GtkTextTag *style; GtkTextBuffer *buffer = gtk_text_view_get_buffer(text_view); /* HEAD */ if (!g_ascii_strncasecmp(in_tag.name, "head", 4)) { GtkTextIter start, end; gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); gtk_text_buffer_delete(buffer, &start, &end); return TRUE; } /* HORIZONTAL LINE */ if (!g_ascii_strncasecmp(in_tag.name, "hr", 4)) { GtkTextIter start; GtkWidget *line; GtkTextChildAnchor *anchor; GtkRequisition r; gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_insert(buffer, &start, "\n", -1); /* Reinitialized since the insert invalidates the iter */ gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_iter_forward_line(&start); line = gtk_hseparator_new(); anchor = gtk_text_buffer_create_child_anchor(buffer, &start); gtk_text_view_add_child_at_anchor(text_view, line, anchor); /* FIXME: Need a way to stretch the HR on resize */ gtk_widget_size_request(GTK_WIDGET(text_view), &r); gtk_widget_set_size_request(line, r.width, 2); gtk_widget_show(line); return TRUE; } /* BR */ if (!g_ascii_strncasecmp(in_tag.name, "br", 2)) { GtkTextIter start; gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_insert(buffer, &start, "\n", -1); return TRUE; } /* BODY */ if (!g_ascii_strncasecmp(in_tag.name, "body", 4)) { char *param = NULL; char attr_val[255]; GtkTextIter start, end; bzero(attr_val, 255); gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); if ((param = ay_strcasestr(in_tag.name, "bgcolor=")) != NULL) { param += 8; /* length of bgcolor= */ _extract_parameter(param, attr_val, 255); style = gtk_text_buffer_create_tag(buffer, in_tag.id, "background", attr_val, NULL); gtk_text_buffer_apply_tag(buffer, style, &start, &end); } return TRUE; } /* BOLD */ if (!g_ascii_strcasecmp(in_tag.name, "b")) { GtkTextIter start, end; gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); style = gtk_text_buffer_create_tag(buffer, in_tag.id, "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_buffer_apply_tag(buffer, style, &start, &end); return TRUE; } /* UNDERLINE */ if (!g_ascii_strcasecmp(in_tag.name, "u")) { GtkTextIter start, end; gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); style = gtk_text_buffer_create_tag(buffer, in_tag.id, "underline", PANGO_UNDERLINE_SINGLE, NULL); gtk_text_buffer_apply_tag(buffer, style, &start, &end); return TRUE; } /* ITALICS */ if (!g_ascii_strcasecmp(in_tag.name, "i")) { GtkTextIter start, end; gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); style = gtk_text_buffer_create_tag(buffer, in_tag.id, "style", PANGO_STYLE_ITALIC, NULL); gtk_text_buffer_apply_tag(buffer, style, &start, &end); return TRUE; } /* FONT */ if (!g_ascii_strncasecmp(in_tag.name, "font", 4)) { GtkTextIter start, end; char *param = NULL; char attr_val[255]; bzero(attr_val, 255); gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); style = gtk_text_buffer_create_tag(buffer, in_tag.id, NULL); /* Font Face */ if (!(ignore & HTML_IGNORE_FONT) && (param = ay_strcasestr(in_tag.name, "face=")) != NULL) { param += 5; /* length of face= */ _extract_parameter(param, attr_val, 255); g_object_set(style, "family", attr_val, NULL); } /* Font color */ if (!(ignore & HTML_IGNORE_FOREGROUND) && (param = ay_strcasestr(in_tag.name, "color=")) != NULL) { param += 6; /* length of color= */ _extract_parameter(param, attr_val, 255); g_object_set(style, "foreground", attr_val, NULL); } /* Font Size */ if ((param = ay_strcasestr(in_tag.name, "ptsize=")) != NULL) { param += 7; /*length of ptsize= */ _extract_parameter(param, attr_val, 255); g_object_set(style, "size-points", strtod(attr_val, NULL), NULL); } else if ((param = ay_strcasestr(in_tag.name, "absz=")) != NULL) { param += 5; /*length of absz= */ _extract_parameter(param, attr_val, 255); g_object_set(style, "size-points", strtod(attr_val, NULL), NULL); } else if ((param = ay_strcasestr(in_tag.name, "size=")) != NULL) { /* Get the current font size */ gint cur_size = 0; PangoContext *context = gtk_widget_get_pango_context(GTK_WIDGET (text_view)); PangoFontDescription *desc = pango_context_get_font_description(context); param += 5; /*length of size= */ cur_size = pango_font_description_get_size(desc) / PANGO_SCALE; _extract_parameter(param, attr_val, 255); if (attr_val == NULL) { /* Do nothing */ } else if (*attr_val == '+') { int font_size = atoi(attr_val + 1) * 4; g_object_set(style, "size-points", (double)cur_size + font_size, NULL); } else if (*attr_val == '-') { int font_size = atoi(attr_val + 1) * 4; g_object_set(style, "size-points", (double)cur_size - font_size, NULL); } else { int font_size = atoi(attr_val) * 4; g_object_set(style, "size-points", (double)font_size, NULL); } } gtk_text_buffer_apply_tag(buffer, style, &start, &end); return TRUE; } /* ANCHOR */ if (!g_ascii_strncasecmp(in_tag.name, "a ", 2)) { GtkTextIter start, end; char *param = NULL; gchar *attr_val = (gchar *)malloc(1024); bzero(attr_val, 1024); gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); gtk_text_buffer_get_iter_at_mark(buffer, &end, &(in_tag.end)); /* Font Face */ if ((param = ay_strcasestr(in_tag.name, "href=")) != NULL) { param += 5; /*length of href= */ _extract_parameter(param, attr_val, 1024); style = gtk_text_buffer_create_tag(buffer, in_tag.id, "underline", PANGO_UNDERLINE_SINGLE, "foreground", "blue", NULL); g_object_set_data(G_OBJECT(style), "href", attr_val); gtk_text_buffer_apply_tag(buffer, style, &start, &end); } return TRUE; } /* SMILEY */ if (!g_ascii_strncasecmp(in_tag.name, "smiley", 6)) { GtkTextIter start; char *param = NULL; char smiley_name[64]; char smiley_protocol[64]; smiley *smile = NULL; bzero(smiley_name, 64); bzero(smiley_protocol, 64); gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); if ((param = ay_strcasestr(in_tag.name, "name=")) != NULL) { param += 5; /*length of name= */ _extract_parameter(param, smiley_name, 64); if ((param = ay_strcasestr(in_tag.name, "protocol=")) != NULL) { param += 9; /*length of protocol= */ _extract_parameter(param, smiley_protocol, 64); smile = get_smiley_by_name_and_service (smiley_name, smiley_protocol); } else { smile = get_smiley_by_name(smiley_name); } if (smile) { insert_xpm_at_iter(text_view, &start, smile->pixmap); } else if ((param = ay_strcasestr(in_tag.name, "alt=")) != NULL) { param += 4; /*length of alt= */ _extract_parameter(param, smiley_name, 64); gtk_text_buffer_insert(buffer, &start, smiley_name, -1); } else { insert_xpm_at_iter(text_view, &start, no_such_smiley_xpm); } } return TRUE; } /* IMAGE */ if (!g_ascii_strncasecmp(in_tag.name, "img", 3)) { GtkTextIter start; char *param = NULL; char img_loc[1024]; bzero(img_loc, 1024); gtk_text_buffer_get_iter_at_mark(buffer, &start, &(in_tag.start)); if ((param = ay_strcasestr(in_tag.name, "src=")) != NULL) { param += 4; /*length of src= */ _extract_parameter(param, img_loc, 1024); if (!strcmp(img_loc, "aol_icon.gif")) insert_xpm_at_iter(text_view, &start, aol_icon_xpm); else if (!strcmp(img_loc, "free_icon.gif")) insert_xpm_at_iter(text_view, &start, free_icon_xpm); else if (!strcmp(img_loc, "dt_icon.gif")) insert_xpm_at_iter(text_view, &start, dt_icon_xpm); else if (!strcmp(img_loc, "admin_icon.gif")) insert_xpm_at_iter(text_view, &start, admin_icon_xpm); } return TRUE; } return FALSE; }