◆InsertRangeBefore 方法,該方法和InsertBefore類型,只是用於插入一批文檔元素對象
在某些容器對象中存在一個特殊的子元素,該子元素為最後一個元素,並且不能刪除,比如對於段落對象,在此是一種容器對象,該對象最後一個元素為一個段落結尾標記對象,該對象不能刪除,而在其他類型的容器對象中也可能存在類似的結尾對象,因此在TextContainer對象中就考慮這種情況,因此定義了一套虛成員來處理
◆AddLastElement 虛方法,想容器對象添加段落結尾標記對象來作為最後一個對象,其他派生的容器對象可以重載該方法來實現自己的最後對象
◆IsLastElement 函數,該函數參數為一個TextElement對象,本函數返回指定的TextElement對象是否是最後對象,程序在刪除子元素前都有調用該函數,若要刪除的元素為最後元素則不應當刪除
TextContainer對象還重載RefreshSize方法來重新計算所有子元素的顯示大小,此外還定義了新的虛方法RefreshLine來進行分行處理,為了方便分行處理,還定義了文檔行對象TextLine,文檔行對象用於保存文檔內容分行信息,當文檔分行完畢而內容沒有發生改變時重新繪制文檔內容時就無需重新計算要顯示的內容的坐標,文檔行對象的成員有
◆LineSpacing 行間距,也就是本文檔行下端和下文本行上端的距離
◆Elements 屬於該文檔行的所有的文檔元素的集合,該屬性為了編程方便
◆FirstElement 本文檔行第一個元素
◆LastElement 文檔行最後一個元素
◆RealLeft , RealTop 文檔行左上角在文檔視圖區域中的位置
◆Container 本文檔行所在的容器對象
◆ContentWidth 本文檔行所有元素的寬度
為了保存分行信息,TextContainer對象還定義了一個Lines只讀屬性,該屬性返回System.Collections.ArrayList對象列表,該列表元素為屬於該容器的所有文本行對象,容器對象執行RefreshLine進行分行的步驟為:
◆將文本行集合Lines清空
◆設置所有參與分行的元素集合
◆從前到後的遍歷所有的參與分行的元素集合中的所有子元素
◆若子元素對象為制表符或水平線對象則重新計算它的寬度
◆若子元素為一個容器對象則調用它的RefreshLine方法
◆向當前行的元素列表中添加元素,並累計元素的寬度和,若寬度和大於容器顯示寬度(我們稱為情況1)或者當前元素單獨占據一行則取消向當前行添加元素並結束當前行
◆若當前元素是強制換行的則結束當前行
◆在結束當前行前,若當前元素不能出現在行尾或者下一個元素不能出現在行首則取消向當前行添加當前元素(這也算情況1)。按照書寫慣例,某些字符例如!),.:;?]}¨·ˇˉ―‖’”…∶、。〃々〉》」』】〕〗!"'),.:;?]`|}~¢是不能顯示在行首,而另外一些字符例如([{·‘“〈《「『【〔〖(.[{£¥是不能顯示在行尾,此外在某些特定的應用中可能還有其他類型的元素也出現這種情況,這些情況需要考慮。為此在基礎元素對象類型TextElement中定義了方法 CanBeLineHead 來判斷元素對象是否可以出現在行首,定義了方法CanBeLineEnd來判斷元素對象是否可以出現在行尾,這樣字符元素對象和其他元素對象可以重載這兩個方法來進行所需的判斷。在進行這樣的判斷要特別的小心,若容器顯示寬度比較小則有可能由於這種判斷而導致死循環,因此還需要額外的進行反死循環的判斷(當年為了發現這個錯誤而嘔出了幾十兩血)。