home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Examples / AppKit / Draw / textUndo.subproj / TextSelection.m < prev    next >
Text File  |  1992-02-09  |  2KB  |  115 lines

  1. #import "textundo.h"
  2.  
  3. @implementation TextSelection
  4.  
  5. /*
  6.  * The TextSelection class takes a snapshot of the current selection of
  7.  * a Text object. It remembers the position of the selection and records
  8.  * the characters in the selection with an RTF stream.
  9.  */
  10.  
  11. - initText:aView
  12. {
  13.     NXSelPt selStart, selEnd;
  14.  
  15.     [aView getSel:&selStart :&selEnd];
  16.     return [self initText:aView start:selStart.cp end:selEnd.cp];
  17. }
  18.  
  19. - initText:aView start:(int)startPos end:(int)endPos
  20. {
  21.     [super init];
  22.  
  23.     text = aView;
  24.     start = startPos;
  25.     end = endPos;
  26.  
  27.     selectionChars = (NXStream *) 0;
  28.  
  29.     if (start == 0 && end == [text textLength]) {
  30.     allText = YES;
  31.     } else {
  32.     allText = NO;
  33. 2b}
  34.  
  35.     [text getFrame:&frame];
  36.  
  37.     return self;
  38. }
  39.  
  40. - free
  41. {
  42.     if (selectionChars) {
  43.     NXCloseMemory(selectionChars, NX_FREEBUFFER);
  44.     }
  45.  
  46.     return [super free];
  47. }
  48.  
  49. - (int)clickCount
  50. {
  51.     return clickCount;
  52. }
  53.  
  54. - setClickCount:(int)value
  55. {
  56.     clickCount = value;
  57.     return self;
  58. }
  59.  
  60. /*
  61.  * The Text object doesn't save everything out in writeRichText:from:to: even
  62.  * if the bounds specify the entire contents of the object. Things like tab
  63.  * stops and margins are missing. However, writeRichText: does a better job,
  64.  * although not perfect.
  65.  */
  66.  
  67. - capture
  68. {
  69.     clickCount = [text clickCount];
  70.  
  71.     if (start < end || allText) {
  72.     selectionChars = NXOpenMemory(NULL, 0, NX_READWRITE);
  73.     if (allText) {
  74.         [text writeRichText:selectionChars];
  75.     } else {
  76.         [text writeRichText:selectionChars from:start to:end];
  77.     }
  78.     }
  79.  
  80.     return self;
  81. }
  82.  
  83. - install
  84. {
  85.     [text setSel:start :start];
  86.     [text setFrame:&frame];
  87.  
  88.     if (selectionChars) {
  89.     NXSeek(selectionChars, 0, NX_FROMSTART);
  90.  
  91.     if (allText) {
  92.         [text readRichText:selectionChars];
  93.         [text display];
  94.     } else {
  95.         [text replaceSelWithRichText:selectionChars];
  96.     }
  97.  
  98.     [text setSel:start :end];
  99.  
  100.     }
  101.  
  102.     return self;
  103. }
  104.  
  105. - remove
  106. {
  107.     [text setSel:start :end];
  108.     [text setClickCount:clickCount];
  109.     [text eraseSelection];
  110.  
  111.     return self;
  112. }
  113.  
  114. @end
  115.