Changeset 113


Ignore:
Timestamp:
Feb 9, 2006, 1:44:14 PM (16 years ago)
Author:
titer
Message:

Optimized stringFittingInWidth

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/StringAdditions.m

    r111 r113  
    6464                    withAttributes: (NSDictionary *) attributes
    6565{
    66     NSString * newString = self;
    67    
    68     unsigned i;
    69     for (i = [self length]; [newString sizeWithAttributes: attributes].width > width; i--)
    70         newString = [[self substringToIndex: i] stringByAppendingString: NS_ELLIPSIS];
    71    
    72     return newString;
     66    float w;
     67    int i;
     68    NSString * newString;
     69
     70    w = [self sizeWithAttributes: attributes].width;
     71    if( w <= width )
     72        /* The whole string fits */
     73        return self;
     74
     75    /* Approximate how many characters we'll need to drop... */
     76    i = [self length] * width / w - 1;
     77
     78    /* ... then refine it */
     79    newString = [[self substringToIndex: i]
     80        stringByAppendingString: NS_ELLIPSIS];
     81    w = [newString sizeWithAttributes: attributes].width;
     82
     83    if( w < width )
     84    {
     85        NSString * bakString;
     86        for( ;; )
     87        {
     88            bakString = newString;
     89            newString = [[self substringToIndex: ++i]
     90                stringByAppendingString: NS_ELLIPSIS];
     91            if( [newString sizeWithAttributes: attributes].width > width )
     92                return bakString;
     93        }
     94
     95    }
     96    else if( w > width )
     97    {
     98        for( ;; )
     99        {
     100            newString = [[self substringToIndex: --i]
     101                stringByAppendingString: NS_ELLIPSIS];
     102            if( [newString sizeWithAttributes: attributes].width <= width )
     103                return newString;
     104        }
     105    }
     106    else
     107    {
     108        return newString;
     109    }
    73110}
    74111
Note: See TracChangeset for help on using the changeset viewer.