]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktextbuffer.c
Fix DND with frame sync
[~andy/gtk] / gtk / gtktextbuffer.c
index a576c69aa6d04bb2f5516a662d26cee91766edd3..a877e345995348e4ce5b57406de23301a25f93ef 100644 (file)
@@ -13,9 +13,7 @@
  * 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., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
 #include "gtkintl.h"
 
 
+/**
+ * SECTION:gtktextbuffer
+ * @Short_description: Stores attributed text for display in a GtkTextView
+ * @Title: GtkTextBuffer
+ * @See_also: #GtkTextView, #GtkTextIter, #GtkTextMark
+ *
+ * You may wish to begin by reading the <link linkend="TextWidget">text widget
+ * conceptual overview</link> which gives an overview of all the objects and data
+ * types related to the text widget and how they work together.
+ */
+
+
 typedef struct _GtkTextLogAttrCache GtkTextLogAttrCache;
 
 struct _GtkTextBufferPrivate
@@ -306,6 +316,8 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass)
                   GTK_TYPE_TEXT_ITER | G_SIGNAL_TYPE_STATIC_SCOPE,
                   G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
                   G_TYPE_INT);
+  g_signal_set_va_marshaller (signals[INSERT_TEXT], G_TYPE_FROM_CLASS (klass),
+                              _gtk_marshal_VOID__BOXED_STRING_INTv);
 
   /**
    * GtkTextBuffer::insert-pixbuf:
@@ -1477,10 +1489,10 @@ gtk_text_buffer_insert_range_interactive (GtkTextBuffer     *buffer,
  * @text: UTF-8 text
  * @len: length of @text, or -1
  * @first_tag: first tag to apply to @text
- * @Varargs: NULL-terminated list of tags to apply
+ * @...: %NULL-terminated list of tags to apply
  *
  * Inserts @text into @buffer at @iter, applying the list of tags to
- * the newly-inserted text. The last tag specified must be NULL to
+ * the newly-inserted text. The last tag specified must be %NULL to
  * terminate the list. Equivalent to calling gtk_text_buffer_insert(),
  * then gtk_text_buffer_apply_tag() on the inserted text;
  * gtk_text_buffer_insert_with_tags() is just a convenience function.
@@ -1531,7 +1543,7 @@ gtk_text_buffer_insert_with_tags (GtkTextBuffer *buffer,
  * @text: UTF-8 text
  * @len: length of @text, or -1
  * @first_tag_name: name of a tag to apply to @text
- * @Varargs: more tag names
+ * @...: more tag names
  *
  * Same as gtk_text_buffer_insert_with_tags(), but allows you
  * to pass in tag names instead of tag objects.
@@ -2454,7 +2466,7 @@ gtk_text_buffer_select_range (GtkTextBuffer     *buffer,
  * @buffer: a #GtkTextBuffer
  * @tag_name: (allow-none): name of the new tag, or %NULL
  * @first_property_name: (allow-none): name of first property to set, or %NULL
- * @Varargs: %NULL-terminated list of property names and values
+ * @...: %NULL-terminated list of property names and values
  *
  * Creates a tag and adds it to the tag table for @buffer.
  * Equivalent to calling gtk_text_tag_new() and then adding the
@@ -4436,3 +4448,302 @@ _gtk_text_buffer_spew (GtkTextBuffer *buffer)
 {
   _gtk_text_btree_spew (get_btree (buffer));
 }
+
+void
+_gtk_text_buffer_get_text_before (GtkTextBuffer   *buffer,
+                                  AtkTextBoundary  boundary_type,
+                                  GtkTextIter     *position,
+                                  GtkTextIter     *start,
+                                  GtkTextIter     *end)
+{
+  gint line_number;
+
+  *start = *position;
+  *end = *start;
+
+  switch (boundary_type)
+    {
+    case ATK_TEXT_BOUNDARY_CHAR:
+      gtk_text_iter_backward_char (start);
+      break;
+
+    case ATK_TEXT_BOUNDARY_WORD_START:
+      if (!gtk_text_iter_starts_word (start))
+        gtk_text_iter_backward_word_start (start);
+      *end = *start;
+      gtk_text_iter_backward_word_start (start);
+      break;
+
+    case ATK_TEXT_BOUNDARY_WORD_END:
+      if (gtk_text_iter_inside_word (start) &&
+          !gtk_text_iter_starts_word (start))
+        gtk_text_iter_backward_word_start (start);
+      while (!gtk_text_iter_ends_word (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      *end = *start;
+      gtk_text_iter_backward_word_start (start);
+      while (!gtk_text_iter_ends_word (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      break;
+
+    case ATK_TEXT_BOUNDARY_SENTENCE_START:
+      if (!gtk_text_iter_starts_sentence (start))
+        gtk_text_iter_backward_sentence_start (start);
+      *end = *start;
+      gtk_text_iter_backward_sentence_start (start);
+      break;
+
+    case ATK_TEXT_BOUNDARY_SENTENCE_END:
+      if (gtk_text_iter_inside_sentence (start) &&
+          !gtk_text_iter_starts_sentence (start))
+        gtk_text_iter_backward_sentence_start (start);
+      while (!gtk_text_iter_ends_sentence (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      *end = *start;
+      gtk_text_iter_backward_sentence_start (start);
+      while (!gtk_text_iter_ends_sentence (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      break;
+
+    case ATK_TEXT_BOUNDARY_LINE_START:
+      line_number = gtk_text_iter_get_line (start);
+      if (line_number == 0)
+        {
+          gtk_text_buffer_get_iter_at_offset (buffer, start, 0);
+        }
+      else
+        {
+          gtk_text_iter_backward_line (start);
+          gtk_text_iter_forward_line (start);
+        }
+      *end = *start;
+      gtk_text_iter_backward_line (start);
+      break;
+
+    case ATK_TEXT_BOUNDARY_LINE_END:
+      line_number = gtk_text_iter_get_line (start);
+      if (line_number == 0)
+        {
+          gtk_text_buffer_get_iter_at_offset (buffer, start, 0);
+          *end = *start;
+        }
+      else
+        {
+          gtk_text_iter_backward_line (start);
+          *end = *start;
+          while (!gtk_text_iter_ends_line (start))
+            {
+              if (!gtk_text_iter_backward_char (start))
+                break;
+            }
+          gtk_text_iter_forward_to_line_end (end);
+        }
+      break;
+    }
+}
+
+void
+_gtk_text_buffer_get_text_at (GtkTextBuffer   *buffer,
+                              AtkTextBoundary  boundary_type,
+                              GtkTextIter     *position,
+                              GtkTextIter     *start,
+                              GtkTextIter     *end)
+{
+  gint line_number;
+
+  *start = *position;
+  *end = *start;
+
+  switch (boundary_type)
+    {
+    case ATK_TEXT_BOUNDARY_CHAR:
+      gtk_text_iter_forward_char (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_WORD_START:
+      if (!gtk_text_iter_starts_word (start))
+        gtk_text_iter_backward_word_start (start);
+      if (gtk_text_iter_inside_word (end))
+        gtk_text_iter_forward_word_end (end);
+      while (!gtk_text_iter_starts_word (end))
+        {
+          if (!gtk_text_iter_forward_char (end))
+            break;
+        }
+      break;
+
+    case ATK_TEXT_BOUNDARY_WORD_END:
+      if (gtk_text_iter_inside_word (start) &&
+          !gtk_text_iter_starts_word (start))
+        gtk_text_iter_backward_word_start (start);
+      while (!gtk_text_iter_ends_word (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      gtk_text_iter_forward_word_end (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_SENTENCE_START:
+      if (!gtk_text_iter_starts_sentence (start))
+        gtk_text_iter_backward_sentence_start (start);
+      if (gtk_text_iter_inside_sentence (end))
+        gtk_text_iter_forward_sentence_end (end);
+      while (!gtk_text_iter_starts_sentence (end))
+        {
+          if (!gtk_text_iter_forward_char (end))
+            break;
+        }
+      break;
+
+    case ATK_TEXT_BOUNDARY_SENTENCE_END:
+      if (gtk_text_iter_inside_sentence (start) &&
+          !gtk_text_iter_starts_sentence (start))
+        gtk_text_iter_backward_sentence_start (start);
+      while (!gtk_text_iter_ends_sentence (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      gtk_text_iter_forward_sentence_end (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_LINE_START:
+      line_number = gtk_text_iter_get_line (start);
+      if (line_number == 0)
+        {
+          gtk_text_buffer_get_iter_at_offset (buffer, start, 0);
+        }
+      else
+        {
+          gtk_text_iter_backward_line (start);
+          gtk_text_iter_forward_line (start);
+        }
+      gtk_text_iter_forward_line (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_LINE_END:
+      line_number = gtk_text_iter_get_line (start);
+      if (line_number == 0)
+        {
+          gtk_text_buffer_get_iter_at_offset (buffer, start, 0);
+        }
+      else
+        {
+          gtk_text_iter_backward_line (start);
+          gtk_text_iter_forward_line (start);
+        }
+      while (!gtk_text_iter_ends_line (start))
+        {
+          if (!gtk_text_iter_backward_char (start))
+            break;
+        }
+      gtk_text_iter_forward_to_line_end (end);
+      break;
+   }
+}
+
+void
+_gtk_text_buffer_get_text_after (GtkTextBuffer   *buffer,
+                                 AtkTextBoundary  boundary_type,
+                                 GtkTextIter     *position,
+                                 GtkTextIter     *start,
+                                 GtkTextIter     *end)
+{
+  *start = *position;
+  *end = *start;
+
+  switch (boundary_type)
+    {
+    case ATK_TEXT_BOUNDARY_CHAR:
+      gtk_text_iter_forward_char (start);
+      gtk_text_iter_forward_chars (end, 2);
+      break;
+
+    case ATK_TEXT_BOUNDARY_WORD_START:
+      if (gtk_text_iter_inside_word (end))
+        gtk_text_iter_forward_word_end (end);
+      while (!gtk_text_iter_starts_word (end))
+        {
+          if (!gtk_text_iter_forward_char (end))
+            break;
+        }
+      *start = *end;
+      if (!gtk_text_iter_is_end (end))
+        {
+          gtk_text_iter_forward_word_end (end);
+          while (!gtk_text_iter_starts_word (end))
+            {
+              if (!gtk_text_iter_forward_char (end))
+                break;
+            }
+        }
+      break;
+
+    case ATK_TEXT_BOUNDARY_WORD_END:
+      gtk_text_iter_forward_word_end (end);
+      *start = *end;
+      if (!gtk_text_iter_is_end (end))
+        gtk_text_iter_forward_word_end (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_SENTENCE_START:
+      if (gtk_text_iter_inside_sentence (end))
+        gtk_text_iter_forward_sentence_end (end);
+      while (!gtk_text_iter_starts_sentence (end))
+        {
+          if (!gtk_text_iter_forward_char (end))
+            break;
+        }
+      *start = *end;
+      if (!gtk_text_iter_is_end (end))
+        {
+          gtk_text_iter_forward_sentence_end (end);
+          while (!gtk_text_iter_starts_sentence (end))
+            {
+              if (!gtk_text_iter_forward_char (end))
+                break;
+            }
+        }
+      break;
+
+    case ATK_TEXT_BOUNDARY_SENTENCE_END:
+      gtk_text_iter_forward_sentence_end (end);
+      *start = *end;
+      if (!gtk_text_iter_is_end (end))
+        gtk_text_iter_forward_sentence_end (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_LINE_START:
+      gtk_text_iter_forward_line (end);
+      *start = *end;
+      gtk_text_iter_forward_line (end);
+      break;
+
+    case ATK_TEXT_BOUNDARY_LINE_END:
+      gtk_text_iter_forward_line (start);
+      *end = *start;
+      if (!gtk_text_iter_is_end (start))
+        {
+          while (!gtk_text_iter_ends_line (start))
+            {
+              if (!gtk_text_iter_backward_char (start))
+                break;
+            }
+          gtk_text_iter_forward_to_line_end (end);
+        }
+      break;
+    }
+}