This is TileScrollView.m in view mode; [Download] [Up]
// TileScrollView.h // By Jayson Adams, NeXT Developer Support Team // 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. #import <appkit/ClipView.h> #import <appkit/Scroller.h> #import <appkit/Matrix.h> #import <appkit/Text.h> #import <appkit/NXImage.h> #import <appkit/TextFieldCell.h> #import <appkit/ButtonCell.h> #import "StubView.h" #import "SpreadSheetMgr.h" #import "TileScrollView.h" const char TileScrollView_h_rcsid[] = TILESCROOLVIEW_H; const char TileScrollView_m_rcsid[] = "$Id"; #define printval(x) printf(""#x" = %f\n",(x)) #define RECELL_TIME 500 @implementation TileScrollView /* instance methods */ - initFrame:(const NXRect *)theFrame { // theFrame->origin.x = 0.0; // theFrame->origin.y = 0.0; [super initFrame:theFrame]; //printf("TileScrollView: initFrame:\n"); /* turn off drawing (to the screen) */ [window disableFlushWindow]; [self makelines:theFrame]; [self makeColumns:theFrame]; [self makeArrowMatrix]; [self makeAddMatrix]; /* send results to screen */ [[window reenableFlushWindow] flushWindow]; [self setAutoresizeSubviews:YES]; return self; } - makelines:(const NXRect *)theFrame /* make a clipView to hold line number Matrix */ { NXRect frameRect = {0.0, 0.0, 0.0, 0.0}; NXRect rulerViewRect; id cellPrototype; NXSize size; cellPrototype = [[TextFieldCell alloc] initTextCell:"kkkkkk"]; [cellPrototype setTextGray:NX_BLACK]; [cellPrototype setBordered:YES]; lineMatrix = [[Matrix alloc] initFrame:&frameRect mode:NX_TRACKMODE prototype:cellPrototype numRows:0 numCols:0]; size.width = 0.0; size.height = 0.0; [lineMatrix setIntercell:&size]; stubView = [[StubView alloc] initFrame:&frameRect]; [self addSubview:stubView]; [lineMatrix setAutodisplay:NO]; [lineMatrix setFrame:theFrame]; [lineMatrix setCellBackgroundGray:NX_LTGRAY]; [lineMatrix renewRows:DEFAULT_ROWS cols:1]; [lineMatrix sizeToCells]; { int i; for (i = 0; i < DEFAULT_ROWS; i++) [[lineMatrix cellAt:i :0] setIntValue:i]; } [lineMatrix update]; [lineMatrix getBounds:&rulerViewRect]; lineMatrixClipView = [[ClipView alloc] initFrame:&rulerViewRect]; [lineMatrixClipView setDocView:lineMatrix]; [self addSubview:lineMatrixClipView]; //[lineMatrixClipView sizeTo:rulerViewRect.size.width //:rulerViewRect.size.width]; return self; } - makeColumns:(const NXRect *)theFrame /* make a clipView to hold column Name Matrix */ { NXRect frameRect = {45.0, 0.0, 0.0, 0.0}; NXRect rulerViewRect; NXSize size = {80.0, 20.0}; id cellPrototype; cellPrototype = [[TextFieldCell alloc] initTextCell:" "]; [cellPrototype setTextGray:NX_BLACK]; [cellPrototype setBordered:YES]; [cellPrototype setEditable:YES]; [cellPrototype setAlignment:NX_CENTERED]; colNameMatrix = [[Matrix alloc] initFrame:&frameRect mode:NX_TRACKMODE prototype:cellPrototype numRows:0 numCols:0]; [colNameMatrix setCellSize:&size]; size.width = 0.0; size.height = 0.0; [colNameMatrix setIntercell:&size]; [colNameMatrix setAutodisplay:NO]; [colNameMatrix setFrame:theFrame]; [colNameMatrix setCellBackgroundGray:NX_LTGRAY]; [colNameMatrix renewRows:1 cols:DEFAULT_COLS]; [colNameMatrix sizeToCells]; //[colNameMatrix update]; [colNameMatrix getBounds:&rulerViewRect]; rulerViewRect.size.width -= 45.0; colNameMatrixClipView = [[ClipView alloc] initFrame:&rulerViewRect]; [colNameMatrixClipView setDocView:colNameMatrix]; [self addSubview:colNameMatrixClipView]; /* * [colNameMatrixClipView sizeTo:rulerViewRect.size.width * :rulerViewRect.size.width]; */ return self; } - makeArrowMatrix { NXRect frameRect = {148.0, 40.0, 20.0, 40.0}; ButtonCell *bCell; NXSize aSize = {18.0, 18.0}; bCell = [[ButtonCell alloc] initIconCell:"icon2"]; [bCell setBordered:YES]; arrowMatrix = [[Matrix alloc] initFrame:&frameRect mode:NX_TRACKMODE prototype:bCell numRows:2 numCols:1]; [[arrowMatrix cellAt:0 :0] setIcon:"icon3"]; [[arrowMatrix cellAt:0 :0] setType:NX_MOMENTARYPUSH]; [[arrowMatrix cellAt:1 :0] setType:NX_MOMENTARYPUSH]; [arrowMatrix setCellSize:&aSize]; [arrowMatrix update]; return self; } - makeAddMatrix { NXRect frameRect = {148.0, 40.0, 20.0, 40.0}; ButtonCell *bCell; NXSize aSize = {24.0, 18.0}; bCell = [[ButtonCell alloc] initIconCell:"icon6"]; [bCell setBordered:YES]; addMatrix = [[Matrix alloc] initFrame:&frameRect mode:NX_TRACKMODE prototype:bCell numRows:1 numCols:3]; [[addMatrix cellAt:0 :0] setIcon:"icon5"]; [[addMatrix cellAt:0 :0] setType:NX_MOMENTARYPUSH]; [[addMatrix cellAt:0 :1] setType:NX_MOMENTARYPUSH]; [addMatrix setCellSize:&aSize]; [addMatrix update]; return self; } - free { return[super free]; } - changeScale:sender { return self; } - tile /* * tile gets called whenever the scrollView changes size. Its job is to resize * all of the scrollView's "tiled" views (scrollers, contentView and any other * views we might want to place in the scrollView's bounds). */ { NXRect contentViewRect, rulerRect, rulerClipRect, scrollerRect, buttonRect, stubRect; //printf("tile\n"); /* resize and arrange the scrollers and contentView as usual */ [super tile]; if ([arrowMatrix superview] != self) { [self addSubview:arrowMatrix]; } if ([addMatrix superview] != self) { [self addSubview:addMatrix]; } if ([colNameMatrixClipView superview] != self) { [self addSubview:colNameMatrixClipView]; } if ([lineMatrixClipView superview] != self) { [self addSubview:lineMatrixClipView]; } Controller = [self superview]; [[[arrowMatrix cellAt:0 :0] setTarget:Controller] setAction:@selector(readLess:)]; [[[arrowMatrix cellAt:1 :0] setTarget:Controller] setAction:@selector(readMore:)]; [[[addMatrix cellAt:0 :0] setTarget:Controller] setAction:@selector(addRowFunction:)]; [[[addMatrix cellAt:0 :1] setTarget:Controller] setAction:@selector(addColFunction:)]; [Controller setColumnNameMatrix:colNameMatrix]; [Controller setLineNumberMatrix:lineMatrix]; /* MYCODE */ [contentView getFrame:&contentViewRect]; [colNameMatrix getFrame:&rulerRect]; NXDivideRect(&contentViewRect, &rulerClipRect, NX_HEIGHT(&rulerRect), 1); rulerClipRect.origin.x += 45.0; rulerClipRect.size.width -= 45.0; [colNameMatrixClipView setFrame:&rulerClipRect]; [contentView setFrame:&contentViewRect]; [colNameMatrix update]; /* shrink the vScroller to make room for the stub view */ [stubView getFrame:&stubRect]; [vScroller getFrame:&scrollerRect]; NXDivideRect(&scrollerRect, &stubRect, NX_HEIGHT(&rulerClipRect), 1); [vScroller setFrame:&scrollerRect]; stubRect.size.width += 45.0; [stubView setFrame:&stubRect]; [stubView update]; [contentView getFrame:&contentViewRect]; [lineMatrix getFrame:&buttonRect]; NXDivideRect(&contentViewRect, &rulerClipRect, NX_WIDTH(&buttonRect), 0); rulerClipRect.size.height -= 1; [lineMatrixClipView setFrame:&rulerClipRect]; //[lineMatrixClipView translate:0 :298]; [contentView setFrame:&contentViewRect]; /* * now make the vScroller smaller and stick the two buttons next to * it */ [arrowMatrix getFrame:&buttonRect]; [vScroller getFrame:&scrollerRect]; NXDivideRect(&scrollerRect, &buttonRect, 38.0, 3); [vScroller setFrame:&scrollerRect]; //NXInsetRect(&buttonRect, 1.0, 1.0); [arrowMatrix setFrame:&buttonRect]; /* * now make the hScroller smaller and stick the two buttons next to * it */ [hScroller getFrame:&scrollerRect]; [addMatrix getFrame:&buttonRect]; NXDivideRect(&scrollerRect, &buttonRect, 66.0, 2); [hScroller setFrame:&scrollerRect]; NXInsetRect(&buttonRect, 1.0, 1.0); [addMatrix setFrame:&buttonRect]; return self; } - scrollClip:aClipView to:(NXPoint *)aPoint { NXPoint colOrigin; NXRect colBounds; //printf("scroll\n"); /* don't do anything if it's not the contentView */ if (aClipView != contentView) { return self; } /* turn off drawing (to the screen) */ [window disableFlushWindow]; [aClipView rawScroll:aPoint]; /* compute new origin for the colNameMatrix */ [colNameMatrixClipView getBounds:&colBounds]; colOrigin.x = aPoint->x /*- NX_SCROLLERWIDTH*//* + colBounds.origin.x *//* + 542.0 */ ; colOrigin.y = colBounds.origin.y; /* scroll the ruler view to that point */ [colNameMatrixClipView rawScroll:&colOrigin]; /* * compute new origin for the line Matrix (don't let it scroll * horizontally) */ [lineMatrixClipView getBounds:&colBounds]; colOrigin.x = colBounds.origin.x; //if (aPoint->y != colBounds.origin.y) colOrigin.y = aPoint->y /*- 298.0*//*- colBounds.origin.y - 298.0*//* + 248.0 */ ; /* scroll the Matrix view to that point */ [lineMatrixClipView rawScroll:&colOrigin]; /* send results to screen */ [[window reenableFlushWindow] flushWindow]; return self; } - read:(NXTypedStream *) typedStream { //printf("read:\n"); [super read:typedStream]; lineMatrix = NXReadObject(typedStream); lineMatrixClipView = NXReadObject(typedStream); colNameMatrix = NXReadObject(typedStream); colNameMatrixClipView = NXReadObject(typedStream); arrowMatrix = NXReadObject(typedStream); addMatrix = NXReadObject(typedStream); stubView = NXReadObject(typedStream); return self; } - write:(NXTypedStream *) typedStream { //printf("write:\n"); [super write:typedStream]; NXWriteObject(typedStream, lineMatrix); NXWriteObject(typedStream, lineMatrixClipView); NXWriteObject(typedStream, colNameMatrix); NXWriteObject(typedStream, colNameMatrixClipView); NXWriteObject(typedStream, arrowMatrix); NXWriteObject(typedStream, addMatrix); NXWriteObject(typedStream, stubView); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.