Annotation of Examples/UNIX/Subprocess/CommandScroll.m, revision 1.1.1.1

1.1       root        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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.