--- /dev/null
+//
+// VariableTable.m
+// The Cheat
+//
+// Created by Chaz McGarvey on 12/28/04.
+// Copyright 2004 Chaz McGarvey. All rights reserved.
+//
+
+#import "VariableTable.h"
+
+
+@interface VariableTable ( PrivateAPI )
+
+- (void)_setVisibleRows:(NSRange)rows;
+
+@end
+
+
+@implementation VariableTable
+
+
+- (void)awakeFromNib
+{
+ NSScrollView *scrollView = (NSScrollView *)[(NSClipView *)[self superview] superview];
+ NSScroller *oldScroller = [[scrollView verticalScroller] retain];
+
+ TrackerScroller *scroller = [[TrackerScroller alloc] initWithFrame:[oldScroller frame]];
+
+ [scroller setControlSize:[oldScroller controlSize]];
+ [scroller setFloatValue:[oldScroller floatValue] knobProportion:[oldScroller knobProportion]];
+ [scroller setControlTint:[oldScroller controlTint]];
+
+ // set the new scroller
+ [scrollView setHasVerticalScroller:NO];
+ [scrollView setVerticalScroller:scroller];
+ [scrollView setHasVerticalScroller:YES];
+
+ [scroller setDelegate:self];
+ [scroller release];
+ [oldScroller release];
+
+ /*if ( [super respondsToSelector:@selector(awakeFromNib)] ) {
+ [super awakeFromNib];
+ }*/
+}
+
+
+- (NSRange)visibleRows
+{
+ return _visibleRows;
+}
+
+- (void)_setVisibleRows:(NSRange)rows
+{
+ _visibleRows = rows;
+}
+
+
+- (void)reloadData
+{
+ if ( _dontUpdate ) {
+ _updatePending = YES;
+ return;
+ }
+
+ [super reloadData];
+
+ NSRange range = [self rowsInRect:[(NSClipView *)[self superview] documentVisibleRect]];
+ id delegate = [self delegate];
+
+ if ( !NSEqualRanges( range, _visibleRows ) ) {
+ [self _setVisibleRows:range];
+ if ( [delegate respondsToSelector:@selector(tableView:didChangeVisibleRows:)] ) {
+ [delegate tableView:self didChangeVisibleRows:range];
+ }
+ }
+}
+
+
+- (void)keyDown:(NSEvent *)theEvent
+{
+ _dontUpdate = YES;
+ [super keyDown:theEvent];
+}
+
+- (void)keyUp:(NSEvent *)theEvent
+{
+ NSRange range = [self rowsInRect:[(NSClipView *)[self superview] documentVisibleRect]];
+ id delegate = [self delegate];
+
+ [super keyUp:theEvent];
+
+ _dontUpdate = NO;
+
+ if ( !NSEqualRanges( range, _visibleRows ) ) {
+ [self _setVisibleRows:range];
+ if ( [delegate respondsToSelector:@selector(tableView:didChangeVisibleRows:)] ) {
+ [delegate tableView:self didChangeVisibleRows:range];
+ }
+ }
+ else if ( _updatePending ) {
+ [self reloadData];
+ _updatePending = NO;
+ }
+}
+
+- (void)scrollerDidStartScrolling:(TrackerScroller *)scroller
+{
+ _dontUpdate = YES;
+}
+
+- (void)scrollerDidStopScrolling:(TrackerScroller *)scroller
+{
+ NSRange range = [self rowsInRect:[(NSClipView *)[self superview] documentVisibleRect]];
+ id delegate = [self delegate];
+
+ _dontUpdate = NO;
+
+ if ( !NSEqualRanges( range, _visibleRows ) ) {
+ [self _setVisibleRows:range];
+ if ( [delegate respondsToSelector:@selector(tableView:didChangeVisibleRows:)] ) {
+ [delegate tableView:self didChangeVisibleRows:range];
+ }
+ }
+ else if ( _updatePending ) {
+ [self reloadData];
+ _updatePending = NO;
+ }
+}
+
+
+@end