This is TextSelChange.m in view mode; [Download] [Up]
#import "textundo.h" @implementation TextSelChange /* * The TextSelChange is the workhorse of undoable text. It records the * contents of the selection (via TextSelection objects) before and after * a change is made. By alternately installing and removing the old and new * selections, the original change can be undone and redone. */ - initView:aView name:(const char *)str { [super initView:aView]; oldSel = nil; newSel = nil; name = str; return self; } - free { if (newSel) { [newSel free]; } if (oldSel) { [oldSel free]; } return [super free]; } - (const char *)changeName { return name; } - saveAfterChange { newSel = [[[TextSelection alloc] initText:textView] capture]; return self; } - saveBeforeChange { NXSelPt start, end; [textView getSel:&start :&end]; selStart = start.cp; selEnd = end.cp; oldSel = [TextSelection alloc]; [[oldSel initText:textView start:selStart end:selEnd] capture]; [oldSel setClickCount:[newSel clickCount]]; return self; } - undoChange { [[textView window] disableFlushWindow]; [newSel remove]; [oldSel install]; [[[textView window] reenableFlushWindow] flushWindow]; return [super undoChange]; } - redoChange { NXRect oldBounds, invalidRect; id delegate; [[textView window] disableFlushWindow]; if (delegate = [textView delegate]) { [textView getBounds:&oldBounds]; invalidRect = oldBounds; invalidRect.size.width = 0.0; invalidRect.size.height = 0.0; } else { delegate = nil; } [oldSel remove]; [newSel install]; if (delegate != nil && [delegate respondsTo:@selector(textDidResize:oldBounds:invalid:)]) { [delegate textDidResize:textView oldBounds:&oldBounds invalid:&invalidRect]; } [[[textView window] reenableFlushWindow] flushWindow]; return [super redoChange]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.