gtksourceview3/gtksourceview/gtksourcemark.c

275 lines
7.3 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*- */
/* gtksourcemark.c
* This file is part of GtkSourceView
*
* Copyright (C) 2007 - Johannes Schmid <jhs@gnome.org>
*
* GtkSourceView is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* GtkSourceView is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "gtksourcemark.h"
#include "gtksourcebuffer.h"
#include "gtksourcebuffer-private.h"
#include "gtksourceview-i18n.h"
/**
* SECTION:mark
* @Short_description: Mark object for GtkSourceBuffer
* @Title: GtkSourceMark
* @See_also: #GtkSourceBuffer
*
* A #GtkSourceMark marks a position in the text where you want to display
* additional info. It is based on #GtkTextMark and thus is still valid after
* the text has changed though its position may change.
*
* #GtkSourceMark<!-- -->s are organised in categories which you have to set
* when you create the mark. Each category can have a priority, a pixbuf and
* other associated attributes. See gtk_source_view_set_mark_attributes().
* The pixbuf will be displayed in the margin at the line where the mark
* residents if the #GtkSourceView:show-line-marks property is set to %TRUE. If
* there are multiple marks in the same line, the pixbufs will be drawn on top
* of each other. The mark with the highest priority will be drawn on top.
*/
enum
{
PROP_0,
PROP_CATEGORY
};
struct _GtkSourceMarkPrivate
{
gchar *category;
};
G_DEFINE_TYPE_WITH_PRIVATE (GtkSourceMark, gtk_source_mark, GTK_TYPE_TEXT_MARK);
static void
gtk_source_mark_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkSourceMarkPrivate *priv;
g_return_if_fail (GTK_SOURCE_IS_MARK (object));
priv = GTK_SOURCE_MARK (object)->priv;
switch (prop_id)
{
case PROP_CATEGORY:
g_return_if_fail (g_value_get_string (value) != NULL);
g_free (priv->category);
priv->category = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
prop_id,
pspec);
}
}
static void
gtk_source_mark_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkSourceMark *mark;
g_return_if_fail (GTK_SOURCE_IS_MARK (object));
mark = GTK_SOURCE_MARK (object);
switch (prop_id)
{
case PROP_CATEGORY:
g_value_set_string (value,
gtk_source_mark_get_category (mark));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
prop_id,
pspec);
}
}
static void
gtk_source_mark_finalize (GObject *object)
{
GtkSourceMark *mark = GTK_SOURCE_MARK (object);
g_free (mark->priv->category);
G_OBJECT_CLASS (gtk_source_mark_parent_class)->finalize (object);
}
static void
gtk_source_mark_class_init (GtkSourceMarkClass *klass)
{
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
object_class->set_property = gtk_source_mark_set_property;
object_class->get_property = gtk_source_mark_get_property;
object_class->finalize = gtk_source_mark_finalize;
/**
* GtkSourceMark:category:
*
* The category of the #GtkSourceMark, classifies the mark and controls
* which pixbuf is used and with which priority it is drawn.
*/
g_object_class_install_property (object_class,
PROP_CATEGORY,
g_param_spec_string ("category",
"Category",
"The mark category",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
}
static void
gtk_source_mark_init (GtkSourceMark *mark)
{
mark->priv = gtk_source_mark_get_instance_private (mark);
}
/**
* gtk_source_mark_new:
* @name: Name of the #GtkSourceMark, can be NULL when not using a name
* @category: is used to classify marks according to common characteristics
* (e.g. all the marks representing a bookmark could belong to the "bookmark"
* category, or all the marks representing a compilation error could belong to
* "error" category).
*
* Creates a text mark. Add it to a buffer using gtk_text_buffer_add_mark().
* If name is NULL, the mark is anonymous; otherwise, the mark can be retrieved
* by name using gtk_text_buffer_get_mark().
* Normally marks are created using the utility function
* gtk_source_buffer_create_source_mark().
*
* Returns: a new #GtkSourceMark that can be added using gtk_text_buffer_add_mark().
*
* Since: 2.2
*/
GtkSourceMark *
gtk_source_mark_new (const gchar *name,
const gchar *category)
{
g_return_val_if_fail (category != NULL, NULL);
return GTK_SOURCE_MARK (g_object_new (GTK_SOURCE_TYPE_MARK,
"category", category,
"name", name,
"left-gravity", TRUE,
NULL));
}
/**
* gtk_source_mark_get_category:
* @mark: a #GtkSourceMark.
*
* Returns the mark category.
*
* Returns: the category of the #GtkSourceMark.
*
* Since: 2.2
*/
const gchar *
gtk_source_mark_get_category (GtkSourceMark *mark)
{
g_return_val_if_fail (GTK_SOURCE_IS_MARK (mark), NULL);
return mark->priv->category;
}
/**
* gtk_source_mark_next:
* @mark: a #GtkSourceMark.
* @category: (nullable): a string specifying the mark category, or %NULL.
*
* Returns the next #GtkSourceMark in the buffer or %NULL if the mark
* was not added to a buffer. If there is no next mark, %NULL will be returned.
*
* If @category is %NULL, looks for marks of any category.
*
* Returns: (nullable) (transfer none): the next #GtkSourceMark, or %NULL.
*
* Since: 2.2
*/
GtkSourceMark *
gtk_source_mark_next (GtkSourceMark *mark,
const gchar *category)
{
GtkTextBuffer *buffer;
g_return_val_if_fail (GTK_SOURCE_IS_MARK (mark), NULL);
buffer = gtk_text_mark_get_buffer (GTK_TEXT_MARK (mark));
if (buffer == NULL)
{
return NULL;
}
return _gtk_source_buffer_source_mark_next (GTK_SOURCE_BUFFER (buffer),
mark,
category);
}
/**
* 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: (nullable) (transfer none): 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_SOURCE_IS_MARK (mark), NULL);
buffer = gtk_text_mark_get_buffer (GTK_TEXT_MARK (mark));
if (buffer == NULL)
{
return NULL;
}
return _gtk_source_buffer_source_mark_prev (GTK_SOURCE_BUFFER (buffer),
mark,
category);
}