/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*- * gtksourcemarker.c * * Copyright (C) 2003 - Gustavo Giráldez * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "gtksourcebuffer.h" #include "gtksourcemarker.h" static GQuark quark_marker_type = 0; static GQuark quark_next_marker = 0; static GQuark quark_prev_marker = 0; GType gtk_source_marker_get_type (void) { static GType our_type = 0; /* this function's solely purpose is to allow us to later * derive GtkSourceMarker from other base object and not break * ABI compatibility (since this way the type is resolved at * runtime) */ if (!our_type) { our_type = GTK_TYPE_TEXT_MARK; quark_marker_type = g_quark_from_static_string ("gtk-source-marker-type"); quark_next_marker = g_quark_from_static_string ("gtk-source-marker-next"); quark_prev_marker = g_quark_from_static_string ("gtk-source-marker-prev"); } return our_type; } void gtk_source_marker_set_marker_type (GtkSourceMarker *marker, const gchar *type) { g_return_if_fail (marker != NULL); g_return_if_fail (GTK_IS_SOURCE_MARKER (marker)); g_object_set_qdata_full (G_OBJECT (marker), quark_marker_type, g_strdup (type), (GDestroyNotify) g_free); _gtk_source_marker_changed (marker); } /** * gtk_source_marker_get_marker_type: * @marker: a #GtkSourceMarker. * * Gets the marker type of this @marker. * * Return value: the marker type. **/ gchar * gtk_source_marker_get_marker_type (GtkSourceMarker *marker) { g_return_val_if_fail (marker != NULL, NULL); g_return_val_if_fail (GTK_IS_SOURCE_MARKER (marker), NULL); return g_strdup (g_object_get_qdata (G_OBJECT (marker), quark_marker_type)); } /** * gtk_source_marker_get_line: * @marker: a #GtkSourceMarker. * * Gets the line number of this @marker. * * Return value: the line number. **/ gint gtk_source_marker_get_line (GtkSourceMarker *marker) { GtkTextIter iter; g_return_val_if_fail (marker != NULL, -1); g_return_val_if_fail (GTK_IS_SOURCE_MARKER (marker), -1); g_return_val_if_fail (!gtk_text_mark_get_deleted (GTK_TEXT_MARK (marker)), -1); gtk_text_buffer_get_iter_at_mark (gtk_text_mark_get_buffer (GTK_TEXT_MARK (marker)), &iter, GTK_TEXT_MARK (marker)); return gtk_text_iter_get_line (&iter); } /** * gtk_source_marker_get_name: * @marker: a #GtkSourceMarker. * * Gets the name of this @marker. * * Return value: the name. **/ G_CONST_RETURN gchar * gtk_source_marker_get_name (GtkSourceMarker *marker) { g_return_val_if_fail (marker != NULL, NULL); g_return_val_if_fail (GTK_IS_SOURCE_MARKER (marker), NULL); return gtk_text_mark_get_name (GTK_TEXT_MARK (marker)); } /** * gtk_source_marker_get_buffer: * @marker: a #GtkSourceMarker. * * Gets the buffer associated with this @marker. * * Return value: the #GtkSourceBuffer. **/ GtkSourceBuffer * gtk_source_marker_get_buffer (GtkSourceMarker *marker) { GtkTextBuffer *buffer; g_return_val_if_fail (marker != NULL, NULL); g_return_val_if_fail (GTK_IS_SOURCE_MARKER (marker), NULL); buffer = gtk_text_mark_get_buffer (GTK_TEXT_MARK (marker)); if (GTK_IS_SOURCE_BUFFER (buffer)) return GTK_SOURCE_BUFFER (buffer); else return NULL; } void _gtk_source_marker_changed (GtkSourceMarker *marker) { GtkSourceBuffer *buffer; GtkTextIter iter; g_return_if_fail (marker != NULL); g_return_if_fail (GTK_IS_SOURCE_MARKER (marker)); g_return_if_fail (!gtk_text_mark_get_deleted (GTK_TEXT_MARK (marker))); buffer = GTK_SOURCE_BUFFER (gtk_text_mark_get_buffer (GTK_TEXT_MARK (marker))); gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (buffer), &iter, GTK_TEXT_MARK (marker)); gtk_text_iter_set_line_offset (&iter, 0); g_signal_emit_by_name (buffer, "marker_updated", &iter); } void _gtk_source_marker_link (GtkSourceMarker *marker, GtkSourceMarker *sibling, gboolean after_sibling) { GtkSourceMarker *tmp; g_return_if_fail (marker != NULL); g_return_if_fail (GTK_IS_SOURCE_MARKER (marker)); g_return_if_fail (!gtk_text_mark_get_deleted (GTK_TEXT_MARK (marker))); if (!sibling) return; g_return_if_fail (GTK_IS_SOURCE_MARKER (sibling)); if (after_sibling) { tmp = g_object_get_qdata (G_OBJECT (sibling), quark_next_marker); g_object_set_qdata (G_OBJECT (marker), quark_next_marker, tmp); g_object_set_qdata (G_OBJECT (marker), quark_prev_marker, sibling); g_object_set_qdata (G_OBJECT (sibling), quark_next_marker, marker); if (tmp) g_object_set_qdata (G_OBJECT (tmp), quark_prev_marker, marker); } else { tmp = g_object_get_qdata (G_OBJECT (sibling), quark_prev_marker); g_object_set_qdata (G_OBJECT (marker), quark_next_marker, sibling); g_object_set_qdata (G_OBJECT (marker), quark_prev_marker, tmp); g_object_set_qdata (G_OBJECT (sibling), quark_prev_marker, marker); if (tmp) g_object_set_qdata (G_OBJECT (tmp), quark_next_marker, marker); } } void _gtk_source_marker_unlink (GtkSourceMarker *marker) { GtkSourceMarker *m1, *m2; g_return_if_fail (marker != NULL); g_return_if_fail (GTK_IS_SOURCE_MARKER (marker)); g_return_if_fail (!gtk_text_mark_get_deleted (GTK_TEXT_MARK (marker))); m1 = g_object_steal_qdata (G_OBJECT (marker), quark_prev_marker); m2 = g_object_steal_qdata (G_OBJECT (marker), quark_next_marker); if (m1) g_object_set_qdata (G_OBJECT (m1), quark_next_marker, m2); if (m2) g_object_set_qdata (G_OBJECT (m2), quark_prev_marker, m1); } /** * gtk_source_marker_next: * @marker: a #GtkSourceMarker. * * Gets the next marker after @marker. * * Return value: a #GtkSourceMarker. **/ GtkSourceMarker * gtk_source_marker_next (GtkSourceMarker *marker) { g_return_val_if_fail (marker != NULL, NULL); g_return_val_if_fail (GTK_IS_SOURCE_MARKER (marker), NULL); return g_object_get_qdata (G_OBJECT (marker), quark_next_marker); } /** * gtk_source_marker_prev: * @marker: a #GtkSourceMarker. * * Gets the previous marker before @marker. * * Return value: a #GtkSourceMarker. **/ GtkSourceMarker * gtk_source_marker_prev (GtkSourceMarker *marker) { g_return_val_if_fail (marker != NULL, NULL); g_return_val_if_fail (GTK_IS_SOURCE_MARKER (marker), NULL); return g_object_get_qdata (G_OBJECT (marker), quark_prev_marker); }