mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-07 17:38:02 +00:00
Merge pull request #2962 from mrcarlberg/cptextview_more_ib_options
Fixed: CPTextView now handles more options from Interface Builder
This commit is contained in:
4 files changed
+82
-36
No files matched your search
@@ -84,6 +84,8 @@ CPLineMovesUp = 4;
|
||||
CPLayoutManager _layoutManager @accessors(property=layoutManager);
|
||||
CPTextView _textView @accessors(property=textView);
|
||||
BOOL _inResizing;
|
||||
BOOL _widthTracksTextView;
|
||||
BOOL _heightTracksTextView;
|
||||
}
|
||||
|
||||
|
||||
@@ -139,11 +141,17 @@ CPLineMovesUp = 4;
|
||||
}
|
||||
|
||||
// Controls whether the receiver adjusts the width of its bounding rectangle when its text view is resized.
|
||||
- (BOOL)widthTracksTextView
|
||||
{
|
||||
return _widthTracksTextView;
|
||||
}
|
||||
|
||||
- (void)setWidthTracksTextView:(BOOL)flag
|
||||
{
|
||||
_widthTracksTextView = flag;
|
||||
[_textView setPostsFrameChangedNotifications:flag];
|
||||
|
||||
if (flag)
|
||||
if (flag && _textView)
|
||||
{
|
||||
[[CPNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(textViewFrameChanged:)
|
||||
@@ -168,12 +176,18 @@ CPLineMovesUp = 4;
|
||||
- (void)setTextView:(CPTextView)aTextView
|
||||
{
|
||||
if (_textView)
|
||||
{
|
||||
[self setWidthTracksTextView:NO]; // We only support width
|
||||
[_textView setTextContainer:nil];
|
||||
}
|
||||
|
||||
_textView = aTextView;
|
||||
|
||||
if (_textView)
|
||||
{
|
||||
[self setWidthTracksTextView:_widthTracksTextView]; // We only support width
|
||||
[_textView setTextContainer:self];
|
||||
}
|
||||
|
||||
[_layoutManager textContainerChangedTextView:self];
|
||||
}
|
||||
@@ -222,7 +236,9 @@ CPLineMovesUp = 4;
|
||||
|
||||
|
||||
var CPTextContainerSizeKey = @"CPTextContainerSizeKey",
|
||||
CPTextContainerLayoutManagerKey = @"CPTextContainerLayoutManagerKey";
|
||||
CPTextContainerLayoutManagerKey = @"CPTextContainerLayoutManagerKey",
|
||||
CPTextContainerWidthTracksTextViewKey = @"CPTextContainerWidthTracksTextViewKey",
|
||||
CPTextContainerHeightTracksTextViewKey = @"CPTextContainerHeightTracksTextViewKey";
|
||||
|
||||
@implementation CPTextContainer (CPCoding)
|
||||
|
||||
@@ -238,6 +254,9 @@ var CPTextContainerSizeKey = @"CPTextContainerSizeKey",
|
||||
|
||||
_layoutManager = [aCoder decodeObjectForKey:CPTextContainerLayoutManagerKey];
|
||||
[_layoutManager addTextContainer:self];
|
||||
|
||||
_widthTracksTextView = [aCoder decodeBoolForKey:CPTextContainerWidthTracksTextViewKey];
|
||||
_heightTracksTextView = [aCoder decodeBoolForKey:CPTextContainerHeightTracksTextViewKey];
|
||||
}
|
||||
|
||||
return self;
|
||||
@@ -247,6 +266,8 @@ var CPTextContainerSizeKey = @"CPTextContainerSizeKey",
|
||||
{
|
||||
[aCoder encodeSize:_size forKey:CPTextContainerSizeKey];
|
||||
[aCoder encodeObject:_layoutManager forKey:CPTextContainerLayoutManagerKey];
|
||||
[aCoder encodeBool:_widthTracksTextView forKey:CPTextContainerWidthTracksTextViewKey];
|
||||
[aCoder encodeBool:_heightTracksTextView forKey:CPTextContainerHeightTracksTextViewKey];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1978,43 +1978,45 @@ Sets the selection to a range of characters in response to user action.
|
||||
|
||||
- (void)setFrameSize:(CGSize)aSize
|
||||
{
|
||||
var minSize = [self minSize],
|
||||
maxSize = [self maxSize],
|
||||
desiredSize = CGSizeCreateCopy(aSize),
|
||||
rect = CGRectUnion([_layoutManager boundingRectForGlyphRange:CPMakeRange(0, 1) inTextContainer:_textContainer],
|
||||
[_layoutManager boundingRectForGlyphRange:CPMakeRange(MAX(0, [_layoutManager numberOfCharacters] - 2), 1) inTextContainer:_textContainer]),
|
||||
myClipviewSize = nil;
|
||||
var desiredSize = CGSizeCreateCopy(aSize);
|
||||
|
||||
if (_isHorizontallyResizable || _isVerticallyResizable)
|
||||
{
|
||||
var minSize = [self minSize],
|
||||
maxSize = [self maxSize],
|
||||
rect = CGRectUnion([_layoutManager boundingRectForGlyphRange:CPMakeRange(0, 1) inTextContainer:_textContainer],
|
||||
[_layoutManager boundingRectForGlyphRange:CPMakeRange(MAX(0, [_layoutManager numberOfCharacters] - 2), 1) inTextContainer:_textContainer]);
|
||||
|
||||
if ([_layoutManager extraLineFragmentTextContainer] === _textContainer)
|
||||
rect = CGRectUnion(rect, [_layoutManager extraLineFragmentRect]);
|
||||
|
||||
if (_isHorizontallyResizable)
|
||||
{
|
||||
rect = [_layoutManager boundingRectForGlyphRange:CPMakeRange(0, MAX(0, [_layoutManager numberOfCharacters] - 1)) inTextContainer:_textContainer]; // needs expensive "deep" recalculation
|
||||
|
||||
desiredSize.width = rect.size.width + 2 * _textContainerInset.width;
|
||||
|
||||
if (desiredSize.width < minSize.width)
|
||||
desiredSize.width = minSize.width;
|
||||
else if (desiredSize.width > maxSize.width)
|
||||
desiredSize.width = maxSize.width;
|
||||
}
|
||||
|
||||
if (_isVerticallyResizable)
|
||||
{
|
||||
desiredSize.height = rect.size.height + 2 * _textContainerInset.height;
|
||||
|
||||
if (desiredSize.height < minSize.height)
|
||||
desiredSize.height = minSize.height;
|
||||
else if (desiredSize.height > maxSize.height)
|
||||
desiredSize.height = maxSize.height;
|
||||
}
|
||||
}
|
||||
|
||||
if ([[self superview] isKindOfClass:[CPClipView class]])
|
||||
myClipviewSize = [[self superview] frame].size;
|
||||
|
||||
if ([_layoutManager extraLineFragmentTextContainer] === _textContainer)
|
||||
rect = CGRectUnion(rect, [_layoutManager extraLineFragmentRect]);
|
||||
|
||||
if (_isHorizontallyResizable)
|
||||
{
|
||||
rect = [_layoutManager boundingRectForGlyphRange:CPMakeRange(0, MAX(0, [_layoutManager numberOfCharacters] - 1)) inTextContainer:_textContainer]; // needs expensive "deep" recalculation
|
||||
var myClipviewSize = [[self superview] frame].size;
|
||||
|
||||
desiredSize.width = rect.size.width + 2 * _textContainerInset.width;
|
||||
|
||||
if (desiredSize.width < minSize.width)
|
||||
desiredSize.width = minSize.width;
|
||||
else if (desiredSize.width > maxSize.width)
|
||||
desiredSize.width = maxSize.width;
|
||||
}
|
||||
|
||||
if (_isVerticallyResizable)
|
||||
{
|
||||
desiredSize.height = rect.size.height + 2 * _textContainerInset.height;
|
||||
|
||||
if (desiredSize.height < minSize.height)
|
||||
desiredSize.height = minSize.height;
|
||||
else if (desiredSize.height > maxSize.height)
|
||||
desiredSize.height = maxSize.height;
|
||||
}
|
||||
|
||||
if (myClipviewSize)
|
||||
{
|
||||
if (desiredSize.width < myClipviewSize.width)
|
||||
desiredSize.width = myClipviewSize.width;
|
||||
if (desiredSize.height < myClipviewSize.height)
|
||||
@@ -2382,7 +2384,11 @@ var CPTextViewAllowsUndoKey = @"CPTextViewAllowsUndoKey",
|
||||
CPTextViewTextStorageKey = @"CPTextViewTextStorageKey",
|
||||
CPTextViewInsertionPointColorKey = @"CPTextViewInsertionPointColorKey",
|
||||
CPTextViewSelectedTextAttributesKey = @"CPTextViewSelectedTextAttributesKey",
|
||||
CPTextViewDelegateKey = @"CPTextViewDelegateKey";
|
||||
CPTextViewDelegateKey = @"CPTextViewDelegateKey",
|
||||
CPTextViewHorizontallyResizableKey = @"CPTextViewHorizontallyResizableKey",
|
||||
CPTextViewVerticallyResizableKey = @"CPTextViewVerticallyResizableKey",
|
||||
CPMaxSize = @"CPMaxSize";
|
||||
|
||||
|
||||
@implementation CPTextView (CPCoding)
|
||||
|
||||
@@ -2423,6 +2429,10 @@ var CPTextViewAllowsUndoKey = @"CPTextViewAllowsUndoKey",
|
||||
[self setFont:[_typingAttributes valueForKey:CPFontAttributeName]];
|
||||
|
||||
[self setString:[_textStorage string]];
|
||||
|
||||
[self setMaxSize:[aCoder decodeSizeForKey:CPMaxSize]];
|
||||
[self setHorizontallyResizable:[aCoder decodeBoolForKey:CPTextViewHorizontallyResizableKey]];
|
||||
[self setVerticallyResizable:[aCoder decodeBoolForKey:CPTextViewVerticallyResizableKey]]
|
||||
}
|
||||
|
||||
return self;
|
||||
@@ -2438,6 +2448,9 @@ var CPTextViewAllowsUndoKey = @"CPTextViewAllowsUndoKey",
|
||||
[aCoder encodeObject:_selectedTextAttributes forKey:CPTextViewSelectedTextAttributesKey];
|
||||
[aCoder encodeBool:_allowsUndo forKey:CPTextViewAllowsUndoKey];
|
||||
[aCoder encodeBool:_usesFontPanel forKey:CPTextViewUsesFontPanelKey];
|
||||
[aCoder encodeBool:_isHorizontallyResizable forKey:CPTextViewHorizontallyResizableKey];
|
||||
[aCoder encodeBool:_isVerticallyResizable forKey:CPTextViewVerticallyResizableKey];
|
||||
[aCoder encodeSize:_maxSize forKey:CPMaxSize];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
_layoutManager = [aCoder decodeObjectForKey:@"NSLayoutManager"];
|
||||
[_layoutManager addTextContainer:self];
|
||||
|
||||
var tcFlags = [aCoder decodeIntForKey: @"NSTCFlags"];
|
||||
_widthTracksTextView = (tcFlags & 0x00000001) ? YES : NO;
|
||||
_heightTracksTextView = (tcFlags & 0x00000002) ? YES : NO;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,14 @@
|
||||
[self setInsertionPointColor:[aTextViewSharedData insertionColor]];
|
||||
[self setSelectedTextAttributes:[aTextViewSharedData selectedTextAttributes]];
|
||||
[[self textContainer] setWidthTracksTextView:YES];
|
||||
|
||||
if ([aCoder containsValueForKey:@"NSMaxSize"])
|
||||
_maxSize = [aCoder decodeSizeForKey:@"NSMaxSize"];
|
||||
|
||||
var tvFlags = [aCoder decodeIntForKey:@"NSTVFlags"];
|
||||
|
||||
_isHorizontallyResizable = (tvFlags & 0x00000001) ? YES : NO;
|
||||
_isVerticallyResizable = (tvFlags & 0x00000002) ? YES : NO;
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
Reference in new issue
Block a user