[53] | 1 | //
|
---|
| 2 | // NSString-NJRExtensions.m
|
---|
| 3 | // Pester
|
---|
| 4 | //
|
---|
| 5 | // Created by Nicholas Riley on Mon Dec 16 2002.
|
---|
| 6 | // Copyright (c) 2002 Nicholas Riley. All rights reserved.
|
---|
| 7 | //
|
---|
| 8 |
|
---|
| 9 | #import "NSString-NJRExtensions.h"
|
---|
| 10 |
|
---|
| 11 | @implementation NSString (NJRExtensions)
|
---|
| 12 |
|
---|
| 13 | - (NSAttributedString *)attributedStringWithFont:(NSFont *)font;
|
---|
| 14 | {
|
---|
| 15 | return [[[NSAttributedString alloc] initWithString: self attributes: [NSDictionary dictionaryWithObject: font forKey: NSFontAttributeName]] autorelease];
|
---|
| 16 | }
|
---|
| 17 |
|
---|
| 18 | - (NSAttributedString *)underlined;
|
---|
| 19 | {
|
---|
| 20 | return [[[NSAttributedString alloc] initWithString: self attributes: [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: NSSingleUnderlineStyle] forKey: NSUnderlineStyleAttributeName]] autorelease];
|
---|
| 21 | }
|
---|
| 22 |
|
---|
| 23 | - (NSAttributedString *)small;
|
---|
| 24 | {
|
---|
| 25 | return [self attributedStringWithFont: [NSFont systemFontOfSize: [NSFont smallSystemFontSize]]];
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 | - (NSAttributedString *)smallBold;
|
---|
| 29 | {
|
---|
| 30 | return [self attributedStringWithFont: [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]]];
|
---|
| 31 | }
|
---|
| 32 |
|
---|
| 33 | + (NSString *)ellipsisString;
|
---|
| 34 | {
|
---|
| 35 | static NSString *ellipsis = nil;
|
---|
| 36 | if (ellipsis == nil) {
|
---|
| 37 | const unichar ellipsisChar = 0x2026;
|
---|
| 38 | ellipsis = [[NSString alloc] initWithCharacters: &ellipsisChar length: 1];
|
---|
| 39 | }
|
---|
| 40 | return ellipsis;
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | @end
|
---|
| 44 |
|
---|
| 45 | @implementation NSMutableString (NJRExtensions)
|
---|
| 46 |
|
---|
| 47 | - (void)truncateToLength:(unsigned)maxLength by:(NSLineBreakMode)method;
|
---|
| 48 | {
|
---|
| 49 | if ([self length] > maxLength) {
|
---|
| 50 | NSRange range = {0, [self length] - maxLength};
|
---|
| 51 | switch (method) {
|
---|
| 52 | case NSLineBreakByTruncatingHead:
|
---|
| 53 | range.location = 0;
|
---|
| 54 | break;
|
---|
| 55 | case NSLineBreakByTruncatingMiddle:
|
---|
| 56 | range.location = maxLength / 2;
|
---|
| 57 | break;
|
---|
| 58 | case NSLineBreakByTruncatingTail:
|
---|
| 59 | range.location = maxLength;
|
---|
| 60 | break;
|
---|
| 61 | default:
|
---|
| 62 | range.location = maxLength;
|
---|
| 63 | break;
|
---|
| 64 | }
|
---|
| 65 | [self replaceCharactersInRange: range withString: [NSString ellipsisString]];
|
---|
| 66 | }
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | - (void)truncateToWidth:(float)maxWidth by:(NSLineBreakMode)method withAttributes:(NSDictionary *)attributes;
|
---|
| 70 | {
|
---|
| 71 | if ([self sizeWithAttributes: attributes].width > maxWidth) {
|
---|
| 72 | float width;
|
---|
| 73 | int min = 0, max = [self length], avg;
|
---|
| 74 | NSMutableString *original = [self mutableCopy];
|
---|
| 75 | while (max >= min) {
|
---|
| 76 | avg = (max + min) / 2;
|
---|
| 77 | [self truncateToLength: avg by: method];
|
---|
| 78 | width = [self sizeWithAttributes: attributes].width;
|
---|
| 79 | if (width > maxWidth) {
|
---|
| 80 | max = avg - 1; // too wide
|
---|
| 81 | } else if (width == maxWidth) {
|
---|
| 82 | break;
|
---|
| 83 | } else {
|
---|
| 84 | min = avg + 1; // too narrow
|
---|
| 85 | [self setString: original];
|
---|
| 86 | }
|
---|
| 87 | }
|
---|
| 88 | if (width != maxWidth)
|
---|
| 89 | [self truncateToLength: max by: method];
|
---|
| 90 | [original release];
|
---|
| 91 | }
|
---|
| 92 | }
|
---|
| 93 |
|
---|
| 94 | @end
|
---|