Scintilla'改变之前'通知

时间:2014-03-14 16:28:29

标签: notifications onchange scintilla

当Scintilla编辑器第一次变得“脏”时,我需要做一些处理。 之前文档实际发生了变化。

SCN_SAVEPOINTLEFT通知似乎是明显的候选人,但不幸的是,之后发生了,导致文档变脏。

查看其他可用通知,{/ 1}}在发生更改后也会被解雇(当然SCN_MODIFIED也是如此)。

我能想到的最好的方法是开始回放SCEN_CHANGE进行宏录制(即保存文档或撤消所有更改时)。然后,当我用SCN_SAVEPOINTREACHED检测到第一次更改时,我停止录制,撤消所有更改,直到我返回保存点,执行我的自定义处理(恰好修改文档中的日期字段),然后重播录制的宏可以恢复未完成的更改。

这看起来非常令人费解。有没有更简单的方法? (也许用SCN_BEFORECHANGE通知创建我自己的Scintilla自定义版本会更简单,但我更愿意避免创建一个分支。粗略地浏览一下来源表明这里有很多分数。必须发送通知,因此很容易错过一些。)


更新:真正的要求是当用户执行'撤消'首次修改文档后,自动'编辑和用户的第一次编辑在撤消缓冲区中的顺序不正确。最简单的解决方案是,不是强制自动更新是第一个,而是使用SCN_MODIFIED / SCI_BEGINUNDOACTION将这两个操作合并为一个撤消操作。请参阅下面的评论,了解我是如何做到的。

1 个答案:

答案 0 :(得分:1)

SCN_MODIFIED通知确实似乎符合您的规范。 modificationType字段提供有关已执行操作的信息,包括:

SC_MOD_BEFOREINSERT 0x400 Text is about to be inserted into the document.
SC_MOD_BEFOREDELETE 0x800 Text is about to be deleted from the document.