Changeset 3152
- Timestamp:
- 03/11/06 22:32:26 (2 years ago)
- Files:
-
- trunk/Colloquy.xcodeproj/project.pbxproj (modified) (7 diffs)
- trunk/Controllers/MVApplicationController.m (modified) (2 diffs)
- trunk/Panels/JVChatRoomPanel.m (modified) (1 diff)
- trunk/Resources/base.html (added)
- trunk/Resources/chatRoomTemplate.html (deleted)
- trunk/Resources/roomTopicBanner.html (added)
- trunk/Resources/roomTopicBanner.js (added)
- trunk/Settings/Common Settings.xcconfig (modified) (1 diff)
- trunk/Views/JVMarkedScroller.h (modified) (3 diffs)
- trunk/Views/JVMarkedScroller.m (modified) (32 diffs)
- trunk/Views/JVStyleView.h (modified) (2 diffs)
- trunk/Views/JVStyleView.m (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Colloquy.xcodeproj/project.pbxproj
r3150 r3152 34 34 1C1ACFB805344FCC00F71D4E /* JVConnectionInspector.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1ACFB605344FCC00F71D4E /* JVConnectionInspector.m */; }; 35 35 1C1AD00B053487ED00F71D4E /* JVConnectionInspector.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1C1AD009053487ED00F71D4E /* JVConnectionInspector.nib */; }; 36 1C1AFB3D09C295D900BF3E2A /* base.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C1AFB3C09C295D900BF3E2A /* base.html */; }; 37 1C1AFDAB09C3BC5000BF3E2A /* roomTopicBanner.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C1AFDAA09C3BC4F00BF3E2A /* roomTopicBanner.html */; }; 38 1C1AFE8E09C3D92E00BF3E2A /* roomTopicBanner.js in Resources */ = {isa = PBXBuildFile; fileRef = 1C1AFE8109C3D8C900BF3E2A /* roomTopicBanner.js */; }; 36 39 1C238F050677B5E5000E89A7 /* JVTabbedChatWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1C238F040677B5E5000E89A7 /* JVTabbedChatWindow.nib */; }; 37 40 1C2391AA0677E6B7000E89A7 /* JVChatTabItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C2391A80677E6B7000E89A7 /* JVChatTabItem.m */; }; … … 75 78 1C7780DE08FA1D82006AD8E5 /* JVSpeechController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7780DC08FA1D81006AD8E5 /* JVSpeechController.m */; }; 76 79 1C77822908FA4104006AD8E5 /* topicBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C77822808FA4101006AD8E5 /* topicBackground.png */; }; 77 1C77822B08FA415B006AD8E5 /* chatRoomTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C77822A08FA415B006AD8E5 /* chatRoomTemplate.html */; };78 80 1C77830708FA4BD3006AD8E5 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = F5394C070378E44D01A35792 /* Credits.rtf */; }; 79 81 1C77831208FA4EA2006AD8E5 /* topicToggleDown.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C77831008FA4EA2006AD8E5 /* topicToggleDown.png */; }; … … 480 482 1C1ACFB605344FCC00F71D4E /* JVConnectionInspector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JVConnectionInspector.m; path = Inspectors/JVConnectionInspector.m; sourceTree = "<group>"; }; 481 483 1C1AD00A053487ED00F71D4E /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = Languages/English.lproj/JVConnectionInspector.nib; sourceTree = "<group>"; }; 484 1C1AFB3C09C295D900BF3E2A /* base.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = base.html; path = Resources/base.html; sourceTree = "<group>"; }; 485 1C1AFDAA09C3BC4F00BF3E2A /* roomTopicBanner.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = roomTopicBanner.html; path = Resources/roomTopicBanner.html; sourceTree = "<group>"; }; 486 1C1AFE8109C3D8C900BF3E2A /* roomTopicBanner.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = roomTopicBanner.js; path = Resources/roomTopicBanner.js; sourceTree = "<group>"; }; 482 487 1C1D19F105992D80000BB31A /* ChatCore.scriptSuite */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ChatCore.scriptSuite; path = Resources/ChatCore.scriptSuite; sourceTree = "<group>"; }; 483 488 1C1D19F205992D80000BB31A /* ChatCore.scriptTerminology */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ChatCore.scriptTerminology; path = Resources/ChatCore.scriptTerminology; sourceTree = "<group>"; }; … … 557 562 1C7780DC08FA1D81006AD8E5 /* JVSpeechController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JVSpeechController.m; path = Controllers/JVSpeechController.m; sourceTree = "<group>"; }; 558 563 1C77822808FA4101006AD8E5 /* topicBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = topicBackground.png; path = Resources/topicBackground.png; sourceTree = "<group>"; }; 559 1C77822A08FA415B006AD8E5 /* chatRoomTemplate.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = chatRoomTemplate.html; path = Resources/chatRoomTemplate.html; sourceTree = "<group>"; };560 564 1C77831008FA4EA2006AD8E5 /* topicToggleDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = topicToggleDown.png; path = Resources/topicToggleDown.png; sourceTree = "<group>"; }; 561 565 1C77831108FA4EA2006AD8E5 /* topicToggleUp.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = topicToggleUp.png; path = Resources/topicToggleUp.png; sourceTree = "<group>"; }; … … 1523 1527 0A5B683E0810EC9700398D5A /* default.css */, 1524 1528 0AA811220826DB8800A3BF2D /* default.js */, 1529 1C1AFB3C09C295D900BF3E2A /* base.html */, 1525 1530 1C3C116005029DE1000001C8 /* template.html */, 1526 1C77822A08FA415B006AD8E5 /* chatRoomTemplate.html */, 1531 1C1AFDAA09C3BC4F00BF3E2A /* roomTopicBanner.html */, 1532 1C1AFE8109C3D8C900BF3E2A /* roomTopicBanner.js */, 1527 1533 1C746A95050CF86B000001C8 /* emoticons.plist */, 1528 1534 F5675B8601DB767601EE70DE /* verbs.plist */, … … 2023 2029 buildActionMask = 2147483647; 2024 2030 files = ( 2031 1C1AFE8E09C3D92E00BF3E2A /* roomTopicBanner.js in Resources */, 2025 2032 1CB2CD11052DDC560094AAA4 /* op.tif in Resources */, 2026 2033 1CB2CD12052DDC560094AAA4 /* person.tif in Resources */, … … 2188 2195 1CE6917008B183C8006D9CA0 /* NSTextSuite.scriptSuite in Resources */, 2189 2196 1C77822908FA4104006AD8E5 /* topicBackground.png in Resources */, 2190 1C77822B08FA415B006AD8E5 /* chatRoomTemplate.html in Resources */,2191 2197 1C77830708FA4BD3006AD8E5 /* Credits.rtf in Resources */, 2192 2198 1C77831208FA4EA2006AD8E5 /* topicToggleDown.png in Resources */, 2193 2199 1C77831308FA4EA2006AD8E5 /* topicToggleUp.png in Resources */, 2194 2200 1C6E43C40955EFD7002D22E7 /* serverWindow.png in Resources */, 2201 1C1AFB3D09C295D900BF3E2A /* base.html in Resources */, 2202 1C1AFDAB09C3BC5000BF3E2A /* roomTopicBanner.html in Resources */, 2195 2203 ); 2196 2204 runOnlyForDeploymentPostprocessing = 0; trunk/Controllers/MVApplicationController.m
r3072 r3152 23 23 #import "JVDirectChatPanel.h" 24 24 #import "JVChatTranscriptBrowserPanel.h" 25 #import "JVMarkedScroller.h"26 25 27 26 #import <Foundation/NSDebug.h> … … 372 371 373 372 - (void) applicationWillFinishLaunching:(NSNotification *) notification { 374 [JVMarkedScroller poseAsClass:[NSScroller class]];375 373 [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"plist"]]]; 376 374 [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector( handleURLEvent:withReplyEvent: ) forEventClass:kInternetEventClass andEventID:kAEGetURL]; trunk/Panels/JVChatRoomPanel.m
r3072 r3152 72 72 73 73 [display setBodyTemplate:@"chatRoom"]; 74 [display addBanner:@"roomTopicBanner"]; 74 75 75 76 NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"irc://%@/%@", [[self connection] server], _target]]; trunk/Settings/Common Settings.xcconfig
r3125 r3152 17 17 GCC_OPTIMIZATION_LEVEL = s 18 18 GCC_MODEL_TUNING = G5 19 PREBINDING = YES19 PREBINDING = NO 20 20 ZERO_LINK = NO 21 21 DSTROOT = / trunk/Views/JVMarkedScroller.h
r3072 r3152 1 @interface JVMarkedScroller : NSScroller 1 2 @interface JVMarkedScroller : NSScroller { 3 NSMutableSet *_marks; 4 NSMutableArray *_shades; 5 unsigned long long _nearestPreviousMark; 6 unsigned long long _nearestNextMark; 7 unsigned long long _currentMark; 8 BOOL _jumpingToMark; 9 } 2 10 - (void) setLocationOfCurrentMark:(unsigned long long) location; 3 11 - (unsigned long long) locationOfCurrentMark; 4 12 5 - ( unsigned long long) locationOfPreviousMark;6 - ( unsigned long long) locationOfNextMark;7 - ( unsigned long long) locationOfMarkWithIdentifier:(NSString *) identifier;13 - (IBAction) jumpToPreviousMark:(id) sender; 14 - (IBAction) jumpToNextMark:(id) sender; 15 - (void) jumpToMarkWithIdentifier:(NSString *) identifier; 8 16 9 17 - (void) shiftMarksAndShadedAreasBy:(long long) displacement; … … 13 21 - (void) addMarkAt:(unsigned long long) location withColor:(NSColor *) color; 14 22 - (void) addMarkAt:(unsigned long long) location withIdentifier:(NSString *) identifier withColor:(NSColor *) color; 23 15 24 - (void) removeMarkAt:(unsigned long long) location; 16 25 - (void) removeMarkAt:(unsigned long long) location withIdentifier:(NSString *) identifier; … … 33 42 - (unsigned long long) contentViewLength; 34 43 - (float) scaleToContentView; 35 - ( long) shiftAmountToCenterAlign;44 - (float) shiftAmountToCenterAlign; 36 45 @end trunk/Views/JVMarkedScroller.m
r3072 r3152 1 1 #import "JVMarkedScroller.h" 2 3 static NSMapTable *scrollers = NULL;4 5 struct _instanceVars {6 NSMutableSet *marks;7 NSMutableArray *shades;8 unsigned long long nearestPreviousMark;9 unsigned long long nearestNextMark;10 unsigned long long currentMark;11 };12 2 13 3 struct _mark { … … 18 8 19 9 @implementation JVMarkedScroller 20 + (void) initialize {21 static BOOL tooLate = NO;22 if( ! tooLate ) {23 // setup our global NSMapTable to hold our instance variables. This is so we can poseAsClass:24 // no need for the callbacks, we don't want to retain/release anything we add, etc25 NSMapTableKeyCallBacks keyCallbacks = { NULL, NULL, NULL, NULL, NULL, NULL };26 NSMapTableValueCallBacks valueCallbacks = { NULL, NULL, NULL };27 scrollers = NSCreateMapTable( keyCallbacks, valueCallbacks, 100 );28 tooLate = YES;29 }30 }31 32 10 - (id) initWithFrame:(NSRect) frame { 33 11 if( ( self = [super initWithFrame:frame] ) ) { 34 struct _instanceVars *vars = malloc( sizeof( struct _instanceVars ) ); 35 if( ! vars ) { 36 [self release]; 37 return nil; 38 } 39 40 // insert our instance variables structure 41 NSMapInsert( scrollers, self, vars ); 42 43 vars -> marks = [[NSMutableSet set] retain]; 44 vars -> shades = [[NSMutableArray array] retain]; 45 vars -> nearestPreviousMark = NSNotFound; 46 vars -> nearestNextMark = NSNotFound; 47 vars -> currentMark = NSNotFound; 12 _marks = [[NSMutableSet set] retain]; 13 _shades = [[NSMutableArray array] retain]; 14 _nearestPreviousMark = NSNotFound; 15 _nearestNextMark = NSNotFound; 16 _currentMark = NSNotFound; 48 17 } 49 18 return self; … … 51 20 52 21 - (void) dealloc { 53 struct _instanceVars *vars = NSMapGet( scrollers, self ); 54 if( ! vars ) { 55 [super dealloc]; 56 return; 57 } 58 59 [vars -> marks release]; 60 [vars -> shades release]; 61 62 vars -> marks = nil; 63 vars -> shades = nil; 64 65 NSMapRemove( scrollers, self ); 66 67 free( vars ); 22 [_marks release]; 23 [_shades release]; 24 25 _marks = nil; 26 _shades = nil; 68 27 69 28 [super dealloc]; … … 75 34 [super drawRect:rect]; 76 35 77 struct _instanceVars *vars = NSMapGet( scrollers, self );78 if( ! vars || ( ! [vars -> marks count] && ! [vars -> shades count] ) ) return;79 80 36 NSAffineTransform *transform = [NSAffineTransform transform]; 81 37 float width = [[self class] scrollerWidthForControlSize:[self controlSize]]; … … 88 44 89 45 NSBezierPath *shades = [NSBezierPath bezierPath]; 90 NSEnumerator *enumerator = [ vars ->shades objectEnumerator];46 NSEnumerator *enumerator = [_shades objectEnumerator]; 91 47 NSNumber *startNum = nil; 92 48 NSNumber *stopNum = nil; … … 106 62 } 107 63 108 if( ( [ vars ->shades count] % 2 ) == 1 ) {64 if( ( [_shades count] % 2 ) == 1 ) { 109 65 NSRect rect = NSZeroRect; 110 unsigned long long start = [[ vars ->shades lastObject] unsignedLongLongValue];111 unsigned long long stop = ( NSHeight( [self frame] ) / [self knobProportion] );66 unsigned long long start = [[_shades lastObject] unsignedLongLongValue]; 67 unsigned long long stop = [self contentViewLength]; 112 68 113 69 if( sFlags.isHoriz ) rect = NSMakeRect( start, 0., ( stop - start ), width ); … … 129 85 NSBezierPath *lines = [NSBezierPath bezierPath]; 130 86 NSMutableArray *lineArray = [NSMutableArray array]; 87 enumerator = [_marks objectEnumerator]; 131 88 NSValue *currentMark = nil; 132 enumerator = [vars -> marks objectEnumerator]; 133 134 unsigned long long currentPosition = ( vars -> currentMark != NSNotFound ? vars -> currentMark : [self floatValue] * [self contentViewLength] ); 89 90 unsigned long long currentPosition = ( _currentMark != NSNotFound ? _currentMark : [self floatValue] * [self contentViewLength] ); 135 91 BOOL foundNext = NO, foundPrevious = NO; 136 92 NSRect knobRect = [self rectForPart:NSScrollerKnob]; … … 141 97 unsigned long long value = mark.location; 142 98 143 if( value < currentPosition && ( ! foundPrevious || value > vars ->nearestPreviousMark ) ) {144 vars ->nearestPreviousMark = value;99 if( value < currentPosition && ( ! foundPrevious || value > _nearestPreviousMark ) ) { 100 _nearestPreviousMark = value; 145 101 foundPrevious = YES; 146 102 } 147 103 148 if( value > currentPosition && ( ! foundNext || value < vars ->nearestNextMark ) ) {149 vars ->nearestNextMark = value;104 if( value > currentPosition && ( ! foundNext || value < _nearestNextMark ) ) { 105 _nearestNextMark = value; 150 106 foundNext = YES; 151 107 } … … 174 130 } 175 131 176 if( ! foundPrevious ) vars ->nearestPreviousMark = NSNotFound;177 if( ! foundNext ) vars ->nearestNextMark = NSNotFound;132 if( ! foundPrevious ) _nearestPreviousMark = NSNotFound; 133 if( ! foundNext ) _nearestNextMark = NSNotFound; 178 134 179 135 if( ! [lines isEmpty] ) { … … 195 151 196 152 - (void) setFloatValue:(float) position knobProportion:(float) percent { 197 struct _instanceVars *vars = NSMapGet( scrollers, self ); 198 if( vars ) vars -> currentMark = NSNotFound; 199 if( vars && ( [self floatValue] != position || [self knobProportion] != percent ) && ( [vars -> marks count] || [vars -> shades count] ) ) 153 if( ! _jumpingToMark ) _currentMark = NSNotFound; 154 if( ( [self floatValue] != position || [self knobProportion] != percent ) && ( [_marks count] || [_shades count] ) ) 200 155 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 201 156 [super setFloatValue:position knobProportion:percent]; 202 157 } 203 158 204 /* - (NSMenu *) menuForEvent:(NSEvent *) event { 205 struct _instanceVars *vars = NSMapGet( scrollers, self ); 206 if( ! vars || ! [vars -> marks count] ) return nil; 207 159 - (NSMenu *) menuForEvent:(NSEvent *) event { 208 160 NSMenu *menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; 209 161 NSMenuItem *item = nil; … … 242 194 243 195 return menu; 244 } */196 } 245 197 246 198 #pragma mark - 247 199 248 200 - (void) updateNextAndPreviousMarks { 249 struct _instanceVars *vars = NSMapGet( scrollers, self ); 250 if( ! vars ) return; 251 252 NSEnumerator *enumerator = [vars -> marks objectEnumerator]; 201 NSEnumerator *enumerator = [_marks objectEnumerator]; 253 202 NSValue *currentMark = nil; 254 203 255 unsigned long long currentPosition = ( vars -> currentMark != NSNotFound ? vars ->currentMark : [self floatValue] * [self contentViewLength] );204 unsigned long long currentPosition = ( _currentMark != NSNotFound ? _currentMark : [self floatValue] * [self contentViewLength] ); 256 205 BOOL foundNext = NO, foundPrevious = NO; 257 206 … … 261 210 unsigned long long value = mark.location; 262 211 263 if( value < currentPosition && ( ! foundPrevious || value > vars ->nearestPreviousMark ) ) {264 vars ->nearestPreviousMark = value;212 if( value < currentPosition && ( ! foundPrevious || value > _nearestPreviousMark ) ) { 213 _nearestPreviousMark = value; 265 214 foundPrevious = YES; 266 215 } 267 216 268 if( value > currentPosition && ( ! foundNext || value < vars ->nearestNextMark ) ) {269 vars ->nearestNextMark = value;217 if( value > currentPosition && ( ! foundNext || value < _nearestNextMark ) ) { 218 _nearestNextMark = value; 270 219 foundNext = YES; 271 220 } 272 221 } 273 222 274 if( ! foundPrevious ) vars ->nearestPreviousMark = NSNotFound;275 if( ! foundNext ) vars ->nearestNextMark = NSNotFound;223 if( ! foundPrevious ) _nearestPreviousMark = NSNotFound; 224 if( ! foundNext ) _nearestNextMark = NSNotFound; 276 225 } 277 226 … … 297 246 298 247 - (void) setLocationOfCurrentMark:(unsigned long long) location { 299 struct _instanceVars *vars = NSMapGet( scrollers, self ); 300 if( ! vars ) return; 301 if( vars -> currentMark != location ) { 302 vars -> currentMark = location; 248 if( _currentMark != location ) { 249 _currentMark = location; 303 250 [self updateNextAndPreviousMarks]; 304 251 } … … 306 253 307 254 - (unsigned long long) locationOfCurrentMark { 308 struct _instanceVars *vars = NSMapGet( scrollers, self ); 309 if( ! vars ) return NSNotFound; 310 return vars -> currentMark; 311 } 312 313 #pragma mark - 314 315 - (unsigned long long) locationOfPreviousMark { 316 struct _instanceVars *vars = NSMapGet( scrollers, self ); 317 if( ! vars ) return NSNotFound; 318 return vars -> nearestPreviousMark; 319 } 320 321 - (unsigned long long) locationOfNextMark { 322 struct _instanceVars *vars = NSMapGet( scrollers, self ); 323 if( ! vars ) return NSNotFound; 324 return vars -> nearestNextMark; 325 } 326 327 - (unsigned long long) locationOfMarkWithIdentifier:(NSString *) identifier { 328 struct _instanceVars *vars = NSMapGet( scrollers, self ); 329 if( ! vars ) return NSNotFound; 330 331 NSEnumerator *enumerator = [vars -> marks objectEnumerator]; 332 unsigned long long currentMark = NSNotFound; 255 return _currentMark; 256 } 257 258 #pragma mark - 259 260 - (IBAction) jumpToPreviousMark:(id) sender { 261 if( _nearestPreviousMark != NSNotFound ) { 262 _currentMark = _nearestPreviousMark; 263 _jumpingToMark = YES; 264 float shift = [self shiftAmountToCenterAlign]; 265 [[(NSScrollView *)[self superview] documentView] scrollPoint:NSMakePoint( 0., _currentMark - shift )]; 266 _jumpingToMark = NO; 267 } 268 } 269 270 - (IBAction) jumpToNextMark:(id) sender { 271 if( _nearestNextMark != NSNotFound ) { 272 _currentMark = _nearestNextMark; 273 _jumpingToMark = YES; 274 float shift = [self shiftAmountToCenterAlign]; 275 [[(NSScrollView *)[self superview] documentView] scrollPoint:NSMakePoint( 0., _currentMark - shift )]; 276 _jumpingToMark = NO; 277 } 278 } 279 280 - (void) jumpToMarkWithIdentifier:(NSString *) identifier { 281 _jumpingToMark = YES; 282 283 NSEnumerator *e = [_marks objectEnumerator]; 333 284 NSValue *obj = nil; 334 335 while( obj = [enumerator nextObject] ) { 285 BOOL foundMark = NO; 286 287 while( obj = [e nextObject] ) { 336 288 struct _mark mark; 337 289 [obj getValue:&mark]; 338 290 if( [mark.identifier isEqualToString:identifier] ) { 339 currentMark = mark.location; 291 _currentMark = mark.location; 292 foundMark = YES; 340 293 break; 341 294 } 342 295 } 343 344 return currentMark; 296 297 if( foundMark ) { 298 float shift = [self shiftAmountToCenterAlign]; 299 [[(NSScrollView *)[self superview] documentView] scrollPoint:NSMakePoint( 0., _currentMark - shift )]; 300 } 301 302 _jumpingToMark = NO; 345 303 } 346 304 … … 352 310 NSValue *location = nil; 353 311 354 struct _instanceVars *vars = NSMapGet( scrollers, self ); 355 if( ! vars ) return; 356 357 if( ! ( negative && vars -> nearestPreviousMark < ABS( displacement ) ) ) vars -> nearestPreviousMark += displacement; 358 else vars -> nearestPreviousMark = NSNotFound; 359 360 if( ! ( negative && vars -> nearestNextMark < ABS( displacement ) ) ) vars -> nearestNextMark += displacement; 361 else vars -> nearestNextMark = NSNotFound; 362 363 if( ! ( negative && vars -> currentMark < ABS( displacement ) ) ) vars -> currentMark += displacement; 364 else vars -> currentMark = NSNotFound; 365 366 NSEnumerator *enumerator = [vars -> marks objectEnumerator]; 312 if( ! ( negative && _nearestPreviousMark < ABS( displacement ) ) ) _nearestPreviousMark += displacement; 313 else _nearestPreviousMark = NSNotFound; 314 315 if( ! ( negative && _nearestNextMark < ABS( displacement ) ) ) _nearestNextMark += displacement; 316 else _nearestNextMark = NSNotFound; 317 318 if( ! ( negative && _currentMark < ABS( displacement ) ) ) _currentMark += displacement; 319 else _currentMark = NSNotFound; 320 321 NSEnumerator *enumerator = [_marks objectEnumerator]; 367 322 while( ( location = [enumerator nextObject] ) ) { 368 323 struct _mark mark; … … 374 329 } 375 330 376 [ vars ->marks setSet:shiftedMarks];331 [_marks setSet:shiftedMarks]; 377 332 378 333 NSMutableArray *shiftedShades = [NSMutableArray array]; … … 380 335 NSNumber *stop = nil; 381 336 382 enumerator = [ vars ->shades objectEnumerator];337 enumerator = [_shades objectEnumerator]; 383 338 while( ( start = [enumerator nextObject] ) && ( ( stop = [enumerator nextObject] ) || YES ) ) { 384 339 unsigned long long shiftedStart = [start unsignedLongLongValue]; … … 395 350 } 396 351 397 [ vars ->shades setArray:shiftedShades];352 [_shades setArray:shiftedShades]; 398 353 399 354 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; … … 415 370 416 371 - (void) addMarkAt:(unsigned long long) location withIdentifier:(NSString *) identifier withColor:(NSColor *) color { 417 struct _instanceVars *vars = NSMapGet( scrollers, self ); 418 if( ! vars ) return; 419 420 struct _mark mark = { location, identifier, color }; 421 [vars -> marks addObject:[NSValue value:&mark withObjCType:@encode( struct _mark )]]; 372 struct _mark mark = {location, identifier, color}; 373 [_marks addObject:[NSValue value:&mark withObjCType:@encode( struct _mark )]]; 422 374 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 423 375 } … … 436 388 437 389 - (void) removeMarkAt:(unsigned long long) location withIdentifier:(NSString *) identifier withColor:(NSColor *) color { 438 struct _instanceVars *vars = NSMapGet( scrollers, self ); 439 if( ! vars ) return; 440 441 struct _mark mark = { location, identifier, color }; 442 [vars -> marks removeObject:[NSValue value:&mark withObjCType:@encode( struct _mark )]]; 390 struct _mark mark = {location, identifier, color}; 391 [_marks removeObject:[NSValue value:&mark withObjCType:@encode( struct _mark )]]; 443 392 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 444 393 } 445 394 446 395 - (void) removeMarkWithIdentifier:(NSString *) identifier { 447 struct _instanceVars *vars = NSMapGet( scrollers, self ); 448 if( ! vars ) return; 449 450 NSEnumerator *e = [[[vars -> marks copy] autorelease] objectEnumerator]; 396 NSEnumerator *e = [[[_marks copy] autorelease] objectEnumerator]; 451 397 NSValue *obj = nil; 452 453 398 while( obj = [e nextObject] ) { 454 399 struct _mark mark; 455 400 [obj getValue:&mark]; 456 401 if( [mark.identifier isEqualToString:identifier] ) { 457 [ vars ->marks removeObject:obj];402 [_marks removeObject:obj]; 458 403 } 459 404 } … … 463 408 464 409 - (void) removeMarksGreaterThan:(unsigned long long) location { 465 struct _instanceVars *vars = NSMapGet( scrollers, self ); 466 if( ! vars ) return; 467 468 NSEnumerator *enumerator = [[[vars -> marks copy] autorelease] objectEnumerator]; 410 NSEnumerator *enumerator = [[[_marks copy] autorelease] objectEnumerator]; 469 411 NSValue *obj = nil; 470 412 … … 473 415 [obj getValue:&mark]; 474 416 if( mark.location > location ) 475 [ vars ->marks removeObject:obj];417 [_marks removeObject:obj]; 476 418 } 477 419 … … 480 422 481 423 - (void) removeMarksLessThan:(unsigned long long) location { 482 struct _instanceVars *vars = NSMapGet( scrollers, self ); 483 if( ! vars ) return; 484 485 NSEnumerator *enumerator = [[[vars -> marks copy] autorelease] objectEnumerator]; 424 NSEnumerator *enumerator = [[[_marks copy] autorelease] objectEnumerator]; 486 425 NSValue *obj = nil; 487 426 … … 490 429 [obj getValue:&mark]; 491 430 if( mark.location < location ) 492 [ vars ->marks removeObject:obj];431 [_marks removeObject:obj]; 493 432 } 494 433 … … 497 436 498 437 - (void) removeMarksInRange:(NSRange) range { 499 struct _instanceVars *vars = NSMapGet( scrollers, self ); 500 if( ! vars ) return; 501 502 NSEnumerator *enumerator = [[[vars -> marks copy] autorelease] objectEnumerator]; 438 NSEnumerator *enumerator = [[[_marks copy] autorelease] objectEnumerator]; 503 439 NSValue *obj = nil; 504 440 … … 507 443 [obj getValue:&mark]; 508 444 if( NSLocationInRange( (unsigned int)mark.location, range ) ) 509 [ vars ->marks removeObject:obj];445 [_marks removeObject:obj]; 510 446 } 511 447 … … 514 450 515 451 - (void) removeAllMarks { 516 struct _instanceVars *vars = NSMapGet( scrollers, self ); 517 if( ! vars ) return; 518 519 [vars -> marks removeAllObjects]; 452 [_marks removeAllObjects]; 520 453 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 521 454 } … … 524 457 525 458 - (void) setMarks:(NSSet *) marks { 526 struct _instanceVars *vars = NSMapGet( scrollers, self ); 527 if( ! vars ) return; 528 529 [vars -> marks setSet:marks]; 459 [_marks setSet:marks]; 530 460 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 531 461 } 532 462 533 463 - (NSSet *) marks { 534 struct _instanceVars *vars = NSMapGet( scrollers, self ); 535 if( ! vars ) return nil; 536 return [[vars -> marks retain] autorelease]; 464 return [[_marks retain] autorelease]; 537 465 } 538 466 … … 540 468 541 469 - (void) startShadedAreaAt:(unsigned long long) location { 542 struct _instanceVars *vars = NSMapGet( scrollers, self ); 543 if( ! vars ) return; 544 545 if( ! [vars -> shades count] || ! ( [vars -> shades count] % 2 ) ) { 546 [vars -> shades addObject:[NSNumber numberWithUnsignedLongLong:location]]; 470 if( ! [_shades count] || ! ( [_shades count] % 2 ) ) { 471 [_shades addObject:[NSNumber numberWithUnsignedLongLong:location]]; 547 472 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 548 473 } … … 550 475 551 476 - (void) stopShadedAreaAt:(unsigned long long) location { 552 struct _instanceVars *vars = NSMapGet( scrollers, self ); 553 if( ! vars ) return; 554 555 if( [vars -> shades count] && ( [vars -> shades count] % 2 ) == 1 ) { 556 [vars -> shades addObject:[NSNumber numberWithUnsignedLongLong:location]]; 477 if( [_shades count] && ( [_shades count] % 2 ) == 1 ) { 478 [_shades addObject:[NSNumber numberWithUnsignedLongLong:location]]; 557 479 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 558 480 } … … 562 484 563 485 - (void) removeAllShadedAreas { 564 struct _instanceVars *vars = NSMapGet( scrollers, self ); 565 if( ! vars ) return; 566 567 [vars -> shades removeAllObjects]; 486 [_shades removeAllObjects]; 568 487 [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 569 488 } … … 577 496 578 497 - (float) scaleToContentView { 579 if( sFlags.isHoriz ) return NSWidth( [self rectForPart:NSScrollerKnobSlot] ) / ( NSWidth( [self frame] ) / [self knobProportion] );580 else return NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / ( NSHeight( [self frame] ) / [self knobProportion] );581 } 582 583 - ( long) shiftAmountToCenterAlign {498 if( sFlags.isHoriz ) return NSWidth( [self rectForPart:NSScrollerKnobSlot] ) / NSWidth( [[(NSScrollView *)[self superview] contentView] documentRect] ); 499 else return NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / NSHeight( [[(NSScrollView *)[self superview] contentView] documentRect] ); 500 } 501 502 - (float) shiftAmountToCenterAlign { 584 503 float scale = [self scaleToContentView]; 585 504 if( sFlags.isHoriz ) return ( ( NSWidth( [self rectForPart:NSScrollerKnobSlot] ) * [self knobProportion] ) / 2. ) / scale; trunk/Views/JVStyleView.h
r3122 r3152 15 15 BOOL _switchingStyles; 16 16 BOOL _ready; 17 BOOL _webViewReady; 17 BOOL _mainFrameReady; 18 BOOL _contentFrameReady; 18 19 JVChatTranscript *_transcript; 19 20 JVStyle *_style; … … 21 22 NSMutableDictionary *_styleParameters; 22 23 JVEmoticonSet *_emoticons; 24 DOMHTMLDocument *_mainDocument; 23 25 DOMHTMLDocument *_domDocument; 24 26 DOMHTMLElement *_body; trunk/Views/JVStyleView.m
r3122 r3152 35 35 - (void) _prependMessages:(NSString *) messages; 36 36 - (void) _styleError; 37 - (NSString *) _fullDisplayHTMLWithBody:(NSString *) html; 37 - (NSString *) _baseHTML; 38 - (NSString *) _contentHTMLWithBody:(NSString *) html; 38 39 - (unsigned long) _visibleMessageCount; 39 40 - (long) _locationOfMessage:(JVChatMessage *) message; 40 41 - (long) _locationOfElementAtIndex:(unsigned long) index; 41 - (void) _ tickleForLayout;42 - (void) _setupMarkedScroller; 42 43 @end 43 44 … … 50 51 _forwarding = NO; 51 52 _ready = NO; 52 _ webViewReady = NO;53 _contentFrameReady = NO; 53 54 _requiresFullMessage = YES; 54 55 _scrollbackLimit = 600; … … 79 80 [_styleParameters release]; 80 81 [_emoticons release]; 82 [_mainDocument release]; 81 83 [_domDocument release]; 82 84 [_body release]; … … 89 91 _styleParameters = nil; 90 92 _emoticons = nil; 93 _mainDocument = nil; 91 94 _domDocument = nil; 92 95 _body = nil; … … 103 106 [[self nextTextView] tryToPerform:selector with:object]; 104 107 } 105 }106 107 #pragma mark -108 109 - (void) setFrame:(NSRect) frame {110 [super setFrame:frame];111 [self _tickleForLayout];112 }113 114 - (void) setFrameSize:(NSSize) size {115 [super setFrameSize:size];116 [self _tickleForLayout];117 }118 119 - (void) setBounds:(NSRect) bounds {120 [super setBounds:bounds];121 [self _tickleForLayout];122 }123 124 - (void) setBoundsSize:(NSSize) size {125 [super setBoundsSize:size];126 [self _tickleForLayout];127 108 } 128 109 … … 218 199 _styleVariant = [variant copyWithZone:[self zone]]; 219 200 220 if( _ webViewReady ) {201 if( _contentFrameReady ) { 221 202 [WebCoreCache empty]; 222 203 … … 264 245 _emoticons = [emoticons retain]; 265 246 266 if( _ webViewReady ) {247 if( _contentFrameReady ) { 267 248 [WebCoreCache empty]; 268 249 … … 309 290 310 291 - (void) mark { 311 if( _ webViewReady ) {292 if( _contentFrameReady ) { 312 293 unsigned int location = 0; 313 294 … … 332 313 #pragma mark - 333 314 315 - (void) addBanner:(NSString *) name { 316 if( ! _mainFrameReady ) { 317 [self performSelector:_cmd withObject:name afterDelay:0.]; 318 return; 319 } 320 321 NSString *shell = nil; 322 if( floor( NSAppKitVersionNumber ) <= NSAppKitVersionNumber10_3 ) // test for 10.3 323 shell = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:@"html"]]; 324 else shell = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:@"html"] encoding:NSUTF8StringEncoding error:NULL]; 325 326 DOMHTMLElement *element = (DOMHTMLElement *)[_mainDocument createElement:@"div"]; 327 [element setClassName:@"banner"]; 328 [element setInnerHTML:shell]; 329 330 [[_mainDocument body] insertBefore:element :[[_mainDocument body] firstChild]]; 331 332 NSLog(@"%@", [[_mainDocument documentElement] outerHTML] ); 333 } 334 335 #pragma mark - 336 334 337 - (BOOL) appendChatMessage:(JVChatMessage *) message { 335 if( ! _ webViewReady ) return YES; // don't schedule this to fire later since the transcript will be processed338 if( ! _contentFrameReady ) return YES; // don't schedule this to fire later since the transcript will be processed 336 339 337 340 NSString *result = nil; … … 362 365 363 366 - (BOOL) appendChatTranscriptElement:(id <JVChatTranscriptElement>) element { 364 if( ! _ webViewReady ) return YES; // don't schedule this to fire later since the transcript will be processed367 if( ! _contentFrameReady ) return YES; // don't schedule this to fire later since the transcript will be processed 365 368 366 369 NSString *result = nil; … … 417 420 418 421 - (void) markScrollbarForMessage:(JVChatMessage *) message { 419 if( _switchingStyles || ! _ webViewReady ) {422 if( _switchingStyles || ! _contentFrameReady ) { 420 423 [self performSelector:_cmd withObject:message afterDelay:0.]; 421 424 return; … … 427 430 428 431 - (void) markScrollbarForMessage:(JVChatMessage *) message usingMarkIdentifier:(NSString *) identifier andColor:(NSColor *) color { 429 if( _switchingStyles || ! _ webViewReady ) return; // can't queue, too many args. NSInvocation?432 if( _switchingStyles || ! _contentFrameReady ) return; // can't queue, too many args. NSInvocation? 430 433 431 434 long loc = [self _locationOfMessage:message]; … … 434 437 435 438 - (void) markScrollbarForMessages:(NSArray *) messages { 436 if( _switchingStyles || ! _ webViewReady ) {439 if( _switchingStyles || ! _contentFrameReady ) { 437 440 [self performSelector:_cmd withObject:messages afterDelay:0.]; 438 441 return; … … 464 467 465 468 - (void) webView:(WebView *) sender didFinishLoadForFrame:(WebFrame *) frame { 466 [_domDocument autorelease]; 467 _domDocument = (DOMHTMLDocument *)[[[self mainFrame] DOMDocument] retain]; 468 469 [_body autorelease]; 470 _body = (DOMHTMLElement *)[[_domDocument getElementById:@"contents"] retain]; 471 if( ! _body ) _body = (DOMHTMLElement *)[[_domDocument body] retain]; 472 473 [self performSelector:@selector( _checkForTransparantStyle )]; 474 475 [self setPreferencesIdentifier:[[self style] identifier]]; 476 [[self preferences] setJavaScriptEnabled:YES]; 477 478 [self clearScrollbarMarks]; 479 480 if( [[self window] isFlushWindowDisabled] ) [[self window] enableFlushWindow]; 481 [[self window] displayIfNeeded]; 482 483 [self performSelector:@selector( _webkitIsReady ) withObject:nil afterDelay:0.]; 469 if( frame == [self mainFrame] ) { 470 _mainFrameReady = YES; 471 472 [_mainDocument autorelease]; 473 _mainDocument = (DOMHTMLDocument *)[[frame DOMDocument] retain]; 474 475 WebFrame *contentFrame = [[self mainFrame] findFrameNamed:@"content"]; 476 [contentFrame loadHTMLString:[self _contentHTMLWithBody:@""] baseURL:nil]; 477 } else if( _mainFrameReady) { 478 [_domDocument autorelease]; 479 _domDocument = (DOMHTMLDocument *)[[frame DOMDocument] retain]; 480 481 [_body autorelease]; 482 _body = (DOMHTMLElement *)[[_domDocument getElementById:@"contents"] retain]; 483 if( ! _body ) _body = (DOMHTMLElement *)[[_domDocument body] retain]; 484 485 [self performSelector:@selector( _checkForTransparantStyle )]; 486 487 [self setPreferencesIdentifier:[[self style] identifier]]; 488 489 [self clearScrollbarMarks]; 490 491 if( [[self window] isFlushWindowDisabled] ) [[self window] enableFlushWindow]; 492 [[self window] displayIfNeeded]; 493 494 [self performSelector:@selector( _contentFrameIsReady ) withObject:nil afterDelay:0.]; 495 } 484 496 } 485 497 … … 493 505 #pragma mark Highlight/Message Jumping 494 506
