This is CellScrollView.m in view mode; [Download] [Up]
/*
* Copyright (C) 1993 Robert Davis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of Version 2, or any later version, of
* the GNU General Public License as published by the Free Software
* Foundation.
*/
static char RCSId[]="$Id: CellScrollView.m,v 1.9 1993/05/18 03:54:44 davis Exp $";
/*
* Based heavily on the NeXTSTEP MiniExample CellScrollView
* by R. Dunbar Poor and Mai Nguyen.
*/
#import <appkit/Cell.h>
#import <appkit/nextstd.h>
#import "CellScrollView.h"
#import "EditMatrix.h"
#import "SubObjectCategory.h"
@implementation CellScrollView
- initFrame:(const NXRect *)frameRect
{
[super initFrame:frameRect];
return self;
}
- initMatrixCellClass:classId cols:(int)anInt
{
Cell *cell;
NXSize interCellSpacing = {0.0, 0.0};
/*
* This method should only be called once. Check to see if
* cellMatrix already exists.
*/
if (cellMatrix || !classId)
return nil;
cell = [[classId alloc] init];
isSubType = [cell respondsTo:@selector(setSubObject:)];
[cell free];
numCols = anInt;
cellMatrix = [[EditMatrix alloc] initFrame: &frame
mode: NX_LISTMODE
cellClass: (cellClass = classId)
numRows: 0
numCols: numCols];
[cellMatrix setIntercell:&interCellSpacing];
[cellMatrix sizeToCells]; /* Resize matrix to contain cells */
[cellMatrix setAutosizeCells:YES];
[cellMatrix setAutoscroll:YES]; /* Auto-scroll on drag if necessary */
[cellMatrix setAutosizing:NX_WIDTHSIZABLE];
[[self setDocView:cellMatrix] free];
[self setVertScrollerRequired:YES];
[self setBorderType:NX_BEZEL];
[self setAutoresizeSubviews:YES];
/* This is the only way to get the clipview to resize too */
[[cellMatrix superview] setAutoresizeSubviews:YES];
if (cellSizePrototype) {
NXRect protoFrame;
NXSize docSize;
[cellSizePrototype getFrame:&protoFrame];
[self getContentSize:&docSize];
if ((NX_WIDTH(&protoFrame) * numCols) > docSize.width)
[self setHorizScrollerRequired:YES];
[cellMatrix sizeTo:(NX_WIDTH(&protoFrame) * numCols) :docSize.height];
[cellSizePrototype free];
cellSizePrototype = nil;
} else {
NXSize docSize;
/* 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];
}
- awakeFromNib
{
return self;
}
- cellMatrix
{
return cellMatrix;
}
- loadCol:(int)col from:(List *)cellObjects
/*
* Fill column col of the matrix with Cells, associate each Cell with
* a cellObject.
*
* 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;
if (!isSubType)
return nil;
cellCount = [cellObjects count];
if (col > numCols)
numCols = col + 1;
/* tell the matrix there are 0 cells in it (but don't deallocate them) */
[cellMatrix renewRows:0 cols:numCols];
[cellMatrix lockFocus]; /* for highlightCellAt::lit: */
for (i=0; i < cellCount; i++) {
id 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:col];
/* install the cellObject in that cell */
[cell setSubObject:[cellObjects objectAt:i]];
/* make sure the cell is neither selected nor highlighted */
[cellMatrix highlightCellAt:i:0 lit:NO];
[cell setState:0];
}
[cellMatrix unlockFocus];
[cellMatrix sizeToCells];
[cellMatrix display];
return self;
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.