Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44099
  • 博文数量: 22
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-21 17:00
文章分类

全部博文(22)

文章存档

2011年(1)

2009年(2)

2008年(19)

我的朋友

分类: LINUX

2009-03-12 11:06:11

GTK+有一个及其强大的多行文本编辑框架。在这个过程中涉及的主要对象是GtkTextBuffer和GtkTextView,GTKTextBuffer表示将要被编辑的文本,GtkTextView是显示一个GtkTextBuffer的控件。每一个buffer可以被任何数目的view显示。

一件很重要的事是在GTK+中的文本是UTF-8编码的。这意味着一个字符会被编码成多个字节。字符数目通常被作为offsets引用,同时字节数目叫做indexes。如果你弄混了它们,虽然在ASCII下工作的很好,但是一旦你的buffer包含了多字节的字符,不好的事就会发生。

在buffer中的文本可以被tags标记。一个tag是可被应用到一段文本的属性。比如说,一个tag可能叫做“bold”并使在tag中的文本加粗。然而,tag的概念比这要广得多;tags不影响外观。它们代替来影响鼠标和键盘的行为。“缩”住一段文本使用户不能编辑它,或者很多其他的事。一个tag被表示为一个GtkTextTag对象。一个GtkTextTag能被应用到任何数目的buffer中的任何段的文本。

每一个tag都存储在GtkTextTagTable中。一个tag表定义了同时使用的一集tags。每一buffer有与其关联的一个tag表;在那个tag表中的任何tag能和这个buffer一同使用。然而,一个tag表可以在多个buffers中使用。

Tags可以有名字,它在某些时候是很方便的(比如,你可以命名使一段文本加粗的tag为“bold”),但是它也可以是匿名的(这很方便如果你任意创建tags)。

许多文本的维护工作由iterators完成,被GtkTextIter表示。一个iterator表示文本buffer中两个字符间的一个位置。GtkTextIter被设计为分配在栈上的结构;它被保证是传值拷贝并且一定不会含有堆上分配的数据。Iterators不是无限期有效的;无论何时以某种方式做了修改而影响了buffer中的字符的数目,所有未决的iterator变成无效。(注意:删除5个字符然后重新输入5个也会是iterators失效,虽然最终是一样的数目但是你传递了一个不同数目的状态)。

因为这些,iterator不能用来维护buffer修改中的位置。为了维护一个位置,GtkTextMark对象是理想的。你能想象为一个不可视的光标或者插入位置;它在buffer中浮动,保存一个位置。如果包围标记的文本被删除了,这个标记保持在稳便原先所在的位置;如果在标记上插入文本,这个标记最终会在新文本的左边或者右边,这取决于它的gravity。标准的文本光标在从左向右的语言中是有右gravity的标记,因为它待在插入文本的右边。

和tags一样,marks可以有名字或者匿名的。GtkTextBuffer有两个内建的marks;它们是“insert”和“select_bound”,它们分别引用插入点和不是插入点的选择边界点。如果没有选择文本,这两个marks将在同一个位置。你可以通过移动这些marks来维护被选择的部分和光标显示的位置。

Text buffers总是包含至少一行,但可以是空的(也就是说,buffer能包含零个字符)。在text buffer中的最后一行从不以行分隔符结尾(比如newline);在buffer中的其他行通常以行分隔符结尾。当计算字符数和字符偏移量时行分隔符作为字符计数。注意一些Unicode行分隔符在UTF-8中表示为多字节,双字节序列“\r\n”也被当做是一个行分隔符。
阅读(643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~