Changeset 2180

Show
Ignore:
Timestamp:
12/30/04 22:55:01 (4 years ago)
Author:
timothy
Message:

* Made the scrollbar marks more accurately aligned, if the knob is covering marks that means the highlighted messages are always visible now.
* Added a jump to next/previous highlight so you can quickly skip back and see where you were mentioned. Command-[ and Command-]. Also available in the scrollbar's context menu.
* Added a Clear Scrollback menu item under View as Command-K (this matches Terminal.app's key combo.)
Note to localizers: 3 new menu items need translated in the View menu. And 2 new localized string items.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/JVChatTranscript.m

    r2163 r2180  
    670670        else if( ! [[NSUserDefaults standardUserDefaults] boolForKey:@"MVChatIgnoreColors"] && [[toolbarItem itemIdentifier] isEqualToString:NSToolbarShowColorsItemIdentifier] ) return YES; 
    671671        return YES; 
     672} 
     673 
     674#pragma mark - 
     675#pragma mark Highlight Jumping 
     676 
     677- (IBAction) jumpToPreviousHighlight:(id) sender { 
     678        JVMarkedScroller *scroller = (JVMarkedScroller *)[[[[[display mainFrame] frameView] documentView] enclosingScrollView] verticalScroller]; 
     679        if( [scroller isMemberOfClass:[JVMarkedScroller class]] ) 
     680                [scroller jumpToPreviousMark:sender]; 
     681} 
     682 
     683- (IBAction) jumpToNextHighlight:(id) sender { 
     684        JVMarkedScroller *scroller = (JVMarkedScroller *)[[[[[display mainFrame] frameView] documentView] enclosingScrollView] verticalScroller]; 
     685        if( [scroller isMemberOfClass:[JVMarkedScroller class]] ) 
     686                [scroller jumpToNextMark:sender]; 
    672687} 
    673688 
  • trunk/JVMarkedScroller.h

    r2177 r2180  
    33        NSMutableSet *_marks; 
    44        NSMutableArray *_shades; 
     5        unsigned long long _nearestPreviousMark; 
     6        unsigned long long _nearestNextMark; 
     7        unsigned long long _currentMark; 
     8        BOOL _jumpingToMark; 
    59} 
     10- (IBAction) jumpToPreviousMark:(id) sender; 
     11- (IBAction) jumpToNextMark:(id) sender; 
     12 
    613- (void) shiftMarksAndShadedAreasBy:(long long) displacement; 
    714 
  • trunk/JVMarkedScroller.m

    r2177 r2180  
    66                _marks = [[NSMutableSet set] retain]; 
    77                _shades = [[NSMutableArray array] retain]; 
     8                _nearestPreviousMark = NSNotFound; 
     9                _nearestNextMark = NSNotFound; 
     10                _currentMark = NSNotFound; 
    811        } 
    912        return self; 
     
    2023} 
    2124 
     25#pragma mark - 
     26 
    2227- (void) drawRect:(NSRect) rect { 
    23         NSEraseRect( rect ); 
    2428        [super drawRect:rect]; 
    2529 
     
    2731        float width = [[self class] scrollerWidthForControlSize:[self controlSize]]; 
    2832 
    29         NSRect clip = NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 6. : 0. ), ( sFlags.isHoriz ? 0. : 6. ) ); 
    30         float scale = NSHeight( clip ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
     33        float scale = NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
    3134        [transform scaleXBy:( sFlags.isHoriz ? scale : 1. ) yBy:( sFlags.isHoriz ? 1. : scale )]; 
    3235 
    33         float offset = [self rectForPart:NSScrollerKnobSlot].origin.y + 6.
     36        float offset = [self rectForPart:NSScrollerKnobSlot].origin.y
    3437        [transform translateXBy:( sFlags.isHoriz ? offset / scale : 0. ) yBy:( sFlags.isHoriz ? 0. : offset / scale )]; 
    3538 
    36         clip = NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 0. : 3. ), ( sFlags.isHoriz ? 3. : 0. ) ); 
    37         NSRectClip( clip ); 
     39        NSRectClip( NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 0. : 3. ), ( sFlags.isHoriz ? 3. : 0. ) ) ); 
    3840 
    3941        NSBezierPath *shades = [NSBezierPath bezierPath]; 
     
    7375        [shades fill]; 
    7476 
    75         clip = NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 4. : 3. ), ( sFlags.isHoriz ? 3. : 4. ) ); 
    76         NSRectClip( clip ); 
     77        NSRectClip( NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 4. : 3. ), ( sFlags.isHoriz ? 3. : 4. ) ) ); 
    7778 
    7879        NSBezierPath *lines = [NSBezierPath bezierPath]; 
    7980        enumerator = [_marks objectEnumerator]; 
    8081 
     82        unsigned long long currentPosition = ( _currentMark != NSNotFound ? _currentMark : [self floatValue] * ( NSHeight( [self frame] ) / [self knobProportion] ) ); 
     83        BOOL foundNext = NO, foundPrevious = NO; 
     84        NSRect knobRect = [self rectForPart:NSScrollerKnob]; 
     85 
    8186        while( ( startNum = [enumerator nextObject] ) ) { 
    82                 NSPoint point = NSMakePoint( ( sFlags.isHoriz ? [startNum unsignedLongLongValue] : 0. ), ( sFlags.isHoriz ? 0. : [startNum unsignedLongLongValue] ) ); 
     87                unsigned long long value = [startNum unsignedLongLongValue]; 
     88 
     89                if( value < currentPosition && ( ! foundPrevious || value > _nearestPreviousMark ) ) { 
     90                        _nearestPreviousMark = value; 
     91                        foundPrevious = YES; 
     92                } 
     93 
     94                if( value > currentPosition && ( ! foundNext || value < _nearestNextMark ) ) { 
     95                        _nearestNextMark = value; 
     96                        foundNext = YES; 
     97                } 
     98 
     99                NSPoint point = NSMakePoint( ( sFlags.isHoriz ? value : 0. ), ( sFlags.isHoriz ? 0. : value ) ); 
    83100                point = [transform transformPoint:point]; 
    84101                point.x = ( sFlags.isHoriz ? roundf( point.x ) + 0.5 : point.x ); 
    85102                point.y = ( sFlags.isHoriz ? point.y : roundf( point.y ) + 0.5 ); 
    86103 
    87                 [lines moveToPoint:point]; 
    88  
    89                 point = NSMakePoint( ( sFlags.isHoriz ? 0. : width ), ( sFlags.isHoriz ? width : 0. ) ); 
    90                 [lines relativeLineToPoint:point]; 
    91         } 
     104                if( ! NSPointInRect( point, knobRect ) ) { 
     105                        [lines moveToPoint:point]; 
     106 
     107                        point = NSMakePoint( ( sFlags.isHoriz ? 0. : width ), ( sFlags.isHoriz ? width : 0. ) ); 
     108                        [lines relativeLineToPoint:point]; 
     109                } 
     110        } 
     111 
     112        if( ! foundPrevious ) _nearestPreviousMark = NSNotFound; 
     113        if( ! foundNext ) _nearestNextMark = NSNotFound; 
    92114 
    93115        [[NSColor selectedKnobColor] set]; 
    94116        [lines stroke]; 
    95  
    96         [self drawKnob]; 
    97117} 
    98118 
    99119- (void) setFloatValue:(float) position knobProportion:(float) percent { 
     120        if( ! _jumpingToMark ) _currentMark = NSNotFound; 
    100121        [self setNeedsDisplayInRect:[self rectForPart:NSScrollerKnobSlot]]; 
    101122        [super setFloatValue:position knobProportion:percent]; 
     
    128149        } 
    129150 
     151        [menu addItem:[NSMenuItem separatorItem]]; 
     152 
     153        item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Jump to Previous Mark", "jump to previous mark contextual menu") action:@selector( jumpToPreviousMark: ) keyEquivalent:@"["] autorelease]; 
     154        [item setTarget:self]; 
     155        [menu addItem:item]; 
     156 
     157        item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Jump to Next Mark", "jump to next mark contextual menu") action:@selector( jumpToNextMark: ) keyEquivalent:@"]"] autorelease]; 
     158        [item setTarget:self]; 
     159        [menu addItem:item]; 
     160 
    130161        return menu; 
    131162} 
     163 
     164#pragma mark - 
    132165 
    133166- (IBAction) clearMarksHereLess:(id) sender { 
    134167        NSEvent *event = [[NSApplication sharedApplication] currentEvent]; 
    135168        NSPoint where = [self convertPoint:[event locationInWindow] fromView:nil]; 
    136         NSRect clip = NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 6. : 0. ), ( sFlags.isHoriz ? 0. : 6. ) ); 
    137         float scale = NSHeight( clip ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
     169        float scale = NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
    138170        [self removeMarksLessThan:( ( sFlags.isHoriz ? where.x : where.y ) / scale )]; 
    139171} 
     
    142174        NSEvent *event = [[NSApplication sharedApplication] currentEvent]; 
    143175        NSPoint where = [self convertPoint:[event locationInWindow] fromView:nil]; 
    144         NSRect clip = NSInsetRect( [self rectForPart:NSScrollerKnobSlot], ( sFlags.isHoriz ? 6. : 0. ), ( sFlags.isHoriz ? 0. : 6. ) ); 
    145         float scale = NSHeight( clip ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
     176        float scale = NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
    146177        [self removeMarksGreaterThan:( ( sFlags.isHoriz ? where.x : where.y ) / scale )]; 
     178} 
     179 
     180#pragma mark - 
     181 
     182- (IBAction) jumpToPreviousMark:(id) sender { 
     183        if( _nearestPreviousMark != NSNotFound ) { 
     184                _currentMark = _nearestPreviousMark; 
     185                _jumpingToMark = YES; 
     186                float scale = NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
     187                float shift = ( NSHeight( [self rectForPart:NSScrollerKnob] ) / 2. ) / scale; 
     188                [[(NSScrollView *)[self superview] documentView] scrollPoint:NSMakePoint( 0., _nearestPreviousMark - shift )]; 
     189                _jumpingToMark = NO; 
     190        } 
     191} 
     192 
     193- (IBAction) jumpToNextMark:(id) sender { 
     194        if( _nearestNextMark != NSNotFound ) { 
     195                _currentMark = _nearestNextMark; 
     196                _jumpingToMark = YES; 
     197                float scale = NSHeight( [self rectForPart:NSScrollerKnobSlot] ) / ( NSHeight( [self frame] ) / [self knobProportion] ); 
     198                float shift = ( NSHeight( [self rectForPart:NSScrollerKnob] ) / 2. ) / scale; 
     199                [[(NSScrollView *)[self superview] documentView] scrollPoint:NSMakePoint( 0., _nearestNextMark - shift )]; 
     200                _jumpingToMark = NO; 
     201        } 
    147202} 
    148203 
  • trunk/Languages/Dutch.lproj/Colloquy.nib/classes.nib

    r2163 r2180  
    44            ACTIONS = { 
    55                bold = id;  
     6                clearDisplay = id;  
    67                closeCurrentPanel = id;  
    78                detachCurrentPanel = id;  
     
    910                italic = id;  
    1011                joinRoom = id;  
     12                jumpToNextHighlight = id;  
     13                jumpToPreviousHighlight = id;  
    1114                newConnection = id;  
    1215                selectNextActivePanel = id;  
  • trunk/Languages/Dutch.lproj/Colloquy.nib/info.nib

    r2163 r2180  
    44<dict> 
    55        <key>IBDocumentLocation</key> 
    6         <string>69 78 356 240 0 0 1280 832 </string> 
     6        <string>74 98 356 240 0 0 1344 986 </string> 
    77        <key>IBEditorPositions</key> 
    88        <dict> 
    99                <key>29</key> 
    10                 <string>368 614 468 44 0 0 1280 832 </string> 
     10                <string>215 828 468 44 0 0 1344 986 </string> 
    1111        </dict> 
    1212        <key>IBFramework Version</key> 
    13         <string>362.0</string> 
     13        <string>364.0</string> 
    1414        <key>IBOpenObjects</key> 
    1515        <array> 
  • trunk/Languages/English.lproj/Colloquy.nib/classes.nib

    r1566 r2180  
    44            ACTIONS = { 
    55                bold = id;  
     6                clearDisplay = id;  
    67                closeCurrentPanel = id;  
    78                detachCurrentPanel = id;  
     
    910                italic = id;  
    1011                joinRoom = id;  
     12                jumpToNextHighlight = id;  
     13                jumpToPreviousHighlight = id;  
    1114                newConnection = id;  
    1215                selectNextActivePanel = id;  
  • trunk/Languages/English.lproj/Colloquy.nib/info.nib

    r1566 r2180  
    44<dict> 
    55        <key>IBDocumentLocation</key> 
    6         <string>69 78 356 240 0 0 1280 832 </string> 
     6        <string>150 118 356 240 0 0 1344 986 </string> 
    77        <key>IBEditorPositions</key> 
    88        <dict> 
    99                <key>29</key> 
    10                 <string>368 614 366 44 0 0 1280 832 </string> 
     10                <string>31 715 366 44 0 0 1344 986 </string> 
    1111        </dict> 
    1212        <key>IBFramework Version</key> 
    1313        <string>364.0</string> 
     14        <key>IBOpenObjects</key> 
     15        <array> 
     16                <integer>29</integer> 
     17        </array> 
    1418        <key>IBSystem Version</key> 
    15         <string>7H63</string> 
     19        <string>7S215</string> 
    1620</dict> 
    1721</plist> 
  • trunk/Languages/German.lproj/Colloquy.nib/classes.nib

    r2114 r2180  
    44            ACTIONS = { 
    55                bold = id;  
     6                clearDisplay = id;  
    67                closeCurrentPanel = id;  
    78                detachCurrentPanel = id;  
     
    910                italic = id;  
    1011                joinRoom = id;  
     12                jumpToNextHighlight = id;  
     13                jumpToPreviousHighlight = id;  
    1114                newConnection = id;  
    1215                selectNextActivePanel = id;  
  • trunk/Languages/German.lproj/Colloquy.nib/info.nib

    r2114 r2180  
    44<dict> 
    55        <key>IBDocumentLocation</key> 
    6         <string>69 78 356 240 0 0 1280 832 </string> 
     6        <string>74 98 356 240 0 0 1344 986 </string> 
    77        <key>IBEditorPositions</key> 
    88        <dict> 
    99                <key>29</key> 
    10                 <string>368 614 366 44 0 0 1280 832 </string> 
     10                <string>84 828 482 44 0 0 1344 986 </string> 
    1111        </dict> 
    1212        <key>IBFramework Version</key> 
    1313        <string>364.0</string> 
     14        <key>IBOpenObjects</key> 
     15        <array> 
     16                <integer>29</integer> 
     17        </array> 
    1418        <key>IBSystem Version</key> 
    15         <string>7R28</string> 
     19        <string>7S215</string> 
    1620</dict> 
    1721</plist>