Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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;
}
Пример #6
0
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);
}
Пример #7
0
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);
    }
}
Пример #8
0
/*
 * 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);
}
Пример #9
0
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);
}
Пример #10
0
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);
}
Пример #11
0
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;
}
Пример #12
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);
}
Пример #13
0
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));
    }
}
Пример #14
0
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);
}
Пример #15
0
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);

  }
}
Пример #16
0
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);
}
Пример #17
0
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;
    }
}
Пример #18
0
/*
 * 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;
}