// // MPExpressionStorage.m // MathPad // // Created by Kim Wittenburg on 22.04.14. // Copyright (c) 2014 Kim Wittenburg. All rights reserved. // #import "MPExpressionStorage.h" #import "MPExpressionLayout.h" #import "MPFunctionLayout.h" #import "MPRangePath.h" @interface MPExpressionStorage () @property (nonatomic, strong) NSLayoutManager *layoutManager; @property (nonatomic, strong) NSTextContainer *textContainer; @property (nonatomic, strong) NSTextStorage *textStorage; @end @implementation MPExpressionStorage - (instancetype)initWithElements:(NSArray *)elements { self = [super initWithElements:elements]; if (self) { _rootLayout = [[MPExpressionLayout alloc] initRootLayoutWithExpressionStorage:self]; } return self; } - (NSLayoutManager *)layoutManager { [self ensureTextSystemObjects]; return _layoutManager; } - (NSTextContainer *)textContainer { [self ensureTextSystemObjects]; return _textContainer; } - (NSTextStorage *)textStorage { [self ensureTextSystemObjects]; return _textStorage; } - (void)ensureTextSystemObjects { if (_layoutManager == nil || _textContainer == nil || _textStorage == nil) { _textStorage = [[NSTextStorage alloc] init]; NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)]; NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; [layoutManager addTextContainer:textContainer]; [_textStorage addLayoutManager:layoutManager]; _textContainer = textContainer; _layoutManager = layoutManager; } } - (void)didChangeElementsInRangePath:(MPRangePath *)rangePath replacementLength:(NSUInteger)replacementLength { if (rangePath.location.length == 0) { return; } MPLayout *current = self.rootLayout; for (NSUInteger index = 1; index < rangePath.location.length-1; index++) { current = [current childLayoutAtIndex:index]; } [current clearCacheInRange:rangePath.rangeAtLastIndex replacementLength:replacementLength]; } @end