root / pithos-macos / FileSystemBrowserCell.m @ 3740ba57
History | View | Annotate | Download (5.8 kB)
1 | 9f3a92de | Miltiadis Vasilakis | /* |
---|---|---|---|
2 | 9f3a92de | Miltiadis Vasilakis | File: FileSystemBrowserCell.m |
3 | 9f3a92de | Miltiadis Vasilakis | Abstract: A cell that can draw an image/icon and a label color. |
4 | 9f3a92de | Miltiadis Vasilakis | Version: 1.1 |
5 | 9f3a92de | Miltiadis Vasilakis | |
6 | 9f3a92de | Miltiadis Vasilakis | Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple |
7 | 9f3a92de | Miltiadis Vasilakis | Inc. ("Apple") in consideration of your agreement to the following |
8 | 9f3a92de | Miltiadis Vasilakis | terms, and your use, installation, modification or redistribution of |
9 | 9f3a92de | Miltiadis Vasilakis | this Apple software constitutes acceptance of these terms. If you do |
10 | 9f3a92de | Miltiadis Vasilakis | not agree with these terms, please do not use, install, modify or |
11 | 9f3a92de | Miltiadis Vasilakis | redistribute this Apple software. |
12 | 9f3a92de | Miltiadis Vasilakis | |
13 | 9f3a92de | Miltiadis Vasilakis | In consideration of your agreement to abide by the following terms, and |
14 | 9f3a92de | Miltiadis Vasilakis | subject to these terms, Apple grants you a personal, non-exclusive |
15 | 9f3a92de | Miltiadis Vasilakis | license, under Apple's copyrights in this original Apple software (the |
16 | 9f3a92de | Miltiadis Vasilakis | "Apple Software"), to use, reproduce, modify and redistribute the Apple |
17 | 9f3a92de | Miltiadis Vasilakis | Software, with or without modifications, in source and/or binary forms; |
18 | 9f3a92de | Miltiadis Vasilakis | provided that if you redistribute the Apple Software in its entirety and |
19 | 9f3a92de | Miltiadis Vasilakis | without modifications, you must retain this notice and the following |
20 | 9f3a92de | Miltiadis Vasilakis | text and disclaimers in all such redistributions of the Apple Software. |
21 | 9f3a92de | Miltiadis Vasilakis | Neither the name, trademarks, service marks or logos of Apple Inc. may |
22 | 9f3a92de | Miltiadis Vasilakis | be used to endorse or promote products derived from the Apple Software |
23 | 9f3a92de | Miltiadis Vasilakis | without specific prior written permission from Apple. Except as |
24 | 9f3a92de | Miltiadis Vasilakis | expressly stated in this notice, no other rights or licenses, express or |
25 | 9f3a92de | Miltiadis Vasilakis | implied, are granted by Apple herein, including but not limited to any |
26 | 9f3a92de | Miltiadis Vasilakis | patent rights that may be infringed by your derivative works or by other |
27 | 9f3a92de | Miltiadis Vasilakis | works in which the Apple Software may be incorporated. |
28 | 9f3a92de | Miltiadis Vasilakis | |
29 | 9f3a92de | Miltiadis Vasilakis | The Apple Software is provided by Apple on an "AS IS" basis. APPLE |
30 | 9f3a92de | Miltiadis Vasilakis | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION |
31 | 9f3a92de | Miltiadis Vasilakis | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS |
32 | 9f3a92de | Miltiadis Vasilakis | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND |
33 | 9f3a92de | Miltiadis Vasilakis | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. |
34 | 9f3a92de | Miltiadis Vasilakis | |
35 | 9f3a92de | Miltiadis Vasilakis | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL |
36 | 9f3a92de | Miltiadis Vasilakis | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
37 | 9f3a92de | Miltiadis Vasilakis | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
38 | 9f3a92de | Miltiadis Vasilakis | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, |
39 | 9f3a92de | Miltiadis Vasilakis | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED |
40 | 9f3a92de | Miltiadis Vasilakis | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), |
41 | 9f3a92de | Miltiadis Vasilakis | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE |
42 | 9f3a92de | Miltiadis Vasilakis | POSSIBILITY OF SUCH DAMAGE. |
43 | 9f3a92de | Miltiadis Vasilakis | |
44 | 9f3a92de | Miltiadis Vasilakis | Copyright (C) 2011 Apple Inc. All Rights Reserved. |
45 | 9f3a92de | Miltiadis Vasilakis | |
46 | 9f3a92de | Miltiadis Vasilakis | */ |
47 | 9f3a92de | Miltiadis Vasilakis | |
48 | 9f3a92de | Miltiadis Vasilakis | #import "FileSystemBrowserCell.h" |
49 | 9f3a92de | Miltiadis Vasilakis | |
50 | 9f3a92de | Miltiadis Vasilakis | @implementation FileSystemBrowserCell |
51 | 9f3a92de | Miltiadis Vasilakis | |
52 | 9f3a92de | Miltiadis Vasilakis | #define ICON_SIZE 16.0 // Our Icons are ICON_SIZE x ICON_SIZE |
53 | 9f3a92de | Miltiadis Vasilakis | #define ICON_INSET_HORIZ 4.0 // Distance to inset the icon from the left edge. |
54 | 9f3a92de | Miltiadis Vasilakis | #define ICON_TEXT_SPACING 2.0 // Distance between the end of the icon and the text part |
55 | 9f3a92de | Miltiadis Vasilakis | #define ICON_INSET_VERT 2.0 // Distance from top/bottom of icon |
56 | 9f3a92de | Miltiadis Vasilakis | |
57 | 9f3a92de | Miltiadis Vasilakis | - (id)init { |
58 | 9f3a92de | Miltiadis Vasilakis | self = [super init]; |
59 | 9f3a92de | Miltiadis Vasilakis | [self setLineBreakMode:NSLineBreakByTruncatingTail]; |
60 | 9f3a92de | Miltiadis Vasilakis | return self; |
61 | 9f3a92de | Miltiadis Vasilakis | } |
62 | 9f3a92de | Miltiadis Vasilakis | |
63 | 9f3a92de | Miltiadis Vasilakis | - (id)copyWithZone:(NSZone *)zone { |
64 | 9f3a92de | Miltiadis Vasilakis | FileSystemBrowserCell *result = [super copyWithZone:zone]; |
65 | 9f3a92de | Miltiadis Vasilakis | result->_image = nil; |
66 | 9f3a92de | Miltiadis Vasilakis | result.image = self.image; |
67 | 9f3a92de | Miltiadis Vasilakis | result->_labelColor = nil; |
68 | 9f3a92de | Miltiadis Vasilakis | result.labelColor = self.labelColor; |
69 | 9f3a92de | Miltiadis Vasilakis | return result; |
70 | 9f3a92de | Miltiadis Vasilakis | } |
71 | 9f3a92de | Miltiadis Vasilakis | |
72 | 9f3a92de | Miltiadis Vasilakis | - (void)dealloc { |
73 | 9f3a92de | Miltiadis Vasilakis | [_image release]; |
74 | 9f3a92de | Miltiadis Vasilakis | [_labelColor release]; |
75 | 9f3a92de | Miltiadis Vasilakis | [super dealloc]; |
76 | 9f3a92de | Miltiadis Vasilakis | } |
77 | 9f3a92de | Miltiadis Vasilakis | |
78 | 9f3a92de | Miltiadis Vasilakis | @synthesize image = _image; |
79 | 9f3a92de | Miltiadis Vasilakis | @synthesize labelColor = _labelColor; |
80 | 9f3a92de | Miltiadis Vasilakis | |
81 | 9f3a92de | Miltiadis Vasilakis | - (NSRect)imageRectForBounds:(NSRect)bounds { |
82 | 9f3a92de | Miltiadis Vasilakis | bounds.origin.x += ICON_INSET_HORIZ; |
83 | 9f3a92de | Miltiadis Vasilakis | bounds.size.width = ICON_SIZE; |
84 | 9f3a92de | Miltiadis Vasilakis | bounds.origin.y += trunc((bounds.size.height - ICON_SIZE) / 2.0); |
85 | 9f3a92de | Miltiadis Vasilakis | bounds.size.height = ICON_SIZE; |
86 | 9f3a92de | Miltiadis Vasilakis | return bounds; |
87 | 9f3a92de | Miltiadis Vasilakis | } |
88 | 9f3a92de | Miltiadis Vasilakis | |
89 | 9f3a92de | Miltiadis Vasilakis | - (NSRect)titleRectForBounds:(NSRect)bounds { |
90 | 9f3a92de | Miltiadis Vasilakis | // Inset the title for the image |
91 | 9f3a92de | Miltiadis Vasilakis | CGFloat inset = (ICON_INSET_HORIZ + ICON_SIZE + ICON_TEXT_SPACING); |
92 | 9f3a92de | Miltiadis Vasilakis | bounds.origin.x += inset; |
93 | 9f3a92de | Miltiadis Vasilakis | bounds.size.width -= inset; |
94 | 9f3a92de | Miltiadis Vasilakis | return [super titleRectForBounds:bounds]; |
95 | 9f3a92de | Miltiadis Vasilakis | } |
96 | 9f3a92de | Miltiadis Vasilakis | |
97 | 9f3a92de | Miltiadis Vasilakis | - (NSSize)cellSizeForBounds:(NSRect)aRect { |
98 | 9f3a92de | Miltiadis Vasilakis | // Make our cells a bit higher than normal to give some additional space for the icon to fit. |
99 | 9f3a92de | Miltiadis Vasilakis | NSSize theSize = [super cellSizeForBounds:aRect]; |
100 | 9f3a92de | Miltiadis Vasilakis | theSize.width += (ICON_INSET_HORIZ + ICON_SIZE + ICON_TEXT_SPACING); |
101 | 9f3a92de | Miltiadis Vasilakis | theSize.height = ICON_INSET_VERT + ICON_SIZE + ICON_INSET_VERT; |
102 | 9f3a92de | Miltiadis Vasilakis | return theSize; |
103 | 9f3a92de | Miltiadis Vasilakis | } |
104 | 9f3a92de | Miltiadis Vasilakis | |
105 | 9f3a92de | Miltiadis Vasilakis | - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { |
106 | 9f3a92de | Miltiadis Vasilakis | // First draw a label background color |
107 | 9f3a92de | Miltiadis Vasilakis | if (self.labelColor != nil) { |
108 | 9f3a92de | Miltiadis Vasilakis | [[self.labelColor colorWithAlphaComponent:0.2] set]; |
109 | 9f3a92de | Miltiadis Vasilakis | NSRectFillUsingOperation(cellFrame, NSCompositeSourceOver); |
110 | 9f3a92de | Miltiadis Vasilakis | } |
111 | 9f3a92de | Miltiadis Vasilakis | |
112 | 9f3a92de | Miltiadis Vasilakis | NSRect imageRect = [self imageRectForBounds:cellFrame]; |
113 | 9f3a92de | Miltiadis Vasilakis | if (self.image) { |
114 | 9f3a92de | Miltiadis Vasilakis | // Flip images that don't agree with our flipped state |
115 | 9f3a92de | Miltiadis Vasilakis | BOOL flipped = [controlView isFlipped] != [self.image isFlipped]; |
116 | 9f3a92de | Miltiadis Vasilakis | if (flipped) { |
117 | 9f3a92de | Miltiadis Vasilakis | [[NSGraphicsContext currentContext] saveGraphicsState]; |
118 | 9f3a92de | Miltiadis Vasilakis | NSAffineTransform *transform = [[NSAffineTransform alloc] init]; |
119 | 9f3a92de | Miltiadis Vasilakis | [transform translateXBy:0 yBy:cellFrame.origin.y + cellFrame.size.height]; |
120 | 9f3a92de | Miltiadis Vasilakis | [transform scaleXBy:1.0 yBy:-1.0]; |
121 | 9f3a92de | Miltiadis Vasilakis | [transform translateXBy:0 yBy:-cellFrame.origin.y]; |
122 | 9f3a92de | Miltiadis Vasilakis | [transform concat]; |
123 | 9f3a92de | Miltiadis Vasilakis | [transform release]; |
124 | 9f3a92de | Miltiadis Vasilakis | } |
125 | 9f3a92de | Miltiadis Vasilakis | [self.image drawInRect:imageRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; |
126 | 9f3a92de | Miltiadis Vasilakis | if (flipped) { |
127 | 9f3a92de | Miltiadis Vasilakis | [[NSGraphicsContext currentContext] restoreGraphicsState]; |
128 | 9f3a92de | Miltiadis Vasilakis | } |
129 | 9f3a92de | Miltiadis Vasilakis | } |
130 | 9f3a92de | Miltiadis Vasilakis | CGFloat inset = (ICON_INSET_HORIZ + ICON_SIZE + ICON_TEXT_SPACING); |
131 | 9f3a92de | Miltiadis Vasilakis | cellFrame.origin.x += inset; |
132 | 9f3a92de | Miltiadis Vasilakis | cellFrame.size.width -= inset; |
133 | 9f3a92de | Miltiadis Vasilakis | cellFrame.origin.y += 1; // Looks better |
134 | 9f3a92de | Miltiadis Vasilakis | cellFrame.size.height -= 1; |
135 | 9f3a92de | Miltiadis Vasilakis | [super drawInteriorWithFrame:cellFrame inView:controlView]; |
136 | 9f3a92de | Miltiadis Vasilakis | } |
137 | 9f3a92de | Miltiadis Vasilakis | |
138 | 9f3a92de | Miltiadis Vasilakis | - (void)drawWithExpansionFrame:(NSRect)cellFrame inView:(NSView *)view { |
139 | 9f3a92de | Miltiadis Vasilakis | // We want to exclude the icon from the expansion frame when you hover over the cell |
140 | 9f3a92de | Miltiadis Vasilakis | [super drawInteriorWithFrame:cellFrame inView:view]; |
141 | 9f3a92de | Miltiadis Vasilakis | } |
142 | 9f3a92de | Miltiadis Vasilakis | |
143 | 9f3a92de | Miltiadis Vasilakis | @end |