Use user catalog displayname when displaying an account node
[pithos-macos] / pithos-macos / ImageAndTextCell.m
1 /*
2      File: ImageAndTextCell.m 
3  Abstract: Subclass of NSTextFieldCell which can display text and an image simultaneously.
4   
5   Version: 1.1 
6   
7  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple 
8  Inc. ("Apple") in consideration of your agreement to the following 
9  terms, and your use, installation, modification or redistribution of 
10  this Apple software constitutes acceptance of these terms.  If you do 
11  not agree with these terms, please do not use, install, modify or 
12  redistribute this Apple software. 
13   
14  In consideration of your agreement to abide by the following terms, and 
15  subject to these terms, Apple grants you a personal, non-exclusive 
16  license, under Apple's copyrights in this original Apple software (the 
17  "Apple Software"), to use, reproduce, modify and redistribute the Apple 
18  Software, with or without modifications, in source and/or binary forms; 
19  provided that if you redistribute the Apple Software in its entirety and 
20  without modifications, you must retain this notice and the following 
21  text and disclaimers in all such redistributions of the Apple Software. 
22  Neither the name, trademarks, service marks or logos of Apple Inc. may 
23  be used to endorse or promote products derived from the Apple Software 
24  without specific prior written permission from Apple.  Except as 
25  expressly stated in this notice, no other rights or licenses, express or 
26  implied, are granted by Apple herein, including but not limited to any 
27  patent rights that may be infringed by your derivative works or by other 
28  works in which the Apple Software may be incorporated. 
29   
30  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE 
31  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 
32  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 
33  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 
34  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 
35   
36  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 
37  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
38  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
39  INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 
40  MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 
41  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 
42  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 
43  POSSIBILITY OF SUCH DAMAGE. 
44   
45  Copyright (C) 2010 Apple Inc. All Rights Reserved. 
46   
47  */
48
49 #import "ImageAndTextCell.h"
50 //#import "BaseNode.h"
51
52 @implementation ImageAndTextCell
53
54 #define kIconImageSize          16.0
55
56 #define kImageOriginXOffset 3
57 #define kImageOriginYOffset 1
58
59 #define kTextOriginXOffset      2
60 #define kTextOriginYOffset      2
61 #define kTextHeightAdjust       4
62
63 // -------------------------------------------------------------------------------
64 //      init:
65 // -------------------------------------------------------------------------------
66 - (id)init
67 {
68         self = [super init];
69         
70         // we want a smaller font
71         [self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
72
73         return self;
74 }
75
76 // -------------------------------------------------------------------------------
77 //      dealloc:
78 // -------------------------------------------------------------------------------
79 - (void)dealloc
80 {
81     image = nil;
82 }
83
84 // -------------------------------------------------------------------------------
85 //      copyWithZone:zone
86 // -------------------------------------------------------------------------------
87 - (id)copyWithZone:(NSZone*)zone
88 {
89     ImageAndTextCell *cell = (ImageAndTextCell*)[super copyWithZone:zone];
90     cell->image = image;
91     return cell;
92 }
93
94 // -------------------------------------------------------------------------------
95 //      setImage:anImage
96 // -------------------------------------------------------------------------------
97 - (void)setImage:(NSImage*)anImage
98 {
99     if (anImage != image)
100         {
101         image = anImage;
102                 [image setSize:NSMakeSize(kIconImageSize, kIconImageSize)];
103     }
104 }
105
106 // -------------------------------------------------------------------------------
107 //      image:
108 // -------------------------------------------------------------------------------
109 - (NSImage*)image
110 {
111     return image;
112 }
113
114 // -------------------------------------------------------------------------------
115 //      isGroupCell:
116 // -------------------------------------------------------------------------------
117 - (BOOL)isGroupCell
118 {
119     return ([self image] == nil && [[self title] length] > 0);
120 }
121
122 // -------------------------------------------------------------------------------
123 //      titleRectForBounds:cellRect
124 //
125 //      Returns the proper bound for the cell's title while being edited
126 // -------------------------------------------------------------------------------
127 - (NSRect)titleRectForBounds:(NSRect)cellRect
128 {       
129         // the cell has an image: draw the normal item cell
130         NSSize imageSize;
131         NSRect imageFrame;
132
133         imageSize = [image size];
134         NSDivideRect(cellRect, &imageFrame, &cellRect, 3 + imageSize.width, NSMinXEdge);
135
136         imageFrame.origin.x += kImageOriginXOffset;
137         imageFrame.origin.y -= kImageOriginYOffset;
138         imageFrame.size = imageSize;
139         
140         imageFrame.origin.y += ceil((cellRect.size.height - imageFrame.size.height) / 2);
141         
142         NSRect newFrame = cellRect;
143         newFrame.origin.x += kTextOriginXOffset;
144         newFrame.origin.y += kTextOriginYOffset;
145         newFrame.size.height -= kTextHeightAdjust;
146
147         return newFrame;
148 }
149
150 // -------------------------------------------------------------------------------
151 //      editWithFrame:inView:editor:delegate:event
152 // -------------------------------------------------------------------------------
153 - (void)editWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent
154 {
155         NSRect textFrame = [self titleRectForBounds:aRect];
156         [super editWithFrame:textFrame inView:controlView editor:textObj delegate:anObject event:theEvent];
157 }
158
159 // -------------------------------------------------------------------------------
160 //      selectWithFrame:inView:editor:delegate:event:start:length
161 // -------------------------------------------------------------------------------
162 - (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
163 {
164         NSRect textFrame = [self titleRectForBounds:aRect];
165         [super selectWithFrame:textFrame inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
166 }
167
168 // -------------------------------------------------------------------------------
169 //      drawWithFrame:cellFrame:controlView:
170 // -------------------------------------------------------------------------------
171 - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
172 {
173         if (image != nil)
174         {
175                 // the cell has an image: draw the normal item cell
176                 NSSize imageSize;
177         NSRect imageFrame;
178
179         imageSize = [image size];
180         NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge);
181  
182         imageFrame.origin.x += kImageOriginXOffset;
183                 imageFrame.origin.y -= kImageOriginYOffset;
184         imageFrame.size = imageSize;
185                 
186         if ([controlView isFlipped])
187             imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2);
188         else
189             imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2);
190                 [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver];
191
192                 NSRect newFrame = cellFrame;
193                 newFrame.origin.x += kTextOriginXOffset;
194                 newFrame.origin.y += kTextOriginYOffset;
195                 newFrame.size.height -= kTextHeightAdjust;
196                 [super drawWithFrame:newFrame inView:controlView];
197     }
198         else
199         {
200                 if ([self isGroupCell])
201                 {
202                         // Center the text in the cellFrame, and call super to do thew ork of actually drawing. 
203                         CGFloat yOffset = floor((NSHeight(cellFrame) - [[self attributedStringValue] size].height) / 2.0);
204                         cellFrame.origin.y += yOffset;
205                         cellFrame.size.height -= (kTextOriginYOffset*yOffset);
206                         [super drawWithFrame:cellFrame inView:controlView];
207                 }
208         }
209 }
210
211 // -------------------------------------------------------------------------------
212 //      cellSize:
213 // -------------------------------------------------------------------------------
214 - (NSSize)cellSize
215 {
216     NSSize cellSize = [super cellSize];
217     cellSize.width += (image ? [image size].width : 0) + 3;
218     return cellSize;
219 }
220
221 // -------------------------------------------------------------------------------
222 //      hitTestForEvent:
223 //
224 //      In 10.5, we need you to implement this method for blocking drag and drop of a given cell.
225 //      So NSCell hit testing will determine if a row can be dragged or not.
226 //
227 //      NSTableView calls this cell method when starting a drag, if the hit cell returns
228 //      NSCellHitTrackableArea, the particular row will be tracked instead of dragged.
229 //
230 // -------------------------------------------------------------------------------
231 //- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView
232 //{
233 //      NSInteger result = NSCellHitContentArea;
234 //      
235 //      NSOutlineView* hostingOutlineView = (NSOutlineView*)[self controlView];
236 //      if (hostingOutlineView)
237 //      {
238 //              NSInteger selectedRow = [hostingOutlineView selectedRow];
239 //              BaseNode* node = [[hostingOutlineView itemAtRow:selectedRow] representedObject];
240 //
241 //              if (![node isDraggable])        // is the node isDraggable (i.e. non-file system based objects)
242 //                      result = NSCellHitTrackableArea;
243 //      }
244 //              
245 //      return result;
246 //}
247
248 @end
249