Changeset 3152

Show
Ignore:
Timestamp:
03/11/06 22:32:26 (2 years ago)
Author:
timothy
Message:

Much better way to handle styles. We no longer use a overflow div and now use an iframe, this is a lot faster and avoides a few webkit bugs. This also adds prelimenary banner support, the only banner we have now is the topic banner. The topic banner still has the bug described in #500, i have an idea how to fix that though.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Colloquy.xcodeproj/project.pbxproj

    r3150 r3152  
    3434                1C1ACFB805344FCC00F71D4E /* JVConnectionInspector.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1ACFB605344FCC00F71D4E /* JVConnectionInspector.m */; }; 
    3535                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 */; }; 
    3639                1C238F050677B5E5000E89A7 /* JVTabbedChatWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1C238F040677B5E5000E89A7 /* JVTabbedChatWindow.nib */; }; 
    3740                1C2391AA0677E6B7000E89A7 /* JVChatTabItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C2391A80677E6B7000E89A7 /* JVChatTabItem.m */; }; 
     
    7578                1C7780DE08FA1D82006AD8E5 /* JVSpeechController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7780DC08FA1D81006AD8E5 /* JVSpeechController.m */; }; 
    7679                1C77822908FA4104006AD8E5 /* topicBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C77822808FA4101006AD8E5 /* topicBackground.png */; }; 
    77                 1C77822B08FA415B006AD8E5 /* chatRoomTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C77822A08FA415B006AD8E5 /* chatRoomTemplate.html */; }; 
    7880                1C77830708FA4BD3006AD8E5 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = F5394C070378E44D01A35792 /* Credits.rtf */; }; 
    7981                1C77831208FA4EA2006AD8E5 /* topicToggleDown.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C77831008FA4EA2006AD8E5 /* topicToggleDown.png */; }; 
     
    480482                1C1ACFB605344FCC00F71D4E /* JVConnectionInspector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JVConnectionInspector.m; path = Inspectors/JVConnectionInspector.m; sourceTree = "<group>"; }; 
    481483                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>"; }; 
    482487                1C1D19F105992D80000BB31A /* ChatCore.scriptSuite */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ChatCore.scriptSuite; path = Resources/ChatCore.scriptSuite; sourceTree = "<group>"; }; 
    483488                1C1D19F205992D80000BB31A /* ChatCore.scriptTerminology */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ChatCore.scriptTerminology; path = Resources/ChatCore.scriptTerminology; sourceTree = "<group>"; }; 
     
    557562                1C7780DC08FA1D81006AD8E5 /* JVSpeechController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JVSpeechController.m; path = Controllers/JVSpeechController.m; sourceTree = "<group>"; }; 
    558563                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>"; }; 
    560564                1C77831008FA4EA2006AD8E5 /* topicToggleDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = topicToggleDown.png; path = Resources/topicToggleDown.png; sourceTree = "<group>"; }; 
    561565                1C77831108FA4EA2006AD8E5 /* topicToggleUp.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = topicToggleUp.png; path = Resources/topicToggleUp.png; sourceTree = "<group>"; }; 
     
    15231527                                0A5B683E0810EC9700398D5A /* default.css */, 
    15241528                                0AA811220826DB8800A3BF2D /* default.js */, 
     1529                                1C1AFB3C09C295D900BF3E2A /* base.html */, 
    15251530                                1C3C116005029DE1000001C8 /* template.html */, 
    1526                                 1C77822A08FA415B006AD8E5 /* chatRoomTemplate.html */, 
     1531                                1C1AFDAA09C3BC4F00BF3E2A /* roomTopicBanner.html */, 
     1532                                1C1AFE8109C3D8C900BF3E2A /* roomTopicBanner.js */, 
    15271533                                1C746A95050CF86B000001C8 /* emoticons.plist */, 
    15281534                                F5675B8601DB767601EE70DE /* verbs.plist */, 
     
    20232029                        buildActionMask = 2147483647; 
    20242030                        files = ( 
     2031                                1C1AFE8E09C3D92E00BF3E2A /* roomTopicBanner.js in Resources */, 
    20252032                                1CB2CD11052DDC560094AAA4 /* op.tif in Resources */, 
    20262033                                1CB2CD12052DDC560094AAA4 /* person.tif in Resources */, 
     
    21882195                                1CE6917008B183C8006D9CA0 /* NSTextSuite.scriptSuite in Resources */, 
    21892196                                1C77822908FA4104006AD8E5 /* topicBackground.png in Resources */, 
    2190                                 1C77822B08FA415B006AD8E5 /* chatRoomTemplate.html in Resources */, 
    21912197                                1C77830708FA4BD3006AD8E5 /* Credits.rtf in Resources */, 
    21922198                                1C77831208FA4EA2006AD8E5 /* topicToggleDown.png in Resources */, 
    21932199                                1C77831308FA4EA2006AD8E5 /* topicToggleUp.png in Resources */, 
    21942200                                1C6E43C40955EFD7002D22E7 /* serverWindow.png in Resources */, 
     2201                                1C1AFB3D09C295D900BF3E2A /* base.html in Resources */, 
     2202                                1C1AFDAB09C3BC5000BF3E2A /* roomTopicBanner.html in Resources */, 
    21952203                        ); 
    21962204                        runOnlyForDeploymentPostprocessing = 0; 
  • trunk/Controllers/MVApplicationController.m

    r3072 r3152  
    2323#import "JVDirectChatPanel.h" 
    2424#import "JVChatTranscriptBrowserPanel.h" 
    25 #import "JVMarkedScroller.h" 
    2625 
    2726#import <Foundation/NSDebug.h> 
     
    372371 
    373372- (void) applicationWillFinishLaunching:(NSNotification *) notification { 
    374         [JVMarkedScroller poseAsClass:[NSScroller class]]; 
    375373        [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"plist"]]]; 
    376374        [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector( handleURLEvent:withReplyEvent: ) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 
  • trunk/Panels/JVChatRoomPanel.m

    r3072 r3152  
    7272 
    7373        [display setBodyTemplate:@"chatRoom"]; 
     74        [display addBanner:@"roomTopicBanner"]; 
    7475 
    7576        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"irc://%@/%@", [[self connection] server], _target]]; 
  • trunk/Settings/Common Settings.xcconfig

    r3125 r3152  
    1717GCC_OPTIMIZATION_LEVEL = s 
    1818GCC_MODEL_TUNING = G5 
    19 PREBINDING = YES 
     19PREBINDING = NO 
    2020ZERO_LINK = NO 
    2121DSTROOT = / 
  • 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
    210- (void) setLocationOfCurrentMark:(unsigned long long) location; 
    311- (unsigned long long) locationOfCurrentMark; 
    412 
    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; 
    816 
    917- (void) shiftMarksAndShadedAreasBy:(long long) displacement; 
     
    1321- (void) addMarkAt:(unsigned long long) location withColor:(NSColor *) color; 
    1422- (void) addMarkAt:(unsigned long long) location withIdentifier:(NSString *) identifier withColor:(NSColor *) color; 
     23 
    1524- (void) removeMarkAt:(unsigned long long) location; 
    1625- (void) removeMarkAt:(unsigned long long) location withIdentifier:(NSString *) identifier; 
     
    3342- (unsigned long long) contentViewLength; 
    3443- (float) scaleToContentView; 
    35 - (long) shiftAmountToCenterAlign; 
     44- (float) shiftAmountToCenterAlign; 
    3645@end 
  • trunk/Views/JVMarkedScroller.m

    r3072 r3152  
    11#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 }; 
    122 
    133struct _mark { 
     
    188 
    199@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, etc 
    25                 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  
    3210- (id) initWithFrame:(NSRect) frame { 
    3311        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; 
    4817        } 
    4918        return self; 
     
    5120 
    5221- (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; 
    6827 
    6928        [super dealloc]; 
     
    7534        [super drawRect:rect]; 
    7635 
    77         struct _instanceVars *vars = NSMapGet( scrollers, self ); 
    78         if( ! vars || ( ! [vars -> marks count] && ! [vars -> shades count] ) ) return; 
    79  
    8036        NSAffineTransform *transform = [NSAffineTransform transform]; 
    8137        float width = [[self class] scrollerWidthForControlSize:[self controlSize]]; 
     
    8844 
    8945        NSBezierPath *shades = [NSBezierPath bezierPath]; 
    90         NSEnumerator *enumerator = [vars -> shades objectEnumerator]; 
     46        NSEnumerator *enumerator = [_shades objectEnumerator]; 
    9147        NSNumber *startNum = nil; 
    9248        NSNumber *stopNum = nil; 
     
    10662        } 
    10763 
    108         if( ( [vars -> shades count] % 2 ) == 1 ) { 
     64        if( ( [_shades count] % 2 ) == 1 ) { 
    10965                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]
    11268 
    11369                if( sFlags.isHoriz ) rect = NSMakeRect( start, 0., ( stop - start ), width ); 
     
    12985        NSBezierPath *lines = [NSBezierPath bezierPath]; 
    13086        NSMutableArray *lineArray = [NSMutableArray array]; 
     87        enumerator = [_marks objectEnumerator]; 
    13188        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] ); 
    13591        BOOL foundNext = NO, foundPrevious = NO; 
    13692        NSRect knobRect = [self rectForPart:NSScrollerKnob]; 
     
    14197                unsigned long long value = mark.location; 
    14298 
    143                 if( value < currentPosition && ( ! foundPrevious || value > vars -> nearestPreviousMark ) ) { 
    144                         vars -> nearestPreviousMark = value; 
     99                if( value < currentPosition && ( ! foundPrevious || value > _nearestPreviousMark ) ) { 
     100                        _nearestPreviousMark = value; 
    145101                        foundPrevious = YES; 
    146102                } 
    147103 
    148                 if( value > currentPosition && ( ! foundNext || value < vars -> nearestNextMark ) ) { 
    149                         vars -> nearestNextMark = value; 
     104                if( value > currentPosition && ( ! foundNext || value < _nearestNextMark ) ) { 
     105                        _nearestNextMark = value; 
    150106                        foundNext = YES; 
    151107                } 
     
    174130        } 
    175131 
    176         if( ! foundPrevious ) vars -> nearestPreviousMark = NSNotFound; 
    177         if( ! foundNext ) vars -> nearestNextMark = NSNotFound; 
     132        if( ! foundPrevious ) _nearestPreviousMark = NSNotFound; 
     133        if( ! foundNext ) _nearestNextMark = NSNotFound; 
    178134 
    179135        if( ! [lines isEmpty] ) { 
     
    195151 
    196152- (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] ) ) 
    200155                [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    201156        [super setFloatValue:position knobProportion:percent]; 
    202157} 
    203158 
    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 { 
    208160        NSMenu *menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; 
    209161        NSMenuItem *item = nil; 
     
    242194 
    243195        return menu; 
    244 } */ 
     196} 
    245197 
    246198#pragma mark - 
    247199 
    248200- (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]; 
    253202        NSValue *currentMark = nil; 
    254203 
    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] ); 
    256205        BOOL foundNext = NO, foundPrevious = NO; 
    257206 
     
    261210                unsigned long long value = mark.location; 
    262211 
    263                 if( value < currentPosition && ( ! foundPrevious || value > vars -> nearestPreviousMark ) ) { 
    264                         vars -> nearestPreviousMark = value; 
     212                if( value < currentPosition && ( ! foundPrevious || value > _nearestPreviousMark ) ) { 
     213                        _nearestPreviousMark = value; 
    265214                        foundPrevious = YES; 
    266215                } 
    267216 
    268                 if( value > currentPosition && ( ! foundNext || value < vars -> nearestNextMark ) ) { 
    269                         vars -> nearestNextMark = value; 
     217                if( value > currentPosition && ( ! foundNext || value < _nearestNextMark ) ) { 
     218                        _nearestNextMark = value; 
    270219                        foundNext = YES; 
    271220                } 
    272221        } 
    273222 
    274         if( ! foundPrevious ) vars -> nearestPreviousMark = NSNotFound; 
    275         if( ! foundNext ) vars -> nearestNextMark = NSNotFound; 
     223        if( ! foundPrevious ) _nearestPreviousMark = NSNotFound; 
     224        if( ! foundNext ) _nearestNextMark = NSNotFound; 
    276225} 
    277226 
     
    297246 
    298247- (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; 
    303250                [self updateNextAndPreviousMarks]; 
    304251        } 
     
    306253 
    307254- (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]; 
    333284        NSValue *obj = nil; 
    334  
    335         while( obj = [enumerator nextObject] ) { 
     285        BOOL foundMark = NO; 
     286 
     287        while( obj = [e nextObject] ) { 
    336288                struct _mark mark; 
    337289                [obj getValue:&mark]; 
    338290                if( [mark.identifier isEqualToString:identifier] ) { 
    339                         currentMark = mark.location; 
     291                        _currentMark = mark.location; 
     292                        foundMark = YES; 
    340293                        break; 
    341294                } 
    342295        } 
    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; 
    345303} 
    346304 
     
    352310        NSValue *location = nil; 
    353311 
    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]; 
    367322        while( ( location = [enumerator nextObject] ) ) { 
    368323                struct _mark mark; 
     
    374329        } 
    375330 
    376         [vars -> marks setSet:shiftedMarks]; 
     331        [_marks setSet:shiftedMarks]; 
    377332 
    378333        NSMutableArray *shiftedShades = [NSMutableArray array]; 
     
    380335        NSNumber *stop = nil; 
    381336 
    382         enumerator = [vars -> shades objectEnumerator]; 
     337        enumerator = [_shades objectEnumerator]; 
    383338        while( ( start = [enumerator nextObject] ) && ( ( stop = [enumerator nextObject] ) || YES ) ) { 
    384339                unsigned long long shiftedStart = [start unsignedLongLongValue]; 
     
    395350        } 
    396351 
    397         [vars -> shades setArray:shiftedShades]; 
     352        [_shades setArray:shiftedShades]; 
    398353 
    399354        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
     
    415370 
    416371- (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 )]]; 
    422374        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    423375} 
     
    436388 
    437389- (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 )]]; 
    443392        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    444393} 
    445394 
    446395- (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]; 
    451397        NSValue *obj = nil; 
    452  
    453398        while( obj = [e nextObject] ) { 
    454399                struct _mark mark; 
    455400                [obj getValue:&mark]; 
    456401                if( [mark.identifier isEqualToString:identifier] ) { 
    457                         [vars -> marks removeObject:obj]; 
     402                        [_marks removeObject:obj]; 
    458403                } 
    459404        } 
     
    463408 
    464409- (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]; 
    469411        NSValue *obj = nil; 
    470412 
     
    473415                [obj getValue:&mark]; 
    474416                if( mark.location > location ) 
    475                         [vars -> marks removeObject:obj]; 
     417                        [_marks removeObject:obj]; 
    476418        } 
    477419 
     
    480422 
    481423- (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]; 
    486425        NSValue *obj = nil; 
    487426 
     
    490429                [obj getValue:&mark]; 
    491430                if( mark.location < location ) 
    492                         [vars -> marks removeObject:obj]; 
     431                        [_marks removeObject:obj]; 
    493432        } 
    494433 
     
    497436 
    498437- (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]; 
    503439        NSValue *obj = nil; 
    504440 
     
    507443                [obj getValue:&mark]; 
    508444                if( NSLocationInRange( (unsigned int)mark.location, range ) ) 
    509                         [vars -> marks removeObject:obj]; 
     445                        [_marks removeObject:obj]; 
    510446        } 
    511447 
     
    514450 
    515451- (void) removeAllMarks { 
    516         struct _instanceVars *vars = NSMapGet( scrollers, self ); 
    517         if( ! vars ) return; 
    518  
    519         [vars -> marks removeAllObjects]; 
     452        [_marks removeAllObjects]; 
    520453        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    521454} 
     
    524457 
    525458- (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]; 
    530460        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    531461} 
    532462 
    533463- (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]; 
    537465} 
    538466 
     
    540468 
    541469- (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]]; 
    547472                [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    548473        } 
     
    550475 
    551476- (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]]; 
    557479                [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    558480        } 
     
    562484 
    563485- (void) removeAllShadedAreas { 
    564         struct _instanceVars *vars = NSMapGet( scrollers, self ); 
    565         if( ! vars ) return; 
    566  
    567         [vars -> shades removeAllObjects]; 
     486        [_shades removeAllObjects]; 
    568487        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    569488} 
     
    577496 
    578497- (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 { 
    584503        float scale = [self scaleToContentView]; 
    585504        if( sFlags.isHoriz ) return ( ( NSWidth( [self rectForPart:NSScrollerKnobSlot] ) * [self knobProportion] ) / 2. ) / scale; 
  • trunk/Views/JVStyleView.h

    r3122 r3152  
    1515        BOOL _switchingStyles; 
    1616        BOOL _ready; 
    17         BOOL _webViewReady; 
     17        BOOL _mainFrameReady; 
     18        BOOL _contentFrameReady; 
    1819        JVChatTranscript *_transcript; 
    1920        JVStyle *_style; 
     
    2122        NSMutableDictionary *_styleParameters; 
    2223        JVEmoticonSet *_emoticons; 
     24        DOMHTMLDocument *_mainDocument; 
    2325        DOMHTMLDocument *_domDocument; 
    2426        DOMHTMLElement *_body; 
  • trunk/Views/JVStyleView.m

    r3122 r3152  
    3535- (void) _prependMessages:(NSString *) messages; 
    3636- (void) _styleError; 
    37 - (NSString *) _fullDisplayHTMLWithBody:(NSString *) html; 
     37- (NSString *) _baseHTML; 
     38- (NSString *) _contentHTMLWithBody:(NSString *) html; 
    3839- (unsigned long) _visibleMessageCount; 
    3940- (long) _locationOfMessage:(JVChatMessage *) message; 
    4041- (long) _locationOfElementAtIndex:(unsigned long) index; 
    41 - (void) _tickleForLayout
     42- (void) _setupMarkedScroller
    4243@end 
    4344 
     
    5051                _forwarding = NO; 
    5152                _ready = NO; 
    52                 _webViewReady = NO; 
     53                _contentFrameReady = NO; 
    5354                _requiresFullMessage = YES; 
    5455                _scrollbackLimit = 600; 
     
    7980        [_styleParameters release]; 
    8081        [_emoticons release]; 
     82        [_mainDocument release]; 
    8183        [_domDocument release]; 
    8284        [_body release]; 
     
    8991        _styleParameters = nil; 
    9092        _emoticons = nil; 
     93        _mainDocument = nil; 
    9194        _domDocument = nil; 
    9295        _body = nil; 
     
    103106                [[self nextTextView] tryToPerform:selector with:object]; 
    104107        } 
    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]; 
    127108} 
    128109 
     
    218199        _styleVariant = [variant copyWithZone:[self zone]]; 
    219200 
    220         if( _webViewReady ) { 
     201        if( _contentFrameReady ) { 
    221202                [WebCoreCache empty]; 
    222203 
     
    264245        _emoticons = [emoticons retain]; 
    265246 
    266         if( _webViewReady ) { 
     247        if( _contentFrameReady ) { 
    267248                [WebCoreCache empty]; 
    268249 
     
    309290 
    310291- (void) mark { 
    311         if( _webViewReady ) { 
     292        if( _contentFrameReady ) { 
    312293                unsigned int location = 0; 
    313294 
     
    332313#pragma mark - 
    333314 
     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 
    334337- (BOOL) appendChatMessage:(JVChatMessage *) message { 
    335         if( ! _webViewReady ) return YES; // don't schedule this to fire later since the transcript will be processed 
     338        if( ! _contentFrameReady ) return YES; // don't schedule this to fire later since the transcript will be processed 
    336339 
    337340        NSString *result = nil; 
     
    362365 
    363366- (BOOL) appendChatTranscriptElement:(id <JVChatTranscriptElement>) element { 
    364         if( ! _webViewReady ) return YES; // don't schedule this to fire later since the transcript will be processed 
     367        if( ! _contentFrameReady ) return YES; // don't schedule this to fire later since the transcript will be processed 
    365368 
    366369        NSString *result = nil; 
     
    417420 
    418421- (void) markScrollbarForMessage:(JVChatMessage *) message { 
    419         if( _switchingStyles || ! _webViewReady ) { 
     422        if( _switchingStyles || ! _contentFrameReady ) { 
    420423                [self performSelector:_cmd withObject:message afterDelay:0.]; 
    421424                return; 
     
    427430 
    428431- (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? 
    430433 
    431434        long loc = [self _locationOfMessage:message]; 
     
    434437 
    435438- (void) markScrollbarForMessages:(NSArray *) messages { 
    436         if( _switchingStyles || ! _webViewReady ) { 
     439        if( _switchingStyles || ! _contentFrameReady ) { 
    437440                [self performSelector:_cmd withObject:messages afterDelay:0.]; 
    438441                return; 
     
    464467 
    465468- (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        } 
    484496} 
    485497 
     
    493505#pragma mark Highlight/Message Jumping 
    494506