private void ScnModified(ref NativeMethods.SCNotification scn) { // The InsertCheck, BeforeInsert, BeforeDelete, Insert, and Delete events can all potentially require // the same conversions: byte to char position, char* to string, etc.... To avoid doing the same work // multiple times we share that data between events. if ((scn.modificationType & NativeMethods.SC_MOD_INSERTCHECK) > 0) { var eventArgs = new InsertCheckEventArgs(this, scn.position, scn.length, scn.text); OnInsertCheck(eventArgs); cachedPosition = eventArgs.CachedPosition; cachedText = eventArgs.CachedText; } const int sourceMask = (NativeMethods.SC_PERFORMED_USER | NativeMethods.SC_PERFORMED_UNDO | NativeMethods.SC_PERFORMED_REDO); if ((scn.modificationType & (NativeMethods.SC_MOD_BEFOREDELETE | NativeMethods.SC_MOD_BEFOREINSERT)) > 0) { var source = (ModificationSource)(scn.modificationType & sourceMask); var eventArgs = new BeforeModificationEventArgs(this, source, scn.position, scn.length, scn.text); eventArgs.CachedPosition = cachedPosition; eventArgs.CachedText = cachedText; if ((scn.modificationType & NativeMethods.SC_MOD_BEFOREINSERT) > 0) { OnBeforeInsert(eventArgs); } else { OnBeforeDelete(eventArgs); } cachedPosition = eventArgs.CachedPosition; cachedText = eventArgs.CachedText; } if ((scn.modificationType & (NativeMethods.SC_MOD_DELETETEXT | NativeMethods.SC_MOD_INSERTTEXT)) > 0) { var source = (ModificationSource)(scn.modificationType & sourceMask); var eventArgs = new ModificationEventArgs(this, source, scn.position, scn.length, scn.text, scn.linesAdded); eventArgs.CachedPosition = cachedPosition; eventArgs.CachedText = cachedText; if ((scn.modificationType & NativeMethods.SC_MOD_INSERTTEXT) > 0) { OnInsert(eventArgs); } else { OnDelete(eventArgs); } // Always clear the cache cachedPosition = null; cachedText = null; // For backward compatibility.... Of course this means that we'll raise two // TextChanged events for replace (insert/delete) operations, but that's life. OnTextChanged(EventArgs.Empty); } if ((scn.modificationType & NativeMethods.SC_MOD_CHANGEANNOTATION) > 0) { var eventArgs = new ChangeAnnotationEventArgs(scn.line); OnChangeAnnotation(eventArgs); } }
/// <summary> /// Raises the <see cref="ChangeAnnotation" /> event. /// </summary> /// <param name="e">A <see cref="ChangeAnnotationEventArgs" /> that contains the event data.</param> protected virtual void OnChangeAnnotation(ChangeAnnotationEventArgs e) { var handler = Events[changeAnnotationEventKey] as EventHandler<ChangeAnnotationEventArgs>; if (handler != null) handler(this, e); }