コード例 #1
0
ファイル: gtktextmark.c プロジェクト: 3dfxmadscientist/gtk
static void
gtk_text_mark_set_property (GObject      *object,
			    guint         prop_id,
			    const GValue *value,
			    GParamSpec   *pspec)
{
  gchar *tmp;
  GtkTextMark *mark = GTK_TEXT_MARK (object);
  GtkTextLineSegment *seg = mark->segment;

  switch (prop_id)
    {
    case PROP_NAME:
      tmp = seg->body.mark.name;
      seg->body.mark.name = g_value_dup_string (value);
      g_free (tmp);
      break;

    case PROP_LEFT_GRAVITY:
      if (g_value_get_boolean (value))
	seg->type = &gtk_text_left_mark_type;
      else
	seg->type = &gtk_text_right_mark_type;
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
    }
}
コード例 #2
0
static void
on_delete_range (GtkTextBuffer *buffer,
	     	 GtkTextIter   *start,
	     	 GtkTextIter   *end,
	     	 gpointer       user_data)
{
	GtkTextIter iter;
	GSList *marks;
	GSList *item;

	iter = *start;

	/* move to start of line */
	gtk_text_iter_set_line_offset (&iter, 0);

	/* remove any bookmarks that are collapsed on each other due to this */
	marks = gtk_source_buffer_get_source_marks_at_iter (GTK_SOURCE_BUFFER (buffer),
							    &iter,
							    BOOKMARK_CATEGORY);

	if (marks == NULL)
		return;

	/* remove all but the first mark */
	for (item = marks->next; item; item = item->next)
		gtk_text_buffer_delete_mark (buffer, GTK_TEXT_MARK (item->data));

	g_slist_free (marks);
}
コード例 #3
0
ファイル: gtktextmark.c プロジェクト: 3dfxmadscientist/gtk
static void
gtk_text_mark_finalize (GObject *obj)
{
  GtkTextMark *mark;
  GtkTextLineSegment *seg;

  mark = GTK_TEXT_MARK (obj);

  seg = mark->segment;

  if (seg)
    {
      if (seg->body.mark.tree != NULL)
        g_warning ("GtkTextMark being finalized while still in the buffer; "
                   "someone removed a reference they didn't own! Crash "
                   "impending");

      g_free (seg->body.mark.name);
      g_free (seg);

      mark->segment = NULL;
    }

  /* chain parent_class' handler */
  G_OBJECT_CLASS (gtk_text_mark_parent_class)->finalize (obj);
}
コード例 #4
0
ファイル: snippets.c プロジェクト: bqv/gummi-vim
void snippets_activate (GuSnippets* sc, GuEditor* ec, gchar* key) {
    gchar* snippet = NULL;
    GuSnippetInfo* new_info = NULL;
    GtkTextIter start, end;

    slog (L_DEBUG, "Snippet `%s' activated\n", key);

    snippet = snippets_get_value (sc, key);
    g_return_if_fail (snippet != NULL);

    new_info = snippets_parse (snippet);

    gtk_text_buffer_get_selection_bounds (ec_buffer, &start, &end);
    new_info->start_offset = gtk_text_iter_get_offset (&start);
    new_info->sel_text = gtk_text_iter_get_text (&start, &end);
    GSList* marks = gtk_text_iter_get_marks (&start);
    new_info->sel_start = *GTK_TEXT_MARK (marks->data);
    g_slist_free (marks);

    gtk_text_buffer_insert (ec_buffer, &start, new_info->expanded, -1);
    snippet_info_create_marks (new_info, ec);
    snippet_info_initial_expand (new_info, ec);
    gtk_text_buffer_set_modified (ec_buffer, TRUE);

    if (sc->info) {
        snippet_info_sync_group (sc->info, ec);
        sc->stackframe = g_list_append (sc->stackframe, sc->info);
    }
    sc->info = new_info;

    if (!snippet_info_goto_next_placeholder (sc->info, ec))
        snippets_deactivate (sc, ec);
}
コード例 #5
0
ファイル: text-search.c プロジェクト: UIKit0/libgda
static void
go_forward_search_cb (G_GNUC_UNUSED GtkButton *button, TextSearch *tsearch)
{
	if (tsearch->priv->current_mark && tsearch->priv->current_mark->next) {
		tsearch->priv->current_mark = tsearch->priv->current_mark->next;
		gtk_text_view_scroll_mark_onscreen (tsearch->priv->view,
						    GTK_TEXT_MARK (tsearch->priv->current_mark->data));
	}
}
コード例 #6
0
static gint
sort_marks_by_priority (gconstpointer m1,
			gconstpointer m2,
			gpointer data)
{
	GtkSourceMark *mark1 = GTK_SOURCE_MARK (m1);
	GtkSourceMark *mark2 = GTK_SOURCE_MARK (m2);
	GtkSourceView *view = GTK_SOURCE_VIEW (data);
	GtkTextIter iter1, iter2;
	gint line1;
	gint line2;

	gtk_text_buffer_get_iter_at_mark (gtk_text_mark_get_buffer (GTK_TEXT_MARK (mark1)),
	                                  &iter1,
	                                  GTK_TEXT_MARK (mark1));

	gtk_text_buffer_get_iter_at_mark (gtk_text_mark_get_buffer (GTK_TEXT_MARK (mark2)),
	                                  &iter2,
	                                  GTK_TEXT_MARK (mark2));

	line1 = gtk_text_iter_get_line (&iter1);
	line2 = gtk_text_iter_get_line (&iter2);

	if (line1 == line2)
	{
		gint priority1 = -1;
		gint priority2 = -1;

		gtk_source_view_get_mark_attributes (view,
		                                     gtk_source_mark_get_category (mark1),
		                                     &priority1);

		gtk_source_view_get_mark_attributes (view,
		                                     gtk_source_mark_get_category (mark2),
		                                     &priority2);

		return priority1 - priority2;
	}
	else
	{
		return line2 - line1;
	}
}
コード例 #7
0
static void
on_end_user_action (GtkTextBuffer *buffer,
		    InsertData    *data)
{
	GSList *item;

	if (--data->user_action > 0)
	{
		return;
	}

	/* Remove trackers */
	for (item = data->trackers; item; item = g_slist_next (item))
	{
		InsertTracker *tracker = item->data;
		GtkTextIter curloc;
		GtkTextIter newloc;

		/* Move the category to the line where the mark now is */
		gtk_text_buffer_get_iter_at_mark (buffer,
		                                  &curloc,
		                                  GTK_TEXT_MARK (tracker->bookmark));

		gtk_text_buffer_get_iter_at_mark (buffer,
		                                  &newloc,
		                                  tracker->mark);

		if (gtk_text_iter_get_line (&curloc) != gtk_text_iter_get_line (&newloc))
		{
			gtk_text_iter_set_line_offset (&newloc, 0);
			gtk_text_buffer_move_mark (buffer,
			                           GTK_TEXT_MARK (tracker->bookmark),
			                           &newloc);
		}

		gtk_text_buffer_delete_mark (buffer, tracker->mark);
		g_slice_free (InsertTracker, tracker);
	}

	g_slist_free (data->trackers);
	data->trackers = NULL;
}
コード例 #8
0
/**
 * gtk_source_mark_prev:
 * @mark: a #GtkSourceMark
 * @category: a string specifying the mark category or %NULL
 *
 * Returns the previous #GtkSourceMark in the buffer or %NULL if the mark
 * was not added to a buffer. If there is no previous mark, %NULL is returned.
 * 
 * If @category is %NULL, looks for marks of any category
 *
 * Returns: the previous #GtkSourceMark or %NULL
 *
 * Since: 2.2
 */
GtkSourceMark *
gtk_source_mark_prev (GtkSourceMark *mark,
		      const gchar   *category)
{
	GtkTextBuffer *buffer;

	g_return_val_if_fail (GTK_IS_SOURCE_MARK (mark), NULL);

	buffer = gtk_text_mark_get_buffer (GTK_TEXT_MARK (mark));
	if (buffer != NULL)
		return _gtk_source_buffer_source_mark_prev (GTK_SOURCE_BUFFER (buffer),
							    mark, category);
	else
		return NULL;
}
コード例 #9
0
static void
remove_bookmark (GtkSourceBuffer *buffer,
                 GtkTextIter     *iter)
{
	GtkTextIter start;
	GtkSourceMark *bookmark;

	bookmark = get_bookmark_and_iter (buffer, iter, &start);

	if (bookmark != NULL)
	{
		gtk_text_buffer_delete_mark (GTK_TEXT_BUFFER (buffer),
		                             GTK_TEXT_MARK (bookmark));
	}
}
コード例 #10
0
ファイル: gtktextmark.c プロジェクト: 3dfxmadscientist/gtk
static void
gtk_text_mark_get_property (GObject    *object,
			    guint       prop_id,
			    GValue     *value,
			    GParamSpec *pspec)
{
  GtkTextMark *mark = GTK_TEXT_MARK (object);

  switch (prop_id)
    {
    case PROP_NAME:
      g_value_set_string (value, gtk_text_mark_get_name (mark));
      break;

    case PROP_LEFT_GRAVITY:
      g_value_set_boolean (value, gtk_text_mark_get_left_gravity (mark));
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
    }
}
コード例 #11
0
ファイル: text-search.c プロジェクト: UIKit0/libgda
static void
hide_search_bar (TextSearch *tsearch)
{
	GtkTextIter start, end;
	GtkTextBuffer *buffer;

	/* clean all previous search result */
	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tsearch->priv->view));
	gtk_text_buffer_get_bounds (buffer, &start, &end);
	gtk_text_buffer_remove_tag_by_name (buffer, "search", &start, &end);

	if (tsearch->priv->search_marks) {
		GList *list;
		for (list = tsearch->priv->search_marks; list; list = list->next)
			gtk_text_buffer_delete_mark (buffer, GTK_TEXT_MARK (list->data));

		g_list_free (tsearch->priv->search_marks);
		tsearch->priv->search_marks = NULL;
	}
	tsearch->priv->current_mark = NULL;

	gtk_widget_hide (GTK_WIDGET (tsearch));
}
コード例 #12
0
ファイル: bookmarks.cpp プロジェクト: KeithDHedger/KKEdit
VISIBLE void toggleBookmark(GtkWidget *widget,GtkTextIter *titer)
{
	ERRDATA
	pageStruct		*page=getPageStructByIDFromPage(-1);
	GtkWidget		*menuitem;
	GtkTextMark		*mark;
	GtkTextIter		*iter;
	GtkTextIter		siter;
	int				line;
	GtkTextIter		startprev,endprev;
	char			*previewtext;
	GSList			*mark_list=NULL;
	const gchar		*mark_type;
	GList			*ptr=NULL;
	bookMarksNew	*bookmarkdata;
	char			*correctedpreview;

	if(page==NULL)
		return;
	mark_type=MARK_TYPE_1;
	if(titer==NULL)
		{
			mark=gtk_text_buffer_get_insert((GtkTextBuffer*)page->buffer);
			gtk_text_buffer_get_iter_at_mark((GtkTextBuffer*)page->buffer,&siter,mark);
			gtk_text_iter_set_line_offset(&siter,0);
			iter=(GtkTextIter*)(&siter);
		}
	else
		iter=titer;

	mark_list=gtk_source_buffer_get_source_marks_at_line(page->buffer,gtk_text_iter_get_line(iter),mark_type);
	if(mark_list!=NULL)
		{
			//remove entry from bookmark list
			ptr=newBookMarksList;
			while(ptr!=NULL)
				{
					if((gpointer)((bookMarksNew*)ptr->data)->mark==(gpointer)GTK_TEXT_MARK(mark_list->data))
						{
							ERRDATA debugFree(&((bookMarksNew*)ptr->data)->markName);
							newBookMarksList=g_list_remove(newBookMarksList,ptr->data);
							gtk_text_buffer_delete_mark(GTK_TEXT_BUFFER(page->buffer),GTK_TEXT_MARK(mark_list->data));
							break;
						}
					ptr=g_list_next(ptr);
				}

			/* just take the first and delete it */
//rebuild bookmark menu
			rebuildBookMarkMenu();

			ptr=newBookMarksList;
			while(ptr!=NULL)
				{
					menuitem=gtk_menu_item_new_with_label(((bookMarksNew*)ptr->data)->label);
					gtk_menu_shell_append(GTK_MENU_SHELL(bookMarkSubMenu),menuitem);
					g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(jumpToMark),ptr->data);

					ptr=g_list_next(ptr);
				}
			gtk_widget_show_all(bookMarkMenu);
			g_slist_free(mark_list);
		}
	else
		{
			/* no mark found: create one */
			bookmarkdata=(bookMarksNew*)malloc(sizeof(bookMarksNew));
			newBookMarksList=g_list_append(newBookMarksList,(gpointer)bookmarkdata);
			bookmarkdata->page=page;
			sinkReturn=asprintf(&bookmarkdata->markName,"%s-%i",BOOKMARK_LABEL,bmMarkNumber++);
			bookmarkdata->mark=gtk_source_buffer_create_source_mark(page->buffer,bookmarkdata->markName,mark_type,iter);
			bookmarkdata->pageID=page->pageID;
//preview text for menu
			line=gtk_text_iter_get_line(iter);
			gtk_text_buffer_get_iter_at_line((GtkTextBuffer*)page->buffer,&startprev,line);
			gtk_text_buffer_get_iter_at_line((GtkTextBuffer*)page->buffer,&endprev,line+1);
			previewtext=gtk_text_iter_get_text(&startprev,&endprev);

			previewtext[strlen(previewtext)-1]=0;
			g_strchug(previewtext);
			g_strchomp(previewtext);

			correctedpreview=truncateWithElipses(previewtext,maxBMChars);
			ERRDATA debugFree(&previewtext);
			previewtext=correctedpreview;

			bookmarkdata->label=previewtext;
			bookmarkdata->line=line;
			menuitem=gtk_menu_item_new_with_label(bookmarkdata->label);
			gtk_menu_shell_append(GTK_MENU_SHELL(bookMarkSubMenu),menuitem);
			g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(jumpToMark),(void*)bookmarkdata);
			gtk_widget_show_all(bookMarkMenu);
		}
}
コード例 #13
0
ファイル: text-search.c プロジェクト: UIKit0/libgda
static void
search_text_changed_cb (GtkEntry *entry, TextSearch *tsearch)
{
	GtkTextIter iter, siter, end;
	GtkTextBuffer *buffer;
	const gchar *search_text, *sptr;
	gboolean sensitive;

	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tsearch->priv->view));
	
	/* clean all previous search result */
	gtk_text_buffer_get_bounds (buffer, &iter, &end);
	gtk_text_buffer_remove_tag_by_name (buffer, "search", &iter, &end);
	tsearch->priv->current_mark = NULL;
	if (tsearch->priv->search_marks) {
		GList *list;
		for (list = tsearch->priv->search_marks; list; list = list->next)
			gtk_text_buffer_delete_mark (buffer, GTK_TEXT_MARK (list->data));

		g_list_free (tsearch->priv->search_marks);
		tsearch->priv->search_marks = NULL;
	}

	gtk_text_buffer_get_start_iter (buffer, &iter);
	search_text = gtk_entry_get_text (entry);

	if (!search_text || !*search_text)
		return;

	sensitive = gtk_toggle_button_get_active (tsearch->priv->search_sensitive);

	while (1) {
		gboolean high = TRUE;
		siter = iter;
		sptr = search_text;

		/* search for @search_text starting from the @siter position */
		while (1) {
			gunichar c1, c2;
			c1 = gtk_text_iter_get_char (&siter);
			c2 = g_utf8_get_char (sptr);
			if (!sensitive) {
				c1 = g_unichar_tolower (c1);
				c2 = g_unichar_tolower (c2);
			}
			if (c1 != c2) {
				high = FALSE;
				break;
			}
			
			sptr = g_utf8_find_next_char (sptr, NULL);
			if (!sptr || !*sptr)
				break;

			if (! gtk_text_iter_forward_char (&siter)) {
				high = FALSE;
				break;
			}
		}
		if (high) {
			if (gtk_text_iter_forward_char (&siter)) {
				GtkTextMark *mark;
				gtk_text_buffer_apply_tag_by_name (buffer, "search", &iter, &siter);
				mark = gtk_text_buffer_create_mark (buffer, NULL, &iter, FALSE);
				tsearch->priv->search_marks = g_list_prepend (tsearch->priv->search_marks,
									    mark);
			}
			iter = siter;
		}
		else {
			if (! gtk_text_iter_forward_char (&iter))
				break;
		}
	}

	if (tsearch->priv->search_marks) {
		tsearch->priv->search_marks = g_list_reverse (tsearch->priv->search_marks);
		tsearch->priv->current_mark = tsearch->priv->search_marks;
		gtk_text_view_scroll_mark_onscreen (tsearch->priv->view,
						    GTK_TEXT_MARK (tsearch->priv->current_mark->data));
	}
}
コード例 #14
0
ファイル: gtk_glue.c プロジェクト: Emerentius/gtk
GtkTextMark* cast_GtkTextMark(GObject* obj) {
    return GTK_TEXT_MARK(obj);
}