Files
textmate/Frameworks/OakAppKit/src/OakImageAndTextCell.mm
Allan Odgaard 9894969e67 Initial commit
2012-08-09 16:25:56 +02:00

93 lines
3.1 KiB
Plaintext

#import "OakImageAndTextCell.h"
#import "NSImage Additions.h"
@implementation OakImageAndTextCell
@synthesize image;
- (void)dealloc
{
[self setImage:nil];
[super dealloc];
}
- (id)copyWithZone:(NSZone*)zone
{
OakImageAndTextCell* cell = [super copyWithZone:zone];
cell->image = [image retain];
return cell;
}
- (NSRect)imageFrameWithFrame:(NSRect)aRect inControlView:(NSView*)aView
{
aRect.size = self.image.size;
aRect.origin.y += 1;
aRect.origin.x += 8;
if([aView respondsToSelector:@selector(intercellSpacing)])
aRect.origin.y -= [(NSOutlineView*)aView intercellSpacing].height / 2;
return aRect;
}
- (NSRect)textFrameWithFrame:(NSRect)aRect inControlView:(NSView*)aView
{
NSRect imageFrame = [self imageFrameWithFrame:aRect inControlView:aView];
NSRect textFrame = aRect;
textFrame.origin.x = NSMaxX(imageFrame) + 4;
textFrame.size.width = NSMaxX(aRect) - NSMinX(textFrame);
return textFrame;
}
- (void)editWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent
{
[super editWithFrame:[self textFrameWithFrame:aRect inControlView:controlView] inView:controlView editor:textObj delegate:anObject event:theEvent];
}
- (void)selectWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
{
[super selectWithFrame:[self textFrameWithFrame:aRect inControlView:controlView] inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
}
- (NSRect)expansionFrameWithFrame:(NSRect)cellFrame inView:(NSView*)view
{
NSRect frame = [super expansionFrameWithFrame:[self textFrameWithFrame:cellFrame inControlView:view] inView:view];
frame.size.width -= image ? [image size].width + 3.0 : 0.0;
return frame;
}
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{
if(image)
{
NSRect imageRect = [self imageFrameWithFrame:cellFrame inControlView:controlView];
if([self drawsBackground])
{
[[self backgroundColor] set];
NSRectFill(imageRect);
}
[image drawAdjustedInRect:imageRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}
[super drawWithFrame:[self textFrameWithFrame:cellFrame inControlView:controlView] inView:controlView];
}
- (NSSize)cellSize
{
NSSize cellSize = [super cellSize];
cellSize.width += image ? [image size].width + 3.0 : 0.0;
return cellSize;
}
- (NSUInteger)hitTestForEvent:(NSEvent*)event inRect:(NSRect)cellFrame ofView:(NSView*)controlView
{
NSRect imageRect = [self imageFrameWithFrame:cellFrame inControlView:controlView];
NSRect textRect = [self textFrameWithFrame:cellFrame inControlView:controlView];
NSPoint point = [controlView convertPoint:([event window] ? [event locationInWindow] : [[controlView window] convertScreenToBase:[event locationInWindow]]) fromView:nil];
NSUInteger res = NSCellHitContentArea;
if(NSMouseInRect(point, imageRect, controlView.isFlipped))
res = NSCellHitContentArea|OakImageAndTextCellHitImage;
else if(NSMouseInRect(point, textRect, controlView.isFlipped))
res = NSCellHitContentArea|NSCellHitEditableTextArea|OakImageAndTextCellHitText;
return res;
}
@end