Changeset 118


Ignore:
Timestamp:
Feb 10, 2006, 5:59:19 AM (16 years ago)
Author:
titer
Message:

Cleaner stringFittingInWidth

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/StringAdditions.m

    r113 r118  
    6464                    withAttributes: (NSDictionary *) attributes
    6565{
    66     float w;
    6766    int i;
    68     NSString * newString;
     67    float realWidth = [self sizeWithAttributes: attributes].width;
     68   
     69    /* The whole string fits */
     70    if( realWidth <= width )
     71        return self;
     72       
     73    /* Width is too small */
     74    if ( [NS_ELLIPSIS sizeWithAttributes: attributes].width > width )
     75        return @"";
    6976
    70     w = [self sizeWithAttributes: attributes].width;
    71     if( w <= width )
    72         /* The whole string fits */
    73         return self;
     77    /* Don't worry about ellipsis until the end */
     78    width -= [NS_ELLIPSIS sizeWithAttributes: attributes].width;
    7479
    7580    /* Approximate how many characters we'll need to drop... */
    76     i = [self length] * width / w - 1;
     81    i = [self length] * (width / realWidth);
    7782
    7883    /* ... then refine it */
    79     newString = [[self substringToIndex: i]
    80         stringByAppendingString: NS_ELLIPSIS];
    81     w = [newString sizeWithAttributes: attributes].width;
     84    NSString * newString = [self substringToIndex: i];
     85    realWidth = [newString sizeWithAttributes: attributes].width;
    8286
    83     if( w < width )
     87    if( realWidth < width )
    8488    {
    85         NSString * bakString;
    86         for( ;; )
     89        NSString * smallerString;
     90        do
    8791        {
    88             bakString = newString;
    89             newString = [[self substringToIndex: ++i]
    90                 stringByAppendingString: NS_ELLIPSIS];
    91             if( [newString sizeWithAttributes: attributes].width > width )
    92                 return bakString;
    93         }
     92            smallerString = newString;
     93            newString = [self substringToIndex: ++i];
     94        } while ([newString sizeWithAttributes: attributes].width <= width);
     95       
     96        newString = smallerString;
     97    }
     98    else if( realWidth > width )
     99    {
     100        do
     101        {
     102            newString = [self substringToIndex: --i];
     103        } while ([newString sizeWithAttributes: attributes].width > width);
     104    }
     105    else;
    94106
    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     }
     107    return [newString stringByAppendingString: NS_ELLIPSIS];
    110108}
    111109
Note: See TracChangeset for help on using the changeset viewer.