This is DiagramCell.m in view mode; [Download] [Up]
#import "DiagramCell.h" /* DiagramCell - This is a simple graphic object to be used in the DemoDiagram view. It owns an NXImage object which it composites into the diagram. */ @implementation DiagramCell:Object - setImage:(NXImage *)anImage { image=anImage; frameRect.origin.x=frameRect.origin.y=0.0; [image getSize:&frameRect.size]; NXIntegralRect(&frameRect); //Insure no fractional dimensions return self; } - getFrame:(NXRect *)rect { *rect=frameRect; return self; } /* In this method, this item has the responsibility for moving no further than up against the edge of the view rectangle it is passed. */ - moveBy:(NXCoord)dx :(NXCoord)dy inViewRect:(NXRect *)rect { float newX,newY,minX,maxX,minY,maxY; /* Here is the desired new location */ newX = frameRect.origin.x + dx; newY = frameRect.origin.y + dy; /* Here are the limits within the view rect. Yes, this could be calculated once in advance, perhaps in a setViewRect: method, or in an initInRect: method. */ minX = rect->origin.x; maxX = minX + rect->size.width - frameRect.size.width; minY = rect->origin.y; maxY = minY + rect->size.height - frameRect.size.height; /* Recalculate location constrained to the view rect. */ if(newX < minX)newX=minX; if(newY < minY)newY=minY; if(newX > maxX)newX=maxX; if(newY > maxY)newY=maxY; /* Finally, "move" to the new location. */ frameRect.origin.x=newX; frameRect.origin.y=newY; return self; } - mouseHit:(NXPoint *)location { if(NXMouseInRect(location,&frameRect,NO)) return self; else return nil; } - drawSelf { [image composite:NX_SOVER toPoint:&frameRect.origin]; return self; } - drawInDirtyRect:(NXRect *)dirtyRect { if(NXIntersectsRect(&frameRect,dirtyRect)){ NXPoint intersectPoint; //origin of intersection in view coords NXRect intersectRect=frameRect; /* Get intersection of this cell's frame with the dirty rect */ NXIntersectionRect(dirtyRect,&intersectRect); /* Save intersect origin in view's coordinates */ intersectPoint.x = intersectRect.origin.x; intersectPoint.y = intersectRect.origin.y; /* Now convert intersection rect origin to cell image's coordinates */ intersectRect.origin.x -= frameRect.origin.x; intersectRect.origin.y -= frameRect.origin.y; /* Composite from intersection in image to point in view */ [image composite:NX_SOVER fromRect:&intersectRect toPoint:&intersectPoint]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.