Removing the use of private CoreGraphics APIs to draw shadows, and replacing with...
[ITKit.git] / ITTextFieldCell.m
old mode 100755 (executable)
new mode 100644 (file)
index 7e289fd..002af3b
 #import "ITTextFieldCell.h"
 #import <ApplicationServices/ApplicationServices.h>
-#import "ITCoreGraphicsHacks.h"
-
-
-/*************************************************************************/
-#pragma mark -
-#pragma mark IMPLEMENTATION
-/*************************************************************************/
+#import <ITFoundation/ITFoundation.h>
 
 @implementation ITTextFieldCell
 
-/*************************************************************************/
-#pragma mark -
-#pragma mark INITIALIZATION METHODS
-/*************************************************************************/
-
-- (id)initTextCell:(NSString *)string;
-{
-    if ( ( self = [super initTextCell:string] ) ) {
-        castsShadow      = NO;
-        shadowElevation  = 45.0;
-        shadowAzimuth    = 90.0;
-        shadowAmbient    = 0.15;
-        shadowHeight     = 1.00;
-        shadowRadius     = 4.00;
-        shadowSaturation = 1.2;
-    }
-
-    return self;
+- (id)initTextCell:(NSString *)string {
+       if ((self = [super initTextCell:string])) {
+               castsShadow = NO;
+               shadowAzimuth = 90.0;
+               shadowAmbient = 0.0;
+               shadowHeight = 1.00;
+               shadowRadius = 4.00;
+       }
+       return self;
 }
 
-- (id)initWithCoder:(NSCoder *)coder
-{
-    if ( ( self = [super initWithCoder:coder] ) ) {        
-        castsShadow      = NO;
-        shadowElevation  = 45.0;
-        shadowAzimuth    = 90.0;
-        shadowAmbient    = 0.15;
-        shadowHeight     = 1.00;
-        shadowRadius     = 4.00;
-        shadowSaturation = 1.0;
-    }
-    
-    return self;
+- (id)initWithCoder:(NSCoder *)coder {
+       if ((self = [super initWithCoder:coder])) {             
+               castsShadow = NO;
+               shadowAzimuth = 90.0;
+               shadowAmbient = 0.0; // Unlike ITImageCell, even an alpha component of 1.0 is ligher than the old private API's results. There's not much we can do about it as we can't go "blacker" than black.
+               shadowHeight = 1.00;
+               shadowRadius = 4.00;
+       }
+       return self;
 }
 
-
-/*************************************************************************/
-#pragma mark -
-#pragma mark DRAWING METHODS
-/*************************************************************************/
-
-- (void)drawWithFrame:(NSRect)rect inView:(NSView *)controlView
-{
-    CGSGenericObj        style = nil;
-    CGShadowStyle        shadow;
-
-    if ( castsShadow ) { 
-//      Create the shadow style to use for drawing the string
-        shadow.version    = 0;
-        shadow.elevation  = shadowElevation;
-        shadow.azimuth    = shadowAzimuth;
-        shadow.ambient    = shadowAmbient;
-        shadow.height     = shadowHeight;
-        shadow.radius     = shadowRadius;
-        shadow.saturation = shadowSaturation;
-        style = CGStyleCreateShadow(&shadow);
-        
-        // Set the context for drawing the string
-        [NSGraphicsContext saveGraphicsState];
-        CGContextSetStyle([[NSGraphicsContext currentContext] graphicsPort], style);
-    }
-    
-    // Draw the string
-    [super drawWithFrame:rect inView:controlView];
-    
-
-    if ( castsShadow ) { 
-        // Restore the old context
-        [NSGraphicsContext restoreGraphicsState];
-        CGStyleRelease(style);
-    }
+- (void)drawWithFrame:(NSRect)rect inView:(NSView *)controlView {
+       NSShadow *shadow;
+       
+       if (castsShadow) {
+               CGFloat height = ((2.0*tan((M_PI/360.0)*(shadowAzimuth-180.0)))*shadowHeight)/(1.0+pow(tan((M_PI/360.0)*(shadowAzimuth-180.0)),2.0));
+               CGFloat width = sqrt(pow(shadowHeight, 2.0)-pow(height, 2.0));
+               
+               shadow = [[NSShadow alloc] init];
+               [shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:(1.0 - shadowAmbient)]];
+               [shadow setShadowOffset:NSMakeSize(width, height)];
+               [shadow setShadowBlurRadius:shadowRadius];
+               
+               [NSGraphicsContext saveGraphicsState];
+               [shadow set];
+       }
+       
+       // Draw the string
+       [super drawWithFrame:rect inView:controlView];
+       
+       if (castsShadow) { 
+               // Restore the old context
+               [NSGraphicsContext restoreGraphicsState];
+               [shadow release];
+       }
 }
 
-
-
-/*************************************************************************/
-#pragma mark -
-#pragma mark ACCESSOR METHODS
-/*************************************************************************/
-
-- (BOOL)castsShadow;
-{
-    return castsShadow;
+- (BOOL)castsShadow {
+       return castsShadow;
 }
 
-- (void)setCastsShadow:(BOOL)newSetting;
-{
-    castsShadow = newSetting;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setCastsShadow:(BOOL)newSetting {
+       castsShadow = newSetting;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (float)shadowElevation;
-{
-    return shadowElevation;
+- (float)shadowElevation {
+       return 45.0;
 }
 
-- (void)setShadowElevation:(float)newElevation;
-{
-    shadowElevation = newElevation;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setShadowElevation:(float)newElevation {
+       ITDebugLog(@"setShadowElevation: on ITTextFieldCell objects does nothing.");
 }
 
-- (float)shadowAzimuth;
-{
-    return shadowAzimuth;
+- (float)shadowAzimuth {
+       return shadowAzimuth;
 }
 
-- (void)setShadowAzimuth:(float)newAzimuth;
-{
-    shadowAzimuth = newAzimuth;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setShadowAzimuth:(float)newAzimuth {
+       shadowAzimuth = newAzimuth;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (float)shadowAmbient;
-{
-    return shadowAmbient;
+- (float)shadowAmbient {
+       return shadowAmbient;
 }
 
-- (void)setShadowAmbient:(float)newAmbient;
-{
-    shadowAmbient = newAmbient;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setShadowAmbient:(float)newAmbient {
+       shadowAmbient = newAmbient;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (float)shadowHeight;
-{
-    return shadowHeight;
+- (float)shadowHeight {
+       return shadowHeight;
 }
 
-- (void)setShadowHeight:(float)newHeight;
-{
-    shadowHeight = newHeight;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setShadowHeight:(float)newHeight {
+       shadowHeight = newHeight;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (float)shadowRadius;
-{
-    return shadowRadius;
+- (float)shadowRadius {
+       return shadowRadius;
 }
 
-- (void)setShadowRadius:(float)newRadius;
-{
-    shadowRadius = newRadius;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setShadowRadius:(float)newRadius {
+       shadowRadius = newRadius;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (float)shadowSaturation;
-{
-    return shadowSaturation;
+- (float)shadowSaturation {
+       return 1.0;
 }
 
-- (void)setShadowSaturation:(float)newSaturation;
-{
-    shadowSaturation = newSaturation;
-    [[self controlView] setNeedsDisplay:YES];
+- (void)setShadowSaturation:(float)newSaturation {
+       ITDebugLog(@"setShadowSaturation: on ITTextFieldCell objects does nothing.");
 }
 
-
-@end
+@end
\ No newline at end of file