在實際開發文本編輯器時,無需逐一解決所有問題,關鍵在於先確定文檔對象樹的結構。這裡引入了文檔對象模型(Document Object Model,DOM)的概念。我們日常接觸最多的莫過於HTML DOM——使用JavaScript操作網頁內容時即在使用它;此外還有XML DOM,以及VBA操作Word/Excel時用到的文檔對象模型。DOM的核心思想是將文檔中所有內容與內存中的對象建立映射關係:應用程序修改內存對象數據,相應文檔內容同步更新;刪除內存對象即刪除文檔內容。更多DOM設計思想可參考W3C標準。
觀察.NET類庫中System.Xml命名空間定義的XML DOM,會發現XmlDocument、XmlElement、XmlAttribute、XmlComment、XmlText等所有節點類型均繼承自抽象類XmlNode。這種設計極大地方便了對XML文檔樹的遍歷:各類對象均視為XmlNode,根據自身需求重載虛方法,外部程序利用多態性實現差異化處理。
遵循上述指導思想,筆者定義了抽象類TextElement作為所有文檔對象的基類,包含以下核心虛成員:
Left、Top、Width、Height(對象位置與顯示大小);RealLeft、RealTop(只讀,視圖區域中的實際顯示位置)。RefreshSize()(重新計算顯示大小)、RefreshView()(重新繪製對象)。HandleMouseDown()、HandleMouseMove()、HandleMouseUp()。FromXML()(從XML節點加載數據)、ToXML()(向XML節點保存數據)。鑑於文檔內容具有層級結構,進一步定義容器類型TextContainer(繼承自TextElement),擴展子對象管理功能:
MaxWidth:內容最大寬度(頁寬減左右邊距),所有內容限制在此寬度內。ChildElements:只讀屬性,返回ArrayList類型的子對象集合。AppendChild()、RemoveChild()、RemoveChildRange()、InsertBefore():子對象的增刪插操作。這種基於DOM的對象體系,為文本編輯器提供了清晰的數據結構基礎,支撐複雜的排版、編輯與持久化需求。