翻译自:http://wiki.openoffice.org/wiki/Writer/Core_And_Layout#Tables
表格
基本上,文字处理的表格由模型表示(类SwTable)和视图表示(类SwTabFrm)联合表现出来的。
表格模型
表格模型定义在SwTable对象中,SwTable对象是由SwTableLine对象数组组成,其中的SwTableLine对象是由SwTableBox数组组成的,所有这些对象注册到继承自SwFrmFmt的类中,例如SwTableFmt,SwTableLineFmt,SwTableBoxFmt。表格的属性、表格行和表格单元格都被设置到SwFrmFmt对象中。通过这种方式,属性的变化会通过Modify()函数传播到表模型对象。SwTable指针是SwTableNode的成员变量,通过这种方式,SwTable被链接到节点数组。
表格帧
SwTabFrm、SwRowFrm和SwCellFrm为表格的布局对象,它们中的每一个对应一个表格模型对象:SwTable <-> SwTabFrm, SwTableLine <-> SwRowFrm, SwTableBox <-> SwCellFrm。像表模型对象一样,表的布局对象也被注册到客户端的各自的SwFrmFmt对象。
索引和位置
SwNodes类(SwNode对象数组):包含SwNodeIndexes列表,成员变量pRoot指向列表中的第一个元素。如果SwNodes数组执行删除SwNode对象操作,SwNodeIndexes会指向一个删除的对象将会调整为下一个不会被删除的对象。
类SwNodeIndex:包含指向SwNode对象的指针,它是在SwNodes数组的SwNode对象的列表的一部分。只要SwNode对象是在SwNodes数组,该SwNodeIndex不需要改变。
如果SwNode从SwNodes数组中移除,SwNodeIndex适应移动到SwNodes数组中的下一个SwNode,此操作是由SwNodes(-Array)自己完成的。所有的SwNodeIndexs必须注册在它们的SwNode所在的SwNodes数组上,SwNodes数组包含所有注册的SwNodeIndexes的列表。成员函数pRoot指向第一个SwNodeIndex,每个SwNodeIndex有pPrev和pNext指针指向上一个/下一个在列表中的SwNodeIndex。
++() 和--()操作符允许SwNodeIndex在SwNodes数组中迭代。
类SwNodeRange:简单的SwNodeIndex对(start,end)。
SwNodes继承自BigPtrArray,BigPtrArray是BigPtrEntry的数组。
BigPtrEntry知道在数组中的位置(GetPos()),如果有元素插入或者删除,必须进行调整其位置。
SwNode继承自BigPtrEntry。
在文字处理模型中,SwTxtNode代表一个段落。SwTxtNode继承自SwCntntNode,SwCntntNode继承自SwIndexReg。
类SwIndexReg:包含一个排序的SwIndexes列表,pFirst指向列表中的第一个元素,pLast指向列表中的最后一个元素。
类SwIndex:代表数组(SwIndexReg *pArray)中的一个位置(xub_StrLen nIndex),SwIndex注册到这个数组中。如果数组被操作,会更新所有相应的位置(方法Update(..))。
类SwPosition:它是SwNodeIndex和SwIndex对并且代表文档中的一个位置。如果SwNodeIndex指向一个段落(SwTxtNode),SwIndex注册到这个SwNode并且其值指向段落中一个字符的位置。如果SwNode指向其他的类型(例如,SwTableNode、SwSectionNode、SwStartNode),SwIndex被注册到一个虚的SwIndexReg上。
重要提示:如果SwPosition的SwNodeIndex指向SwTxtNode,SwIndex必须注册到相同的SwTxtNode。如果一个SwPostion的SwNodeIndex的操作代码为:
aPosition.nNode++;SwIndex也需要适应:aPosition.nContent.Assign( aPosition.nNode.GetNode().GetCntntNode(), 0 );.