This is Controller.m in view mode; [Download] [Up]
/* Controller.m * Purpose: A subclass of Object and the main controlling class of * the application. Controller is the application delegate. * * You may freely copy, distribute, and reuse the code in this example. * NeXT disclaims any warranty of any kind, expressed or implied, as to its * fitness for any particular use. * * Written by: Sharon Zakhour * Created: 22/July/91 * */ #import <stdio.h> #import <appkit/Text.h> #import <appkit/TextField.h> #import <appkit/Matrix.h> #import <appkit/ScrollView.h> #import "Controller.h" #import "TurboText.h" @implementation Controller /* Since we have subclassed the Text object but we have used */ /* The ScrollView from IB we need to replace the Text object in */ /* the IB-generated ScrollView with our own subclass. At the */ /* same time we want to preserve the text that was inserted into */ /* the view. The replaceText method performs this swap. This */ /* is also covered in the NeXTanswer appkit.555. */ - appDidInit:sender { /* Replace the Text object in the ScrollView with my */ /* own TurboText object */ [self replaceText]; /* Now that we're ready, bring the window up */ /* In IB, we've instructed the window NOT to become */ /* visible at launch time so that we can make this swap */ /* invisibly. */ [[myScrollView window] makeKeyAndOrderFront: nil]; return self; } /* This method is called when the user selects the ConvertTo */ /* button in the window. The x,y coordinates are extracted from */ /* two form fields and the result is placed into yet-another */ /* form field. At the same time, the character position is echoed */ /* in the ScrollView with an insertion cursor at the new position. */ - convert:sender { NXPoint myPoint; int charPos; NXSelPt start, end; myPoint.x = [[charCoordinate cellAt: 0:0] floatValue]; myPoint.y = [[charCoordinate cellAt: 1:0] floatValue]; charPos = [[myScrollView docView] convertPoint: &myPoint]; [[charPosition cellAt: 0: 0] setFloatValue: (float)charPos]; /* Set the selection at the character position so that */ /* we can see it. This will also make the ScrollView the */ /* first responder which is necessary to see the blinking */ /* insertion point. */ [[myScrollView docView] setSel: charPos :charPos]; /* Now let's get the selection point back. The actual x,y */ /* coordinates have been adjusted by the Text object */ /* and we want to update our textfields */ [[myScrollView docView] getSel: &start :&end]; [[charPosition cellAt: 1:0] setFloatValue: start.x]; [[charPosition cellAt: 2:0] setFloatValue: start.y]; return self; } /* Swaps a standard Text object from IB with my own. See */ /* NeXTanswer appkit.555 for more information. */ - replaceText { NXStream *s = (NXStream *)nil; id stdDoc, newDoc; NXRect r; /* Measure the old doc view, then trash it. */ stdDoc = [myScrollView docView]; [stdDoc getFrame:&r]; /* Get the entire text, using the rich RTF format */ s = NXOpenMemory(NULL, 0, NX_READWRITE); if (s) [stdDoc writeRichText: s]; [myScrollView setVertScrollerRequired:YES]; [myScrollView setHorizScrollerRequired:NO]; [myScrollView setDynamicScrolling:YES]; newDoc = [[TurboText alloc] initFrame:&r]; [newDoc moveTo:0.0:0.0]; [newDoc notifyAncestorWhenFrameChanged: YES]; [newDoc setVertResizable:YES]; [newDoc setSelectable:YES]; [newDoc setEditable: YES]; [newDoc setAutosizing:NX_WIDTHSIZABLE]; [newDoc setMinSize:&r.size]; [newDoc setMonoFont:NO]; r.size.height = 1.0e30; [newDoc setMaxSize:&r.size]; [myScrollView setDocView:newDoc]; [stdDoc free]; /* Stick the text from the original doc into the new doc */ if (s) { /* Rewind to the beginning of the stream */ NXSeek(s, 0L, NX_FROMSTART); [newDoc readRichText:s]; NXCloseMemory(s, NX_FREEBUFFER); } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.