Chapter 226 · 文档控件扩展

富文档与事务

xuiDocument 是一个共享句柄的文档对象:事务保证编辑原子性,快照提供不可变视图,修订号驱动撤销与协同。

226

文档是共享句柄

xui_document pDoc;
xuiDocumentCreate(&tDesc, &pDoc);
xuiDocumentRetain(pDoc);    // 编辑器与预览各自持有引用
...
xuiDocumentRelease(pDoc);

创建描述可指定 profile 与 Markdown 方言(xuiDocumentGetProfile / GetMarkdownDialect 可回读)。同一份文档可以同时挂富文本编辑器、Markdown 编辑器与只读预览——三个视图共享内容与撤销历史。

事务:要么全有要么全无

xui_document_transaction t;
xuiDocumentBeginTransaction(pDoc, &tTxnDesc, &t);
xuiDocumentTxnInsertFragment(t, ...);
xuiDocumentTxnInsertTable(t, 1, XUI_DOCUMENT_APPEND, 3, 2, 1, &tTable);
xuiDocumentTxnCommit(t, NULL);
xuiDocumentTxnRelease(t);
原子保证:任一步失败则整体不提交——文档不会留下半截结构。UI 侧的失败反馈就是一句"Operation returned %d. The document was not partially committed."

快照与修订

xuiDocumentAcquireSnapshot 取不可变快照,配合 SnapshotRetain / Release 与一族遍历 API(GetNode / GetChild / GetBlockSyntax / GetInlineSyntax / GetSourceSegment / GetSourceLine / GetTableToken…)做导出、搜索或语法着色;xuiDocumentGetRevision 返回单调修订号,是撤销栈与协同合并的基准。

编辑器控件

xui_doc_editor_desc_t ed = { 0 };
ed.tView.pDocument = pDoc;
xuiDocumentEditorCreate(pContext, &ed, &pEditor);   // 三参数创建模式

xuiDocumentEditorExecute(pEditor, XUI_DOC_EDIT_BOLD); // 结构化命令
xuiDocumentEditorInsertText(pEditor, ...);
xuiDocumentUndo(pDoc, NULL);                          // 共享撤销