This is SpreadSheetMgr.m in view mode; [Download] [Up]
/* Spread Sheet like n-tuple browser by Imran Qureshi August 1992 * * Copyright (C) 1992 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. */ #import "SpreadSheetMgr.h" const char SpreadSheetMgr_h_rcsid[] = SPREADSHEETMGH_H_ID; const char SpreadSheetMgr_m_rcsid[] = "$Id: SpreadSheetMgr.m,v 2.7.2.1 1994/01/05 02:23:14 rensing Exp $"; #import <assert.h> #import "HDrawApp.h" #import "InspectFunc.h" #import "InspectTuple.h" #import "TileScrollView.h" #define INCREMENT 25 @implementation SpreadSheetMgr + new:sender { NXBundle *bundle; id mgrView, aWindow; char buffer[MAXPATHLEN + 1]; bundle = [NXBundle bundleForClass:[self class]]; if ([bundle getPath:buffer forResource:"SpreadSheet" ofType:"nib"]) { [NXApp loadNibFile:buffer owner:self withNames:YES fromZone:[self zone]]; } aWindow = NXGetNamedObject("killWindow", self); mgrView = (id)[[[aWindow contentView] subviews] objectAt:0]; [mgrView appDidInit:sender]; self = mgrView; window = aWindow; hDraw = sender; return self; } /*** for the palette **/ - (const char*)inspectorName { return "SpreadSheetInspector"; } -setRows:(int)rows columns:(int)cols { int oldRows; int i; NXRect rect; /* turn off drawing (to the screen) */ [window disableFlushWindow]; oldRows = numRowsD; numRowsD = rows; numColsD = cols; [cellMatrix renewRows:numRowsD cols:numColsD]; [cellMatrix sizeToCells]; [cellMatrix getFrame:&rect]; [cellMatrix update]; [spreadView sizeTo:rect.size.width :rect.size.height]; [lineNumberMatrix renewRows:numRowsD cols:1]; [lineNumberMatrix sizeToCells]; for (i = oldRows; i < numRowsD; i++) [[lineNumberMatrix cellAt:i :0] setIntValue:i]; /* update scroller */ [scrollView reflectScroll:[[scrollView subviews] objectAt:0]]; [scrollView update]; //[self display]; /* send results to screen */ [[window reenableFlushWindow] flushWindow]; return self; } -awake { [super awake]; //printf("awake\n"); /* class-specific initialization goes here */ return self; } -initFrame:(const NXRect *)frameRect { [super initFrame:frameRect]; numRowsD = DEFAULT_ROWS; numColsD = DEFAULT_COLS; scrollView = [[TileScrollView alloc] initFrame:frameRect]; [scrollView setAutosizing: (NX_MINXMARGINSIZABLE | NX_WIDTHSIZABLE | NX_MAXXMARGINSIZABLE | NX_MINYMARGINSIZABLE | NX_HEIGHTSIZABLE | NX_MAXYMARGINSIZABLE)]; [self addSubview:scrollView]; spreadView = [[View alloc] initFrame:frameRect]; [self appDidInit:self]; [self setAutoresizeSubviews:YES]; return self; } -(ntuple)ntuple { return tuple; } -setColumnNameMatrix:(id)matrix { columnNameMatrix = matrix; return self; } -setLineNumberMatrix:(id)matrix { lineNumberMatrix = matrix; return self; } -open:sender { id myOpenPanel; int j; myOpenPanel = [OpenPanel new]; [myOpenPanel setTitle:"Open a spreadsheet"]; [myOpenPanel setPrompt:"File:"]; j = [myOpenPanel runModal]; /* if user cancelled, just return */ if (!j) return self; [self openFile:(char*)[myOpenPanel filename]]; return self; } -openFile:(char*)afilename; { minRowT = 0; strcpy(filename,afilename); currentFile = fopen(filename,"r"); assert(currentFile); /**ntuple h_fileParse(FILE* ifile, ntuple oldnt, int verbose);**/ tuple = h_fileParse(currentFile, NULL, FALSE); assert(tuple); [self tupleToSpreadSheet:tuple]; fclose(currentFile); return self; } -save:sender { printf("Saving file\n"); currentFile = fopen(filename,"w"); h_nt2text( currentFile, tuple ); fclose(currentFile); return self; } -tupleToSpreadSheet:(ntuple)atuple { int x=0,y=0; NXRect rect; tuple = atuple; numRowsD = MIN( h_getNtNdata(tuple), DEFAULT_ROWS ); newTupleFlag = NO; [[scrollView window] disableFlushWindow]; [[scrollView window] setTitle:h_getNtTitle(atuple)]; [[scrollView window] update]; [columnNameMatrix renewRows:1 cols:h_getNtDim(atuple)]; [columnNameMatrix sizeToCells]; /**set the column names */ for(x=0; x<h_getNtDim(atuple);x++) [[columnNameMatrix cellAt:0 :x] setStringValue:h_getNtLabel(atuple,x)]; /** resize the cellMatrix to fit the cells */ x = h_getNtDim(atuple); [cellMatrix renewRows:numRowsD cols:x]; [cellMatrix sizeToCells]; [cellMatrix getFrame:&rect]; [spreadView sizeTo:rect.size.width :rect.size.height]; /** read data **/ for (y=0;y<h_getNtDim(atuple);y++) { float *floatArray; floatArray = (float*)h_getNtColumn(atuple,y); for (x=0; x < numRowsD; x++) [[cellMatrix cellAt:x :y] setFloatValue:floatArray[x]]; } [scrollView update]; [scrollView reflectScroll:[[scrollView subviews] objectAt:0]]; [[[scrollView window] reenableFlushWindow] flushWindow]; minRowT = 0; maxRowT = numRowsD - 1; return self; } -readMore:sender { int newRows; int i; int x, y; newRows = INCREMENT; if ( (maxRowT+newRows) > (h_getNtNdata(tuple) -1) ) { newRows = h_getNtNdata(tuple) - maxRowT - 1; } if ( newRows <= 0 ) { NXBeep(); return self; } for (i=0; i < newRows; i++) { [cellMatrix removeRowAt:0 andFree:NO]; [cellMatrix addRow]; [cellMatrix sizeToCells]; } for (y=0;y<h_getNtDim(tuple);y++) { float *floatArray; i=0; floatArray = (float*)h_getNtColumn(tuple,y); for (x=numRowsD - newRows; x < numRowsD; x++,i++) [[cellMatrix cellAt:x :y] setFloatValue:floatArray[i+maxRowT]]; } maxRowT += newRows; minRowT += newRows; /** update the line numbers */ for (i = 0; i < numRowsD; i++) { [[lineNumberMatrix cellAt:i :0] setIntValue:i+minRowT]; } [self redisplay]; return self; } -readLess:sender { int newRows; int i; int x,y; newRows = INCREMENT; if ( (minRowT-newRows) < 0 ) { newRows = minRowT; } if ( newRows <= 0 ) { NXBeep(); return self; } for (i=0; i < newRows; i++) { [cellMatrix removeRowAt:(numRowsD-1) andFree:NO]; [cellMatrix insertRowAt:0]; [cellMatrix sizeToCells]; } minRowT -= newRows; for (y=0;y<h_getNtDim(tuple);y++) { float *floatArray; i=0; floatArray = (float*)h_getNtColumn(tuple,y); for (x = 0; x < newRows; x++,i++) [[cellMatrix cellAt:x :y] setFloatValue:floatArray[i+minRowT]]; } maxRowT -= newRows; /** update the line numbers */ for (i = 0; i < numRowsD; i++) { [[lineNumberMatrix cellAt:i :0] setIntValue:i+minRowT]; } [self redisplay]; return self; } -redisplay { [[scrollView window] disableFlushWindow]; [lineNumberMatrix update]; [cellMatrix update]; [spreadView update]; [scrollView reflectScroll:[[scrollView subviews] objectAt:0]]; [scrollView update]; [[[scrollView window] reenableFlushWindow] flushWindow]; return self; } /***** MEthods for accessing data ****/ -(float*)row:(int)number { float *floatArray; int size; /**float *h_getNtData( ntuple nt, int i_nt, float *f, int *fSize );**/ floatArray = h_getNtData(tuple,number,NULL, &size); return floatArray; } -setRow:(int)number to:(float*)data { /**int h_arrayReplData( ntuple nt, int i_nt, float *data );*/ h_arrayReplData(tuple, number, data); return self; } -(float*)column:(int)number { float *floatArray; /**float *h_getNtData( ntuple nt, int i_nt, float *f, int *fSize );**/ floatArray = (float*)h_getNtColumn(tuple,number); return floatArray; } -addColumn:(char*)name with:(float*)data { int i,j; i = h_getNtDim(tuple); i--; /* as dimensions start from 1 and everything else starts from 0 */ tuple->data[i] = data; [self addColumn:self]; for (j=minRowT; (j<=maxRowT) && (j < h_getNtNdata(tuple)); j++) [[cellMatrix cellAt:j-minRowT :i] setFloatValue:data[j]]; return self; } -addColumn:sender { int i; i = h_addColumn(tuple); //h_setNtLabel(tuple, i,name ); /**Now for the graphic part **/ [columnNameMatrix addCol]; [columnNameMatrix sizeToCells]; //[[columnNameMatrix cellAt:0 :i] setStringValue:name]; //[columnNameMatrix update]; [cellMatrix addCol]; [cellMatrix sizeToCells]; { NXRect rect; [cellMatrix getFrame:&rect]; [spreadView sizeTo:rect.size.width :rect.size.height]; } [self redisplay]; return self; } -addRow:sender { int i; float *array; i = h_getNtDim(tuple); array = (float*)malloc((i+1)*sizeof(float)); /**int h_arrayFill(ntuple nt, float *data );**/ h_arrayFill(tuple,array); //h_setNtLabel(tuple, i,name ); /**Now for the graphic part **/ //[columnNameMatrix addCol]; //[columnNameMatrix sizeToCells]; //[[columnNameMatrix cellAt:0 :i] setStringValue:name]; //[columnNameMatrix update]; //[cellMatrix addCol]; //[cellMatrix sizeToCells]; //{ // NXRect rect; // [cellMatrix getFrame:&rect]; // [spreadView sizeTo:rect.size.width :rect.size.height]; //} //[self redisplay]; return self; } -temp:sender { return self; } -addColFunction:sender { id inspectFunc; inspectFunc = [[InspectFunc alloc] initInspFor:hDraw]; [inspectFunc newColumnFunction: [[hDraw inspectTuple] currentHTuple]]; [self tupleToSpreadSheet:tuple]; return self; } -addRowFunction:sender { id inspectFunc; inspectFunc = [[InspectFunc alloc] initInspFor:hDraw]; [inspectFunc newFunction:[[hDraw inspectTuple] currentHTuple]]; [self tupleToSpreadSheet:tuple]; return self; } /**** DELEGATE METHOD FOR TEXT OBJECT ******/ -textDidEnd:textObject endChar:(unsigned short)whyEnd { int row,col,size; float *floatArray; //printf("text did end\n"); if (newTupleFlag==YES) { int i; for (i=0; i<numRowsD; i++) { float *array; array = (float*)calloc(h_getNtDim(tuple)+1,sizeof(float)); h_arrayFill(tuple,array); } } row = [cellMatrix selectedRow]; row += minRowT; /** this is the actual row in the document **/ col = [cellMatrix selectedCol]; /**float *h_getNtData( ntuple nt, int i_nt, float *f, int *fSize );**/ floatArray = h_getNtData( tuple, row, NULL, &size ); floatArray[col] = [[cellMatrix selectedCell] floatValue]; h_arrayReplData( tuple, row, floatArray ); //printf("value = %f\n",[[cellMatrix selectedCell] floatValue]); return self; } -appDidInit:(id)sender { NXRect rect; //printf("appDidInit:\n"); newTupleFlag = YES; //printf("scrollView = %x",scrollView); //scrollView = NXGetNamedObject("TileScrollView",self); //printf("scrollView = %x",scrollView); /* set up the scroll view */ [scrollView setBackgroundGray:NX_LTGRAY]; [scrollView setDocView:spreadView]; [scrollView setVertScrollerRequired:YES]; [scrollView setHorizScrollerRequired:YES]; [scrollView setDynamicScrolling:YES]; [scrollView setAutodisplay:YES]; [spreadView setFlipped:YES]; [[scrollView docView] setAutosizing:NX_WIDTHSIZABLE]; /* make everything autodisplay */ [spreadView setAutodisplay:NO]; //[cellMatrix renewRows:0 cols:0]; { id cellPrototype; NXSize size={80.0, 19.0}; cellPrototype = [[TextFieldCell alloc] initTextCell:" "]; [cellPrototype setTextGray:NX_BLACK]; [cellPrototype setAlignment:NX_RIGHTALIGNED]; [cellPrototype setBordered:YES]; [cellPrototype setEditable:YES]; cellMatrix = [[Matrix alloc] initFrame:&rect mode:NX_TRACKMODE prototype:cellPrototype numRows:1 numCols:1]; [cellMatrix setCellSize:&size]; [cellMatrix setPrototype:cellPrototype]; [cellMatrix setCellBackgroundGray:NX_WHITE]; size.width = 0.0; size.height = 0.0; [cellMatrix setIntercell:&size]; [cellMatrix removeColAt:0 andFree:YES]; [cellMatrix setAutodisplay:NO]; [cellMatrix setTextDelegate:self]; } /* set number of rows and columns */ [cellMatrix renewRows:numRowsD cols:numColsD]; [spreadView addSubview:cellMatrix]; [cellMatrix sizeToCells]; /** size and move everything */ { int width; /** move the stuff */ [cellMatrix getFrame:&rect]; [cellMatrix moveTo:0 :0]; width = rect.origin.x + NX_SCROLLERWIDTH + 12.0; /*** size the stuff ***/ [cellMatrix getFrame:&rect]; width += rect.size.width; [spreadView sizeTo:rect.size.width :rect.size.height]; } /* update scroller */ [scrollView reflectScroll:[[scrollView subviews] objectAt:0]]; [scrollView update]; [window orderFront:self]; /** create a new tuple **/ tuple = h_new(numColsD); return self; } -read:(NXTypedStream*)typedStream { //printf("SSM read:\n"); [super read:typedStream]; NXReadTypes(typedStream,"ii",&numRowsD,&numColsD); scrollView = NXReadObject(typedStream); spreadView = NXReadObject(typedStream); cellMatrix = NXReadObject(typedStream); lineNumberMatrix = NXReadObject(typedStream); columnNameMatrix = NXReadObject(typedStream); return self; } -write:(NXTypedStream*)typedStream { //printf("SSM write:\n"); [super write:typedStream]; NXWriteTypes(typedStream,"ii",&numRowsD,&numColsD); NXWriteObject(typedStream,scrollView); NXWriteObject(typedStream,spreadView); NXWriteObject(typedStream,cellMatrix); NXWriteObjectReference(typedStream, lineNumberMatrix); NXWriteObjectReference(typedStream, columnNameMatrix); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.