1// 2// PXLayerDetailsView.m 3// Pixen-XCode 4// 5// Created by Joe Osborn on Thu Feb 05 2004. 6// Copyright (c) 2004 Open Sword Group. All rights reserved. 7// 8 9#import "PXLayerDetailsView.h" 10#import "PXLayer.h" 11#import "PXCanvas.h" 12#import "PXCanvasController.h" 13#ifndef __COCOA__ 14#import "PXLayerDetailsSubView.h" 15#endif 16 17 18@implementation PXLayerDetailsView 19 20- initWithLayer:aLayer 21{ 22 [super init]; 23 [NSBundle loadNibNamed:@"PXLayerDetailsView" owner:self]; 24#ifndef __COCOA__ 25 26 id myView = [[window contentView] retain]; 27 view = [[PXLayerDetailsSubView alloc] initWithFrame:[myView frame]]; 28 [view addSubview:myView]; 29#endif 30 31 [self addSubview:view]; 32 [self setLayer:aLayer]; 33 NSLog(@"****************** thumbnail %@",thumbnail); 34 [thumbnail setImage:image]; 35 [thumbnail setEditable:NO]; 36 isHidden = YES; 37 changedRect = NSZeroRect; 38 return self; 39} 40 41- opacityText 42{ 43 return opacityText; 44} 45 46- (void)dealloc 47{ 48 [self invalidateTimer]; 49 [[NSNotificationCenter defaultCenter] removeObserver:self]; 50 [super dealloc]; 51} 52 53- (void)setLayer:aLayer 54{ 55 [self invalidateTimer]; 56 //set preview, name field, and other state 57 [[NSNotificationCenter defaultCenter] removeObserver:self]; 58 layer = aLayer; 59 [image release]; 60 image = [[NSImage alloc] initWithSize:[layer size]]; 61 [name setStringValue:[layer name]]; 62 [opacity setFloatValue:[layer opacity]]; 63 [opacityField setFloatValue:[layer opacity]]; 64 [self updatePreview:nil]; 65 [visibility setState:[layer visible]]; 66 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePreview:) name:PXCanvasChangedNotificationName object:nil]; 67 timer = [[NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(shouldRedraw:) userInfo:nil repeats:YES] retain]; 68 [self setNeedsDisplay:YES]; 69 [view setLayer:layer]; 70} 71 72- (void)updatePreview:notification 73{ 74#ifdef __COCOA__ 75 if(((notification != nil) 76 && (layer != [[notification userInfo] objectForKey:@"activeLayer"])) 77 || [self isHidden]) 78 { 79 80 return; 81 } 82#endif 83 changedRect = NSUnionRect(changedRect, (notification == nil) ? NSMakeRect(0,0,[layer size].width,[layer size].height) : [[[notification userInfo] objectForKey:@"changedRect"] rectValue]); 84} 85 86- (IBAction)visibilityDidChange:sender 87{ 88 [layer setVisible:([sender state] == NSOnState) ? YES : NO]; 89 [[NSNotificationCenter defaultCenter] postNotificationName:@"PXCanvasShouldRedrawNotificationName" object:layer]; 90} 91 92- (void)shouldRedraw:timer 93{ 94#ifdef __COCOA__ 95 if (NSIsEmptyRect(changedRect)) 96 { 97 return; 98 } 99#endif 100 NSLog(@"thumbnail %@",thumbnail); 101 [image lockFocus]; 102 BOOL oldVisibility = [layer visible]; 103 int oldOpacity = [layer opacity]; 104 [layer setVisible:YES]; 105 [layer setOpacity:100]; 106 [[NSColor clearColor] set]; 107 NSRectFill(changedRect); 108 [layer drawRect:changedRect fixBug:YES]; 109 [layer setVisible:oldVisibility]; 110 [layer setOpacity:oldOpacity]; 111 [image unlockFocus]; 112 [thumbnail setImage:nil]; 113 [thumbnail setImage:image]; 114 [thumbnail setNeedsDisplay:YES]; 115 changedRect = NSZeroRect; 116} 117 118- (void)invalidateTimer 119{ 120 if((timer != nil) && [timer isValid]) 121 { 122 [timer invalidate]; 123 [timer release]; 124 timer = nil; 125 } 126} 127 128- (BOOL)isHidden 129{ 130#ifdef __COCOA__ 131 if([super respondsToSelector:@selector(isHidden)]) 132 { 133 return [super isHidden]; 134 } 135 return isHidden; 136#else 137 return NO; 138#endif 139} 140 141- (void)setHidden:(BOOL)newHidden 142{ 143#ifdef __COCOA__ 144 if([self isHidden] == newHidden) { return; } 145 if([super respondsToSelector:@selector(setHidden:)]) { [super setHidden:newHidden]; } 146 isHidden = newHidden; 147 [self updatePreview:nil]; 148#endif 149} 150 151- (IBAction)opacityDidChange:sender 152{ 153 [opacity setFloatValue:[sender floatValue]]; 154 [opacityField setFloatValue:[sender floatValue]]; 155 [layer setOpacity:[sender floatValue]]; 156 [[NSNotificationCenter defaultCenter] postNotificationName:@"PXCanvasShouldRedrawNotificationName" object:layer]; 157} 158 159- (IBAction)nameDidChange:sender 160{ 161 [(PXLayer *)layer setName:[name stringValue]]; 162} 163 164@end 165