home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Examples / UNIX / Subprocess / CommandScroll.m < prev    next >
Text File  |  1992-06-01  |  4KB  |  152 lines

  1. /*
  2.         CommandScroll.m
  3.     by Joe Freeman
  4.         Subprocess Example, Release 2.0
  5.         NeXT Computer, Inc.
  6.  
  7.     You may freely copy, distribute and reuse the code in this example.
  8.     NeXT disclaims any warranty of any kind, expressed or implied, as to
  9.     its fitness for any particular use.
  10. */
  11.  
  12. #import "CommandScroll.h"
  13. #import <appkit/nextstd.h>
  14. #import <appkit/Font.h>
  15. #import <appkit/Text.h>
  16.  
  17. @implementation CommandScroll
  18.  
  19. - initFrame:(const NXRect *)frameRect
  20. {    
  21.     [super initFrame:frameRect];
  22.     [self setVertScrollerRequired: YES];
  23.     [self setBackgroundGray: NX_WHITE];
  24.     [self awake];
  25.     return self;
  26. }
  27.  
  28. - awake
  29.     // these initializations implemented here so that this object can be
  30.     // made an IB palatte more easily 
  31. {    
  32.     NXRect textRect;
  33.     id theText;
  34.     
  35.     textRect.origin.x = textRect.origin.y = 0.0;
  36.     [self getContentSize: &(textRect.size)];
  37.     theText =
  38.     [[Text alloc]
  39.         initFrame: &textRect  text:NULL alignment: NX_LEFTALIGNED];
  40.     [theText notifyAncestorWhenFrameChanged:YES];
  41.     [theText setHorizResizable:NO];
  42.     [theText setVertResizable:YES];
  43.     
  44.     textRect.size.width = 0.0;
  45.     [theText setMinSize:&(textRect.size)];
  46.     [self getContentSize: &(textRect.size)];
  47.     textRect.size.height = 1000000;
  48.     [theText setMaxSize:&(textRect.size)];
  49.     
  50.     [[theText superview] setAutoresizeSubviews:YES];
  51.     [[theText superview] setAutosizing: NX_HEIGHTSIZABLE | NX_WIDTHSIZABLE];
  52.     
  53.     [theText setCharFilter: NXFieldFilter];
  54.     [theText setMonoFont:FALSE];
  55.     [self setDocView: theText];
  56.     machineFont = [Font newFont:"Ohlfs" size:12];
  57.     userFont = [Font newFont:"Courier-Bold" size:13];
  58.     return self;
  59. }
  60.  
  61. - setDocView:anObject
  62. {
  63.     [super setDocView:anObject];
  64.     docView = anObject;
  65.     [docView setDelegate:self];
  66.     return self;
  67. }
  68.  
  69. /*==========================================================
  70.  *
  71.  * New method for subclass
  72.  *
  73.  *==========================================================*/
  74.  
  75. - appendString:(char *)buffer
  76.     // append the buffer to the end of the text object
  77. {
  78.     [docView setSel:[docView textLength] :0];
  79.     [docView setSelFont:machineFont];
  80.     [docView replaceSel:buffer];
  81.     [docView scrollSelToVisible];
  82.     lastTextCount = [docView textLength];
  83.     return self;
  84. }
  85.  
  86. /*==========================================================
  87.  *
  88.  * Text Object Delegation
  89.  *
  90.  *==========================================================*/
  91.  
  92. - (BOOL)textWillChange:textObject 
  93.     // moving the selection to the end before the change means the keys
  94.     // the user hits will always appear at the end of the scroll view
  95. {
  96.     [docView setSel:[docView textLength] :0];
  97.     [docView setSelFont:userFont];
  98.     [docView scrollSelToVisible];
  99.     return NO;
  100. }
  101.  
  102. - textDidEnd:textObject endChar:(unsigned short)whyEnd  
  103.     // Get this on every Return if using NXFieldFilter
  104.     // really simplistic.  Assumes user does not type ahead
  105. {
  106.     [docView setSel:[docView textLength] :0];
  107.     [docView replaceSel: "\n"];
  108.     lastTextCount = [docView textLength];
  109.     if (delegate && [delegate respondsTo:@selector(userEntered:)])
  110.     [delegate perform:@selector(userEntered:) with:(void *)"\n"];
  111.     return self;
  112. }
  113.  
  114. - textDidGetKeys:textObject isEmpty:(BOOL)flag 
  115.     // Send each character as it is entered.
  116.     // The delta calculation is in case the user has backspaced.
  117. {    
  118.     int    delta;        // the difference in this length from previous
  119.     int    theLength;    // current length of text object
  120.     char *theText, miniBuffer[2];
  121.     BOOL mallocedTheText = NO;
  122.     
  123.     theLength = [docView textLength];
  124.     delta = theLength - lastTextCount;
  125.     if (delta > 0)
  126.     {
  127.         theText = (char *)malloc(delta + 1);
  128.         mallocedTheText = YES;
  129.     [docView
  130.         getSubstring:theText
  131.         start:([docView textLength]-delta)
  132.         length:delta];
  133.     theText[delta] = '\0';
  134.     }
  135.     else
  136.     {
  137.         theText = miniBuffer;
  138.     strcpy(theText,"\177");
  139.     }
  140.     if (delegate && [delegate respondsTo:@selector(userEntered:)])
  141.     [delegate perform:@selector(userEntered:) with:(void *)theText];
  142.     lastTextCount = theLength;
  143.     
  144.     if (mallocedTheText) {
  145.         free(theText);
  146.     }
  147.     
  148.     return self;
  149. }
  150.  
  151. @end
  152.