Fix transcript in transfer window.
[cyberduck.git] / source / ch / cyberduck / ui / cocoa / view / CDOutlineCell.m
blobdcc25bdf2ae38c16e80dbc31ca66f6372bf8a53b
1 /*
2  *  Copyright (c) 2009 David Kocher. All rights reserved.
3  *  http://cyberduck.ch/
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  Bug fixes, suggestions and comments should be sent to:
16  *  dkocher@cyberduck.ch
17  */
19 #import "CDOutlineCell.h"
21 @implementation CDOutlineCell
23  - (id)init {
24     if ((self = [super init])) {
25         [self setLineBreakMode:NSLineBreakByTruncatingTail];
26         [self setSelectable:YES];
27     }
28     return self;
31 - (void)setIcon:(NSImage *)aIcon
33     if(icon == aIcon) {
34        return;
35     }
36     [icon release];
37     icon = [aIcon retain];
40 - (NSImage*)icon
42     return icon;
45 - (id)copyWithZone:(NSZone *)zone
47     CDOutlineCell *cell = (CDOutlineCell *)[super copyWithZone:zone];
48     if (cell != nil) {
49        cell->icon = nil;
50        [cell setIcon:[self icon]];
51     }
52     return cell;
55  - (void)dealloc
57     [icon release];
58     [super dealloc];
61 - (NSRect)imageRectForBounds:(NSRect)cellFrame {
62     NSRect result;
63     if (icon != nil) {
64        result.size = NSMakeSize(16, 16);
65        result.origin = cellFrame.origin;
66        result.origin.x += 3;
67        result.origin.y += ceil((cellFrame.size.height - result.size.height) / 2);
68     } else {
69        result = NSZeroRect;
70     }
71     return result;
74 - (NSRect)titleRectForBounds:(NSRect)cellFrame {
75     NSRect result;
76     if (icon != nil) {
77        CGFloat imageWidth = NSMakeSize(16, 16).width;
78        result = cellFrame;
79        result.origin.x += (3 + imageWidth);
80        result.size.width -= (3 + imageWidth);
81     } else {
82        result = [super titleRectForBounds:cellFrame];
83     }
84     return result;
87 - (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent {
88     [super editWithFrame:[self titleRectForBounds:aRect] inView:controlView editor:textObj delegate:anObject event:theEvent];
91 - (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength {
92     [super selectWithFrame:[self titleRectForBounds:aRect] inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
95 - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
96     if (icon != nil) {
97        NSRect imageFrame = [self imageRectForBounds:cellFrame];
98        [icon drawInRect:imageFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
99        NSInteger newX = NSMaxX(imageFrame) + 3;
100        cellFrame.size.width = NSMaxX(cellFrame) - newX;
101        cellFrame.origin.x = newX;
102     }
103     [super drawWithFrame:cellFrame inView:controlView];
106 - (NSSize)cellSize {
107     NSSize cellSize = [super cellSize];
108     if (icon != nil) {
109        cellSize.width += NSMakeSize(16, 16).width;
110     }
111     cellSize.width += 3;
112     return cellSize;
115 - (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView {
116     NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil];
117     // If we have an image, we need to see if the user clicked on the image portion.
118     if (icon != nil) {
119        // This code closely mimics drawWithFrame:inView:
120        NSSize imageSize = NSMakeSize(16, 16);
121        NSRect imageFrame;
122        NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge);
124        imageFrame.origin.x += 3;
125        imageFrame.size = imageSize;
126        // If the point is in the image rect, then it is a content hit
127        if (NSMouseInRect(point, imageFrame, [controlView isFlipped])) {
128           // We consider this just a content area. It is not trackable, nor it it editable text. If it was, we would or in the additional items.
129           // By returning the correct parts, we allow NSTableView to correctly begin an edit when the text portion is clicked on.
130           return NSCellHitContentArea;
131        }
132     }
133     // At this point, the cellFrame has been modified to exclude the portion for the image. Let the superclass handle the hit testing at this point.
134     return [super hitTestForEvent:event inRect:cellFrame ofView:controlView];
137 @end