This is CellScrollView.m in view mode; [Download] [Up]
/* * 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 "CellScrollView.h" #import "FooCell.h" #import <appkit/Matrix.h> #import <objc/List.h> @implementation CellScrollView - init { return [self initFrame:NULL]; } - initFrame:(const NXRect *)frameRect { NXSize interCellSpacing = {0.0, 0.0}, docSize; [super initFrame:frameRect]; cellMatrix = [[Matrix alloc] initFrame:frameRect mode:NX_LISTMODE cellClass:[FooCell class] numRows:0 numCols:1]; /* * In the following lines, * remember that "cellMatrix" is the matrix that will be installed * in the scrollview, "self" is the scrollview. */ /* we don't want any space between the matrix's cells */ [cellMatrix setIntercell:&interCellSpacing]; /* resize the matrix to contain the cells */ [cellMatrix sizeToCells]; [cellMatrix setAutosizeCells:YES]; /* * when the user clicks in the matrix and then drags the mouse out of * scrollView's contentView, we want the matrix to scroll */ [cellMatrix setAutoscroll:YES]; /* let the matrix stretch horizontally */ [cellMatrix setAutosizing:NX_WIDTHSIZABLE]; /* Install the matrix as the docview of the scrollview */ [[self setDocView:cellMatrix] free]; /* set up the visible attributes of the scrollview */ [self setVertScrollerRequired:YES]; [self setBorderType:NX_BEZEL]; /* tell the subviews to resize along with the scrollview */ [self setAutoresizeSubviews:YES]; /* This is the only way to get the clipview to resize too */ [[cellMatrix superview] setAutoresizeSubviews:YES]; /* Allow the scrollview to stretch both horizontally and vertically */ [self setAutosizing:NX_WIDTHSIZABLE|NX_HEIGHTSIZABLE]; /* Resize the matrix to fill the inside of the scrollview */ [self getContentSize:&docSize]; [cellMatrix sizeTo:docSize.width :docSize.height]; return self; } - free { [cellMatrix free]; return [super free]; } - cellMatrix { return cellMatrix; } - loadCellsFrom:(List *)fooObjects /* * Fill the matrix with FooCells, associate each FooCell with a FooObject. * * Since we recycle the cells (via renewRows:cols:), we also set the state * of each cell to 0 and unhighlight it. If we don't do that, the recycled * cells will display their previous state. */ { int i, cellCount; cellCount = [fooObjects count]; /* tell the matrix there are 0 cells in it (but don't deallocate them) */ [cellMatrix renewRows:0 cols:1]; [cellMatrix lockFocus]; /* for highlightCellAt::lit: */ for (i=0;i<cellCount;i++) { FooCell *cell; /* * add a row to the matrix. (This doesn't necessarily allocate a new * cell, thanks to renewRows:cols:). */ [cellMatrix addRow]; cell = [cellMatrix cellAt:i:0]; /* make sure the cell is neither selected nor highlighted */ [cellMatrix highlightCellAt:i:0 lit:NO]; [cell setState:0]; /* install the fooObject in that cell */ [cell setFooObject:[fooObjects objectAt:i]]; } [cellMatrix unlockFocus]; [cellMatrix sizeToCells]; [cellMatrix display]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.