Changeset 5208

Show
Ignore:
Timestamp:
01/31/08 09:57:51 (5 months ago)
Author:
morris
Message:

Add find panel

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Tuna/trunk/English.lproj/MainMenu.nib/classes.nib

    r5206 r5208  
    3131                        <key>ACTIONS</key> 
    3232                        <dict> 
     33                                <key>find</key> 
     34                                <string>id</string> 
     35                                <key>findNext</key> 
     36                                <string>id</string> 
    3337                                <key>manual</key> 
    3438                                <string>id</string> 
     
    4044                        <key>LANGUAGE</key> 
    4145                        <string>ObjC</string> 
     46                        <key>OUTLETS</key> 
     47                        <dict> 
     48                                <key>_findPanel</key> 
     49                                <string>NSPanel</string> 
     50                                <key>_findTextField</key> 
     51                                <string>NSTextField</string> 
     52                        </dict> 
    4253                        <key>SUPERCLASS</key> 
    4354                        <string>WIObject</string> 
  • Tuna/trunk/English.lproj/MainMenu.nib/info.nib

    r5206 r5208  
    1010        <integer>5</integer> 
    1111        <key>IBOpenObjects</key> 
    12         <array> 
    13                 <integer>215</integer> 
    14         </array> 
     12        <array/> 
    1513        <key>IBSystem Version</key> 
    1614        <string>9B18</string> 
  • Tuna/trunk/English.lproj/ReleaseNotes.rtf

    r5206 r5208  
    2929\cf2 1.0.2 
    3030\b0 \cf0 \ 
     31- Add a find panel\ 
    3132- Stability fixes\ 
    3233 
  • Tuna/trunk/TNMainController.h

    r4995 r5208  
    2727 */ 
    2828 
    29 @interface TNMainController : WIObject 
     29@interface TNMainController : WIObject { 
     30        IBOutlet NSPanel                                *_findPanel; 
     31        IBOutlet NSTextField                    *_findTextField; 
     32
    3033 
    3134- (IBAction)newDocument:(id)sender; 
     35 
     36- (IBAction)find:(id)sender; 
     37- (IBAction)findNext:(id)sender; 
    3238 
    3339- (IBAction)manual:(id)sender; 
  • Tuna/trunk/TNMainController.m

    r4995 r5208  
    2929#import "TNMainController.h" 
    3030#import "TNProfilerController.h" 
     31#import "TNSessionController.h" 
    3132 
    3233@implementation TNMainController 
     34 
     35- (BOOL)validateMenuItem:(NSMenuItem *)item { 
     36        SEL             selector; 
     37         
     38        selector = [item action]; 
     39         
     40        if(selector == @selector(find:) || selector == @selector(findNext:)) 
     41                return [[[NSApp mainWindow] delegate] isKindOfClass:[TNSessionController class]]; 
     42         
     43        return YES; 
     44} 
     45 
     46 
     47 
     48#pragma mark - 
    3349 
    3450- (IBAction)newDocument:(id)sender { 
     
    3955} 
    4056 
     57 
     58 
     59 
     60- (IBAction)find:(id)sender { 
     61        TNSessionController             *controller; 
     62         
     63        controller = [[NSApp mainWindow] delegate]; 
     64         
     65        if([controller isKindOfClass:[TNSessionController class]]) 
     66                [_findPanel makeKeyAndOrderFront:self]; 
     67} 
     68 
     69 
     70 
     71- (IBAction)findNext:(id)sender { 
     72        TNSessionController             *controller; 
     73         
     74        controller = [[NSApp mainWindow] delegate]; 
     75         
     76        if([controller isKindOfClass:[TNSessionController class]]) { 
     77                if([controller findString:[_findTextField stringValue]]) 
     78                        [_findPanel close]; 
     79        } 
     80} 
    4181 
    4282 
  • Tuna/trunk/TNNode.h

    r5206 r5208  
    3737         
    3838        BOOL                            _leaf; 
     39        WISortOrder                     _sortOrder; 
    3940         
    4041        NSUInteger                      _calls; 
     
    5657- (NSUInteger)children; 
    5758- (TNNode *)childAtIndex:(NSUInteger)index; 
    58 - (TNNode *)lastChild; 
     59- (TNNode *)firstChild; 
    5960- (id)childWithFunction:(TNFunction *)function; 
    6061- (id)childWithFunctionIdenticalTo:(TNFunction *)function; 
     
    6465- (void)unlink; 
    6566- (void)collapse; 
    66 - (void)sortUsingSelector:(SEL)selector
     67- (void)sortUsingSelector:(SEL)selector order:(WISortOrder)order
    6768 
    6869- (NSArray *)nodesMatchingLibrary:(NSString *)library; 
     70- (TNNode *)nodeMatchingSymbolSubstring:(NSString *)string beforeNode:(TNNode *)beforeNode; 
     71- (TNNode *)nodeMatchingSymbolSubstring:(NSString *)string afterNode:(TNNode *)afterNode; 
    6972- (void)discardNodesWithCumulativePercentLessThan:(double)percent; 
    7073 
  • Tuna/trunk/TNNode.m

    r5206 r5208  
    3535 
    3636- (void)addNodesMatchingLibrary:(NSString *)library toArray:(NSMutableArray *)array; 
     37- (TNNode *)nodeMatchingSymbolSubstring:(NSString *)string beforeNode:(TNNode *)beforeNode haveReached:(BOOL *)reached afterNode:(TNNode *)afterNode havePassed:(BOOL *)passed; 
    3738 
    3839@end 
     
    119120- (NSComparisonResult)comparePercent:(TNNode *)node { 
    120121        if(_percent < node->_percent) 
    121                 return NSOrderedAscending; 
     122                return (_sortOrder == WISortAscending) ? NSOrderedAscending : NSOrderedDescending; 
    122123        else if(_percent > node->_percent) 
    123                 return NSOrderedDescending; 
     124                return (_sortOrder == WISortAscending) ? NSOrderedDescending : NSOrderedAscending; 
    124125         
    125126        return NSOrderedSame; 
     
    130131- (NSComparisonResult)compareCumulativePercent:(TNNode *)node { 
    131132        if(_cumulativePercent < node->_cumulativePercent) 
    132                 return NSOrderedAscending; 
     133                return (_sortOrder == WISortAscending) ? NSOrderedAscending : NSOrderedDescending; 
    133134        else if(_cumulativePercent > node->_cumulativePercent) 
    134                 return NSOrderedDescending; 
     135                return (_sortOrder == WISortAscending) ? NSOrderedDescending : NSOrderedAscending; 
    135136         
    136137        return NSOrderedSame; 
     
    179180 
    180181 
    181 - (TNNode *)lastChild { 
    182         return [_children lastObject]; 
     182- (TNNode *)firstChild { 
     183        return ([_children count] == 0) ? NULL : [_children objectAtIndex:0]; 
    183184} 
    184185 
     
    298299 
    299300 
    300 - (void)sortUsingSelector:(SEL)selector { 
    301         NSUInteger              i, count; 
     301- (void)sortUsingSelector:(SEL)selector order:(WISortOrder)order { 
     302        TNNode                  *node; 
     303        NSUInteger              i, count; 
     304         
     305        count = [_children count]; 
     306         
     307        for(i = 0; i < count; i++) { 
     308                node = [_children objectAtIndex:i]; 
     309                node->_sortOrder = order; 
     310                [node sortUsingSelector:selector order:order]; 
     311        } 
    302312         
    303313        [_children sortUsingSelector:selector]; 
    304          
    305         count = [_children count]; 
    306          
    307         for(i = 0; i < count; i++) 
    308                 [[_children objectAtIndex:i] sortUsingSelector:selector]; 
    309314} 
    310315 
     
    338343                        [node addNodesMatchingLibrary:library toArray:array]; 
    339344        } 
     345} 
     346 
     347 
     348 
     349- (TNNode *)nodeMatchingSymbolSubstring:(NSString *)string beforeNode:(TNNode *)beforeNode { 
     350        BOOL    reached, passed; 
     351 
     352        reached = passed = NO; 
     353         
     354        return [self nodeMatchingSymbolSubstring:string beforeNode:beforeNode haveReached:&reached afterNode:NULL havePassed:&passed]; 
     355} 
     356 
     357 
     358 
     359- (TNNode *)nodeMatchingSymbolSubstring:(NSString *)string afterNode:(TNNode *)afterNode { 
     360        BOOL    reached, passed; 
     361 
     362        reached = passed = NO; 
     363         
     364        return [self nodeMatchingSymbolSubstring:string beforeNode:NULL haveReached:&reached afterNode:afterNode havePassed:&passed]; 
     365} 
     366 
     367 
     368 
     369- (TNNode *)nodeMatchingSymbolSubstring:(NSString *)string beforeNode:(TNNode *)beforeNode haveReached:(BOOL *)reached afterNode:(TNNode *)afterNode havePassed:(BOOL *)passed { 
     370        TNNode                  *node; 
     371        NSUInteger              i, count; 
     372         
     373        if(beforeNode == self) { 
     374                *reached = YES; 
     375                 
     376                return NULL; 
     377        } 
     378         
     379        if(!afterNode || *passed) { 
     380                if([[_function symbol] containsSubstring:string options:NSCaseInsensitiveSearch]) 
     381                        return self; 
     382        } 
     383         
     384        if(afterNode == self) 
     385                *passed = YES; 
     386         
     387        count = [_children count]; 
     388         
     389        for(i = 0; i < count; i++) { 
     390                node = [[_children objectAtIndex:i] nodeMatchingSymbolSubstring:string 
     391                                                                                                                         beforeNode:beforeNode 
     392                                                                                                                        haveReached:reached 
     393                                                                                                                          afterNode:afterNode 
     394                                                                                                                         havePassed:passed]; 
     395                 
     396                if(node) 
     397                        return node; 
     398                 
     399                if(*reached) 
     400                        break; 
     401        } 
     402         
     403        return NULL; 
    340404} 
    341405 
     
    430494- (NSComparisonResult)compareValue:(TNPerlNode *)node { 
    431495        if(_time < node->_time) 
    432                 return NSOrderedAscending; 
     496                return (_sortOrder == WISortAscending) ? NSOrderedAscending : NSOrderedDescending; 
    433497        else if(_time > node->_time) 
    434                 return NSOrderedDescending; 
     498                return (_sortOrder == WISortAscending) ? NSOrderedDescending : NSOrderedAscending; 
    435499         
    436500        return NSOrderedSame; 
     
    441505- (NSComparisonResult)compareCumulativeValue:(TNPerlNode *)node { 
    442506        if(_cumulativeTime < node->_cumulativeTime) 
    443                 return NSOrderedAscending; 
     507                return (_sortOrder == WISortAscending) ? NSOrderedAscending : NSOrderedDescending; 
    444508        else if(_cumulativeTime > node->_cumulativeTime) 
    445                 return NSOrderedDescending; 
     509                return (_sortOrder == WISortAscending) ? NSOrderedDescending : NSOrderedAscending; 
    446510         
    447511        return NSOrderedSame; 
     
    534598- (NSComparisonResult)compareValue:(TNNode *)node { 
    535599        if(_calls < node->_calls) 
    536                 return NSOrderedAscending; 
     600                return (_sortOrder == WISortAscending) ? NSOrderedAscending : NSOrderedDescending; 
    537601        else if(_calls > node->_calls) 
    538                 return NSOrderedDescending; 
     602                return (_sortOrder == WISortAscending) ? NSOrderedDescending : NSOrderedAscending; 
    539603         
    540604        return NSOrderedSame; 
  • Tuna/trunk/TNSessionController.h

    r5206 r5208  
    6060- (id)initWithTree:(id)tree; 
    6161 
     62- (BOOL)findString:(NSString *)string; 
     63 
    6264- (IBAction)statsDisplayMode:(id)sender; 
    6365- (IBAction)colorByLibrary:(id)sender; 
  • Tuna/trunk/TNSessionController.m

    r5206 r5208  
    178178        TNNode          *node; 
    179179        double          before, after, delta; 
    180         int                   row; 
    181          
     180        NSInteger     row; 
     181 
    182182        node = [_tree rootNode]; 
    183183         
    184184        while([node children] > 0) { 
    185185                before  = [node cumulativePercent]; 
    186                 node    = [node lastChild]; 
     186                node    = [node firstChild]; 
    187187                after   = [node cumulativePercent]; 
    188188                delta   = (before - after) / before; 
     
    228228                selector = @selector(compareSymbol:); 
    229229 
    230         [[_tree rootNode] sortUsingSelector:selector]; 
     230        [[_tree rootNode] sortUsingSelector:selector order:[_treeOutlineView sortOrder]]; 
    231231} 
    232232 
     
    281281         
    282282        return [NSSWF:@"%.1f %@", time, unit]; 
     283} 
     284 
     285 
     286 
     287#pragma mark - 
     288 
     289- (BOOL)findString:(NSString *)string { 
     290        TNNode                  *selectedNode, *node, *parentNode; 
     291        NSMutableArray  *nodes; 
     292        NSUInteger              i, count; 
     293        NSInteger               row; 
     294         
     295        selectedNode = [self selectedNode]; 
     296        node = [[_tree rootNode] nodeMatchingSymbolSubstring:string afterNode:selectedNode]; 
     297         
     298        if(!node) 
     299                node = [[_tree rootNode] nodeMatchingSymbolSubstring:string beforeNode:selectedNode]; 
     300         
     301        if(node) { 
     302                nodes = [[NSMutableArray alloc] init]; 
     303                parentNode = node; 
     304                 
     305                while(parentNode) { 
     306                        [nodes addObject:parentNode]; 
     307                        parentNode = [parentNode parent]; 
     308                } 
     309                 
     310                count = [nodes count]; 
     311                 
     312                for(i = count; i > 0; i--) 
     313                        [_treeOutlineView expandItem:[nodes objectAtIndex:i - 1]]; 
     314                 
     315                row = [_treeOutlineView rowForItem:node]; 
     316                 
     317                if(row >= 0) { 
     318                        [_treeOutlineView selectRow:row byExtendingSelection:NO]; 
     319                        [_treeOutlineView scrollRowToVisible:row]; 
     320                } 
     321                 
     322                [nodes release]; 
     323                 
     324                return YES; 
     325        } 
     326         
     327        return NO; 
    283328} 
    284329 
     
    495540                ? [(TNNode *) item children] - (NSUInteger) index - 1 
    496541                : (NSUInteger) index; 
     542        i = index; 
    497543                 
    498544        return [(TNNode *) item childAtIndex:i];