This is HTMLCells.m in view mode; [Download] [Up]
// Mon Sep 2 12:09:44 MET DST 1996 #import "HTMLCells.h" #import <appkit/appkit.h> #define CLASS_VERSION 1 @implementation HRCell:Cell + initialize { if (self == [HRCell class]) { /* * **** Archiving: READ ME **** After bumping the CLASS_VERSION, it is * considered common practice to add a comment line indicating the new * version number, date, and modifier. Optionally, the reason for the * change. There is no need to modify the setVersion message. */ // version 1: initial. (db) [[self class] setVersion:CLASS_VERSION]; } return self; } - initForText:(Text*) theText { if(!(self=[super init])) return nil; text=theText; return self; } // could be useful for unregistering¼ - free { return [super free]; } - calcCellSize:(NXSize *)theSize { NXRect drawRect; [text getFrame:&drawRect]; theSize->width=drawRect.size.width-12; theSize->height = 6; return self; } - drawInside: (const NXRect *)cellFrame inView:controlView { NXRect drawRect,clipRect; drawRect=*cellFrame; [self calcCellSize:&drawRect.size]; [controlView getFrame:&clipRect]; [controlView lockFocus]; NX_WIDTH(&drawRect)+=(NX_X(&drawRect)+12);NX_X(&drawRect)=0; clipRect=drawRect;NX_X(&clipRect)-=1;NX_Y(&clipRect)-=1; NX_WIDTH(&clipRect)+=2; NX_HEIGHT(&clipRect)=3; NXDrawGroove(&drawRect,&clipRect); [controlView unlockFocus]; return self; } - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag; { return [self drawInside:cellFrame inView:controlView]; } #define eventMask NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK #define CLIP_Y(y, restraint0,restraintN) MAX(restraint0,MIN(restraintN,y)) - (BOOL)trackMouse:(NXEvent *)theEvent inRect:(const NXRect *)cellFrame ofView:controlView; { return NO; } @end @implementation MiscTFTextFieldCell - drawSelf: (const NXRect *)cellFrame inView:controlView { id erg; PSgsave(); erg=[super drawSelf:cellFrame inView:controlView]; PSgrestore(); return erg; } - drawInside: (const NXRect *)cellFrame inView:controlView { if(afterDrag) { afterDrag=NO; return self; } else return [super drawInside:cellFrame inView:controlView]; } - (BOOL)trackMouse:(NXEvent *)theEvent inRect:(const NXRect *)cellFrame ofView:(Text*)controlView; { BOOL erg; NXRect frame=*cellFrame; if( [controlView isKindOf:[Text class]]) { [[controlView window] disableFlushWindow]; [[controlView superview] convertRect:&frame fromView:controlView]; [[controlView sharedField] setCell:self]; [[controlView sharedField] removeFromSuperview]; [[controlView superview] addSubview:[controlView sharedField]]; [[controlView sharedField] setFrame:&frame]; [[controlView window] reenableFlushWindow]; [[controlView sharedField] mouseDown:theEvent]; afterDrag=YES; return NO; } else erg=[super trackMouse:theEvent inRect:cellFrame ofView:controlView]; return erg; } -(void) setWidth:(NXCoord)aWidth { width=aWidth; } - calcCellSize:(NXSize *)theSize { [super calcCellSize:theSize]; if(width) theSize->width=width; return self; } - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag; { return [self drawInside:cellFrame inView:controlView]; } @end @implementation MiscTFRadioCell - initInText:(Text*)view { self=[self initIconCell:"FormRadio"]; //NXradio [self setAltIcon: "FormRadioH"]; //NXradioH [self setBordered:NO]; [self setHighlightsBy:NX_CONTENTS]; [self setShowsStateBy:NX_CONTENTS]; return self; } -(void) setCollegues:(List*) theCollegues { collegues=theCollegues; } - (BOOL)trackMouse:(NXEvent *)theEvent inRect:(const NXRect *)cellFrame ofView:(Text*)controlView; { if([self state]) return NO; else // do some radio { [collegues removeObject:self]; [collegues makeObjectsPerform:@selector(setState:) with:(id)NO]; [controlView display]; [collegues addObject:self]; return [super trackMouse:theEvent inRect:cellFrame ofView:controlView]; } } #if 0 - setState:(BOOL) flag { return [super setState:flag]; } #endif @end @implementation MiscTFCheckCell - initInText:(Text*)view { self=[self initIconCell:"NXswitch"]; [self setAltIcon:"NXswitch"]; [self setBordered:NO]; [self setHighlightsBy:NX_CONTENTS]; [self setShowsStateBy:NX_CONTENTS]; return self; } @end @implementation MiscTFButtonCell - initInText:(Text*)view { [self initTextCell:""]; return self; } @end @implementation MiscTFPopupCell - initInText:(Text*)view { self=[self initTextCell:""]; [self setIcon:"NXpopup"]; [self setIconPosition:NX_ICONRIGHT]; [self setHighlightsBy:NX_PUSHIN]; [self setShowsStateBy:NX_PUSHIN]; [self setAlignment:NX_LEFTALIGNED]; text=view; return self; } -(void) setPopupList:(PopUpList*) theList { popupList=theList; } - takeTitleFrom:sender { [self setTitle:[[sender selectedCell] title]]; [text display]; return self; } - (BOOL)trackMouse:(NXEvent *)theEvent inRect:(const NXRect *)cellFrame ofView:(Text*)controlView; { NXRect frame=*cellFrame; if([controlView isKindOf:[Text class]]) { id newButton=NXCreatePopUpListButton(popupList); [[controlView window] disableFlushWindow]; [[controlView superview] convertRect:&frame fromView:controlView]; // register so that previous gets removed and freed [controlView setSharedButton:newButton]; [[controlView superview] addSubview:newButton]; [newButton setFrame:&frame]; [[controlView window] reenableFlushWindow]; [newButton mouseDown:theEvent]; return NO; } else return [super trackMouse:theEvent inRect:cellFrame ofView:controlView]; } -(void) setWidth:(NXCoord)aWidth { width=aWidth; } - calcCellSize:(NXSize *)theSize { [super calcCellSize:theSize]; if(width) theSize->width=width; return self; } @end @implementation TextBackgroundCell - initFromImage:(NXImage*) theImg { if(!theImg) return nil; self=[super init]; image=theImg; return self; } - calcCellSize:(NXSize *)theSize { theSize->width=2;theSize->height=2; return self; } - drawInside: (const NXRect *)cellFrame inView:controlView { NXRect clipRect; NXSize imgSiz={0,0}; NXCoord x,y; if(!image) return self; [controlView getFrame:&clipRect]; [image getSize:&imgSiz]; if(!imgSiz.width || !imgSiz.height) return self; [controlView lockFocus]; for(y=imgSiz.height;y< NX_HEIGHT(&clipRect);y+=imgSiz.height) { for(x=0;x< NX_WIDTH(&clipRect);x+=imgSiz.width) { NXPoint currPoint={x,y}; [image composite:NX_COPY toPoint:&currPoint]; } } [controlView unlockFocus]; return self; } - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag; { return nil; } @end // this one displays the table-content cells in HTML-matrices @implementation HTMLTextCell //static id sharedText; - sharedText { if(!displayHelper) { NXRect someFrame={-1025,-1025,1024,1024}; displayHelper=[[Text alloc] initFrame:&someFrame]; [displayHelper setDelegate:delegate]; [displayHelper setEditable:NO]; [displayHelper setVertResizable: YES]; [displayHelper setHorizResizable:YES]; [displayHelper setMaxSize:&someFrame.size]; } if (_view && ![displayHelper isDescendantOf:[_view superview]]) [[_view superview] addSubview:displayHelper]; return displayHelper; } - sizeToFit { NXRect frame; if(!displayHelper || ![[self sharedText] textLength]) { if(!strchr([self stringValue],'<')) [[self sharedText] setText:[self stringValue]]; else [[self sharedText] setFromHTML:[self stringValue]]; [[self sharedText] calcLine]; [[self sharedText] sizeToFit];[[self sharedText] getFrame:&frame]; size=frame.size; } return self; } - initWithHTML:(const char*) theHTML inView:(Matrix*) theMatrix { _view=theMatrix; [self initTextCell:theHTML]; columnsSpanning=1; return self; } - setStringValue:(const char*) theStr { id erg=[super setStringValue:theStr]; [self sizeToFit]; return erg; } - calcCellSize:(NXSize *)theSize { *theSize=size; theSize->width/=columnsSpanning; return self; } - drawInside: (const NXRect *)cellFrame inView:controlView { NXRect frame=*cellFrame; [[controlView superview] convertRect:&frame fromView:controlView]; _view=controlView; if(!displayHelper) { if(!strchr([self stringValue],'<')) [[self sharedText] setText:[self stringValue]]; else [[self sharedText] setFromHTML:[self stringValue]]; } PSgsave(); [[self sharedText] setFrame:&frame]; [[self sharedText] display]; PSgrestore(); return NO; } - readRichText:(NXStream *)stream forView:view { char *buffer; int buflen; NXScanf(stream, "%f %f %d",&size.width,&size.height,&buflen); buffer=malloc(buflen+1); NXScanf(stream, "%s",buffer); //[self initWithHTML:buffer inView:view]; free(buffer); return self; } - writeRichText:(NXStream *)stream forView:view { NXPrintf(stream, "%f %f %d %s",size.width,size.height,strlen([self stringValue]),[self stringValue]); return self; } -(void) setSize:(NXSize*) aSize {size=*aSize;} -(void) setView:(Matrix*) aText {_view=aText;} -(void) setDisplayHelper:(Text*) aText {displayHelper=aText;} -(int) columnsSpanning {return columnsSpanning;} -(void) setColumnsSpanning:(int) span {columnsSpanning=span;} - copyFromZone:(NXZone*) aZone { HTMLTextCell *newCell=[super copyFromZone:aZone]; [newCell setSize:&size]; [newCell setStringValue:[self stringValue]]; [newCell setView:_view]; [newCell setDisplayHelper:nil]; [newCell setColumnsSpanning:columnsSpanning]; return newCell; } @end @implementation MiscTFMatrixCell - initWithMatrix:(Matrix *)aMatrix inView:controlView { matrix=aMatrix; return self; } - drawInside: (const NXRect *)cellFrame inView:controlView { int x,y,maxX,maxY,xMove=0,spanning; NXRect frame; [matrix getNumRows:&maxY numCols:&maxX]; PSgsave(); for(y=0;y< maxY;y++, xMove=0) { for(x=0;x< maxX;x++) { Cell *currCell=[matrix cellAt:y:x]; [matrix getCellFrame:&frame at:y:x];NX_X(&frame)+=(NX_X(cellFrame)+xMove), NX_Y(&frame)+=NX_Y(cellFrame); //relocation if((spanning=[currCell columnsSpanning]) >1) { xMove+= NX_WIDTH(&frame)*(spanning-1); NX_WIDTH(&frame)*=spanning; } if([currCell stringValue] && strlen([currCell stringValue])) [(HTMLTextCell*)currCell drawSelf:&frame inView:controlView]; } } PSgrestore(); return NO; } - calcCellSize:(NXSize *)theSize { NXRect frame; [matrix getFrame:&frame]; *theSize=frame.size; return self; } - free { if(matrix) { [matrix free]; } return [super free]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.