You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
4.6 KiB

  1. //
  2. // FLEXSystemLogTableViewCell.m
  3. // FLEX
  4. //
  5. // Created by Ryan Olson on 1/25/15.
  6. // Copyright (c) 2015 f. All rights reserved.
  7. //
  8. #import "FLEXSystemLogTableViewCell.h"
  9. #import "FLEXSystemLogMessage.h"
  10. NSString *const kFLEXSystemLogTableViewCellIdentifier = @"FLEXSystemLogTableViewCellIdentifier";
  11. @interface FLEXSystemLogTableViewCell ()
  12. @property (nonatomic) UILabel *logMessageLabel;
  13. @property (nonatomic) NSAttributedString *logMessageAttributedText;
  14. @end
  15. @implementation FLEXSystemLogTableViewCell
  16. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  17. {
  18. self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  19. if (self) {
  20. self.logMessageLabel = [UILabel new];
  21. self.logMessageLabel.numberOfLines = 0;
  22. self.separatorInset = UIEdgeInsetsZero;
  23. self.selectionStyle = UITableViewCellSelectionStyleNone;
  24. [self.contentView addSubview:self.logMessageLabel];
  25. }
  26. return self;
  27. }
  28. - (void)setLogMessage:(FLEXSystemLogMessage *)logMessage
  29. {
  30. if (![_logMessage isEqual:logMessage]) {
  31. _logMessage = logMessage;
  32. self.logMessageAttributedText = nil;
  33. [self setNeedsLayout];
  34. }
  35. }
  36. - (void)setHighlightedText:(NSString *)highlightedText
  37. {
  38. if (![_highlightedText isEqual:highlightedText]) {
  39. _highlightedText = highlightedText;
  40. self.logMessageAttributedText = nil;
  41. [self setNeedsLayout];
  42. }
  43. }
  44. - (NSAttributedString *)logMessageAttributedText
  45. {
  46. if (!_logMessageAttributedText) {
  47. _logMessageAttributedText = [[self class] attributedTextForLogMessage:self.logMessage highlightedText:self.highlightedText];
  48. }
  49. return _logMessageAttributedText;
  50. }
  51. static const UIEdgeInsets kFLEXLogMessageCellInsets = {10.0, 10.0, 10.0, 10.0};
  52. - (void)layoutSubviews
  53. {
  54. [super layoutSubviews];
  55. self.logMessageLabel.attributedText = self.logMessageAttributedText;
  56. self.logMessageLabel.frame = UIEdgeInsetsInsetRect(self.contentView.bounds, kFLEXLogMessageCellInsets);
  57. }
  58. #pragma mark - Stateless helpers
  59. + (NSAttributedString *)attributedTextForLogMessage:(FLEXSystemLogMessage *)logMessage highlightedText:(NSString *)highlightedText
  60. {
  61. NSString *text = [self displayedTextForLogMessage:logMessage];
  62. NSDictionary<NSString *, id> *attributes = @{ NSFontAttributeName : [UIFont fontWithName:@"CourierNewPSMT" size:12.0] };
  63. NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];
  64. if (highlightedText.length > 0) {
  65. NSMutableAttributedString *mutableAttributedText = [attributedText mutableCopy];
  66. NSMutableDictionary<NSString *, id> *highlightAttributes = [@{ NSBackgroundColorAttributeName : UIColor.yellowColor } mutableCopy];
  67. [highlightAttributes addEntriesFromDictionary:attributes];
  68. NSRange remainingSearchRange = NSMakeRange(0, text.length);
  69. while (remainingSearchRange.location < text.length) {
  70. remainingSearchRange.length = text.length - remainingSearchRange.location;
  71. NSRange foundRange = [text rangeOfString:highlightedText options:NSCaseInsensitiveSearch range:remainingSearchRange];
  72. if (foundRange.location != NSNotFound) {
  73. remainingSearchRange.location = foundRange.location + foundRange.length;
  74. [mutableAttributedText setAttributes:highlightAttributes range:foundRange];
  75. } else {
  76. break;
  77. }
  78. }
  79. attributedText = mutableAttributedText;
  80. }
  81. return attributedText;
  82. }
  83. + (NSString *)displayedTextForLogMessage:(FLEXSystemLogMessage *)logMessage
  84. {
  85. return [NSString stringWithFormat:@"%@: %@", [self logTimeStringFromDate:logMessage.date], logMessage.messageText];
  86. }
  87. + (CGFloat)preferredHeightForLogMessage:(FLEXSystemLogMessage *)logMessage inWidth:(CGFloat)width
  88. {
  89. UIEdgeInsets insets = kFLEXLogMessageCellInsets;
  90. CGFloat availableWidth = width - insets.left - insets.right;
  91. NSAttributedString *attributedLogText = [self attributedTextForLogMessage:logMessage highlightedText:nil];
  92. CGSize labelSize = [attributedLogText boundingRectWithSize:CGSizeMake(availableWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil].size;
  93. return labelSize.height + insets.top + insets.bottom;
  94. }
  95. + (NSString *)logTimeStringFromDate:(NSDate *)date
  96. {
  97. static NSDateFormatter *formatter = nil;
  98. static dispatch_once_t onceToken;
  99. dispatch_once(&onceToken, ^{
  100. formatter = [NSDateFormatter new];
  101. formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS";
  102. });
  103. return [formatter stringFromDate:date];
  104. }
  105. @end