diff --git a/AppKit/CPBox.j b/AppKit/CPBox.j index 6c21cc31e..c0dfc0c77 100644 --- a/AppKit/CPBox.j +++ b/AppKit/CPBox.j @@ -22,13 +22,14 @@ @import "CPTextField.j" @import "CPView.j" +@import // CPBoxType @typedef CPBoxType CPBoxPrimary = 0; -CPBoxSecondary = 1; +CPBoxSecondary = 1; // Deprecated CPBoxSeparator = 2; -CPBoxOldStyle = 3; +CPBoxOldStyle = 3; // Deprecated CPBoxCustom = 4; // CPBorderType @@ -58,11 +59,13 @@ CPBelowBottom = 6; @implementation CPBox : CPView { CPBoxType _boxType; - CPBorderType _borderType; + CPBorderType _borderType; // deprecated CPView _contentView; + CPView _boxView; // needed for CSS theming, will be transparent for non CSS themes + BOOL _transparent @accessors(getter=isTransparent); - CPString _title @accessors(getter=title); - int _titlePosition @accessors(getter=titlePosition); + CPString _title @accessors(getter=title); + int _titlePosition @accessors(getter=titlePosition); CPTextField _titleView; } @@ -90,8 +93,15 @@ CPBelowBottom = 6; @"inner-shadow-size": 6.0, @"inner-shadow-color": [CPNull null], @"content-margin": CGSizeMakeZero(), - @"nib2cib-adjustment-primary-frame": CGRectMake(4, -4, -8, -6) - }; + @"title-font": [CPNull null], + @"title-left-offset": 5.0, + @"title-top-offset": 0.0, + @"title-color": [CPNull null], + @"nib2cib-adjustment-primary-frame": CGRectMake(4, -4, -8, -6), + @"content-adjustment": CGRectMakeZero(), + @"min-y-correction-no-title": 0, + @"min-y-correction-title": 0 + }; } + (id)boxEnclosingView:(CPView)aView @@ -115,16 +125,26 @@ CPBelowBottom = 6; if (self) { - _borderType = CPBezelBorder; + _borderType = CPGrooveBorder; // Was CPBezelBorder but Cocoa default is CPGrooveBorder + _boxType = CPBoxPrimary; _titlePosition = CPNoTitle; _titleView = [CPTextField labelWithTitle:@""]; + [_titleView setFont:[self titleFont]]; + [_titleView setTextColor:[self titleColor]]; + + _boxView = [[CPView alloc] initWithFrame:[self bounds]]; + [_boxView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; _contentView = [[CPView alloc] initWithFrame:[self bounds]]; [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; [self setAutoresizesSubviews:YES]; - [self addSubview:_contentView]; + [self addSubview:_boxView]; + [_boxView setAutoresizesSubviews:YES]; + [_boxView addSubview:_contentView]; + + [self sizeToFit]; } return self; @@ -156,6 +176,8 @@ CPBelowBottom = 6; */ - (CPBorderType)borderType { + CPLog.warn("CPBox borderType is deprecated."); + return _borderType; } @@ -178,7 +200,8 @@ CPBelowBottom = 6; return; _borderType = aBorderType; - [self setNeedsDisplay:YES]; + + [self refreshDisplay]; } /*! @@ -218,13 +241,30 @@ CPBelowBottom = 6; */ - (void)setBoxType:(CPBoxType)aBoxType { + if ((aBoxType == CPBoxSecondary) || (aBoxType == CPBoxOldStyle)) + CPLog.warn("CPBox setBoxType: CPBoxSecondary and CPBoxOldStyle are deprecated."); + if (_boxType === aBoxType) return; _boxType = aBoxType; - [self setNeedsDisplay:YES]; + + [self refreshDisplay]; } +- (void)setTransparent:(BOOL)shouldBeTransparent +{ + if (_transparent == shouldBeTransparent) + return; + + _transparent = shouldBeTransparent; + + [self _manageTitlePositioning]; +} + +/*! + The receiver’s border color. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (CPColor)borderColor { return [self valueForThemeAttribute:@"border-color"]; @@ -232,12 +272,21 @@ CPBelowBottom = 6; - (void)setBorderColor:(CPColor)color { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setBorderColor: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setBorderColor. Ignored."); + return; + } + if ([color isEqual:[self borderColor]]) return; [self setValue:color forThemeAttribute:@"border-color"]; } +/*! + The receiver’s border width. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (float)borderWidth { return [self valueForThemeAttribute:@"border-width"]; @@ -245,12 +294,21 @@ CPBelowBottom = 6; - (void)setBorderWidth:(float)width { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setBorderWidth: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setBorderWidth. Ignored."); + return; + } + if (width === [self borderWidth]) return; [self setValue:width forThemeAttribute:@"border-width"]; } +/*! + The receiver’s corner radius. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (float)cornerRadius { return [self valueForThemeAttribute:@"corner-radius"]; @@ -258,12 +316,21 @@ CPBelowBottom = 6; - (void)setCornerRadius:(float)radius { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setCornerRadius: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setCornerRadius. Ignored."); + return; + } + if (radius === [self cornerRadius]) return; [self setValue:radius forThemeAttribute:@"corner-radius"]; } +/*! + The receiver’s background color. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (CPColor)fillColor { return [self valueForThemeAttribute:@"background-color"]; @@ -271,6 +338,12 @@ CPBelowBottom = 6; - (void)setFillColor:(CPColor)color { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setFillColor: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setFillColor. Ignored."); + return; + } + if ([color isEqual:[self fillColor]]) return; @@ -287,21 +360,20 @@ CPBelowBottom = 6; if (aView === _contentView) return; - var borderWidth = [self borderWidth], - contentMargin = [self valueForThemeAttribute:@"content-margin"]; - - [aView setFrame:CGRectInset([self bounds], contentMargin.width + borderWidth, contentMargin.height + borderWidth)]; [aView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; // A nil contentView is allowed (tested in Cocoa 2013-02-22). if (!aView) [_contentView removeFromSuperview]; else if (_contentView) - [self replaceSubview:_contentView with:aView]; + [_boxView replaceSubview:_contentView with:aView]; else - [self addSubview:aView]; + [_boxView addSubview:aView]; _contentView = aView; + + [self sizeToFit]; + [self refreshDisplay]; } - (CGSize)contentViewMargins @@ -321,9 +393,14 @@ CPBelowBottom = 6; { var offset = [self _titleHeightOffset], borderWidth = [self borderWidth], - contentMargin = [self valueForThemeAttribute:@"content-margin"]; + contentMargin = [self valueForThemeAttribute:@"content-margin"], + contentAdjustment = [self valueForThemeAttribute:@"content-adjustment"], + minYCorrection = [self valueForThemeAttribute:(_titlePosition === CPNoTitle ? @"min-y-correction-no-title" : @"min-y-correction-title")]; - [self setFrame:CGRectInset(aRect, -(contentMargin.width + borderWidth), -(contentMargin.height + offset[0] + borderWidth))]; + [self setFrame:CGRectMake(aRect.origin.x - contentAdjustment.origin.x - contentMargin.width + borderWidth, + aRect.origin.y - contentAdjustment.origin.y - contentMargin.height + borderWidth - minYCorrection, + aRect.size.width + 2 * contentMargin.width - contentAdjustment.size.width, + aRect.size.height + 2 * contentMargin.height - contentAdjustment.size.height)]; } - (void)setTitle:(CPString)aTitle @@ -348,14 +425,42 @@ CPBelowBottom = 6; - (CPFont)titleFont { - return [_titleView font]; + if ([self hasThemeAttribute:@"title-font"]) + return [self valueForThemeAttribute:@"title-font"]; + else + return [_titleView font]; } - (void)setTitleFont:(CPFont)aFont { + if ([aFont isEqual:[self titleFont]]) + return; + + if ([self hasThemeAttribute:@"title-font"]) + [self setValue:aFont forThemeAttribute:@"title-font"]; + [_titleView setFont:aFont]; } +- (CPColor)titleColor +{ + if ([self hasThemeAttribute:@"title-color"]) + return [self valueForThemeAttribute:@"title-color"]; + else + return [_titleView textColor]; +} + +- (void)setTitleColor:(CPColor)aColor +{ + if ([aColor isEqual:[self titleColor]]) + return; + + if ([self hasThemeAttribute:@"title-color"]) + [self setValue:aColor forThemeAttribute:@"title-color"]; + + [_titleView setTextColor:aColor]; +} + /*! Return the text field used to display the receiver's title. @@ -366,25 +471,39 @@ CPBelowBottom = 6; return _titleView; } +/*! + Return the rectangle in which the receiver’s title is drawn. + */ +- (CGRect)titleRect +{ + return [_titleView frame]; +} + - (void)_manageTitlePositioning { - if (_titlePosition == CPNoTitle) + if ((_titlePosition == CPNoTitle) || _transparent) { [_titleView removeFromSuperview]; - [self setNeedsDisplay:YES]; + + if (_boxType !== CPBoxSeparator) + [self sizeToFit]; + + [self refreshDisplay]; return; } [_titleView setStringValue:_title]; [_titleView sizeToFit]; - [self addSubview:_titleView]; + + var titleLeftOffset = [self valueForThemeAttribute:@"title-left-offset"], + titleTopOffset = [self valueForThemeAttribute:@"title-top-offset"]; switch (_titlePosition) { case CPAtTop: case CPAboveTop: case CPBelowTop: - [_titleView setFrameOrigin:CGPointMake(5.0, 0.0)]; + [_titleView setFrameOrigin:CGPointMake(titleLeftOffset, titleTopOffset)]; // FIXME: was 0.0 [_titleView setAutoresizingMask:CPViewNotSizable]; break; @@ -392,39 +511,51 @@ CPBelowBottom = 6; case CPAtBottom: case CPBelowBottom: var h = [_titleView frameSize].height; - [_titleView setFrameOrigin:CGPointMake(5.0, [self frameSize].height - h)]; + [_titleView setFrameOrigin:CGPointMake(titleLeftOffset, [self frameSize].height - h - titleTopOffset)]; [_titleView setAutoresizingMask:CPViewMinYMargin]; break; } + if (!_transparent) + [self addSubview:_titleView]; + [self sizeToFit]; - [self setNeedsDisplay:YES]; + [self refreshDisplay]; } - (void)sizeToFit { - var contentFrame = [_contentView frame], - offset = [self _titleHeightOffset], - contentMargin = [self valueForThemeAttribute:@"content-margin"]; + var offset = [self _titleHeightOffset], + size = [self frameSize]; - if (!contentFrame) + [_boxView setFrame:CGRectMake(0, offset[1], size.width, size.height - offset[0])]; + + if (!_contentView) return; - [_contentView setFrameOrigin:CGPointMake(contentMargin.width, contentMargin.height + offset[1])]; + var boxSize = [_boxView frameSize], + contentMargin = [self valueForThemeAttribute:@"content-margin"], + contentAdjustment = [self valueForThemeAttribute:@"content-adjustment"], + borderWidth = [self valueForThemeAttribute:@"border-width"], + minYCorrection = [self valueForThemeAttribute:(_titlePosition === CPNoTitle ? @"min-y-correction-no-title" : @"min-y-correction-title")]; + + [_contentView setFrame:CGRectMake(contentAdjustment.origin.x + contentMargin.width - borderWidth, + contentAdjustment.origin.y + contentMargin.height - borderWidth + minYCorrection, + boxSize.width - 2 * contentMargin.width + contentAdjustment.size.width, + boxSize.height - 2 * contentMargin.height + contentAdjustment.size.height)]; } -- (float)_titleHeightOffset +- (CPArray)_titleHeightOffset { - if (_titlePosition == CPNoTitle) - return [0.0, 0.0]; + var titleTopOffset = [self valueForThemeAttribute:@"title-top-offset"]; switch (_titlePosition) { case CPAtTop: - return [[_titleView frameSize].height, [_titleView frameSize].height]; + return [[_titleView frameSize].height + titleTopOffset, [_titleView frameSize].height + titleTopOffset]; case CPAtBottom: - return [[_titleView frameSize].height, 0.0]; + return [[_titleView frameSize].height + titleTopOffset, 0.0]; default: return [0.0, 0.0]; @@ -441,21 +572,24 @@ CPBelowBottom = 6; - (void)drawRect:(CGRect)rect { + if ([self isCSSBased] && (_boxType !== CPBoxCustom)) + return; + var bounds = [self bounds]; - switch (_boxType) + if (_boxType === CPBoxSeparator) { - case CPBoxSeparator: - // NSBox does not include a horizontal flag for the separator type. We have to determine - // the type of separator to draw by the width and height of the frame. - if (CGRectGetWidth(bounds) === 5.0) - return [self _drawVerticalSeparatorInRect:bounds]; - else if (CGRectGetHeight(bounds) === 5.0) - return [self _drawHorizontalSeparatorInRect:bounds]; - - break; + // NSBox does not include a horizontal flag for the separator type. We have to determine + // the type of separator to draw by the width and height of the frame. + if (CGRectGetWidth(bounds) === 5.0) + return [self _drawVerticalSeparatorInRect:bounds]; + else if (CGRectGetHeight(bounds) === 5.0) + return [self _drawHorizontalSeparatorInRect:bounds]; } + if (_transparent) + return; + if (_titlePosition == CPAtTop) { bounds.origin.y += [_titleView frameSize].height; @@ -476,9 +610,6 @@ CPBelowBottom = 6; switch (_borderType) { case CPBezelBorder: - [self _drawBezelBorderInRect:bounds]; - break; - case CPGrooveBorder: case CPLineBorder: [self _drawLineBorderInRect:bounds]; @@ -595,12 +726,70 @@ CPBelowBottom = 6; @end +#pragma mark - + +@implementation CPBox (CSSTheming) + +- (void)layoutSubviews +{ + if (![self isCSSBased] || (_boxType === CPBoxCustom)) + return; + + var bounds = [self bounds]; + + if (_boxType === CPBoxSeparator) + { + if (bounds.size.width === 5.0) + { + // Vertical separator + [_boxView setFrame:CGRectMake(2,0,1,bounds.size.height)]; + } + else + { + // Horizontal separator + [_boxView setFrame:CGRectMake(0,2,bounds.size.width,1)]; + } + + [_boxView setBackgroundColor:[self valueForThemeAttribute:@"border-color"]]; + + return; + } + + // All types of boxes (beside custom which is not covered here) always draw the same way, unless they are CPNoBorder. + if ((_borderType !== CPNoBorder) && !_transparent) + { + [_boxView setBackgroundColor:[self valueForThemeAttribute:@"background-color"]]; + return; + } + + // No border or transparent + [_boxView setBackgroundColor:nil]; +} + +- (BOOL)isCSSBased +{ + return [[self theme] isCSSBased]; +} + +- (void)refreshDisplay +{ + if ([self isCSSBased] && (_boxType !== CPBoxCustom)) + [self setNeedsLayout:YES]; + else + [self setNeedsDisplay:YES]; +} + +@end + +#pragma mark - + var CPBoxTypeKey = @"CPBoxTypeKey", CPBoxBorderTypeKey = @"CPBoxBorderTypeKey", - CPBoxTitle = @"CPBoxTitle", - CPBoxTitlePosition = @"CPBoxTitlePosition", - CPBoxTitleView = @"CPBoxTitleView", - CPBoxContentView = @"CPBoxContentView"; + CPBoxTitleKey = @"CPBoxTitleKey", + CPBoxTitlePositionKey = @"CPBoxTitlePositionKey", + CPBoxTitleViewKey = @"CPBoxTitleViewKey", + CPBoxContentViewKey = @"CPBoxContentViewKey", + CPBoxBoxViewKey = @"CPBoxBoxViewKey"; @implementation CPBox (CPCoding) @@ -613,33 +802,56 @@ var CPBoxTypeKey = @"CPBoxTypeKey", _boxType = [aCoder decodeIntForKey:CPBoxTypeKey]; _borderType = [aCoder decodeIntForKey:CPBoxBorderTypeKey]; - _title = [aCoder decodeObjectForKey:CPBoxTitle]; - _titlePosition = [aCoder decodeIntForKey:CPBoxTitlePosition]; - _titleView = [aCoder decodeObjectForKey:CPBoxTitleView] || [CPTextField labelWithTitle:_title]; + _title = [aCoder decodeObjectForKey:CPBoxTitleKey]; + _titlePosition = [aCoder decodeIntForKey:CPBoxTitlePositionKey]; - if (_boxType != CPBoxSeparator) + // Important : see comment on encodeWithCoder below + + _boxView = [aCoder decodeObjectForKey:CPBoxBoxViewKey]; + + if (!_boxView) { - // FIXME: we have a problem with CIB decoding here. - // We should be able to simply add : _contentView = [self subviews][0] - // but first box subview seems to be malformed (badly decoded). - // For example, when deployed, this view doesn't have its _trackingAreas array initialized. - // As a (temporary) workaround, we encode/decode the _contentView property. We then transfer the subview hierarchy - // and replace the first (and only) box subview with this _contentView + // We're coming from nib2cib. - _contentView = [aCoder decodeObjectForKey:CPBoxContentView] || [[CPView alloc] initWithFrame:[self bounds]]; - var malformedContentView = [self subviews][0]; - [_contentView setSubviews:[malformedContentView subviews]]; - [self replaceSubview:malformedContentView with:_contentView]; + _boxView = [[CPView alloc] initWithFrame:[self bounds]]; + _titleView = [CPTextField labelWithTitle:_title]; } else { - _titlePosition = CPNoTitle; + // We're coming from elsewhere + + _titleView = [aCoder decodeObjectForKey:CPBoxTitleViewKey]; } - - [self setAutoresizesSubviews:YES]; + + _contentView = [aCoder decodeObjectForKey:CPBoxContentViewKey]; + + // FIXME: super-mega-hyper-trick : _contentView has a superview which is not normal ! + // FIXME: (see encodeWithCoder to understand why this is not possible) + // FIXME: we fix this by hand. This is horrible so please find a structural solution ! + + if (_contentView) + _contentView._superview = nil; + [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [_boxView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [_boxView setAutoresizesSubviews:YES]; + [self setAutoresizesSubviews:YES]; + + if (_contentView) + [_boxView setSubviews:@[_contentView]]; + + [self addSubview:_boxView]; + [self addSubview:_titleView]; + + if (_boxType === CPBoxSeparator) + _titlePosition = CPNoTitle; + + [_titleView setFont:[self titleFont]]; + [_titleView setTextColor:[self titleColor]]; [self _manageTitlePositioning]; + + [self refreshDisplay]; } return self; @@ -647,14 +859,47 @@ var CPBoxTypeKey = @"CPBoxTypeKey", - (void)encodeWithCoder:(CPCoder)aCoder { + // We have to distinguish between 2 cases : + // - we come from nib2cib + // - we come from elsewhere + // + // When coming from nib2cib, we have no _boxView, _contentView, _titleView. + // We fix _contentView to be the first (and only) subview. + // They will have to be added on decoding. + // + // When coming from elsewhere, we remove _boxView (and thus _contentView) and _titleView + // from the view hierarchy as we'll already encode them via variables. + // They will be putted back during decoding. This way, we reduce the space and speed needed for coding. + + var subviews = [self subviews]; + + if (!_boxView) + { + // We're coming from nib2cib. + + _contentView = subviews[0]; + + [_contentView removeFromSuperview]; + } + else + { + // We're coming from elsewhere. + + [_boxView removeFromSuperview]; + [_titleView removeFromSuperview]; + } + [super encodeWithCoder:aCoder]; + [self setSubviews:subviews]; + [aCoder encodeInt:_boxType forKey:CPBoxTypeKey]; [aCoder encodeInt:_borderType forKey:CPBoxBorderTypeKey]; - [aCoder encodeObject:_title forKey:CPBoxTitle]; - [aCoder encodeInt:_titlePosition forKey:CPBoxTitlePosition]; - [aCoder encodeObject:_titleView forKey:CPBoxTitleView]; - [aCoder encodeObject:_contentView forKey:CPBoxContentView]; + [aCoder encodeObject:_title forKey:CPBoxTitleKey]; + [aCoder encodeInt:_titlePosition forKey:CPBoxTitlePositionKey]; + [aCoder encodeConditionalObject:_contentView forKey:CPBoxContentViewKey]; + [aCoder encodeConditionalObject:_titleView forKey:CPBoxTitleViewKey]; + [aCoder encodeConditionalObject:_boxView forKey:CPBoxBoxViewKey]; } @end diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index af94d34fc..ab9987818 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -44,6 +44,7 @@ CPTexturedRoundedBezelStyle = 11; // Round Textured CPRoundRectBezelStyle = 12; // Round Rect CPRecessedBezelStyle = 13; // Recessed CPRoundedDisclosureBezelStyle = 14; // Disclosure +CPInlineBezelStyle = 15; // Inline CPHUDBezelStyle = -1; @@ -72,14 +73,32 @@ CPPushInCellMask = CPPushInButtonMask; CPChangeGrayCellMask = CPGrayButtonMask; CPChangeBackgroundCellMask = CPBackgroundButtonMask; -CPButtonStateMixed = CPThemeState("mixed"); -CPButtonStateBezelStyleRounded = CPThemeState("rounded"); -CPButtonStateBezelStyleRoundRect = CPThemeState("roundRect"); +CPButtonStateMixed = CPThemeState("mixed"); +CPButtonStateBezelStyleRounded = CPThemeState("rounded"); // IB style : Push +CPButtonStateBezelStyleShadowlessSquare = CPThemeState("square"); // IB style : Square +CPButtonStateBezelStyleSmallSquare = CPThemeState("gradient"); // IB style : Gradient +CPButtonStateBezelStyleTexturedRounded = CPThemeState("textured-rounded"); // IB style : Textured rounded +CPButtonStateBezelStyleRoundRect = CPThemeState("roundRect"); // IB style : Round rect +CPButtonStateBezelStyleRecessed = CPThemeState("recessed"); // IB style : Recessed +CPButtonStateBezelStyleInline = CPThemeState("inline"); // IB style : Inline +CPButtonStateBezelStyleRegularSquare = CPThemeState("bevel"); // IB style : Bevel +CPButtonStateBezelStyleTextured = CPThemeState("textured"); // IB style : Textured +CPButtonStateBezelStyleDisclosure = CPThemeState("disclosure"); // IB style : Disclosure triangle +CPButtonStateBezelStyleRoundedDisclosure = CPThemeState("rounded-disclosure"); // IB style : Rounded disclosure // add all future correspondance between bezel styles and theme state here. var CPButtonBezelStyleStateMap = @{ - CPRoundedBezelStyle: CPButtonStateBezelStyleRounded, - CPRoundRectBezelStyle: CPButtonStateBezelStyleRoundRect, + CPRoundedBezelStyle: CPButtonStateBezelStyleRounded, + CPShadowlessSquareBezelStyle: CPButtonStateBezelStyleShadowlessSquare, + CPSmallSquareBezelStyle: CPButtonStateBezelStyleSmallSquare, + CPTexturedRoundedBezelStyle: CPButtonStateBezelStyleTexturedRounded, + CPRoundRectBezelStyle: CPButtonStateBezelStyleRoundRect, + CPRecessedBezelStyle: CPButtonStateBezelStyleRecessed, + CPInlineBezelStyle: CPButtonStateBezelStyleInline, + CPRegularSquareBezelStyle: CPButtonStateBezelStyleRegularSquare, + CPTexturedSquareBezelStyle: CPButtonStateBezelStyleTextured, + CPDisclosureBezelStyle: CPButtonStateBezelStyleDisclosure, + CPRoundedDisclosureBezelStyle: CPButtonStateBezelStyleRoundedDisclosure }; /// @cond IGNORE @@ -108,6 +127,7 @@ CPButtonImageOffset = 3.0; // NS-style Display Properties CPBezelStyle _bezelStyle; + ThemeState _bezelState; CPString _keyEquivalent; unsigned _keyEquivalentModifierMask; @@ -117,7 +137,7 @@ CPButtonImageOffset = 3.0; float _periodicDelay; float _periodicInterval; - BOOL _isTracking; + BOOL _isHighlighted; } + (Class)_binderClassForBinding:(CPString)aBinding @@ -157,6 +177,13 @@ CPButtonImageOffset = 3.0; @"bezel-inset": CGInsetMakeZero(), @"content-inset": CGInsetMakeZero(), @"bezel-color": [CPNull null], + @"image-position": CPImageLeft, + @"vertical-alignment": CPCenterVerticalTextAlignment, + @"alignment": CPCenterTextAlignment, + @"image-scaling": CPImageScaleNone, + @"invert-image": NO, + @"invert-image-on-push": NO, + @"image-color": [CPNull null] // If null, image color follows text color }; } @@ -172,12 +199,12 @@ CPButtonImageOffset = 3.0; if (self) { // Should we instead override the defaults? - [self setValue:CPCenterTextAlignment forThemeAttribute:@"alignment"]; - [self setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; - [self setValue:CPImageLeft forThemeAttribute:@"image-position"]; - [self setValue:CPImageScaleNone forThemeAttribute:@"image-scaling"]; +// [self setValue:CPCenterTextAlignment forThemeAttribute:@"alignment"]; +// [self setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; +// [self setValue:CPImageLeft forThemeAttribute:@"image-position"]; +// [self setValue:CPImageScaleNone forThemeAttribute:@"image-scaling"]; - [self setBezelStyle:CPRoundRectBezelStyle]; + [self setBezelStyle:CPRoundedBezelStyle]; [self setBordered:YES]; [self _init]; @@ -258,30 +285,6 @@ CPButtonImageOffset = 3.0; anObjectValue = CPOnState; [super setObjectValue:anObjectValue]; - - switch ([self objectValue]) - { - case CPMixedState: - [self unsetThemeState:CPThemeStateSelected]; - [self setThemeState:CPButtonStateMixed]; - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self setThemeState:CPThemeStateHighlighted]; - else - [self unsetThemeState:CPThemeStateHighlighted]; - break; - - case CPOnState: - [self unsetThemeState:CPButtonStateMixed]; - [self setThemeState:CPThemeStateSelected]; - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self setThemeState:CPThemeStateHighlighted]; - else - [self unsetThemeState:CPThemeStateHighlighted]; - break; - - case CPOffState: - [self unsetThemeStates:[CPThemeStateSelected, CPButtonStateMixed, CPThemeStateHighlighted]]; - } } /*! @@ -378,12 +381,19 @@ CPButtonImageOffset = 3.0; - (void)setImage:(CPImage)anImage { - [self setValue:anImage forThemeAttribute:@"image" inState:CPThemeStateNormal]; + // This is needed when compiling themes + if (!_bezelState) + _bezelState = CPThemeStateNormal; + + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState]; } - (CPImage)image { - return [self valueForThemeAttribute:@"image" inState:CPThemeStateNormal]; + if (!_bezelState) + _bezelState = CPThemeStateNormal; + + return [self valueForThemeAttribute:@"image" inState:_bezelState]; } /*! @@ -392,7 +402,8 @@ CPButtonImageOffset = 3.0; */ - (void)setAlternateImage:(CPImage)anImage { - [self setValue:anImage forThemeAttribute:@"image" inState:CPThemeStateHighlighted]; + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateHighlighted)]; + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateSelected)]; } /*! @@ -400,7 +411,17 @@ CPButtonImageOffset = 3.0; */ - (CPImage)alternateImage { - return [self valueForThemeAttribute:@"image" inState:CPThemeStateHighlighted]; + return [self valueForThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateSelected)]; +} + +- (void)setHoveredImage:(CPImage)anImage +{ + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateHovered)]; +} + +- (CPImage)hoveredImage +{ + return [self valueForThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateHovered)]; } - (void)setImageOffset:(float)theImageOffset @@ -423,11 +444,6 @@ CPButtonImageOffset = 3.0; _showsStateBy = aMask; - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask) && [self state] != CPOffState) - [self setThemeState:CPThemeStateHighlighted]; - else - [self unsetThemeState:CPThemeStateHighlighted]; - [self setNeedsDisplay:YES]; [self setNeedsLayout]; } @@ -444,11 +460,8 @@ CPButtonImageOffset = 3.0; _highlightsBy = aMask; - if ([self hasThemeState:CPThemeStateHighlighted]) - { - [self setNeedsDisplay:YES]; - [self setNeedsLayout]; - } + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; } - (CPInteger)highlightsBy @@ -533,6 +546,17 @@ CPButtonImageOffset = 3.0; _periodicInterval = anInterval; } +- (void)highlight:(BOOL)shouldHighlight +{ + if (_isHighlighted == shouldHighlight) + return; + + _isHighlighted = shouldHighlight; + + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + - (void)mouseDown:(CPEvent)anEvent { if ([self isEnabled] && [self isContinuous]) @@ -555,46 +579,12 @@ CPButtonImageOffset = 3.0; [_target performSelector:_action withObject:self]; } -- (BOOL)startTrackingAt:(CGPoint)aPoint -{ - _isTracking = YES; - - var startedTracking = [super startTrackingAt:aPoint]; - - if (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask)) - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self highlight:[self state] == CPOffState]; - else - [self highlight:YES]; - } - else - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self highlight:[self state] != CPOffState]; - else - [self highlight:NO]; - } - - return startedTracking; -} - - (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp { - _isTracking = NO; - if (mouseIsUp && CGRectContainsPoint([self bounds], aPoint)) [self setNextState]; - else - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self highlight:[self state] != CPOffState]; - else - [self highlight:NO]; - } - [self setNeedsLayout]; - [self setNeedsDisplay:YES]; + [self highlight:NO]; [self invalidateTimers]; } @@ -615,7 +605,7 @@ CPButtonImageOffset = 3.0; - (CGRect)contentRectForBounds:(CGRect)bounds { - var contentInset = [self currentValueForThemeAttribute:@"content-inset"]; + var contentInset = [self valueForThemeAttribute:@"content-inset" inState:[self _contentVisualState]]; return CGRectInsetByInset(bounds, contentInset); } @@ -626,7 +616,7 @@ CPButtonImageOffset = 3.0; if (![self isBordered]) return bounds; - var bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"]; + var bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"]; // FIXME: faire comme au dessus ? return CGRectInsetByInset(bounds, bezelInset); } @@ -642,7 +632,7 @@ CPButtonImageOffset = 3.0; size = [contentView frameSize]; } else - size = [([self title] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]]; + size = [([self title] || " ") sizeWithFont:[self font]]; //[self currentValueForThemeAttribute:@"font"]]; var contentInset = [self currentValueForThemeAttribute:@"content-inset"], minSize = [self currentValueForThemeAttribute:@"min-size"], @@ -698,87 +688,164 @@ CPButtonImageOffset = 3.0; return [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()]; } +- (CPThemeState)_backgroundVisualState +{ + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state], + buttonIsOn = (currentState !== CPOffState); + + if (_isHighlighted && (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask))) // FIXME: quid background ? + visualState = visualState.and(CPThemeStateHighlighted); + else + visualState = visualState.without(CPThemeStateHighlighted); + + if (buttonIsOn && (_showsStateBy & (CPPushInCellMask | CPChangeGrayCellMask))) // FIXME: quid background ? + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + else + visualState = visualState.without(CPThemeStateSelected); + + return visualState; +} + +// Note : We have to split content and image visual states as, for example, radio buttons don't follow push buttons behavior +- (CPThemeState)_contentVisualState +{ + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state], + buttonIsOn = (currentState !== CPOffState); + + // If the button is pushed (_isHighlighted), always add the highlighted state + if (_isHighlighted || (((_showsStateBy & CPChangeGrayCellMask) || (_showsStateBy & CPChangeBackgroundCellMask)) && buttonIsOn)) + visualState = visualState.and(CPThemeStateHighlighted); + else + visualState = visualState.without(CPThemeStateHighlighted); + + if (buttonIsOn && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + else + visualState = visualState.without(CPThemeStateSelected); + + return visualState; +} + +- (CPThemeState)_imageVisualState +{ + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state], + buttonIsOn = (currentState !== CPOffState); + + // Remove highlighted & selected theme states + visualState = visualState.without(CPThemeStateHighlighted); + visualState = visualState.without(CPThemeStateSelected); + + // Note : We have to deal with special case where button is ON, highlightsBy and showsStateBy use content, and button is pushed + // BUT this should not be used for disclosure buttons ! + if (_isHighlighted && buttonIsOn && (_highlightsBy & CPContentsCellMask) && (_showsStateBy & CPContentsCellMask) && (_bezelStyle !== CPDisclosureBezelStyle)) + return visualState; + + if (_isHighlighted && ((_highlightsBy & CPContentsCellMask) || (_highlightsBy & CPChangeGrayCellMask))) + visualState = visualState.and(CPThemeStateHighlighted); + + if (buttonIsOn && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; +} + +- (CPString)_currentTitle +{ + var buttonIsOn = ([self state] !== CPOffState); + + // Note : We have to deal with special case where button is ON, highlightsBy and showsStateBy use content, and button is pushed + if (_isHighlighted && buttonIsOn && (_highlightsBy & CPContentsCellMask) && (_showsStateBy & CPContentsCellMask)) + return _title; + + else if (_alternateTitle && ((_isHighlighted && (_highlightsBy & CPContentsCellMask)) || (buttonIsOn && (_showsStateBy & CPContentsCellMask)))) + return _alternateTitle; + + else + return _title; +} + +- (CPImage)_currentImage +{ + var visualState = [self _imageVisualState], + currentImage = [self valueForThemeAttribute:@"image" inState:visualState], + imageColor = [self valueForThemeAttribute:@"image-color" inState:visualState], + buttonIsOn = ([self state] !== CPOffState); + + if ([currentImage isMaterialIconImage]) + { + // FIXME: Keep this ? + if (([self valueForThemeAttribute:@"invert-image" inState:visualState] || ([self valueForThemeAttribute:@"invert-image-on-push" inState:visualState] && (_isHighlighted || (((_showsStateBy & CPChangeGrayCellMask) || (_showsStateBy & CPChangeBackgroundCellMask)) && buttonIsOn))))) + currentImage = [currentImage invertedImage]; + + else if (imageColor && [imageColor isKindOfClass:CPColor]) + // In some buttons, image color doesn't follow text color ! + currentImage = [currentImage imageVersionWithColor:imageColor]; + + else + // By default, image color follows text color + currentImage = [currentImage imageVersionWithColor:[self valueForThemeAttribute:@"text-color" inState:[self _contentVisualState]]]; + } + + return currentImage; +} + - (void)layoutSubviews { - var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" - positioned:CPWindowBelow - relativeToEphemeralSubviewNamed:@"content-view"]; + var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"content-view"], - [bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; - - var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + contentView = [self layoutEphemeralSubviewNamed:@"content-view" positioned:CPWindowAbove - relativeToEphemeralSubviewNamed:@"bezel-view"]; + relativeToEphemeralSubviewNamed:@"bezel-view"], - if (contentView) - { - var title = nil, - image = nil; + image = [self _currentImage], + contentVisualState = [self _contentVisualState]; - if (_isTracking) - { - if (_highlightsBy & CPContentsCellMask) - { - if (_showsStateBy & CPContentsCellMask) - { - title = ([self state] == CPOffState && _alternateTitle) ? _alternateTitle : _title; - image = ([self state] == CPOffState && [self alternateImage]) ? [self alternateImage] : [self image]; - } - else - { - title = [self alternateTitle]; - image = [self alternateImage]; - } - } - else if (_showsStateBy & CPContentsCellMask) - { - title = ([self state] != CPOffState && _alternateTitle) ? _alternateTitle : _title; - image = ([self state] != CPOffState && [self alternateImage]) ? [self alternateImage] : [self image]; - } - else - { - title = _title; - image = [self image]; - } - } - else - { - if (_showsStateBy & CPContentsCellMask) - { - title = ([self state] != CPOffState && _alternateTitle) ? _alternateTitle : _title; - image = ([self state] != CPOffState && [self alternateImage]) ? [self alternateImage] : [self image]; - } - else - { - title = _title; - image = [self image]; - } - } + [bezelView setBackgroundColor:[self valueForThemeAttribute:@"bezel-color" inState:[self _backgroundVisualState]]]; + [contentView setText:[self _currentTitle]]; + [contentView setImage:image]; - [contentView setText:title]; - [contentView setImage:image]; - [contentView setImageOffset:[self currentValueForThemeAttribute:@"image-offset"]]; + [contentView setImageOffset:[self valueForThemeAttribute:@"image-offset" inState:contentVisualState]]; - [contentView setFont:[self currentValueForThemeAttribute:@"font"]]; - [contentView setTextColor:[self currentValueForThemeAttribute:@"text-color"]]; - [contentView setAlignment:[self currentValueForThemeAttribute:@"alignment"]]; - [contentView setVerticalAlignment:[self currentValueForThemeAttribute:@"vertical-alignment"]]; - [contentView setLineBreakMode:[self currentValueForThemeAttribute:@"line-break-mode"]]; - [contentView _setUsesSingleLineMode:YES]; - [contentView setTextShadowColor:[self currentValueForThemeAttribute:@"text-shadow-color"]]; - [contentView setTextShadowOffset:[self currentValueForThemeAttribute:@"text-shadow-offset"]]; - [contentView setImagePosition:[self currentValueForThemeAttribute:@"image-position"]]; - [contentView setImageScaling:[self currentValueForThemeAttribute:@"image-scaling"]]; - [contentView setDimsImage:[self hasThemeState:CPThemeStateDisabled] && _imageDimsWhenDisabled]; - } + [contentView setFont:[self font]]; //[self currentValueForThemeAttribute:@"font"]]; + [contentView setTextColor:[self valueForThemeAttribute:@"text-color" inState:contentVisualState]]; + [contentView setAlignment:[self valueForThemeAttribute:@"alignment" inState:contentVisualState]]; + [contentView setVerticalAlignment:[self valueForThemeAttribute:@"vertical-alignment" inState:contentVisualState]]; + [contentView setLineBreakMode:[self valueForThemeAttribute:@"line-break-mode" inState:contentVisualState]]; + [contentView _setUsesSingleLineMode:YES]; + [contentView setTextShadowColor:[self valueForThemeAttribute:@"text-shadow-color" inState:contentVisualState]]; + [contentView setTextShadowOffset:[self valueForThemeAttribute:@"text-shadow-offset" inState:contentVisualState]]; + [contentView setImagePosition:[self valueForThemeAttribute:@"image-position"]]; + [contentView setImageScaling:[self valueForThemeAttribute:@"image-scaling"]]; + + // We don't automatically dim material icon images as the color is driven by the theme + [contentView setDimsImage:[self hasThemeState:CPThemeStateDisabled] && _imageDimsWhenDisabled && ![image isMaterialIconImage]]; } - (void)setBordered:(BOOL)shouldBeBordered { if (shouldBeBordered) + { [self setThemeState:CPThemeStateBordered]; + + if (_bezelState) + _bezelState = _bezelState.and(CPThemeStateBordered); + else + _bezelState = CPThemeStateBordered; + } else + { [self unsetThemeState:CPThemeStateBordered]; + + if (_bezelState) + _bezelState = _bezelState.without(CPThemeStateBordered); + else + _bezelState = CPThemeStateNormal; + } } - (BOOL)isBordered @@ -874,17 +941,19 @@ CPButtonImageOffset = 3.0; [self setState:[self nextState]]; - var shouldHighlight = NO; - - if (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask)) - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - shouldHighlight = [self state] == CPOffState; - else - shouldHighlight = YES; - } - - [self highlight:shouldHighlight]; + // FIXME: Here +// var shouldHighlight = NO; +// +// if (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask)) +// { +// if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) +// shouldHighlight = [self state] == CPOffState; +// else +// shouldHighlight = YES; +// } +// +// [self highlight:shouldHighlight]; + [self highlight:YES]; try { @@ -896,7 +965,8 @@ CPButtonImageOffset = 3.0; } finally { - if (shouldHighlight) + // FIXME: Here + // if (shouldHighlight) [CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(unhighlightButtonTimerDidFinish:) userInfo:nil repeats:NO]; } } @@ -920,6 +990,18 @@ CPButtonImageOffset = 3.0; [self setThemeState:newState]; _bezelStyle = aBezelStyle; + + if (_bezelState && newState) + _bezelState = _bezelState.and(newState); + else + _bezelState = newState || CPThemeStateNormal; + + // For disclosure triangle and rounded, we have to move away from + // what Xcode tells us as we implement visual behavior with images (so content) + // and not background + + if ((_bezelStyle === CPDisclosureBezelStyle) || (_bezelStyle === CPRoundedDisclosureBezelStyle)) + [self setShowsStateBy:CPContentsCellMask]; } - (unsigned)bezelStyle @@ -930,7 +1012,7 @@ CPButtonImageOffset = 3.0; @end -var CPButtonImageKey = @"CPButtonImageKey", +var CPButtonImageKey = @"CPButtonImageKey", // FIXME: pas utilisé ?????? CPButtonAlternateImageKey = @"CPButtonAlternateImageKey", CPButtonTitleKey = @"CPButtonTitleKey", CPButtonAlternateTitleKey = @"CPButtonAlternateTitleKey", @@ -943,7 +1025,8 @@ var CPButtonImageKey = @"CPButtonImageKey", CPButtonPeriodicDelayKey = @"CPButtonPeriodicDelayKey", CPButtonPeriodicIntervalKey = @"CPButtonPeriodicIntervalKey", CPButtonHighlightsByKey = @"CPButtonHighlightsByKey", - CPButtonShowsStateByKey = @"CPButtonShowsStateByKey"; + CPButtonShowsStateByKey = @"CPButtonShowsStateByKey", + CPButtonBezelStyleKey = @"CPButtonBezelStyleKey"; @implementation CPButton (CPCoding) @@ -992,6 +1075,12 @@ var CPButtonImageKey = @"CPButtonImageKey", _keyEquivalentModifierMask = [aCoder decodeIntForKey:CPButtonKeyEquivalentMaskKey]; + if ([aCoder containsValueForKey:CPButtonIsBorderedKey]) + [self setBordered:[aCoder decodeBoolForKey:CPButtonIsBorderedKey]]; + + if ([aCoder containsValueForKey:CPButtonBezelStyleKey]) + [self setBezelStyle:[aCoder decodeIntForKey:CPButtonBezelStyleKey]]; + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } @@ -1026,6 +1115,9 @@ var CPButtonImageKey = @"CPButtonImageKey", [aCoder encodeObject:_periodicDelay forKey:CPButtonPeriodicDelayKey]; [aCoder encodeObject:_periodicInterval forKey:CPButtonPeriodicIntervalKey]; + + [aCoder encodeBool:[self isBordered] forKey:CPButtonIsBorderedKey]; + [aCoder encodeInt: [self bezelStyle] forKey:CPButtonBezelStyleKey]; } @end diff --git a/AppKit/CPCheckBox.j b/AppKit/CPCheckBox.j index e6c29b459..ecc99bb06 100644 --- a/AppKit/CPCheckBox.j +++ b/AppKit/CPCheckBox.j @@ -94,23 +94,6 @@ CPCheckBoxImageOffset = 4.0; [self takeStateFromKeyPath:aKeyPath ofObjects:objects]; } -- (CPImage)image -{ - return [self currentValueForThemeAttribute:@"image"]; -} - -- (CPImage)alternateImage -{ - return [self currentValueForThemeAttribute:@"image"]; -} - -- (BOOL)startTrackingAt:(CGPoint)aPoint -{ - var startedTracking = [super startTrackingAt:aPoint]; - [self highlight:YES]; - return startedTracking; -} - #pragma mark - #pragma mark Override methods from CPButton @@ -135,6 +118,36 @@ CPCheckBoxImageOffset = 4.0; return size; } +- (CPThemeState)_contentVisualState +{ + // Note : Behavior differs from CPButton as title doesn't follow the highlightsBy content flag + + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; +} + +- (CPThemeState)_imageVisualState +{ + // Note : Behavior differs from CPButton as we don't force "not selected" theme state + // when button is highglighted and selected + + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if (_isHighlighted && (_highlightsBy & CPContentsCellMask)) + visualState = visualState.and(CPThemeStateHighlighted); + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; +} + @end @implementation _CPCheckBoxValueBinder : CPBinder diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index 5866fb0d4..6ee1616da 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -561,7 +561,11 @@ var cachedBlackColor, - (void)_initCSSStringFromComponents { - var hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0; + // Fix to avoid a problem when compiling a theme (missing the alpha component as theme compiler doesn't have CSS rgba capability) + var hasAlpha = YES; +#if PLATFORM(DOM) + hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0; +#endif _cssString = (hasAlpha ? "rgba(" : "rgb(") + parseInt(_components[0] * 255.0) + ", " + @@ -800,6 +804,9 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image var description = [super description], patternImage = [self patternImage]; + if ([self isCSSBased]) + return description + "\n" + [self cssDictionary]+ "\nBefore:\n" + [self cssBeforeDictionary] + "\nAfter:\n" + [self cssAfterDictionary]; + if (!patternImage) return description + " " + [self cssString]; @@ -933,7 +940,7 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image // You can use -(BOOL)isCSSBased to determine how to cope with it in your code. // -(BOOL)hasCSSDictionary, -(BOOL)hasCSSBeforeDictionary and -(BOOL)hasCSSAfterDictionary are convience methods you can use. // -// Remark : -(void)restorePreviousCSSState and -(DOMElement)applyCSSColorForView are meant to be used by low level UI widgets (like CPView) to implement +// Remark : +(void)restorePreviousCSSState and -(DOMElement)applyCSSColorForView are meant to be used by low level UI widgets (like CPView) to implement // CSS theme support. @implementation CPColor (CSSTheming) @@ -992,7 +999,7 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image return ([_cssAfterDictionary count] > 0); } -- (void)restorePreviousCSSState:(CPArrayRef)aPreviousStateRef forDOMElement:(DOMElement)aDOMElement ++ (void)restorePreviousCSSState:(CPArrayRef)aPreviousStateRef forDOMElement:(DOMElement)aDOMElement { #if PLATFORM(DOM) var aPreviousState = @deref(aPreviousStateRef); diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 790a74e3f..623e6003e 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -23,12 +23,13 @@ @import @import -@import "CPFont.j" @import "CPShadow.j" @import "CPText.j" @import "CPKeyValueBinding.j" @import "CPTrackingArea.j" +@class CPFont + @global CPApp @protocol CPControlTextEditingDelegate @@ -48,6 +49,9 @@ CPRegularControlSize = 0; CPSmallControlSize = 1; CPMiniControlSize = 2; +// To get the theme state corresponding to a control size, use CPControlSizeThemeStates[controlSize] +CPControlSizeThemeStates = @[CPThemeStateControlSizeRegular, CPThemeStateControlSizeSmall, CPThemeStateControlSizeMini]; + @typedef CPLineBreakMode CPLineBreakByWordWrapping = 0; CPLineBreakByCharWrapping = 1; @@ -131,7 +135,7 @@ var CPControlBlackColor = [CPColor blackColor]; @"vertical-alignment": CPTopVerticalTextAlignment, @"line-break-mode": CPLineBreakByClipping, @"text-color": [CPColor blackColor], - @"font": [CPFont systemFontOfSize:CPFontCurrentSystemSize], + @"font": [CPNull null], @"text-shadow-color": [CPNull null], @"text-shadow-offset": CGSizeMakeZero(), @"image-position": CPImageLeft, @@ -195,7 +199,8 @@ var CPControlBlackColor = [CPColor blackColor]; { _sendActionOn = CPLeftMouseUpMask; _trackingMouseDownFlags = 0; - + + [self setControlSize:CPThemeStateControlSizeRegular]; [self updateTrackingAreas]; } @@ -852,6 +857,11 @@ var CPControlBlackColor = [CPColor blackColor]; [self setValue:aColor forThemeAttribute:@"text-color" inState:[self themeState]]; } +- (void)setTextColor:(CPColor)aColor inThemeStates:(CPArray)themeStates +{ + [self setValue:aColor forThemeAttribute:@"text-color" inStates:themeStates]; +} + /*! Returns the text color of the receiver. */ @@ -907,7 +917,7 @@ var CPControlBlackColor = [CPColor blackColor]; */ - (CPFont)font { - return [self valueForThemeAttribute:@"font"]; + return [self currentValueForThemeAttribute:@"font"] || [CPFont systemFontForControlSize:_controlSize]; } /*! @@ -1117,6 +1127,7 @@ var CPControlActionKey = @"CPControlActionKey", [self setControlSize:[aCoder decodeIntForKey:CPControlControlSizeKey]]; [self setBaseWritingDirection:[aCoder decodeIntForKey:CPControlBaseWrittingDirectionKey]]; + [self updateTrackingAreas]; } return self; diff --git a/AppKit/CPFont.j b/AppKit/CPFont.j index 65c6786c4..fa8884278 100644 --- a/AppKit/CPFont.j +++ b/AppKit/CPFont.j @@ -25,6 +25,8 @@ @import "CPView.j" @import "CPFontDescriptor.j" +@import "_CPObject+Theme.j" +@import "CPControl.j" CPFontDefaultSystemFontFace = @"Arial, sans-serif"; CPFontDefaultSystemFontSize = 12; @@ -38,12 +40,15 @@ CPFontCurrentSystemSize = -1; // For internal use only by this class and subclasses _CPFontSystemFacePlaceholder = "_CPFontSystemFacePlaceholder"; -var _CPFontCache = {}, - _CPSystemFontCache = {}, - _CPFontSystemFontFace = CPFontDefaultSystemFontFace, - _CPFontSystemFontSize = 12, - _CPFontFallbackFaces = CPFontDefaultSystemFontFace.split(", "), - _CPFontStripRegExp = new RegExp("(^\\s*[\"']?|[\"']?\\s*$)", "g"); +var _CPFontCache = {}, + _CPSystemFontCache = {}, + _CPFontSystemFontFace = CPFontDefaultSystemFontFace, + _CPFontSystemFontSize = CPFontDefaultSystemFontSize, + _CPFontSystemFontSizeSmall = CPFontDefaultSystemFontSize - 1, + _CPFontSystemFontSizeMini = CPFontDefaultSystemFontSize - 2, + _CPFontFallbackFaces = CPFontDefaultSystemFontFace.split(", "), + _CPFontStripRegExp = new RegExp("(^\\s*[\"']?|[\"']?\\s*$)", "g"), + _CPFontSystemFontFaceSpecified = NO; #define _CPRealFontSize(aSize) (aSize <= 0 ? _CPFontSystemFontSize : aSize) @@ -109,7 +114,7 @@ following: Asap @endcode */ -@implementation CPFont : CPObject +@implementation CPFont : CPObject { CPString _name; float _size; @@ -123,6 +128,22 @@ following: CPString _cssString; } ++ (CPString)defaultThemeClass +{ + return @"font"; +} + ++ (CPDictionary)themeAttributes +{ + return @{ + @"system-font-face": [CPNull null], + @"system-font-style": [CPNull null], + @"system-font-size-regular": [CPNull null], + @"system-font-size-small": [CPNull null], + @"system-font-size-mini": [CPNull null] + }; +} + + (void)initialize { if (self !== [CPFont class]) @@ -134,7 +155,10 @@ following: systemFontFace = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:@"CPSystemFontFace"]; if (systemFontFace) + { _CPFontSystemFontFace = _CPFontNormalizedNames(systemFontFace); + _CPFontSystemFontFaceSpecified = YES; + } var systemFontSize = [[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPSystemFontSize"]; @@ -142,7 +166,62 @@ following: systemFontSize = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:@"CPSystemFontSize"]; if (systemFontSize) + { _CPFontSystemFontSize = systemFontSize; + _CPFontSystemFontFaceSpecified = YES; + } +} + ++ (void)initializeSystemFontFromTheme:(CPTheme)aTheme +{ + // If something was specified via +initialize (from an Info.plist file), don't do anything + if (_CPFontSystemFontFaceSpecified) + return; + + // Reset all system font caches + _CPSystemFontCache = {}; + + // Now, try to get information from the theme + var systemFontFace = [aTheme valueForAttributeWithName:@"system-font-face" forClass:[CPFont class]]; + + if (systemFontFace) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontFace = _CPFontNormalizedNames(systemFontFace); + } + + var systemFontSize = [aTheme valueForAttributeWithName:@"system-font-size-regular" forClass:[CPFont class]]; + + if (systemFontSize) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontSize = systemFontSize; + } + + systemFontSize = [aTheme valueForAttributeWithName:@"system-font-size-small" forClass:[CPFont class]]; + + if (systemFontSize) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontSizeSmall = systemFontSize; + } + + systemFontSize = [aTheme valueForAttributeWithName:@"system-font-size-mini" forClass:[CPFont class]]; + + if (systemFontSize) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontSizeMini = systemFontSize; + } + + // Is there something to add to the global syle definition ? + var systemFontStyle = [aTheme valueForAttributeWithName:@"system-font-style" forClass:[CPFont class]]; + + if (systemFontStyle) + { + // Yes, so install it in the DOM Style element + document.getElementsByTagName("STYLE")[0].innerHTML += "\n" + [aTheme setCSSResourcesPathInString:systemFontStyle]; + } } /*! @@ -177,14 +256,13 @@ following: + (CPFont)systemFontForControlSize:(CPControlSize)aSize { - // TODO These sizes should be themable or made less arbitrary in some other way. switch (aSize) { case CPSmallControlSize: - return [self systemFontOfSize:_CPFontSystemFontSize - 1]; + return [self systemFontOfSize:_CPFontSystemFontSizeSmall]; case CPMiniControlSize: - return [self systemFontOfSize:_CPFontSystemFontSize - 2]; + return [self systemFontOfSize:_CPFontSystemFontSizeMini]; case CPRegularControlSize: default: @@ -315,6 +393,10 @@ following: _isItalic = isItalic; _isSystem = isSystem; + _theme = [CPTheme defaultTheme]; + _themeState = CPThemeStateNormal; + [self _loadThemeAttributes]; + if (isSystem) { _name = aName; @@ -432,6 +514,22 @@ following: _lineHeight = [metrics objectForKey:@"lineHeight"]; } +- (CPControlSize)controlSizeCorrespondingToFontSize +{ + switch (_size) + { + case _CPFontSystemFontSizeSmall: + return CPSmallControlSize; + + case _CPFontSystemFontSizeMini: + return CPMiniControlSize; + + default: + // If we can't find a corresponding size, return regular control size + return CPRegularControlSize; + } +} + @end @implementation CPFont(DescriptorAdditions) @@ -492,7 +590,11 @@ var CPFontNameKey = @"CPFontNameKey", isItalic = [aCoder decodeBoolForKey:CPFontIsItalicKey], isSystem = [aCoder decodeBoolForKey:CPFontIsSystemKey]; - return [self _initWithName:fontName size:size bold:isBold italic:isItalic system:isSystem]; + self = [self _initWithName:fontName size:size bold:isBold italic:isItalic system:isSystem]; + + [self _decodeThemeObjectsWithCoder:aCoder]; + + return self; } /*! @@ -506,6 +608,8 @@ var CPFontNameKey = @"CPFontNameKey", [aCoder encodeBool:_isBold forKey:CPFontIsBoldKey]; [aCoder encodeBool:_isItalic forKey:CPFontIsItalicKey]; [aCoder encodeBool:_isSystem forKey:CPFontIsSystemKey]; + + [self _encodeThemeObjectsWithCoder:aCoder]; } @end diff --git a/AppKit/CPImage.j b/AppKit/CPImage.j index 060f6d71c..58cfd1365 100644 --- a/AppKit/CPImage.j +++ b/AppKit/CPImage.j @@ -26,10 +26,13 @@ @import @import @import +@import +@import @import "CGGeometry.j" @import "CPCompatibility.j" +@class CPColor @protocol CPImageDelegate @@ -85,9 +88,7 @@ function CPImageInBundle() if (typeof(arguments[1]) === "number") { - if (arguments[1] != nil) - size = CGSizeMake(arguments[1], arguments[2]); - + size = CGSizeMake(arguments[1], arguments[2]); bundle = arguments[3]; } else if (typeof(arguments[1]) === "object") @@ -446,6 +447,11 @@ function CPAppKitImage(aFilename, aSize) return NO; } +- (BOOL)isMaterialIconImage +{ + return NO; +} + - (CPString)description { var filename = [self filename], @@ -564,6 +570,7 @@ function CPAppKitImage(aFilename, aSize) CPDictionary _cssDictionary @accessors(property=cssDictionary); CPDictionary _cssBeforeDictionary @accessors(property=cssBeforeDictionary); CPDictionary _cssAfterDictionary @accessors(property=cssAfterDictionary); + CGSize _displaySize; } + (CPImage)imageWithCSSDictionary:(CPDictionary)aDictionary size:(CGSize)aSize @@ -582,6 +589,16 @@ function CPAppKitImage(aFilename, aSize) return [[CPImage alloc] initWithCSSDictionary:@{} beforeDictionary:nil afterDictionary:nil size:aSize]; } ++ (CPImage)imageWithMaterialIconNamed:(CPString)iconName size:(CGSize)size +{ + return [_CPMaterialIconImage imageWithIconNamed:iconName size:size]; +} + ++ (CPImage)imageWithMaterialIconNamed:(CPString)iconName size:(CGSize)size color:(CPColor)color +{ + return [_CPMaterialIconImage imageWithIconNamed:iconName size:size color:color]; +} + - (id)initWithCSSDictionary:(CPDictionary)aDictionary beforeDictionary:(CPDictionary)beforeDictionary afterDictionary:(CPDictionary)afterDictionary size:(CGSize)aSize { self = [super init]; @@ -594,6 +611,7 @@ function CPAppKitImage(aFilename, aSize) _cssDictionary = aDictionary; _cssBeforeDictionary = beforeDictionary; _cssAfterDictionary = afterDictionary; + _displaySize = CGSizeMakeCopy(aSize); } return self; @@ -685,7 +703,7 @@ function CPAppKitImage(aFilename, aSize) aStyleNode.replaceChild(styleDescription, aStyleNode.firstChild); } - [aView setDOMClassName:@"CP"+[aView UID]]; + aDOMElement.className = @"CP"+[aView UID]; } else { @@ -707,6 +725,11 @@ function CPAppKitImage(aFilename, aSize) #endif } +- (BOOL)_shouldBeResized +{ + return NO; +} + @end var CPImageCSSDictionaryKey = @"CPImageCSSDictionaryKey", @@ -750,6 +773,168 @@ var CPImageCSSDictionaryKey = @"CPImageCSSDictionaryKey", @end +#pragma mark - + +@implementation _CPMaterialIconImage : CPImage +{ + CPMutableDictionary _cachedColorVersions; + CPColor _cachedInvertedColor; +} + ++ (_CPMaterialIconImage)imageWithIconNamed:(CPString)iconName size:(CGSize)size +{ + return [[_CPMaterialIconImage alloc] initWithIconName:iconName size:size]; +} + ++ (_CPMaterialIconImage)imageWithIconNamed:(CPString)iconName size:(CGSize)size color:(CPColor)color +{ + return [[_CPMaterialIconImage alloc] initWithIconName:iconName size:size color:color]; +} + ++ (_CPMaterialIconImage)imageWithIconNamed:(CPString)iconName size:(CGSize)size color:(CPColor)color additionalCSSDictionary:(CPDictionary)additionalCSSDictionary +{ + return [[_CPMaterialIconImage alloc] initWithIconName:iconName size:size color:color additionalCSSDictionary:additionalCSSDictionary]; +} + +- (CPDictionary)_baseMaterialIconCSSDictionaryForIconName:(CPString)iconName size:(CGSize)size +{ + return @{ + @"width": size.width + @"px", + @"height": size.height + @"px", + @"top": @"0px", + @"left": @"0px", + @"content": @"'" + iconName + @"'", + + @"position": @"absolute", + @"z-index": @"300", + + @"font-family": @"'Material Icons'", + @"font-weight": @"normal", + @"font-style": @"normal", + @"font-size": MIN(size.width, size.height) + @"px", + @"display": @"inline-block", + @"line-height": @"1", + @"text-transform": @"none", + @"letter-spacing": @"normal", + @"word-wrap": @"normal", + @"white-space": @"nowrap", + @"direction": @"ltr", + @"-webkit-font-smoothing": @"antialiased", + @"text-rendering": @"optimizeLegibility", + @"-moz-osx-font-smoothing": @"grayscale", + @"font-feature-settings": @"'liga'" + }; +} + +- (_CPMaterialIconImage)initWithIconName:(CPString)iconName size:(CGSize)size +{ + return [super initWithCSSDictionary:@{} + beforeDictionary:@{} + afterDictionary:[self _baseMaterialIconCSSDictionaryForIconName:iconName size:size] + size:size]; +} + +- (_CPMaterialIconImage)initWithIconName:(CPString)iconName size:(CGSize)size color:(CPColor)color +{ + var materialIconCSSDictionary = [self _baseMaterialIconCSSDictionaryForIconName:iconName size:size]; + + [materialIconCSSDictionary setObject:[color cssString] forKey:@"color"]; + + return [super initWithCSSDictionary:@{} + beforeDictionary:@{} + afterDictionary:materialIconCSSDictionary + size:size]; +} + +- (void)addRotationEffectWithAngle:(float)angle +{ + [self addCSSDictionary:@{ + @"transform": @"rotate("+angle+"deg)", + @"transition": @"transform 0.35s ease" + }]; +} + +- (void)addCSSDictionary:(CPDictionary)additionalCSSDictionary +{ + [_cssAfterDictionary addEntriesFromDictionary:additionalCSSDictionary]; +} + +- (void)setSize:(CGSize)aSize +{ + [self _setDisplaySize:aSize]; + [super setSize:aSize]; +} + +- (void)_setDisplaySize:(CGSize)aSize +{ + if (CGSizeEqualToSize(_displaySize, aSize)) + return; + + _displaySize = CGSizeMakeCopy(aSize); + + [_cssAfterDictionary setObject:(aSize.width + @"px") forKey:@"width"]; + [_cssAfterDictionary setObject:(aSize.height + @"px") forKey:@"height"]; + [_cssAfterDictionary setObject:(MIN(aSize.width, aSize.height) + @"px") forKey:@"font-size"]; +} + +- (BOOL)_shouldBeResized +{ + return YES; +} + +- (BOOL)isMaterialIconImage +{ + return YES; +} + +- (_CPMaterialIconImage)invertedImage +{ + if (!_cachedInvertedColor) + { + var sourceCSSColor = [_cssAfterDictionary objectForKey:@"color"] || @"rgba(0,0,0,1)", + sourceColor = [CPColor colorWithCSSString:sourceCSSColor]; + + _cachedInvertedColor = [CPColor colorWithRed:(1-[sourceColor redComponent]) + green:(1-[sourceColor greenComponent]) + blue:(1-[sourceColor blueComponent]) + alpha:[sourceColor alphaComponent]]; + } + + return [self imageVersionWithColor:_cachedInvertedColor]; +} + +- (_CPMaterialIconImage)imageVersionWithColor:(CPColor)aColor +{ + // We can't just set the color in the cssAfterDictionary as this would not be noticed as a new image, + // so -setImage won't do anything, so no visual refresh won't occur. + // The trick here is to keep in cache a clone of this image for each needed color. + var colorCSSString = [aColor cssString]; + + if (!_cachedColorVersions) + _cachedColorVersions = @{}; + + var cachedColorVersion = [_cachedColorVersions objectForKey:colorCSSString]; + + if (!cachedColorVersion) + { + cachedColorVersion = [self duplicate]; + [cachedColorVersion _setCSSColor:colorCSSString]; + + [_cachedColorVersions setObject:cachedColorVersion forKey:colorCSSString]; + } + + return cachedColorVersion; +} + +- (void)_setCSSColor:(CPString)aCSSColor +{ + [_cssAfterDictionary setObject:aCSSColor forKey:@"color"]; +} + +@end + +#pragma mark - + @implementation CPThreePartImage : CPObject { CPArray _imageSlices; @@ -890,3 +1075,14 @@ var CPNinePartImageImageSlicesKey = @"CPNinePartImageImageSlicesKey"; } @end + +#pragma mark - + +@implementation CPImage (Duplication) + +- (CPImage)duplicate +{ + return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:self]]; +} + +@end diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j index e8afee844..677aa7cad 100644 --- a/AppKit/CPImageView.j +++ b/AppKit/CPImageView.j @@ -99,8 +99,8 @@ var CPImageViewEmptyPlaceholderImage = nil; { #if PLATFORM(DOM) var image = [self objectValue], - isCSSBasedImage = [image isCSSBased], - isIMGImageElement = _DOMImageElement && (_DOMImageElement.nodeName == "IMG"); + isCSSBasedImage = [image isCSSBased], + isIMGImageElement = _DOMImageElement && (_DOMImageElement.nodeName == "IMG"); // First, check if we need to destroy a current DOM image element. This is the case if : // - we have one but not the right one (that is a DIV but needing an IMG, and vice versa) @@ -444,6 +444,18 @@ var CPImageViewEmptyPlaceholderImage = nil; #endif } +#if PLATFORM(DOM) + if ([image isCSSBased] && [image _shouldBeResized]) + { + [image _setDisplaySize:CGSizeMake(ROUND(width), ROUND(height))]; + + _cssStyleNode = [image applyCSSImageForView:self + onDOMElement:_DOMImageElement + styleNode:_cssStyleNode + previousState:@ref(_cssStylePreviousState)]; + } +#endif + _imageRect = CGRectMake(x, y, width, height); if (_hasShadow) diff --git a/AppKit/CPLevelIndicator.j b/AppKit/CPLevelIndicator.j index 94319181f..ae3ca291f 100644 --- a/AppKit/CPLevelIndicator.j +++ b/AppKit/CPLevelIndicator.j @@ -22,15 +22,10 @@ @import "CPControl.j" @import "CPWindow_Constants.j" +@import "CPSlider.j" @global CPApp -@typedef CPTickMarkPosition -CPTickMarkBelow = 0; -CPTickMarkAbove = 1; -CPTickMarkLeft = CPTickMarkAbove; -CPTickMarkRight = CPTickMarkBelow; - @typedef CPLevelIndicatorStyle CPRelevancyLevelIndicatorStyle = 0; CPContinuousCapacityLevelIndicatorStyle = 1; diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j index 655022c97..e96fd03c6 100644 --- a/AppKit/CPMenu/CPMenu.j +++ b/AppKit/CPMenu/CPMenu.j @@ -1293,6 +1293,37 @@ var CPMenuTitleKey = @"CPMenuTitleKey", @end +#pragma mark - + +@implementation CPMenu (CSSTheming) + ++ (void)setNamedValue:(CPString)aName forKey:(CPString)aKey inAttributes:(CPDictionary)aDictionary forTheme:(CPTheme)aTheme +{ + var value = [aTheme valueForAttributeWithName:aName forClass:_CPMenuView]; + + if (value) + [aDictionary setObject:value forKey:aKey]; + else + [aDictionary removeObjectForKey:aKey]; +} + ++ (void)updateMenuBarAttributesWithTheme:(CPTheme)aTheme +{ + var newAttributes = @{}; + + [CPMenu setNamedValue:@"menu-bar-text-color" forKey:@"CPMenuBarTextColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-title-color" forKey:@"CPMenuBarTitleColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-text-shadow-color" forKey:@"CPMenuBarTextShadowColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-title-shadow-color" forKey:@"CPMenuBarTitleShadowColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-highlight-color" forKey:@"CPMenuBarHighlightColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-highlight-text-color" forKey:@"CPMenuBarHighlightTextColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-highlight-text-shadow-color" forKey:@"CPMenuBarHighlightTextShadowColor" inAttributes:newAttributes forTheme:aTheme]; + + [CPMenu setMenuBarAttributes:newAttributes]; +} + +@end + @import "_CPMenuBarWindow.j" @import "_CPMenuWindow.j" diff --git a/AppKit/CPMenu/_CPMenuBarWindow.j b/AppKit/CPMenu/_CPMenuBarWindow.j index 876aae593..25975a70f 100644 --- a/AppKit/CPMenu/_CPMenuBarWindow.j +++ b/AppKit/CPMenu/_CPMenuBarWindow.j @@ -25,6 +25,7 @@ @class _CPMenuView @class CPMenu +@class CPMenuItem @global CPMenuDidAddItemNotification @global CPMenuDidChangeItemNotification @@ -129,10 +130,12 @@ - (void)setColor:(CPColor)aColor { + var targetView = [[CPTheme defaultTheme] valueForAttributeWithName:@"css-based" forClass:CPView] ? [[self contentView] superview] : [self contentView]; + if (!aColor) - [[self contentView] setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-background-color" forClass:_CPMenuView]]; + [targetView setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-background-color" forClass:_CPMenuView]]; else - [[self contentView] setBackgroundColor:aColor]; + [targetView setBackgroundColor:aColor]; } - (void)setTextColor:(CPColor)aColor @@ -277,6 +280,16 @@ [menuItemView setTextColor:_textColor]; [menuItemView setHidden:[item isHidden]]; + // If first menu item has tag -1 and if there is a special theme value menu-bar-window-first-item-font, + // set the corresponding font. This is used to set bold on the first item of the menubar (à la Cocoa) + if ((index == 0) && ([item tag] == -1)) + { + var firstItemFont = [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-first-item-font" forClass:_CPMenuView]; + + if (firstItemFont) + [item setFont:firstItemFont]; + } + [menuItemView synchronizeWithMenuItem]; [contentView addSubview:menuItemView]; diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j index 8ad054f34..187b669db 100644 --- a/AppKit/CPMenu/_CPMenuManager.j +++ b/AppKit/CPMenu/_CPMenuManager.j @@ -28,6 +28,8 @@ @class CPWindow @class _CPMenuWindow +@class _CPMenuView +@class CPMenuItem @global CPApp @@ -223,7 +225,7 @@ var STICKY_TIME_INTERVAL = 0.4, _lastGlobalLocation = globalLocation; // If the item isn't enabled its as if we clicked on nothing. - if (![activeItem isEnabled] || [activeItem _isMenuBarButton]) + if ([activeItem _isMenuBarButton]) { activeItemIndex = CPNotFound; activeItem = nil; @@ -352,7 +354,23 @@ var STICKY_TIME_INTERVAL = 0.4, if ([activeMenuContainer isMenuBar]) newMenuOrigin = CGPointMake(CGRectGetMinX(activeItemRect), CGRectGetMaxY(activeItemRect)); else - newMenuOrigin = CGPointMake(CGRectGetMaxX(activeItemRect), CGRectGetMinY(activeItemRect)); + { + // New theme attributes to have more precise submenus positioning + + var defaultTheme = [CPTheme defaultTheme], + themeDeltaX = [defaultTheme valueForAttributeWithName:@"menu-window-submenu-delta-x" forClass:_CPMenuView], + themeDeltaY = [defaultTheme valueForAttributeWithName:@"menu-window-submenu-delta-y" forClass:_CPMenuView], + themeFirstDeltaY = [defaultTheme valueForAttributeWithName:@"menu-window-submenu-first-level-delta-y" forClass:_CPMenuView], + activeMenuIndex = [_menuContainerStack indexOfObject:activeMenuContainer], + + deltaX = themeDeltaX ? themeDeltaX : 0, + deltaY = themeDeltaY ? themeDeltaY : 0; + + if (themeFirstDeltaY && (activeMenuIndex == 1) && [_menuContainerStack[0] isMenuBar]) + deltaY += themeFirstDeltaY; + + newMenuOrigin = CGPointMake(CGRectGetMaxX(activeItemRect)+deltaX, CGRectGetMinY(activeItemRect)+deltaY); + } newMenuOrigin = [activeMenuContainer convertBaseToGlobal:newMenuOrigin]; @@ -580,6 +598,8 @@ var STICKY_TIME_INTERVAL = 0.4, [self selectNextItemBeginningWith:_keyBuffer inMenu:menu]; _lastGlobalLocation = nil; } + + [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:NO]; } - (void)selectNextItemBeginningWith:(CPString)characters inMenu:(CPMenu)menu @@ -725,39 +745,32 @@ var STICKY_TIME_INTERVAL = 0.4, - (void)moveDown:(CPMenu)menu { - var index = menu._highlightedIndex + 1; + var index = menu._highlightedIndex + 1, + item; + + // Search for the next enabled item + while ((index < [menu numberOfItems]) && (item = [menu itemAtIndex:index]) && ([item isSeparatorItem] || [item isHidden] || ![item isEnabled])) + index++; if (index < [menu numberOfItems]) - { [menu _highlightItemAtIndex:index]; - - var item = [menu highlightedItem]; - - if ([item isSeparatorItem] || [item isHidden] || ![item isEnabled]) - [self moveDown:menu]; - } else if (menu == [CPApp mainMenu]) [menu _highlightItemAtIndex:0]; } - (void)moveUp:(CPMenu)menu { - var index = menu._highlightedIndex - 1; + var index = menu._highlightedIndex - 1, + item; - if (index < 0) - { - if (index != CPNotFound || menu == [CPApp mainMenu]) - [menu _highlightItemAtIndex:[menu numberOfItems] - 1]; + // Search for the previous enabled item + while ((index >= 0) && (item = [menu itemAtIndex:index]) && ([item isSeparatorItem] || [item isHidden] || ![item isEnabled])) + index--; - return; - } - - [menu _highlightItemAtIndex:index]; - - var item = [menu highlightedItem]; - - if ([item isSeparatorItem] || [item isHidden] || ![item isEnabled]) - [self moveUp:menu]; + if (index >= 0) + [menu _highlightItemAtIndex:index]; + else if (menu == [CPApp mainMenu]) + [menu _highlightItemAtIndex:[menu numberOfItems] - 1]; } - (void)insertNewline:(CPMenu)menu diff --git a/AppKit/CPMenu/_CPMenuWindow.j b/AppKit/CPMenu/_CPMenuWindow.j index 91672280f..53237a5a1 100644 --- a/AppKit/CPMenu/_CPMenuWindow.j +++ b/AppKit/CPMenu/_CPMenuWindow.j @@ -465,6 +465,7 @@ _CPMenuWindowAttachedMenuBackgroundStyle = 2; @"menu-bar-window-background-color": [CPNull null], @"menu-bar-window-background-selected-color": [CPNull null], @"menu-bar-window-font": [CPNull null], + @"menu-bar-window-first-item-font": [CPNull null], @"menu-bar-window-height": 30.0, @"menu-bar-window-margin": 10.0, @"menu-bar-window-left-margin": 10.0, @@ -482,6 +483,9 @@ _CPMenuWindowAttachedMenuBackgroundStyle = 2; @"menu-general-icon-new": [CPNull null], @"menu-general-icon-save": [CPNull null], @"menu-general-icon-open": [CPNull null], + @"menu-window-submenu-delta-x": 0.0, + @"menu-window-submenu-delta-y": 0.0, + @"menu-window-submenu-first-level-delta-y": 0.0 }; } diff --git a/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j b/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j index 86f756b11..c9c2af563 100644 --- a/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j +++ b/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j @@ -31,7 +31,9 @@ + (id)view { - return [[self alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 10.0)]; + var themedHeight = [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-item-separator-view-height" forClass:_CPMenuItemStandardView]; + + return [[self alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, (themedHeight ? themedHeight : 10.0))]; } - (id)initWithFrame:(CGRect)aFrame @@ -47,12 +49,25 @@ - (void)drawRect:(CGRect)aRect { var context = [[CPGraphicsContext currentContext] graphicsPort], - bounds = [self bounds]; + bounds = [self bounds], + height = CGRectGetMaxY(bounds), + themedHeight = [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-item-separator-height" forClass:_CPMenuItemStandardView], + lineHeight = themedHeight ? themedHeight : 1.0; CGContextBeginPath(context); - CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); - CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); + CGContextSetLineWidth(context, lineHeight); + + if (!!((height - lineHeight) % 2)) + { + CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); + CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); + } + else + { + CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds))); + CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds))); + } CGContextSetStrokeColor(context, [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-item-separator-color" forClass:_CPMenuItemStandardView]); CGContextStrokePath(context); diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j index 76453ac4a..0c7a2e5de 100644 --- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j +++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j @@ -41,6 +41,8 @@ _CPImageAndTextView _imageAndTextView; _CPImageAndTextView _keyEquivalentView; CPView _submenuIndicatorView; + + BOOL _hasSubmenuIndicatorImage; } + (CPString)defaultThemeClass @@ -63,12 +65,17 @@ @"menu-item-default-mixed-state-image": [CPNull null], @"menu-item-default-mixed-state-highlighted-image": [CPNull null], @"menu-item-separator-color": [CPNull null], + @"menu-item-separator-height": 1.0, + @"menu-item-separator-view-height": 10.0, @"left-margin": 3.0, @"right-margin": 17.0, @"state-column-width": 14.0, @"indentation-width": 17.0, @"vertical-margin": 4.0, + @"vertical-offset": 0.0, @"right-columns-margin": 30.0, + @"submenu-indicator-image": [CPNull null], + @"submenu-indicator-highlighted-image": [CPNull null] }; } @@ -91,6 +98,7 @@ _stateView = [[CPImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 0.0)]; [_stateView setImageScaling:CPImageScaleNone]; + [_stateView setImageAlignment:CPImageAlignCenter]; [self addSubview:_stateView]; @@ -109,9 +117,24 @@ [self addSubview:_keyEquivalentView]; - _submenuIndicatorView = [[_CPMenuItemSubmenuIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 8.0, 10.0)]; + // Do we have a submenu indicator image specified in the theme ? + _hasSubmenuIndicatorImage = !![self valueForThemeAttribute:@"submenu-indicator-image"]; + + if (_hasSubmenuIndicatorImage) + { + // Yes, then use an imageView + _submenuIndicatorView = [[CPImageView alloc] initWithFrame:CGRectMakeZero()]; + + [_submenuIndicatorView setImageAlignment:CPImageAlignCenter]; + } + else + { + // No, then use self drawing _CPMenuItemSubmenuIndicatorView + _submenuIndicatorView = [[_CPMenuItemSubmenuIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 8.0, 10.0)]; + + [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; + } - [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; [_submenuIndicatorView setAutoresizingMask:CPViewMinXMargin]; [self addSubview:_submenuIndicatorView]; @@ -149,11 +172,24 @@ _font = aFont; } +- (CPFont)font +{ + // Menu item font is forced local font or _menuItem font or system font + return _font || [_menuItem font] || [CPFont systemFontOfSize:CPFontCurrentSystemSize]; +} + +// FIXME: update is called 2 times at each display. Find why and fix. - (void)update { var x = [self valueForThemeAttribute:@"left-margin"] + [_menuItem indentationLevel] * [self valueForThemeAttribute:@"indentation-width"], height = 0.0, - hasStateColumn = [[_menuItem menu] showsStateColumn]; + hasStateColumn = [[_menuItem menu] showsStateColumn], + myFont = [self font], + + // When possible, use specific vertical margin/offset value based on font size (which could have been set by control size) + correspondingControlSize = [myFont controlSizeCorrespondingToFontSize], + verticalMargin = [self valueForThemeAttribute:@"vertical-margin" inState:CPControlSizeThemeStates[correspondingControlSize]], + verticalOffset = [self valueForThemeAttribute:@"vertical-offset" inState:CPControlSizeThemeStates[correspondingControlSize]]; if (hasStateColumn) { @@ -163,15 +199,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: @@ -188,7 +224,7 @@ else [_stateView setHidden:YES]; - [_imageAndTextView setFont:[_menuItem font] || _font]; + [_imageAndTextView setFont:myFont]; [_imageAndTextView setVerticalAlignment:CPCenterVerticalTextAlignment]; [_imageAndTextView setImage:[_menuItem image]]; [_imageAndTextView setText:[_menuItem title]]; @@ -201,7 +237,7 @@ imageAndTextViewFrame.origin.x = x; x += CGRectGetWidth(imageAndTextViewFrame); - height = MAX(height, CGRectGetHeight(imageAndTextViewFrame)); + height = MAX(height, CGRectGetHeight(imageAndTextViewFrame)); // FIXME: here, height = 0 -> MAX useless var hasKeyEquivalent = !![_menuItem keyEquivalent], hasSubmenu = [_menuItem hasSubmenu]; @@ -211,14 +247,14 @@ if (hasKeyEquivalent) { - [_keyEquivalentView setFont:[_menuItem font] || _font]; + [_keyEquivalentView setFont:myFont]; [_keyEquivalentView setVerticalAlignment:CPCenterVerticalTextAlignment]; [_keyEquivalentView setImage:[_menuItem image]]; [_keyEquivalentView setText:[_menuItem keyEquivalentStringRepresentation]]; [_keyEquivalentView setTextColor:[self textColor]]; [_keyEquivalentView setTextShadowColor:[self textShadowColor]]; [_keyEquivalentView setTextShadowOffset:CGSizeMake(0, 1)]; - [_keyEquivalentView setFrameOrigin:CGPointMake(x, [self valueForThemeAttribute:@"vertical-margin"])]; + [_keyEquivalentView setFrameOrigin:CGPointMake(x, verticalMargin)]; [_keyEquivalentView sizeToFit]; var keyEquivalentViewFrame = [_keyEquivalentView frame]; @@ -235,6 +271,14 @@ if (hasSubmenu) { + if (_hasSubmenuIndicatorImage) + { + var submenuIndicatorImage = [self valueForThemeAttribute:@"submenu-indicator-image" inState:CPControlSizeThemeStates[correspondingControlSize]]; + + [_submenuIndicatorView setImage:submenuIndicatorImage]; + [_submenuIndicatorView setFrameSize:[submenuIndicatorImage size]]; + } + [_submenuIndicatorView setHidden:NO]; var submenuViewFrame = [_submenuIndicatorView frame]; @@ -247,9 +291,9 @@ else [_submenuIndicatorView setHidden:YES]; - height += 2.0 * [self valueForThemeAttribute:@"vertical-margin"]; + height += 2.0 * verticalMargin; - imageAndTextViewFrame.origin.y = FLOOR((height - CGRectGetHeight(imageAndTextViewFrame)) / 2.0); + imageAndTextViewFrame.origin.y = FLOOR((height - CGRectGetHeight(imageAndTextViewFrame)) / 2.0) + verticalOffset; [_imageAndTextView setFrame:imageAndTextViewFrame]; if (hasStateColumn) @@ -257,7 +301,7 @@ if (hasKeyEquivalent) { - keyEquivalentViewFrame.origin.y = FLOOR((height - CGRectGetHeight(keyEquivalentViewFrame)) / 2.0); + keyEquivalentViewFrame.origin.y = FLOOR((height - CGRectGetHeight(keyEquivalentViewFrame)) / 2.0) + verticalOffset; [_keyEquivalentView setFrame:keyEquivalentViewFrame]; } @@ -282,6 +326,8 @@ _highlighted = shouldHighlight; + var correspondingControlSize = [[self font] controlSizeCorrespondingToFontSize]; + [_imageAndTextView setTextColor:[self textColor]]; [_keyEquivalentView setTextColor:[self textColor]]; [_imageAndTextView setTextShadowColor:[self textShadowColor]]; @@ -291,13 +337,21 @@ { [self setBackgroundColor:[self valueForThemeAttribute:@"menu-item-selection-color"]]; [_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]]; - [_submenuIndicatorView setColor:[self textColor]]; + + if (_hasSubmenuIndicatorImage) + [_submenuIndicatorView setImage:[self valueForThemeAttribute:@"submenu-indicator-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + else + [_submenuIndicatorView setColor:[self textColor]]; } else { [self setBackgroundColor:nil]; [_imageAndTextView setImage:[_menuItem image]]; - [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; + + if (_hasSubmenuIndicatorImage) + [_submenuIndicatorView setImage:[self valueForThemeAttribute:@"submenu-indicator-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + else + [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; } if ([[_menuItem menu] showsStateColumn]) @@ -307,15 +361,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-highlighted-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-highlighted-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-highlighted-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: @@ -327,15 +381,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: diff --git a/AppKit/CPRadio.j b/AppKit/CPRadio.j index cd5f5196d..a2b6f51d9 100644 --- a/AppKit/CPRadio.j +++ b/AppKit/CPRadio.j @@ -67,6 +67,18 @@ CPRadioImageOffset = 4.0; [[button1 radioGroup] selectedRadio] returns the currently selected option. + UPDATE 09/2020 : Implementation of modern Cocoa behavior : + + As in Cocoa, radio buttons grouping is now automatic. + + To be associated in a common group (and so being mutually exclusive), + radio buttons must combine 2 criteria : + + - same superview (enclosing view) + - same action + + TODO: This first implementation uses "as is" CPRadioGroup. This could + be simplified (no more need for radio group action, for example) */ @implementation CPRadio : CPButton { @@ -160,6 +172,63 @@ CPRadioImageOffset = 4.0; [CPApp sendAction:[_radioGroup action] to:[_radioGroup target] from:_radioGroup]; } +- (void)viewDidMoveToSuperview +{ + [self _setRadioGroup]; + [super viewDidMoveToSuperview]; +} + +- (void)setAction:(SEL)anAction +{ + if (anAction === _action) + return; + + [super setAction:anAction]; + [self _setRadioGroup]; +} + +#pragma mark Private methods + +- (void)_setRadioGroup +{ + // Implementation of modern Cocoa behavior : automatic radio group + + // If no action is set or no superview, no grouping can be done. + if (![self action] || ![self superview]) + { + // If I'm in a group (size > 1), remove me. + if ([[self radioGroup] size] > 1) + [self setRadioGroup:[CPRadioGroup new]]; + + return; + } + + // Search in superview subviews for other radio buttons having the same action. + // Take the one with the radio group having the greatest number of members. + + var radioGroup; + + for (var i = 0, superviewSubviews = [[self superview] subviews], count = [superviewSubviews count], aSubview, myAction = [self action], radioGroupSize = -1; (i < count); i++) + { + aSubview = superviewSubviews[i]; + + if ([aSubview isKindOfClass:CPRadio] && (aSubview !== self) && ([aSubview action] === myAction) && ([[aSubview radioGroup] size] > radioGroupSize)) + { + radioGroup = [aSubview radioGroup]; + radioGroupSize = [radioGroup size]; + } + } + + if (radioGroup) + [self setRadioGroup:radioGroup]; + else + // No other radio buttons to group with found. + // It may be because this radio button was in a radio group and its action was changed. + // If this is the case, we must reisolate it in a new radio group. + if ([_radioGroup size] > 1) + [self setRadioGroup:[CPRadioGroup new]]; +} + @end var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey"; @@ -183,21 +252,37 @@ var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey"; [aCoder encodeObject:_radioGroup forKey:CPRadioRadioGroupKey]; } -- (CPImage)image +#pragma mark - +#pragma mark Override methods from CPButton + +- (CPThemeState)_contentVisualState { - return [self currentValueForThemeAttribute:@"image"]; + // Note : Behavior differs from CPButton as title doesn't follow the highlightsBy content flag + + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; } -- (CPImage)alternateImage +- (CPThemeState)_imageVisualState { - return [self currentValueForThemeAttribute:@"image"]; -} + // Note : Behavior differs from CPButton as we don't force "not selected" theme state + // when button is highglighted and selected -- (BOOL)startTrackingAt:(CGPoint)aPoint -{ - var startedTracking = [super startTrackingAt:aPoint]; - [self highlight:YES]; - return startedTracking; + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if (_isHighlighted && (_highlightsBy & CPContentsCellMask)) + visualState = visualState.and(CPThemeStateHighlighted); + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; } @end @@ -304,6 +389,11 @@ var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey"; return _radios; } +- (int)size +{ + return [_radios count]; +} + - (void)setEnabled:(BOOL)enabled { [_radios makeObjectsPerformSelector:@selector(setEnabled:) withObject:enabled]; diff --git a/AppKit/CPSlider.j b/AppKit/CPSlider.j index 2190118d2..b13d4d078 100644 --- a/AppKit/CPSlider.j +++ b/AppKit/CPSlider.j @@ -5,6 +5,9 @@ * Created by Francisco Tolmasky. * Copyright 2009, 280 North, Inc. * + * Adapted by Didier Korthoudt + * Copyright 2018 + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -26,8 +29,26 @@ /*! SLIDER STATES */ -CPLinearSlider = 0; -CPCircularSlider = 1; +@typedef CPSliderType +CPLinearSlider = 0; +CPCircularSlider = 1; + +/*! SLIDER TICK MARK POSITION */ + +@typedef CPTickMarkPosition +CPTickMarkPositionBelow = 0; +CPTickMarkPositionAbove = 1; +CPTickMarkPositionLeading = CPTickMarkPositionAbove; +CPTickMarkPositionTrailing = CPTickMarkPositionBelow; + +/*! Ticked sliders specific states */ + +CPThemeStateTickedSlider = CPThemeState("ticked-slider"); +CPThemeStateAboveLeftTickedSlider = CPThemeState("above-left-ticked-slider"); +CPThemeStateBelowRightTickedSlider = CPThemeState("below-right-ticked-slider"); + +/*! Tick mark affinity distance */ +var AFFINITY = 5; /*! @ingroup appkit @@ -35,13 +56,30 @@ CPCircularSlider = 1; @implementation CPSlider : CPControl { - double _minValue; - double _maxValue; - double _altIncrementValue; + double _minValue; + double _maxValue; + double _altIncrementValue; - BOOL _isVertical; + CPInteger _isVertical; + BOOL _isCircular; + BOOL _isTicked; + BOOL _isContinuous; - CGSize _dragOffset; + CGSize _dragOffset; + + CPSliderType _sliderType @accessors(property=sliderType); + BOOL _allowsTickMarkValuesOnly @accessors(property=allowsTickMarkValuesOnly); + CPTickMarkPosition _tickMarkPosition @accessors(property=tickMarkPosition); + CPInteger _numberOfTickMarks @accessors(property=numberOfTickMarks); + + CPMutableArray _cachedTickMarksRects; + CPMutableArray _cachedTickMarksSegments; + CPMutableArray _cachedTickMarksValues; + CPInteger _currentTickMarkSegment; + CPInteger _closestTickMarkIndex; + CPInteger _affinityPoint; + BOOL _canStickOnTickMarks; + BOOL _stickingOnTickMark; } + (CPString)defaultThemeClass @@ -52,10 +90,19 @@ CPCircularSlider = 1; + (CPDictionary)themeAttributes { return @{ - @"knob-color": [CPNull null], - @"knob-size": CGSizeMakeZero(), - @"track-width": 0.0, - @"track-color": [CPNull null], + @"left-track-color": [CPNull null], + @"knob-color": [CPNull null], + @"knob-size": CGSizeMakeZero(), + @"knob-offset": 0.0, + @"track-width": 0.0, + @"track-color": [CPNull null], + @"direct-nib2cib-adjustment": NO, + @"tick-mark-size": CGSizeMakeZero(), + @"tick-mark-color": [CPNull null], + @"tick-mark-margin": 0, + @"top-margin": 0, + @"bottom-margin": 0, + @"ib-size": -1 }; } @@ -69,10 +116,11 @@ CPCircularSlider = 1; _maxValue = 100.0; [self setObjectValue:50.0]; - [self setContinuous:YES]; + [self setNumberOfTickMarks:0]; + [self setSliderType:CPLinearSlider]; - [self _recalculateIsVertical]; + [self _refreshCachesAndStates]; } return self; @@ -90,6 +138,8 @@ CPCircularSlider = 1; if (doubleValue < _minValue) [self setDoubleValue:_minValue]; + [self _refreshCachesAndStates]; + // The relative position may have (did) change. [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -112,6 +162,8 @@ CPCircularSlider = 1; if (doubleValue > _maxValue) [self setDoubleValue:_maxValue]; + [self _refreshCachesAndStates]; + // The relative position may have (did) change. [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -124,7 +176,9 @@ CPCircularSlider = 1; - (void)setObjectValue:(id)aValue { + [self willChangeValueForKey:@"objectValue"]; [super setObjectValue:MIN(MAX(aValue, _minValue), _maxValue)]; + [self didChangeValueForKey:@"objectValue"]; [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -132,51 +186,115 @@ CPCircularSlider = 1; - (void)setSliderType:(CPSliderType)aSliderType { - if (aSliderType === CPCircularSlider) - [self setThemeState:CPThemeStateCircular]; - else - [self unsetThemeState:CPThemeStateCircular]; + if (aSliderType === _sliderType) + return; + + _sliderType = aSliderType; + + [self _refreshCachesAndStates]; } - (CPSliderType)sliderType { - return [self hasThemeState:CPThemeStateCircular] ? CPCircularSlider : CPLinearSlider; + return _sliderType; } - (CGRect)trackRectForBounds:(CGRect)bounds { - if ([self hasThemeState:CPThemeStateCircular]) + var trackRect = CGRectCreateCopy(bounds); + + if (_isCircular) { - var originalBounds = CGRectCreateCopy(bounds); + var tickMarkMargin = [self currentValueForThemeAttribute:@"tick-mark-margin"]; - bounds.size.width = MIN(bounds.size.width, bounds.size.height); - bounds.size.height = bounds.size.width; + trackRect.size.width = MIN(trackRect.size.width, trackRect.size.height) - tickMarkMargin * 2; + trackRect.size.height = trackRect.size.width; - if (bounds.size.width < originalBounds.size.width) - bounds.origin.x += (originalBounds.size.width - bounds.size.width) / 2.0; - else - bounds.origin.y += (originalBounds.size.height - bounds.size.height) / 2.0; + trackRect.origin.x = tickMarkMargin; + trackRect.origin.y = tickMarkMargin; } else { - var trackWidth = [self currentValueForThemeAttribute:@"track-width"]; + var trackWidth = [self currentValueForThemeAttribute:@"track-width"], + tickMarkSize = [self currentValueForThemeAttribute:@"tick-mark-size"], + tickMarkMargin = [self currentValueForThemeAttribute:@"tick-mark-margin"], + topMargin = [self currentValueForThemeAttribute:@"top-margin"], + bottomMargin = [self currentValueForThemeAttribute:@"bottom-margin"]; if (trackWidth <= 0) return CGRectMakeZero(); - if ([self isVertical]) + if (_isVertical) { - bounds.origin.x = (CGRectGetWidth(bounds) - trackWidth) / 2.0; - bounds.size.width = trackWidth; + var usableWidth = trackRect.size.width - topMargin - bottomMargin - (_isTicked ? (tickMarkSize.width + tickMarkMargin) : 0); + + trackRect.origin.x = (usableWidth - trackWidth) / 2.0 + topMargin + ((_isTicked && (_tickMarkPosition === CPTickMarkPositionLeading)) ? (tickMarkSize.width + tickMarkMargin) : 0); + trackRect.size.width = trackWidth; } else { - bounds.origin.y = (CGRectGetHeight(bounds) - trackWidth) / 2.0; - bounds.size.height = trackWidth; + var usableHeight = trackRect.size.height - topMargin - bottomMargin - (_isTicked ? (tickMarkSize.height + tickMarkMargin) : 0); + + trackRect.origin.y = (usableHeight - trackWidth) / 2.0 + topMargin + ((_isTicked && (_tickMarkPosition === CPTickMarkPositionAbove)) ? (tickMarkSize.height + tickMarkMargin) : 0); + trackRect.size.height = trackWidth; } } - return bounds; + return trackRect; +} + +- (CGRect)leftTrackRectForBounds:(CGRect)bounds +{ + // Circular and ticked slider do not have left and right parts, so we don't need to deal with them + if (_isCircular || _isTicked) + return CGRectMakeZero(); + + var trackRect = CGRectCreateCopy(bounds), + trackWidth = [self currentValueForThemeAttribute:@"track-width"], + currentValue = [self doubleValue]; + + if (_isVertical) + { + trackRect.origin.x = (trackRect.size.width - trackWidth) / 2.0; + trackRect.origin.y = ((_maxValue - currentValue) / (_maxValue - _minValue)) * trackRect.size.height; + trackRect.size.width = trackWidth; + trackRect.size.height = ((currentValue - _minValue) / (_maxValue - _minValue)) * trackRect.size.height; + } + else + { + trackRect.origin.y = (trackRect.size.height - trackWidth) / 2.0; + trackRect.size.width = ((currentValue - _minValue) / (_maxValue - _minValue)) * trackRect.size.width; + trackRect.size.height = trackWidth; + } + + return trackRect; +} + +- (CGRect)rightTrackRectForBounds:(CGRect)bounds +{ + // Circular and ticked slider do not have left and right parts, so we don't need to deal with them + if (_isCircular || _isTicked) + return CGRectMakeZero(); + + var trackRect = CGRectCreateCopy(bounds), + trackWidth = [self currentValueForThemeAttribute:@"track-width"], + currentValue = [self doubleValue]; + + if (_isVertical) + { + trackRect.origin.x = (trackRect.size.width - trackWidth) / 2.0; + trackRect.size.width = trackWidth; + trackRect.size.height = ((_maxValue - currentValue) / (_maxValue - _minValue)) * trackRect.size.height; + } + else + { + trackRect.origin.x = ((currentValue - _minValue) / (_maxValue - _minValue)) * trackRect.size.width; + trackRect.origin.y = (trackRect.size.height - trackWidth) / 2.0; + trackRect.size.width = ((_maxValue - currentValue) / (_maxValue - _minValue)) * trackRect.size.width; + trackRect.size.height = trackWidth; + } + + return trackRect; } - (CGRect)knobRectForBounds:(CGRect)bounds @@ -186,30 +304,41 @@ CPCircularSlider = 1; if (knobSize.width <= 0 || knobSize.height <= 0) return CGRectMakeZero(); - var knobRect = CGRectMake(0.0, 0.0, knobSize.width, knobSize.height), - trackRect = [self trackRectForBounds:bounds]; + var knobRect = CGRectMake(0.0, 0.0, knobSize.width, knobSize.height), + trackRect = [self trackRectForBounds:bounds], + knobOffset = [self currentValueForThemeAttribute:@"knob-offset"]; // No track, do our best to approximate a place for this thing. if (!trackRect || CGRectIsEmpty(trackRect)) trackRect = bounds; - if ([self hasThemeState:CPThemeStateCircular]) + if (_isCircular) { - var angle = 3 * PI_2 - (1.0 - [self doubleValue] - _minValue) / (_maxValue - _minValue) * PI2, - radius = CGRectGetWidth(trackRect) / 2.0 - 8.0; - - knobRect.origin.x = radius * COS(angle) + CGRectGetMidX(trackRect) - 3.0; - knobRect.origin.y = radius * SIN(angle) + CGRectGetMidY(trackRect) - 2.0; + var angle = 3 * PI_2 - (1.0 - [self doubleValue] - _minValue) / (_maxValue - _minValue) * PI2, + radius = trackRect.size.width / 2.0 - (knobOffset ? knobOffset : 8.0); + + knobRect.origin.x = radius * COS(angle) + CGRectGetMidX(trackRect) - knobSize.width / 2; // 3.0; + knobRect.origin.y = radius * SIN(angle) + CGRectGetMidY(trackRect) - knobSize.height / 2; // 2.0; } - else if ([self isVertical]) + else if (_isVertical) { - knobRect.origin.x = CGRectGetMidX(trackRect) - knobSize.width / 2.0; - knobRect.origin.y = ((_maxValue - [self doubleValue]) / (_maxValue - _minValue)) * (CGRectGetHeight(trackRect) - knobSize.height); + knobRect.origin.x = CGRectGetMidX(trackRect) - knobSize.width / 2.0 + knobOffset; + + if (_isTicked && _allowsTickMarkValuesOnly && _cachedTickMarksRects) + // This is done to garantee that the knob is perfectly aligned with the tick mark + knobRect.origin.y = _cachedTickMarksRects[_currentTickMarkSegment].origin.y - (knobSize.height - 1) / 2; + else + knobRect.origin.y = ROUND(((_maxValue - [self doubleValue]) / (_maxValue - _minValue)) * (trackRect.size.height - knobSize.height)); } else { - knobRect.origin.x = (([self doubleValue] - _minValue) / (_maxValue - _minValue)) * (CGRectGetWidth(trackRect) - knobSize.width); - knobRect.origin.y = CGRectGetMidY(trackRect) - knobSize.height / 2.0; + if (_isTicked && _allowsTickMarkValuesOnly && _cachedTickMarksRects) + // This is done to garantee that the knob is perfectly aligned with the tick mark + knobRect.origin.x = _cachedTickMarksRects[_currentTickMarkSegment].origin.x - (knobSize.width - 1) / 2; + else + knobRect.origin.x = ROUND((([self doubleValue] - _minValue) / (_maxValue - _minValue)) * (trackRect.size.width - knobSize.width)); + + knobRect.origin.y = CGRectGetMidY(trackRect) - knobSize.height / 2.0 + knobOffset; } return knobRect; @@ -217,18 +346,28 @@ CPCircularSlider = 1; - (CGRect)rectForEphemeralSubviewNamed:(CPString)aName { - if (aName === "track-view") - return [self trackRectForBounds:[self bounds]]; + switch (aName) + { + case @"track-view": + return [self trackRectForBounds:[self bounds]]; - else if (aName === "knob-view") - return [self knobRectForBounds:[self bounds]]; + case @"knob-view": + return [self knobRectForBounds:[self bounds]]; - return [super rectForEphemeralSubviewNamed:aName]; + case @"left-track-view": + return [self leftTrackRectForBounds:[self bounds]]; + + case @"right-track-view": + return [self rightTrackRectForBounds:[self bounds]]; + + default: + return [super rectForEphemeralSubviewNamed:aName]; + } } - (CPView)createEphemeralSubviewNamed:(CPString)aName { - if (aName === "track-view" || aName === "knob-view") + if (aName === "track-view" || aName === "knob-view" || aName === "left-track-view" || aName === "right-track-view") { var view = [[CPView alloc] init]; @@ -242,6 +381,7 @@ CPCircularSlider = 1; - (void)setAltIncrementValue:(float)anAltIncrementValue { + // FIXME: This is not used. BTW, tested in Cocoa and it is totally useless. So leave it like that for now... _altIncrementValue = anAltIncrementValue; } @@ -250,47 +390,64 @@ CPCircularSlider = 1; return _altIncrementValue; } -- (void)setFrameSize:(CGSize)aSize -{ - [super setFrameSize:aSize]; - [self _recalculateIsVertical]; -} - -- (void)_recalculateIsVertical -{ - // Recalculate isVertical. - var bounds = [self bounds], - width = CGRectGetWidth(bounds), - height = CGRectGetHeight(bounds); - - _isVertical = width < height ? 1 : (width > height ? 0 : -1); - - if (_isVertical === 1) - [self setThemeState:CPThemeStateVertical]; - else if (_isVertical === 0) - [self unsetThemeState:CPThemeStateVertical]; -} - -- (int)isVertical +- (CPInteger)isVertical { return _isVertical; } - (void)layoutSubviews { - var trackView = [self layoutEphemeralSubviewNamed:@"track-view" - positioned:CPWindowBelow - relativeToEphemeralSubviewNamed:@"knob-view"]; + var leftTrackColor = [self currentValueForThemeAttribute:@"left-track-color"]; - if (trackView) + if (leftTrackColor && !_isCircular && !_isTicked) + { + // Two parts layout (needed by Aristo3) + var leftTrackView = [self layoutEphemeralSubviewNamed:@"left-track-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"knob-view"], + rightTrackView = [self layoutEphemeralSubviewNamed:@"right-track-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"knob-view"]; + + [leftTrackView setBackgroundColor:leftTrackColor]; + [rightTrackView setBackgroundColor:[self currentValueForThemeAttribute:@"track-color"]]; + + var knobView = [self layoutEphemeralSubviewNamed:@"knob-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"left-track-view"]; + + [knobView setBackgroundColor:[self currentValueForThemeAttribute:"knob-color"]]; + } + else + { + // Normal layout + var trackView = [self layoutEphemeralSubviewNamed:@"track-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"knob-view"]; + [trackView setBackgroundColor:[self currentValueForThemeAttribute:@"track-color"]]; - var knobView = [self layoutEphemeralSubviewNamed:@"knob-view" - positioned:CPWindowAbove - relativeToEphemeralSubviewNamed:@"track-view"]; - - if (knobView) + var knobView = [self layoutEphemeralSubviewNamed:@"knob-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"track-view"]; + [knobView setBackgroundColor:[self currentValueForThemeAttribute:"knob-color"]]; + } +} + +- (void)drawRect:(CGRect)aRect +{ + // We only draw tick marks here + + if (!_isTicked) + return; + + var context = [[CPGraphicsContext currentContext] graphicsPort]; + + CGContextSetFillColor(context, [self currentValueForThemeAttribute:@"tick-mark-color"]); + + for (var i = 0; i < _numberOfTickMarks; i++) + CGContextFillRect(context, [self rectOfTickMarkAtIndex:i]); } - (BOOL)tracksMouseOutsideOfFrame @@ -298,71 +455,28 @@ CPCircularSlider = 1; return YES; } -- (float)_valueAtPoint:(CGPoint)aPoint -{ - var bounds = [self bounds], - knobRect = [self knobRectForBounds:bounds], - trackRect = [self trackRectForBounds:bounds]; - - if ([self hasThemeState:CPThemeStateCircular]) - { - var knobWidth = CGRectGetWidth(knobRect); - - trackRect.origin.x += knobWidth / 2; - trackRect.size.width -= knobWidth; - - var minValue = [self minValue], - dx = aPoint.x - CGRectGetMidX(trackRect), - dy = aPoint.y - CGRectGetMidY(trackRect); - - return MAX(0.0, MIN(1.0, 1.0 - (3 * PI_2 - ATAN2(dy, dx)) % PI2 / PI2)) * ([self maxValue] - minValue) + minValue; - } - else if ([self isVertical]) - { - var knobHeight = CGRectGetHeight(knobRect); - - trackRect.origin.y += knobHeight / 2; - trackRect.size.height -= knobHeight; - - var minValue = [self minValue]; - - return MAX(0.0, MIN(1.0, (CGRectGetMaxY(trackRect) - aPoint.y) / CGRectGetHeight(trackRect))) * ([self maxValue] - minValue) + minValue; - } - else - { - var knobWidth = CGRectGetWidth(knobRect); - - trackRect.origin.x += knobWidth / 2; - trackRect.size.width -= knobWidth; - - var minValue = [self minValue]; - - return MAX(0.0, MIN(1.0, (aPoint.x - CGRectGetMinX(trackRect)) / CGRectGetWidth(trackRect))) * ([self maxValue] - minValue) + minValue; - } -} - - (BOOL)startTrackingAt:(CGPoint)aPoint { - var bounds = [self bounds], - knobRect = [self knobRectForBounds:CGRectMakeCopy(bounds)]; + var bounds = [self bounds], + knobRect = [self knobRectForBounds:bounds]; if (CGRectContainsPoint(knobRect, aPoint)) _dragOffset = CGSizeMake(CGRectGetMidX(knobRect) - aPoint.x, CGRectGetMidY(knobRect) - aPoint.y); else { - var trackRect = [self trackRectForBounds:bounds]; + _dragOffset = CGSizeMakeZero(); - if (trackRect && CGRectContainsPoint(trackRect, aPoint)) + if (_allowsTickMarkValuesOnly) { - _dragOffset = CGSizeMakeZero(); - - [self setObjectValue:[self _valueAtPoint:aPoint]]; + _currentTickMarkSegment = [self indexOfTickMarkAtPoint:aPoint]; + [self setObjectValue:_cachedTickMarksValues[_currentTickMarkSegment]]; } - else - return NO; + [self setObjectValue:[self _valueAtPoint:aPoint]]; } + _stickingOnTickMark = NO; + [self setHighlighted:YES]; [self setNeedsLayout]; @@ -373,7 +487,57 @@ CPCircularSlider = 1; - (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint { - [self setObjectValue:[self _valueAtPoint:CGPointMake(aPoint.x + _dragOffset.width, aPoint.y + _dragOffset.height)]]; + var bounds = [self bounds], + newPoint = _isCircular ? CGPointMake(aPoint.x + _dragOffset.width, aPoint.y + _dragOffset.height) + : CGPointMake(MAX(0, MIN(bounds.size.width-1, aPoint.x + _dragOffset.width)), + MAX(0, MIN(bounds.size.height-1, aPoint.y + _dragOffset.height))); + + if (_allowsTickMarkValuesOnly) + { + var tickMarkSegment = [self indexOfTickMarkAtPoint:newPoint]; + + if (tickMarkSegment !== _currentTickMarkSegment) + { + _currentTickMarkSegment = tickMarkSegment; + [self setObjectValue:_cachedTickMarksValues[_currentTickMarkSegment]]; + } + } + + else if (_canStickOnTickMarks) + { + // Ticked but not constrained to tick marks + // We're using a tick affinity with a latency of AFFINITY pixels + + // Search the nearest tick mark + var tickMarkSegment = [self indexOfTickMarkAtPoint:newPoint], + tickRect = _cachedTickMarksRects[tickMarkSegment]; + + // Does the knob point to it ? + if ((!_isVertical && (newPoint.x === CGRectGetMidX(tickRect))) || + ( _isVertical && (newPoint.y === CGRectGetMidY(tickRect)))) + { + // Start an affinity + [self setObjectValue:_cachedTickMarksValues[tickMarkSegment]]; + + _stickingOnTickMark = YES; + _affinityPoint = _isVertical ? newPoint.y : newPoint.x; + } + + // Are we going too far from the tick mark ? + else if (_stickingOnTickMark && (ABS((_isVertical ? newPoint.y : newPoint.x) - _affinityPoint) > AFFINITY)) + { + // Yes. Stop affinity + + _stickingOnTickMark = NO; + [self setObjectValue:[self _valueAtPoint:newPoint]]; + } + + else if (!_stickingOnTickMark) // Normal situation + [self setObjectValue:[self _valueAtPoint:newPoint]]; + } + + else // Not ticked at all or no possible affinity + [self setObjectValue:[self _valueAtPoint:newPoint]]; return YES; } @@ -391,16 +555,14 @@ CPCircularSlider = 1; - (BOOL)isContinuous { - return (_sendActionOn & CPLeftMouseDraggedMask) !== 0; + return _isContinuous; } -/*! - @ignore - should we have _continuous? -*/ - (void)setContinuous:(BOOL)flag { - if (flag) + _isContinuous = flag; + + if (_isContinuous) _sendActionOn |= CPLeftMouseDraggedMask; else _sendActionOn &= ~CPLeftMouseDraggedMask; @@ -418,11 +580,491 @@ CPCircularSlider = 1; return [self setFloatValue:1.0]; } +#pragma mark - New methods as in High Sierra (10.13) + +/*! + Creates and returns a continuous horizontal slider whose values range from 0.0 to 1.0. + @param aTarget + @param anAction + */ ++ (CPSlider)sliderWithTarget:(id)aTarget action:(SEL)anAction +{ + return [self sliderWithValue:0.0 minValue:0.0 maxValue:1.0 target:aTarget action:anAction]; +} + +// Creates and returns a continuous horizontal slider that represents values over the specified range. ++ (CPSlider)sliderWithValue:(double)value minValue:(double)minValue maxValue:(double)maxValue target:(id)target action:(SEL)action +{ + var slider = [[self alloc] initWithFrame:CGRectMake(0, 0, 104, 19)]; // Size used by Cocoa + + [slider setMinValue:minValue]; + [slider setMaxValue:maxValue]; + [slider setDoubleValue:value]; + [slider setTarget:target]; + [slider setAction:action]; + [slider setContinuous:YES]; + + [slider _refreshCachesAndStates]; + + return slider; +} + +// The knob’s thickness, in pixels. +// The thickness is defined to be the extent of the knob along the long dimension of the bar. +// In a vertical slider, a knob’s thickness is its height; in a horizontal slider, a knob’s thickness is its width. +- (float)knobThickness +{ + var knobSize = [self currentValueForThemeAttribute:@"knob-size"]; + + return _isVertical ? knobSize.height : knobSize.width; +} + +// allowsTickMarkValuesOnly : A Boolean value that indicates whether the receiver fixes +// its values to those values represented by its tick marks. + +// YES if the slider fixes its values to the values represented by its tick marks; otherwise, NO. +// For example, if a slider has a minimum value of 0, a maximum value of 100, and five markers, +// the allowable values are 0, 25, 50, 75, and 100. When users move the slider’s knob, +// it jumps to the tick mark nearest the cursor when the mouse button is released. +// This method has no effect if the slider has no tick marks. + +- (void)setAllowsTickMarkValuesOnly:(BOOL)shouldAllowTickMarkValuesOnly +{ + if (shouldAllowTickMarkValuesOnly === _allowsTickMarkValuesOnly) + return; + + [self willChangeValueForKey:@"allowsTickMarkValuesOnly"]; + _allowsTickMarkValuesOnly = shouldAllowTickMarkValuesOnly; + [self didChangeValueForKey:@"allowsTickMarkValuesOnly"]; + + [self _refreshCachesAndStates]; + [self setNeedsDisplay:YES]; +} + +// Returns the value of the tick mark closest to the specified value. +- (double)closestTickMarkValueToValue:(double)value +{ + if (_numberOfTickMarks === 1) + return _cachedTickMarksValues[0]; + + _closestTickMarkIndex = CPNotFound; + + var foundDelta = 2 * _maxValue, + delta; + + for (var i = 0; i < _numberOfTickMarks; i++) + { + delta = ABS(value - _cachedTickMarksValues[i]); + + if (delta < foundDelta) + { + foundDelta = delta; + _closestTickMarkIndex = i; + } + } + + return _closestTickMarkIndex ? _cachedTickMarksValues[_closestTickMarkIndex] : _minValue; +} + +// Returns the index of the tick mark closest to the location of the receiver represented by the given point. +- (CPInteger)indexOfTickMarkAtPoint:(CGPoint)point +{ + var foundIndex = CPNotFound; + + if (_isCircular) + { + // CPCircularSlider + + var bounds = [self bounds], + dx = point.x - bounds.size.width / 2, + dy = bounds.size.height / 2 - point.y, + angle = 1 + (((-3 * PI_2 - ATAN2(dy, dx)) % PI2) / PI2); + + for (var i = 0; (i < _numberOfTickMarks) && (foundIndex === CPNotFound); i++) + if ((angle < _cachedTickMarksSegments[i]) || ((i === 0) && (angle >= (1 - _cachedTickMarksSegments[i])))) + foundIndex = i; + } + else + { + // CPLinearSlider + + if (_isVertical) + { + for (var i = 0; (i < _numberOfTickMarks) && (foundIndex === CPNotFound); i++) + if (point.y <= _cachedTickMarksSegments[i]) + foundIndex = i; + } + else + { + for (var i = 0; (i < _numberOfTickMarks) && (foundIndex === CPNotFound); i++) + if (point.x <= _cachedTickMarksSegments[i]) + foundIndex = i; + } + } + + return foundIndex; +} + +// The number of the slider's tick marks. The tick marks assigned to the minimum and maximum values are included. +- (void)setNumberOfTickMarks:(CPInteger)aNumber +{ + if (aNumber === _numberOfTickMarks) + return; + + // We try to play nicer than Cocoa when passing from a non-ticked slider to a ticked one (and vice versa) + var tickedChanged = (((_numberOfTickMarks == 0) && (aNumber > 0)) || ((_numberOfTickMarks > 0) && (aNumber == 0))); + + [self willChangeValueForKey:@"numberOfTickMarks"]; + _numberOfTickMarks = aNumber; + [self didChangeValueForKey:@"numberOfTickMarks"]; + + // If tickedChanged, this refresh is necessary to set new states but we'll have to call it again after for correct geometry + [self _refreshCachesAndStates]; + + if (tickedChanged) + { + // First, remove ephemeral subviews as they may change with new state (needed ones will be created by layoutSubviews) + + [self removeEphemeralSubviewNamed:@"track-view"]; + [self removeEphemeralSubviewNamed:@"left-track-view"]; + [self removeEphemeralSubviewNamed:@"right-track-view"]; + [self removeEphemeralSubviewNamed:@"knob-view"]; + + // Now adapt the frame size to match what Xcode IB would have provided + + var currentSize = [self frameSize], + newSize = [self currentValueForThemeAttribute:@"ib-size"]; + + if (_isCircular) + [self setFrameSize:CGSizeMake(newSize, newSize)]; + + else if (_isVertical) + [self setFrameSize:CGSizeMake(newSize, currentSize.height)]; + + else + [self setFrameSize:CGSizeMake(currentSize.width, newSize)]; + + // _refreshCachesAndStates, setNeedsDisplay and setNeedsLayout are called in setFrameSize + } + else + [self setNeedsDisplay:YES]; +} + +// Returns the bounding rectangle of the tick mark at the given index. +- (CGRect)rectOfTickMarkAtIndex:(CPInteger)index +{ + // If no tick mark is associated with index, the method raises NSRangeException + if ((index < 0) || (index >= _numberOfTickMarks)) + [CPException raise:CPRangeException reason:@"rectOfTickMarkAtIndex: index ("+index+") is outside permitted values (0.."+(_numberOfTickMarks-1)+")"]; + + return _cachedTickMarksRects[index]; +} + +// tickMarkPosition : Determines how the receiver’s tick marks are aligned with it. +// Possible values are CPTickMarkBelow, CPTickMarkAbove, CPTickMarkLeft, and CPTickMarkRight +// (the last two are for vertical sliders). The default alignments are CPTickMarkBelow and CPTickMarkLeft. +// This property has no effect if no tick marks have been assigned (that is, numberOfTickMarks returns 0). +- (void)setTickMarkPosition:(CPTickMarkPosition)aTickMarkPosition +{ + if (aTickMarkPosition === _tickMarkPosition) + return; + + [self willChangeValueForKey:@"tickMarkPosition"]; + _tickMarkPosition = aTickMarkPosition; + [self didChangeValueForKey:@"tickMarkPosition"]; + + [self _refreshCachesAndStates]; + [self setNeedsDisplay:YES]; +} + +// Returns the receiver’s value represented by the tick mark at the specified index. +- (double)tickMarkValueAtIndex:(CPInteger)index +{ + // If no tick mark is associated with index, the method raises NSRangeException + if ((index < 0) || (index >= _numberOfTickMarks)) + [CPException raise:CPRangeException reason:@"tickMarkValueAtIndex: index ("+index+") is outside permitted values (0.."+(_numberOfTickMarks-1)+")"]; + + return _cachedTickMarksValues[index]; +} + +// The color of the filled portion of the slider track, in appearances that support it. +- (void)setTrackFillColor:(CPColor)aColor +{ + var normalState = _isVertical ? [CPThemeStateVertical, CPThemeStateKeyWindow] : [CPThemeStateKeyWindow], + leftTrackColor = [self valueForThemeAttribute:@"left-track-color" inStates:normalState]; + + if (leftTrackColor === aColor) + return; + + [self setValue:aColor forThemeAttribute:@"left-track-color" inStates:normalState]; +} + +- (CPColor)trackFillColor +{ + var normalState = _isVertical ? [CPThemeStateVertical, CPThemeStateKeyWindow] : [CPThemeStateKeyWindow]; + + return [self valueForThemeAttribute:@"left-track-color" inStates:normalState]; +} + +#pragma mark - Private methods + +- (void)_refreshCachesAndStates +{ + // Purge caches + _cachedTickMarksRects = @[]; + _cachedTickMarksValues = @[]; + _cachedTickMarksSegments = @[]; + + // Reset affinity + _canStickOnTickMarks = NO; + + // Recalculate _isVertical. + var bounds = [self bounds], + boundsWidth = bounds.size.width, + boundsHeight = bounds.size.height; + + _isVertical = (boundsWidth < boundsHeight) ? 1 : ((boundsWidth > boundsHeight) ? 0 : -1); + + if (_isVertical) + [self setThemeState:CPThemeStateVertical]; + else + [self unsetThemeState:CPThemeStateVertical]; + + // Recalculate _isCircular + _isCircular = (_sliderType === CPCircularSlider); + + if (_isCircular) + [self setThemeState:CPThemeStateCircular]; + else + [self unsetThemeState:CPThemeStateCircular]; + + // Recalculate _isTicked + _isTicked = (_numberOfTickMarks > 0); + + // If this slider has no tick marks, we're done. + if (!_isTicked) + { + [self unsetThemeState:CPThemeStateTickedSlider]; + [self unsetThemeState:CPThemeStateAboveLeftTickedSlider]; + [self unsetThemeState:CPThemeStateBelowRightTickedSlider]; + return; + } + + // Set specific theme states + [self setThemeState:CPThemeStateTickedSlider]; + + if (!_isCircular) + if (_tickMarkPosition === CPTickMarkPositionAbove) + { + [self setThemeState:CPThemeStateAboveLeftTickedSlider]; + [self unsetThemeState:CPThemeStateBelowRightTickedSlider]; + } + else + { + [self unsetThemeState:CPThemeStateAboveLeftTickedSlider]; + [self setThemeState:CPThemeStateBelowRightTickedSlider]; + } + + // Calculate cached values : tick marks rects, values and segments + + var tickSize = [self currentValueForThemeAttribute:@"tick-mark-size"], + tickMarkMargin = [self currentValueForThemeAttribute:@"tick-mark-margin"], + topMargin = [self currentValueForThemeAttribute:@"top-margin"], + bottomMargin = [self currentValueForThemeAttribute:@"bottom-margin"], + knobSize = [self currentValueForThemeAttribute:@"knob-size"], + width = tickSize.width, + height = tickSize.height, + x, + y, + tickRect, + value; + + if (_isCircular) + { + // CPCircularSlider + + // Remark : Cocoa doesn't use tick affinity with circular sliders + + var delta = 1 / _numberOfTickMarks, + dX = width / 2, + dY = height / 2, + cX = boundsWidth / 2, + cY = boundsHeight / 2, + radius = cX - dX, + deltaValue = (_maxValue - _minValue) / _numberOfTickMarks; + + value = _minValue; + + for (var i = 0, angle; i < _numberOfTickMarks; i++, value += deltaValue) + { + angle = PI_2 - PI2 * i * delta; + x = radius * COS(angle) + cX; + y = radius * SIN(-angle) + cY; // Vertical coordinates are reversed in Cappuccino + + tickRect = CGRectMake(ROUND(x - dX), ROUND(y - dY), width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:value]; + [_cachedTickMarksSegments addObject:(i + 0.5) * delta]; + } + } + else + { + // CPLinearSlider + + if (_isVertical) + { + // Vertical slider + + // If there's only one tick mark, it's centered. + // If there's more than one tick mark, there's at least one at the min value and one at the max value + + var usableHeight = boundsHeight - knobSize.height, + dY = (height - 1)/2; + + x = (_tickMarkPosition === CPTickMarkPositionLeading) ? topMargin : (boundsWidth - width - bottomMargin); + + if (_numberOfTickMarks === 1) + { + y = (boundsHeight - height) / 2; + value = (_maxValue - _minValue) / 2 + _minValue; + tickRect = CGRectMake(x, ROUND(y - dY), width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:value]; + [_cachedTickMarksSegments addObject:bounds]; + } + else + { + var delta = usableHeight / (_numberOfTickMarks - 1), + deltaValue = (_maxValue - _minValue) / (_numberOfTickMarks - 1); + + y = (knobSize.height - 1) / 2; + value = _maxValue; + _canStickOnTickMarks = !_allowsTickMarkValuesOnly && (delta > AFFINITY+3); + + for (var i = 0; i < _numberOfTickMarks; i++, y += delta, value -= deltaValue) + { + tickRect = CGRectMake(x, ROUND(y - dY), width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:(i < _numberOfTickMarks - 1) ? value : _minValue]; // Avoid rounding problems on last tick mark + [_cachedTickMarksSegments addObject:(i < _numberOfTickMarks - 1) ? ROUND(y + delta/2) : boundsHeight]; + } + } + } + else + { + // Horizontal slider + + // If there's only one tick mark, it's centered. + // If there's more than one tick mark, there's at least one at the min value and one at the max value + + var usableWidth = boundsWidth - knobSize.width, + dX = (width - 1)/2; + + y = (_tickMarkPosition === CPTickMarkPositionAbove) ? topMargin : (boundsHeight - height - bottomMargin); + + if (_numberOfTickMarks === 1) + { + x = (boundsWidth - width) / 2; + value = (_maxValue - _minValue) / 2 + _minValue; + tickRect = CGRectMake(ROUND(x - dX), y, width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:value]; + [_cachedTickMarksSegments addObject:boundsWidth]; + } + else + { + var delta = usableWidth / (_numberOfTickMarks - 1), + deltaValue = (_maxValue - _minValue) / (_numberOfTickMarks - 1); + + x = (knobSize.width - 1) / 2; + value = _minValue; + _canStickOnTickMarks = !_allowsTickMarkValuesOnly && (delta > AFFINITY+3); + + for (var i = 0; i < _numberOfTickMarks; i++, x += delta, value += deltaValue) + { + tickRect = CGRectMake(ROUND(x - dX), y, width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:(i < _numberOfTickMarks - 1) ? value : _maxValue]; // Avoid rounding problems on last tick mark + [_cachedTickMarksSegments addObject:(i < _numberOfTickMarks - 1) ? ROUND(x + delta/2) : boundsWidth]; + } + } + } + } + +#if PLATFORM(DOM) + // Don't do this in nib2cib !.. + if (_allowsTickMarkValuesOnly) + { + [self setObjectValue:[self closestTickMarkValueToValue:[self doubleValue]]]; + _currentTickMarkSegment = _closestTickMarkIndex; + [self sendAction:[self action] to:[self target]]; + } +#endif +} + +/*! @ignore */ +- (float)_valueAtPoint:(CGPoint)aPoint +{ + var bounds = [self bounds], + knobSize = [self currentValueForThemeAttribute:@"knob-size"], + trackRect = [self trackRectForBounds:bounds], + value; + + if (_isCircular) + { + var dx = aPoint.x - CGRectGetMidX(trackRect), + dy = CGRectGetMidY(trackRect) - aPoint.y; + + value = ((1 + (((-3 * PI_2 - ATAN2(dy, dx)) % PI2) / PI2)) * (_maxValue - _minValue) + _minValue) % _maxValue; + } + else if (_isVertical) + { + var knobHeight = knobSize.height; + + trackRect.origin.y += knobHeight / 2; + trackRect.size.height -= knobHeight; + + value = MAX(0.0, MIN(1.0, (trackRect.origin.y + trackRect.size.height - aPoint.y) / trackRect.size.height)) * (_maxValue - _minValue) + _minValue; + } + else + { + var knobWidth = knobSize.width; + + trackRect.origin.x += knobWidth / 2; + trackRect.size.width -= knobWidth; + + value = MAX(0.0, MIN(1.0, (aPoint.x - trackRect.origin.x) / trackRect.size.width)) * (_maxValue - _minValue) + _minValue; + } + + return value; +} + +#pragma mark - Overrides + +- (void)setFrameSize:(CGSize)aSize +{ + [super setFrameSize:aSize]; + [self _refreshCachesAndStates]; + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + +#pragma mark - + @end -var CPSliderMinValueKey = "CPSliderMinValueKey", - CPSliderMaxValueKey = "CPSliderMaxValueKey", - CPSliderAltIncrValueKey = "CPSliderAltIncrValueKey"; +var CPSliderMinValueKey = "CPSliderMinValueKey", + CPSliderMaxValueKey = "CPSliderMaxValueKey", + CPSliderAltIncrValueKey = "CPSliderAltIncrValueKey", + CPSliderTypeKey = "CPSliderTypeKey", + CPSliderAllowsTickMarkValuesOnlyKey = "CPSliderAllowsTickMarkValuesOnlyKey", + CPSliderTickMarkPositionKey = "CPSliderTickMarkPositionKey", + CPSliderNumberOfTickMarksKey = "CPSliderNumberOfTickMarksKey"; @implementation CPSlider (CPCoding) @@ -435,9 +1077,15 @@ var CPSliderMinValueKey = "CPSliderMinValueKey", if (self) { - _altIncrementValue = [aCoder decodeDoubleForKey:CPSliderAltIncrValueKey]; + _altIncrementValue = [aCoder decodeDoubleForKey:CPSliderAltIncrValueKey]; + _sliderType = [aCoder decodeIntForKey: CPSliderTypeKey]; + _allowsTickMarkValuesOnly = [aCoder decodeBoolForKey: CPSliderAllowsTickMarkValuesOnlyKey]; + _tickMarkPosition = [aCoder decodeIntForKey: CPSliderTickMarkPositionKey]; + _numberOfTickMarks = [aCoder decodeIntForKey: CPSliderNumberOfTickMarksKey]; - [self _recalculateIsVertical]; + _isContinuous = (_sendActionOn & CPLeftMouseDraggedMask) !== 0; + + [self _refreshCachesAndStates]; [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -450,9 +1098,13 @@ var CPSliderMinValueKey = "CPSliderMinValueKey", { [super encodeWithCoder:aCoder]; - [aCoder encodeDouble:_minValue forKey:CPSliderMinValueKey]; - [aCoder encodeDouble:_maxValue forKey:CPSliderMaxValueKey]; - [aCoder encodeDouble:_altIncrementValue forKey:CPSliderAltIncrValueKey]; + [aCoder encodeDouble:_minValue forKey:CPSliderMinValueKey]; + [aCoder encodeDouble:_maxValue forKey:CPSliderMaxValueKey]; + [aCoder encodeDouble:_altIncrementValue forKey:CPSliderAltIncrValueKey]; + [aCoder encodeInt: _sliderType forKey:CPSliderTypeKey]; + [aCoder encodeBool: _allowsTickMarkValuesOnly forKey:CPSliderAllowsTickMarkValuesOnlyKey]; + [aCoder encodeInt: _tickMarkPosition forKey:CPSliderTickMarkPositionKey]; + [aCoder encodeInt: _numberOfTickMarks forKey:CPSliderNumberOfTickMarksKey]; } @end diff --git a/AppKit/CPStepper.j b/AppKit/CPStepper.j index 2374f3af3..5fb2aeab0 100644 --- a/AppKit/CPStepper.j +++ b/AppKit/CPStepper.j @@ -188,12 +188,12 @@ [_buttonUp setFrame:upFrame]; [_buttonDown setFrame:downFrame]; - [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered]; - [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled]]; - [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted]]; - [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered]; - [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled]]; - [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted]]; + [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPButtonStateBezelStyleRounded]]; + [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled, CPButtonStateBezelStyleRounded]]; + [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted, CPButtonStateBezelStyleRounded]]; + [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPButtonStateBezelStyleRounded]]; + [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled, CPButtonStateBezelStyleRounded]]; + [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted, CPButtonStateBezelStyleRounded]]; } - (void)_sizeToFit diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 423f37800..dff268244 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -233,7 +233,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); @"bezel-inset": CGInsetMakeZero(), @"content-inset": CGInsetMake(1.0, 0.0, 0.0, 0.0), @"bezel-color": [CPNull null], - @"min-size": CGSizeMake(0, 29) + @"min-size": CGSizeMake(0, 29), + @"background-inset": CGInsetMakeZero() }; } @@ -368,8 +369,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self setPlaceholderString:@""]; _sendActionOn = CPKeyUpMask | CPKeyDownMask; - - [self setValue:CPNaturalTextAlignment forThemeAttribute:@"alignment"]; } return self; @@ -560,9 +559,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); Sets the background color, which is shown for non-bezeled text fields with drawsBackground set to YES @param aColor The background color */ -- (void)setTextFieldBackgroundColor:(CPColor)aColor +- (void)setBackgroundColor:(CPColor)aColor { - if (_textFieldBackgroundColor == aColor) + if (_backgroundColor == aColor) return; _textFieldBackgroundColor = aColor; @@ -574,7 +573,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); /*! Returns the background color. */ -- (CPColor)textFieldBackgroundColor +- (CPColor)backgroundColor { return _textFieldBackgroundColor; } @@ -759,7 +758,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); #if PLATFORM(DOM) var element = [self _inputElement], - font = [self currentValueForThemeAttribute:@"font"], + font = [self font], lineHeight = [font defaultLineHeightForFont], contentRect = [self contentRectForBounds:[self bounds]], verticalAlign = [self currentValueForThemeAttribute:"vertical-alignment"], @@ -1462,7 +1461,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); lineBreakMode = [self lineBreakMode], text = (_stringValue || @" "), textSize = CGSizeMakeCopy(frameSize), - font = [self currentValueForThemeAttribute:@"font"]; + font = [self font]; textSize.width -= contentInset.left + contentInset.right; textSize.height -= contentInset.top + contentInset.bottom; @@ -1866,6 +1865,12 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if (aName === "bezel-view") return [self bezelRectForBounds:[self bounds]]; + else if (aName === "background-view") + { + var backgroundInset = [self currentValueForThemeAttribute:@"background-inset"]; + + return CGRectInsetByInset([self bounds], backgroundInset); + } else if (aName === "content-view") return [self contentRectForBounds:[self bounds]]; @@ -1882,6 +1887,14 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return view; } + else if (aName === "background-view") + { + var view = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [view setHitTests:NO]; + + return view; + } else { var view = [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()]; @@ -1896,16 +1909,37 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)layoutSubviews { - var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" - positioned:CPWindowBelow - relativeToEphemeralSubviewNamed:@"content-view"]; + var bezelColor = [self currentValueForThemeAttribute:@"bezel-color"]; + + if ([bezelColor isCSSBased]) + { + // CSS Styling + // We don't need bezelView as we apply CSS styling directly on the text field view itself - if (bezelView) - [bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; + // We need to call [super setBackgroundColor:] as we have redefined it here + [super setBackgroundColor:bezelColor]; + + var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:nil], + backgroundView = [self layoutEphemeralSubviewNamed:@"background-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"content-view"]; - var contentView = [self layoutEphemeralSubviewNamed:@"content-view" - positioned:CPWindowAbove - relativeToEphemeralSubviewNamed:@"bezel-view"]; + [backgroundView setBackgroundColor:(_drawsBackground ? _textFieldBackgroundColor : [CPColor clearColor])]; + } + else + { + var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"content-view"]; + + [bezelView setBackgroundColor:bezelColor]; + + var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"bezel-view"]; + } if (contentView) { @@ -1926,7 +1960,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [contentView setText:string]; [contentView setTextColor:[self currentValueForThemeAttribute:@"text-color"]]; - [contentView setFont:[self currentValueForThemeAttribute:@"font"]]; + [contentView setFont:[self font]]; [contentView setAlignment:[self currentValueForThemeAttribute:@"alignment"]]; [contentView setVerticalAlignment:[self currentValueForThemeAttribute:@"vertical-alignment"]]; [contentView setLineBreakMode:[self currentValueForThemeAttribute:@"line-break-mode"]]; @@ -1966,7 +2000,25 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // We don't want to change the text-color of the placeHolder of the textField var placeholderColor = [self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder]; - [super setTextColor:aColor]; + // If the text field is a cell based table data view, we need to fix the color for all possible states + if ([self hasThemeState:CPThemeStateTableDataView]) + { + [self setTextColor:aColor inThemeStates:[CPThemeStateTableDataView]]; + [self setTextColor:aColor inThemeStates:[CPThemeStateTableDataView, CPThemeStateSelectedDataView]]; + [self setTextColor:aColor inThemeStates:[CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]]; + } + else + { + if ([self hasThemeState:CPTextFieldStateRounded]) + { + [self setTextColor:aColor inThemeStates:[CPTextFieldStateRounded]]; + [self setTextColor:aColor inThemeStates:[CPTextFieldStateRounded, CPThemeStateEditing]]; + } + + [self setTextColor:aColor inThemeStates:[CPThemeStateNormal]]; + [self setTextColor:aColor inThemeStates:[CPThemeStateEditing]]; + } + [self setValue:placeholderColor forThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder]; } @@ -2109,8 +2161,7 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]]; [self setDrawsBackground:[aCoder decodeBoolForKey:CPTextFieldDrawsBackgroundKey]]; - - [self setTextFieldBackgroundColor:[aCoder decodeObjectForKey:CPTextFieldBackgroundColorKey]]; + [self setBackgroundColor:[aCoder decodeObjectForKey:CPTextFieldBackgroundColorKey]]; [self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]]; [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; @@ -2120,6 +2171,7 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]]; [self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]]; [self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]]; + [self updateTrackingAreas]; } return self; @@ -2319,4 +2371,22 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", @end +#pragma mark - +@implementation CPTextField (Deprecated) + +- (void)setTextFieldBackgroundColor:(CPColor)aColor +{ + CPLog.error("[CPTextField setTextFieldBackgroundColor:] is deprecated, use [CPTextField setBackgroundColor:] instead."); + + [self setBackgroundColor:aColor]; +} + +- (CPColor)textFieldBackgroundColor +{ + CPLog.info("[CPTextField textFieldBackgroundColor] is deprecated, use [CPTextField backgroundColor] instead."); + + return [self backgroundColor]; +} + +@end diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index 4b55c9c12..2fbc7fdeb 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -49,6 +49,8 @@ var CPThemesByName = { }, + (void)setDefaultTheme:(CPTheme)aTheme { CPThemeDefaultTheme = aTheme; + + [CPFont initializeSystemFontFromTheme:aTheme]; } + (CPTheme)defaultTheme diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 52486310d..847bb5af5 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1995,7 +1995,7 @@ var CPViewHighDPIDrawingEnabled = YES; #if PLATFORM(DOM) if (_backgroundType === BackgroundCSSStyling) - [_backgroundColor restorePreviousCSSState:@ref(_cssStylePreviousState) forDOMElement:_DOMElement]; + [CPColor restorePreviousCSSState:@ref(_cssStylePreviousState) forDOMElement:_DOMElement]; var patternImage = [_backgroundColor patternImage], colorExists = _backgroundColor && ([_backgroundColor patternImage] || [_backgroundColor alphaComponent] > 0.0), diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index e9ab2da16..041388d0e 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -193,7 +193,7 @@ var CPWindowActionMessageKeys = [ BOOL _isDocumentEdited; BOOL _isDocumentSaving; - CPImageView _shadowView; + _CPShadowWindowView _shadowView; CPView _windowView; CPView _contentView; @@ -369,6 +369,23 @@ CPTexturedBackgroundWindowMask [_windowView _setWindow:self]; [_windowView setNextResponder:self]; + // CSS Styling +#if PLATFORM(DOM) + var radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-top-left-radius"]) + _windowView._DOMElement.style.borderTopLeftRadius = radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-top-right-radius"]) + _windowView._DOMElement.style.borderTopRightRadius = radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-bottom-left-radius"]) + _windowView._DOMElement.style.borderBottomLeftRadius = radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-bottom-right-radius"]) + _windowView._DOMElement.style.borderBottomRightRadius = radius; +#endif + // Size calculation needs _windowView _minSize = [self _calculateMinSizeForProposedSize:CGSizeMake(0.0, 0.0)]; _maxSize = CGSizeMake(1000000.0, 1000000.0); @@ -1410,25 +1427,51 @@ CPTexturedBackgroundWindowMask return; } - - if (_hasShadow && !_shadowView) + + if ([[self actualTheme] isCSSBased]) { - _shadowView = [[_CPShadowWindowView alloc] initWithFrame:CGRectMakeZero()]; - - [_shadowView setWindowView:_windowView]; - [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; - [_shadowView setNeedsLayout]; - + // When using CSS theming, we get rid of _shadowView and add CSS shadowing directly + // on the _windowView + #if PLATFORM(DOM) - CPDOMDisplayServerInsertBefore(_DOMElement, _shadowView._DOMElement, _windowView._DOMElement); + // We must check that _windowView exists as _updateShadow can be called by + // _setSharesChromeWithPlatformWindow whereas _windowView is not yet created + if (_windowView && _windowView._DOMElement) + { + var currentBoxShadow = _windowView._DOMElement.style.boxShadow; + + if (_hasShadow && (currentBoxShadow.length == 0)) + { + _windowView._DOMElement.style.boxShadow = [_windowView actualValueForThemeAttribute:@"window-shadow-color"]; + } + else if (!_hasShadow && (currentBoxShadow.length > 0)) + { + _windowView._DOMElement.style.boxShadow = ""; + } + } #endif } - else if (!_hasShadow && _shadowView) + else { + if (_hasShadow && !_shadowView) + { + _shadowView = [[_CPShadowWindowView alloc] initWithFrame:CGRectMakeZero()]; + + [_shadowView setWindowView:_windowView]; + [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [_shadowView setNeedsLayout]; + #if PLATFORM(DOM) - CPDOMDisplayServerRemoveChild(_DOMElement, _shadowView._DOMElement); + CPDOMDisplayServerInsertBefore(_DOMElement, _shadowView._DOMElement, _windowView._DOMElement); #endif - _shadowView = nil; + } + else if (!_hasShadow && _shadowView) + { +#if PLATFORM(DOM) + CPDOMDisplayServerRemoveChild(_DOMElement, _shadowView._DOMElement); +#endif + _shadowView = nil; + } } } @@ -2814,7 +2857,7 @@ CPTexturedBackgroundWindowMask contentRect = [_contentView frame], sheetFrame = CGRectMakeCopy([attachedSheet frame]); - sheetFrame.origin.y = CGRectGetMinY(_frame) + CGRectGetMinY(contentRect); + sheetFrame.origin.y = [[attachedSheet _windowView] _sheetVerticalOffset]+ CGRectGetMinY(_frame) + CGRectGetMinY(contentRect); sheetFrame.origin.x = CGRectGetMinX(_frame) + FLOOR((CGRectGetWidth(_frame) - CGRectGetWidth(sheetFrame)) / 2.0); [attachedSheet setFrame:sheetFrame display:YES animate:NO]; @@ -3013,13 +3056,12 @@ CPTexturedBackgroundWindowMask } // The sheet starts hidden just above the top of a clip rect - // TODO : Make properly for the -1 in endY var sheetFrame = [sheet frame], - sheetShadowFrame = sheet._hasShadow ? [sheet._shadowView frame] : sheetFrame, + sheetShadowFrame = [sheet _shadowFrame], frame = [self frame], originX = frame.origin.x + FLOOR((frame.size.width - sheetFrame.size.width) / 2), startFrame = CGRectMake(originX, -sheetShadowFrame.size.height, sheetFrame.size.width, sheetFrame.size.height), - endY = -1 + [_windowView bodyOffset] - [[self contentView] frame].origin.y, + endY = [[sheet _windowView] _sheetVerticalOffset] + [_windowView bodyOffset] - [[self contentView] frame].origin.y, endFrame = CGRectMake(originX, endY, sheetFrame.size.width, sheetFrame.size.height); if (_toolbar && [_windowView showsToolbar] && [self isFullPlatformWindow]) @@ -3058,7 +3100,7 @@ CPTexturedBackgroundWindowMask { var sheet = _sheetContext["sheet"], sheetFrame = [sheet frame], - fullHeight = sheet._hasShadow ? [sheet._shadowView frame].size.height : sheetFrame.size.height, + fullHeight = [sheet _shadowFrame].size.height, endFrame = CGRectMakeCopy(sheetFrame), contentOrigin = [self convertBaseToGlobal:[[self contentView] frame].origin]; @@ -3090,7 +3132,7 @@ CPTexturedBackgroundWindowMask sheetOrigin = CGPointMakeCopy(sheetFrame.origin); [self _removeClipForSheet:sheet]; - [sheet setFrameOrigin:CGPointMake(sheetOrigin.x, [sheet frame].origin.y + sheetOrigin.y)]; + [self _setAttachedSheetFrameOrigin]; // we wanted to close the sheet while it animated in, do that now if (_sheetContext["shouldClose"] === YES) @@ -3137,6 +3179,14 @@ CPTexturedBackgroundWindowMask return _isSheet; } +- (CGRect)_shadowFrame +{ + if (_hasShadow) + return _shadowView ? [_shadowView frame] : [self frame]; + + return [self frame]; +} + // /* Used privately. diff --git a/AppKit/CPWindow/_CPPopoverWindowView.j b/AppKit/CPWindow/_CPPopoverWindowView.j index aeba11f8a..cd4fbc54c 100644 --- a/AppKit/CPWindow/_CPPopoverWindowView.j +++ b/AppKit/CPWindow/_CPPopoverWindowView.j @@ -41,6 +41,7 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); unsigned _preferredEdge @accessors(property=preferredEdge); CGSize _cursorSize; + CPColor _contentViewSavedBackgroundColor; } + (CPString)defaultThemeClass @@ -123,6 +124,7 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); _arrowOffsetY = 0.0; _appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]; _cursorSize = CGSizeMakeCopy(_CPPopoverWindowViewDefaultCursorSize); + _contentViewSavedBackgroundColor = nil; } return self; @@ -177,6 +179,24 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); strokeColor = [self valueForThemeAttribute:@"stroke-color-hud"]; } + // Cappuccino special behavior : + // If the content view has a background color, we use it as gradient color + var subviews = [self subviews], + contentView = [subviews count] > 0 ? subviews[0] : nil, + contentViewBackgroundColor = [contentView backgroundColor]; + + if (_contentViewSavedBackgroundColor) + { + gradient = _contentViewSavedBackgroundColor; + } + else if (contentViewBackgroundColor) + { + gradient = _contentViewSavedBackgroundColor = contentViewBackgroundColor; + + // We remove the content view background color (it will be restored when the popover closes) + [contentView setBackgroundColor:nil]; + } + // fix rect to take care of stroke and shadow frame.origin.x += halfStrokeWidth + shadowBlur; frame.origin.y += halfStrokeWidth + (shadowBlur + shadowSize.height / 2); @@ -188,7 +208,14 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); CGContextBeginPath(context); CGContextSetShadowWithColor(context, shadowSize, shadowBlur, shadowColor); - CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), 0.0), CGPointMake(CGRectGetMidX(frame), frame.size.height), 0); + + // Is gradient a CGGradient or a CPColor ? + if ('locations' in gradient) + // CGGradient + CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), 0.0), CGPointMake(CGRectGetMidX(frame), frame.size.height), 0); + else + // CPColor or CGColor + CGContextSetFillColor(context, gradient); var xMin = CGRectGetMinX(frame), xMax = CGRectGetMaxX(frame), @@ -401,4 +428,18 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); CGContextFillPath(context); } +- (void)_restoreViewBackgroundColor +{ + if (_contentViewSavedBackgroundColor) + { + // We restore the saved background color in the content view + var subviews = [self subviews], + contentView = [subviews count] > 0 ? subviews[0] : nil; + + [contentView setBackgroundColor:_contentViewSavedBackgroundColor]; + + _contentViewSavedBackgroundColor = nil; + } +} + @end diff --git a/AppKit/CPWindow/_CPWindowView.j b/AppKit/CPWindow/_CPWindowView.j index 910a25d60..d3abb5ee5 100644 --- a/AppKit/CPWindow/_CPWindowView.j +++ b/AppKit/CPWindow/_CPWindowView.j @@ -70,12 +70,40 @@ _CPWindowViewResizeSlop = 3; + (CGRect)contentRectForFrameRect:(CGRect)aFrameRect { - return CGRectMakeCopy(aFrameRect); + // First, we have to check if we are compiling a theme or running an application because if working on a theme, + // we can't use theme attributes to determine the inset ! This would be a kind of circular reference... + + var compilingATheme = [[[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPApplicationDelegateClass"] isEqualToString:@"BKShowcaseController"], + frameOutset = compilingATheme ? CGInsetMakeZero() : [[CPTheme defaultTheme] valueForAttributeWithName:@"frame-outset" forClass:_CPWindowView]; + + if (!frameOutset) + // No value found in theme. Get default value. + frameOutset = [[self themeAttributes] objectForKey:@"frame-outset"]; + + if (!frameOutset) + // No value found in defaults. Get default value for _CPWindowView (we know here that the window class is not _CPWindowView) + frameOutset = [[_CPWindowView themeAttributes] objectForKey:@"frame-outset"]; + + return CGRectMake(aFrameRect.origin.x - frameOutset.left, aFrameRect.origin.y - frameOutset.top, aFrameRect.size.width + frameOutset.left + frameOutset.right, aFrameRect.size.height + frameOutset.top + frameOutset.bottom); } + (CGRect)frameRectForContentRect:(CGRect)aContentRect { - return CGRectMakeCopy(aContentRect); + // First, we have to check if we are compiling a theme or running an application because if working on a theme, + // we can't use theme attributes to determine the inset ! This would be a kind of circular reference... + + var compilingATheme = [[[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPApplicationDelegateClass"] isEqualToString:@"BKShowcaseController"], + frameOutset = compilingATheme ? CGInsetMakeZero() : [[CPTheme defaultTheme] valueForAttributeWithName:@"frame-outset" forClass:[self class]]; // _CPWindowView - [self class] + + if (!frameOutset) + // No value found in theme. Get default value. + frameOutset = [[self themeAttributes] objectForKey:@"frame-outset"]; + + if (!frameOutset) + // No value found in theme. Get default value for _CPWindowView + frameOutset = [[_CPWindowView themeAttributes] objectForKey:@"frame-outset"]; + + return CGRectMake(aContentRect.origin.x - frameOutset.left, aContentRect.origin.y - frameOutset.top, aContentRect.size.width + frameOutset.left + frameOutset.right, aContentRect.size.height + frameOutset.top + frameOutset.bottom); } + (CPString)defaultThemeClass @@ -94,6 +122,7 @@ _CPWindowViewResizeSlop = 3; @"resize-indicator": [CPNull null], @"attached-sheet-shadow-color": [CPColor blackColor], @"shadow-height": 8, + @"shadown-horizontal-offset": 0, @"close-image-origin": [CPNull null], @"close-image-size": [CPNull null], @"close-image": [CPNull null], @@ -107,10 +136,16 @@ _CPWindowViewResizeSlop = 3; @"title-line-break-mode": CPLineBreakByTruncatingTail, @"title-vertical-alignment": CPTopVerticalTextAlignment, @"title-margin": 20, + @"border-top-left-radius": @"0px", + @"border-top-right-radius": @"0px", + @"border-bottom-left-radius": @"0px", + @"border-bottom-right-radius": @"0px", @"minimize-image-origin": [CPNull null], @"minimize-image-size": [CPNull null], @"zoom-image-origin": [CPNull null], - @"zoom-image-size": [CPNull null] + @"zoom-image-size": [CPNull null], + @"frame-outset": CGInsetMakeZero(), + @"sheet-vertical-offset": -1 }; } @@ -937,9 +972,14 @@ _CPWindowViewResizeSlop = 3; [self setNeedsLayout]; } -- (CGRect)_shadowViewWidthForParentWindow:(CPWindow)parentWindow +- (int)_sheetVerticalOffset { - var myWidth = [self bounds].size.width, + return [self currentValueForThemeAttribute:@"sheet-vertical-offset"]; +} + +- (int)_shadowViewWidthForParentWindow:(CPWindow)parentWindow +{ + var myWidth = [self bounds].size.width - [self currentValueForThemeAttribute:@"shadown-horizontal-offset"], parentWidth = [[parentWindow contentView] bounds].size.width; return MIN(myWidth, parentWidth); diff --git a/AppKit/Cib/_CPCibCustomResource.j b/AppKit/Cib/_CPCibCustomResource.j index eac3544fd..5a0ed43b1 100644 --- a/AppKit/Cib/_CPCibCustomResource.j +++ b/AppKit/Cib/_CPCibCustomResource.j @@ -54,8 +54,9 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", return; _CPCibCustomResourceTemplateImageMap = @{ - "CPAddTemplate": "button-image-plus", - "CPRemoveTemplate": "button-image-minus" + "CPAddTemplate": "button-image-plus", + "CPRemoveTemplate": "button-image-minus", + "CPActionTemplate": "button-image-action" }; } + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize @@ -111,6 +112,19 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", (![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources])) if (_className === @"CPImage") { + // Is this a material icon reference ? + if ([_resourceName hasSuffix:@"@MaterialIcons"]) + { + var range = [_resourceName rangeOfString:@"@MaterialIcons"]; + + if (range.location <= 0) + [CPException raise:CPRangeException reason:"Malformed Material Icon reference ("+_resourceName+")"]; + + var iconName = [_resourceName substringToIndex:range.location]; + + return [CPImage imageWithMaterialIconNamed:iconName size:CGSizeMake(16,16)]; + } + var templateImage = [_CPCibCustomResourceTemplateImageMap objectForKey:_resourceName]; if (templateImage) diff --git a/AppKit/CoreAnimation/CPViewAnimator.j b/AppKit/CoreAnimation/CPViewAnimator.j index 6b9ef21da..16c928b45 100644 --- a/AppKit/CoreAnimation/CPViewAnimator.j +++ b/AppKit/CoreAnimation/CPViewAnimator.j @@ -37,7 +37,7 @@ var DEFAULT_CSS_PROPERTIES = nil, [self _setTargetValue:YES withKeyPath:@"CPAnimationTriggerOrderOut" setter:_cmd]; } -- (void)setAlphaValue:(CGPoint)alphaValue +- (void)setAlphaValue:(float)alphaValue { [self _setTargetValue:alphaValue withKeyPath:@"alphaValue" setter:_cmd]; } diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.eot b/AppKit/Resources/fonts/MaterialIcons-Regular.eot new file mode 100755 index 000000000..70508ebab Binary files /dev/null and b/AppKit/Resources/fonts/MaterialIcons-Regular.eot differ diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.ijmap b/AppKit/Resources/fonts/MaterialIcons-Regular.ijmap new file mode 100755 index 000000000..d9f1d259f --- /dev/null +++ b/AppKit/Resources/fonts/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.svg b/AppKit/Resources/fonts/MaterialIcons-Regular.svg new file mode 100755 index 000000000..a449327e2 --- /dev/null +++ b/AppKit/Resources/fonts/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.ttf b/AppKit/Resources/fonts/MaterialIcons-Regular.ttf new file mode 100755 index 000000000..7015564ad Binary files /dev/null and b/AppKit/Resources/fonts/MaterialIcons-Regular.ttf differ diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.woff b/AppKit/Resources/fonts/MaterialIcons-Regular.woff new file mode 100755 index 000000000..b648a3eea Binary files /dev/null and b/AppKit/Resources/fonts/MaterialIcons-Regular.woff differ diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.woff2 b/AppKit/Resources/fonts/MaterialIcons-Regular.woff2 new file mode 100755 index 000000000..9fa211252 Binary files /dev/null and b/AppKit/Resources/fonts/MaterialIcons-Regular.woff2 differ diff --git a/AppKit/Resources/fonts/material-icons.css b/AppKit/Resources/fonts/material-icons.css new file mode 100755 index 000000000..2270c09d0 --- /dev/null +++ b/AppKit/Resources/fonts/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/AppKit/Themes/BlendKit/BKThemeDescriptor.j b/AppKit/Themes/BlendKit/BKThemeDescriptor.j index 1512c480e..21f245881 100644 --- a/AppKit/Themes/BlendKit/BKThemeDescriptor.j +++ b/AppKit/Themes/BlendKit/BKThemeDescriptor.j @@ -325,6 +325,15 @@ var ItemSizes = { }, [self registerThemeValues:themeValues forView:aView]; } ++ (void)registerThemeValues:(CPArray)themeValues forView:(CPView)aView inheritFrom:(CPView)anotherView +{ + if (anotherView) + // We take all theme attributes values from anotherView + [aView _addThemeAttributeDictionary:[anotherView _themeAttributeDictionary]]; + + [self registerThemeValues:themeValues forView:aView]; +} + @end function BKLabelFromIdentifier(anIdentifier) diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index 6c754a448..fc3764351 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -662,17 +662,6 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, if (!imageStyle) var imageStyle = _DOMImageElement.style; - if (_flags & _CPImageAndTextViewImageChangedFlag) - { - if (isCSSBasedImage) - _cssStyleNode = [_image applyCSSImageForView:self - onDOMElement:_DOMImageElement - styleNode:_cssStyleNode - previousState:@ref(_cssStylePreviousState)]; - else - _DOMImageElement.src = [_image filename]; - } - var centerX = size.width / 2.0, centerY = size.height / 2.0, imageSize = [_image size], @@ -737,6 +726,24 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px"; imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px"; } + + if (_flags & _CPImageAndTextViewImageChangedFlag) + { + if (isCSSBasedImage) + { + // For material icons images & co. + if ([_image _shouldBeResized]) + [_image _setDisplaySize:CGSizeMake(imageWidth, imageHeight)]; + + _cssStyleNode = [_image applyCSSImageForView:self + onDOMElement:_DOMImageElement + styleNode:_cssStyleNode + previousState:@ref(_cssStylePreviousState)]; + } + else + _DOMImageElement.src = [_image filename]; + } + } if (hasDOMTextElement) diff --git a/AppKit/_CPObject+Theme.j b/AppKit/_CPObject+Theme.j index 7c906a1ca..30cd13a9a 100644 --- a/AppKit/_CPObject+Theme.j +++ b/AppKit/_CPObject+Theme.j @@ -205,7 +205,7 @@ var NULL_THEME = {}; if (cachedAttributes) { - attributes = attributes.length ? attributes.concat(cachedAttributes) : attributes; + attributes = cachedAttributes.length ? attributes.concat(cachedAttributes) : attributes; break; } @@ -300,6 +300,22 @@ var NULL_THEME = {}; return dictionary; } +- (void)_addThemeAttributeDictionary:(CPDictionary)themeAttributeDictionary +{ + if (!themeAttributeDictionary) + return; + + var keys = [themeAttributeDictionary allKeys]; + + for (var i = 0, count = [keys count], key, value; i < count; i++) + { + key = keys[i]; + value = [themeAttributeDictionary objectForKey:key]; + + _themeAttributes[key] = value; + } +} + - (void)setValue:(id)aValue forThemeAttribute:(CPString)aName inState:(ThemeState)aState { #if DEBUG diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 88c69bb34..9d623b4f8 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -25,6 +25,7 @@ @import "CPButton.j" @import "CPMenu.j" @import "CPPanel.j" +@import "CPAnimationContext.j" // Use forward declaration because this file is imported by CPPopover @class CPPopover @@ -117,7 +118,11 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _isClosing = NO; _browserAnimates = [self browserSupportsAnimation]; _shouldPerformAnimation = YES; - _orderOutTransitionFunction = function() { [self _orderOutRecursively:YES]; }; + _orderOutTransitionFunction = function() + { + [self _orderOutRecursively:YES]; + [_windowView _restoreViewBackgroundColor]; + }; _isOpening = YES; [self setStyleMask:aStyleMask]; diff --git a/Foundation/CPKeyedArchiver.j b/Foundation/CPKeyedArchiver.j index c9e2f10bc..8d58fe42d 100644 --- a/Foundation/CPKeyedArchiver.j +++ b/Foundation/CPKeyedArchiver.j @@ -191,7 +191,7 @@ var _CPKeyedArchiverStringClass = Nil, */ - (void)finishEncoding { - if (_delegate && _delegateSelectors & _CPKeyedArchiverDidFinishEncodingSelector) + if (_delegate && _delegateSelectors & _CPKeyedArchiverWillFinishEncodingSelector) [_delegate archiverWillFinish:self]; var i = 0, @@ -299,10 +299,10 @@ var _CPKeyedArchiverStringClass = Nil, if ([_delegate respondsToSelector:@selector(archiver:willReplaceObject:withObject:)]) _delegateSelectors |= _CPKeyedArchiverWillReplaceObjectWithObjectSelector; - if ([_delegate respondsToSelector:@selector(archiver:didFinishEncoding:)]) + if ([_delegate respondsToSelector:@selector(archiverDidFinish:)]) _delegateSelectors |= _CPKeyedArchiverDidFinishEncodingSelector; - if ([_delegate respondsToSelector:@selector(archiver:willFinishEncoding:)]) + if ([_delegate respondsToSelector:@selector(archiverWillFinish:)]) _delegateSelectors |= _CPKeyedArchiverWillFinishEncodingSelector; } diff --git a/Tests/AppKit/CPButtonTest.j b/Tests/AppKit/CPButtonTest.j index e10550a9e..8a0f92e78 100644 --- a/Tests/AppKit/CPButtonTest.j +++ b/Tests/AppKit/CPButtonTest.j @@ -132,15 +132,16 @@ [self assert:CPMixedState equals:[button state] message:@"Mixed state is allowed, state should be CPMixedState"]; } -- (void)testThemeStateWhenSettingObjectValue -{ - [button unsetThemeState:[button themeState]]; - [button setObjectValue:CPOnState]; - [self assert:String(CPThemeStateSelected) equals:String([button themeState]) message:@"object should be in the selected themestate"]; - - [button setObjectValue:CPOffState]; - [self assert:String(CPThemeStateNormal) equals:String([button themeState]) message:@"object should be in the normal themestate"]; -} +// PR #2920 modifies how theme states are used. This test is no more usable. +//- (void)testThemeStateWhenSettingObjectValue +//{ +// [button unsetThemeState:[button themeState]]; +// [button setObjectValue:CPOnState]; +// [self assert:String(CPThemeStateSelected) equals:String([button themeState]) message:@"object should be in the selected themestate"]; +// +// [button setObjectValue:CPOffState]; +// [self assert:String(CPThemeStateNormal) equals:String([button themeState]) message:@"object should be in the normal themestate"]; +//} - (void)testThemeAttributes { @@ -189,6 +190,69 @@ [self assertTrue:wasClicked message:@"a user click on a radio button should fire the group action"]; } +- (void)testAutomaticRadioGroup +{ + var radioButton1 = [CPRadio radioWithTitle:@"Radio 1"], + radioButton2 = [CPRadio radioWithTitle:@"Radio 2"], + radioButton3 = [CPRadio radioWithTitle:@"Radio 3"], + simpleView1 = [[CPView alloc] initWithFrame:CGRectMakeZero()], + simpleView2 = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + // Initially, buttons are isolated + [self assertFalse:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"initially, buttons should be isolated"]; + + [simpleView1 addSubview:radioButton1]; + [simpleView1 addSubview:radioButton2]; + + // As no actions are defined, buttons are still isolated + [self assertFalse:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"no actions defined, buttons should be isolated"]; + + [radioButton1 setAction:@selector(dummyAction1:)]; + [radioButton2 setAction:@selector(dummyAction2:)]; + + // As different actions are defined, buttons are still isolatdd + [self assertFalse:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"different actions defined, buttons should be isolated"]; + + [radioButton2 setAction:@selector(dummyAction1:)]; + + // As the same action is defined, buttons must be grouped + [self assertTrue:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"same action defined, buttons should be grouped"]; + + [radioButton3 setAction:@selector(dummyAction1:)]; + + // As radioButton3 is not inserted in a view, it's isolated + [self assertTrue:([[radioButton3 radioGroup] size] === 1) message:@"not in a view, button should be isolated"]; + + [simpleView2 addSubview:radioButton3]; + + // As radioButton3 is in another view, it's isolated from radioButton1 & 2 + [self assertTrue:([[radioButton3 radioGroup] size] === 1) message:@"alone in a view, button should be isolated"]; + + [simpleView1 addSubview:radioButton3]; + + // As all 3 buttons are in the same view, with the same action, they are grouped + [self assertTrue:([[radioButton3 radioGroup] size] === 3) message:@"after moving to the same view, buttons should be grouped"]; + + [radioButton3 setAction:@selector(dummyAction2:)]; + + // As the action of button 3 is now different, it's isolated + [self assertTrue:([[radioButton3 radioGroup] size] === 1) message:@"after changing the action, button 3 should be isolated"]; + + // And buttons 1 & 2 are still grouped + [self assertTrue:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"buttons 1 & 2 should remain grouped"]; + [self assertTrue:([[radioButton1 radioGroup] size] === 2) message:@"radio group should contain only buttons 1 & 2"]; +} + +- (IBAction)dummyAction1:(id)sender +{ + +} + +- (IBAction)dummyAction2:(id)sender +{ + +} + - (void)testTypeMasks { button = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; diff --git a/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib b/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib index 9019a2d8a..87a08a420 100644 --- a/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib +++ b/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;41E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;45E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;46E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;55E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;40E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;61E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;63E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;65E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;66E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;67E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;69E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;72E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;76E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;68E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;77E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;78E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;2;68E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;2;79E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;80E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;81E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;2;83E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;84E;K;7;$aimageD;K;6;CP$UIDd;2;86E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;87E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;88E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;89E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;90E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;68E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;91E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;84E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;92E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;93E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;95E;K;6;$afontD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;84E;K;11;$aalignmentD;K;6;CP$UIDd;2;78E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;88E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;97E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;99E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;84E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;78E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;100E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;78E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;97E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;89E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;89E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;89E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;68E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;78E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;104E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;91E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;89E;E;S;35;NSKeyValueBindingSimpleBindingsTestD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;buttonS;16;objectControllerS;6;sliderS;9;textFieldS;9;theWindowS;8;delegateS;10;muteTrack:S;23;value: selection.volumeS;5;valueS;16;selection.volumeD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;22;CPValidatesImmediatelyD;K;6;CP$UIDd;2;91E;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;105E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;20;contentObject: trackS;13;contentObjectS;5;trackD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 518}, {223, 125}}S;22;{{0, 0}, {1680, 1028}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {223, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;E;E;S;6;normalS;21;{{83, 48}, {120, 21}}S;19;{{0, 0}, {120, 21}}d;1;8D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;106E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;107E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;89E;E;d;1;5d;1;4d;2;11S;20;{{83, 82}, {70, 25}}S;18;{{0, 0}, {70, 25}}S;8;borderedD;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;108E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;109E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;91E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;91E;E;d;1;2D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;4;nameD;K;6;CP$UIDd;3;110E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;111E;K;5;valueD;K;6;CP$UIDd;3;112E;E;S;4;MuteS;0;F;d;2;14T;S;21;{{79, 16}, {128, 29}}S;19;{{0, 0}, {128, 29}}S;9;textfieldS;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;108E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;109E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;91E;E;d;4;3072D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;113E;E;S;20;{{20, 23}, {55, 17}}S;18;{{0, 0}, {55, 17}}S;7;Volume:D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;114E;E;S;19;CPMutableDictionaryS;7;NothingS;9;Helveticad;2;12S;28;_CPFontSystemFacePlaceholderd;2;-1S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;115E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;116E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;117E;E;E;S;13;Lucida Granded;2;13d;1;1f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;41E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;45E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;46E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;55E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;40E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;61E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;63E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;65E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;66E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;67E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;69E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;75E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;76E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;77E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;79E;K;6;$afontD;K;6;CP$UIDd;2;81E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;68E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;83E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;2;68E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;2;86E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;87E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;89E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;90E;K;16;$aimage-positionD;K;6;CP$UIDd;2;68E;K;6;$afontD;K;6;CP$UIDd;2;91E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;90E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;92E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;93E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;94E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;74E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;95E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;68E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;68E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;96E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;97E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;98E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;104E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;106E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;96E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;94E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;96E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;96E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;96E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;108E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;90E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;84E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;74E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;74E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;109E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;79E;K;6;$afontD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;114E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;96E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;115E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;74E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;74E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;74E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;116E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;68E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;84E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;74E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;96E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;117E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;96E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;74E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;2;74E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;2;74E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;119E;E;S;35;NSKeyValueBindingSimpleBindingsTestD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;buttonS;16;objectControllerS;6;sliderS;9;textFieldS;9;theWindowS;8;delegateS;10;muteTrack:S;23;value: selection.volumeS;5;valueS;16;selection.volumeD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;22;CPValidatesImmediatelyD;K;6;CP$UIDd;2;97E;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;120E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;20;contentObject: trackS;13;contentObjectS;5;trackD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 518}, {223, 125}}S;22;{{0, 0}, {1680, 1028}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {223, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{83, 48}, {120, 21}}S;19;{{0, 0}, {120, 21}}d;1;8S;18;controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;121E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;5d;1;4d;2;-1d;2;11S;20;{{83, 85}, {70, 25}}S;18;{{0, 0}, {70, 25}}S;35;bordered+controlSizeRegular+roundedd;1;2D;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;123E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;85E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;96E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;MuteS;0;d;2;14T;d;1;1S;21;{{79, 17}, {128, 22}}S;19;{{0, 0}, {128, 22}}S;9;textfieldS;47;bezeled+controlSizeRegular+editable+placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;124E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;126E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;127E;K;12;defaultValueD;K;6;CP$UIDd;2;90E;K;6;valuesD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;129E;K;12;defaultValueD;K;6;CP$UIDd;2;68E;K;6;valuesD;K;6;CP$UIDd;3;130E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;E;S;20;{{19, 23}, {57, 17}}S;18;{{0, 0}, {57, 17}}D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;124E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;127E;K;12;defaultValueD;K;6;CP$UIDd;2;90E;K;6;valuesD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;129E;K;12;defaultValueD;K;6;CP$UIDd;2;68E;K;6;valuesD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;139E;E;E;S;7;Volume:D;K;6;$classD;K;6;CP$UIDd;3;107E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;E;S;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;118E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;7;NothingS;9;Helveticad;2;12S;28;_CPFontSystemFacePlaceholderS;4;fontD;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;123E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;85E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;90E;K;6;normalD;K;6;CP$UIDd;2;90E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;84E;K;6;normalD;K;6;CP$UIDd;2;84E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;142E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;143E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;37E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;145E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;146E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;37E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;68E;K;6;normalD;K;6;CP$UIDd;2;68E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;84E;K;6;normalD;K;6;CP$UIDd;2;84E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;148E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;146E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;38E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;38E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;2;97E;E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;151E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;153E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;155E;E;f;18;0.6862745098039216S;57;{"origin":{"x":0,"y":1},"size":{"width":120,"height":21}}S;59;{"origin":{"x":83,"y":84},"size":{"width":120,"height":21}}S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;59;{"origin":{"x":83,"y":83},"size":{"width":120,"height":22}}S;58;{"origin":{"x":17,"y":85},"size":{"width":61,"height":17}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib b/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib index dadce930f..3547f8943 100644 --- a/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib +++ b/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;62E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;63E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;42E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;69E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;56E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;57E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;76E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;77E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;54E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;82E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;85E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;88E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;91E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;94E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;95E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;96E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;97E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;98E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;38E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;102E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;105E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;107E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;114E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;118E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;120E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;121E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;122E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;113E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;122E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;113E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;122E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;113E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;129E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;130E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;131E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;133E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;135E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;136E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;50E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;49E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;127E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;113E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;113E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;116E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;137E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;111E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;136E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;138E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;136E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;52E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;144E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;145E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;101E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;116E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;146E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;144E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;149E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;101E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;113E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;150E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;151E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;12;$agrid-colorD;K;6;CP$UIDd;3;153E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;154E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;155E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;101E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;112E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;116E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;113E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;113E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;113E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;113E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;156E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;153E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;101E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;116E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;158E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;47E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;159E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;160E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;161E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;162E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;164E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;165E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;166E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;116E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;113E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;167E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;168E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;171E;K;6;$afontD;K;6;CP$UIDd;3;172E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;7;$aimageD;K;6;CP$UIDd;3;174E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;175E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;123E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;176E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;111E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;177E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;168E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;171E;K;6;$afontD;K;6;CP$UIDd;3;172E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;7;$aimageD;K;6;CP$UIDd;3;178E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;179E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;123E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;176E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;111E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;180E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;181E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;182E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;183E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;118E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;183E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;185E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;181E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;182E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;183E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;186E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;118E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;183E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;187E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;113E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;116E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;113E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;113E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;113E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;113E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;113E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;116E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;116E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;188E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;189E;E;S;10;MyDocumentD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;E;E;S;9;addButtonS;15;arrayControllerS;9;nameFieldS;12;removeButtonS;26;selectedBookmarkTitleFieldS;24;selectedBookmarkURLFieldS;9;tableViewS;10;dataSourceS;8;delegateS;7;remove:S;4;add:S;24;contentArray: collectionS;12;contentArrayS;10;collectionD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;28;value: arrangedObjects.titleS;5;valueS;21;arrangedObjects.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;20;value: selection.URLS;13;selection.URLD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;190E;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;191E;E;E;S;22;value: selection.titleS;15;selection.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;191E;E;E;S;11;value: nameS;4;nameD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 368}, {534, 323}}S;21;{{0, 0}, {1440, 878}}d;2;15S;15;02_WithBindingsd;1;0S;20;{{0, 0}, {534, 323}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;59E;E;E;S;6;normalS;21;{{20, 20}, {106, 17}}S;19;{{0, 0}, {106, 17}}d;2;36S;9;textfieldD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;192E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;193E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;113E;E;d;1;2d;1;4T;S;16;Collection Name:d;4;3072F;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;194E;E;S;22;{{130, 13}, {388, 29}}S;19;{{0, 0}, {388, 29}}d;2;34S;28;bezeled+editable+placeholderS;0;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;195E;E;S;22;{{57, 241}, {461, 29}}S;19;{{0, 0}, {461, 29}}d;2;10S;22;{{57, 273}, {461, 29}}S;22;{{20, 47}, {494, 150}}S;20;{{0, 0}, {494, 150}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;E;E;d;2;18S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;196E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;197E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;198E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;199E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;200E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;201E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;198E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;S;19;{{0, 0}, {492, 25}}S;14;tableHeaderRowS;19;{{1, 2}, {492, 15}}S;19;{{0, 0}, {492, 15}}d;1;8S;8;scrollerS;8;disabledS;29;_horizontalScrollerDidScroll:f;18;0.9904761910438538S;21;{{477, 1}, {15, 132}}S;19;{{0, 0}, {15, 132}}S;27;_verticalScrollerDidScroll:f;18;0.6157894730567932S;20;{{0, 0}, {492, 132}}S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;203E;E;d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;54E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;204E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;205E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;S;5;titlef;17;489.0575866699219f;18;31.557619094848633d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;207E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;208E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;209E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;101E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;210E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;209E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;101E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;112E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;211E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;101E;K;15;$acontent-insetD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;101E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;123E;E;d;1;3S;22;{{436, 214}, {78, 25}}S;18;{{0, 0}, {78, 25}}d;1;9S;6;buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;192E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;193E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;113E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;4;nameD;K;6;CP$UIDd;3;215E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;216E;K;5;valueD;K;6;CP$UIDd;3;217E;E;S;6;Removed;2;14S;22;{{346, 214}, {78, 25}}D;K;6;$classD;K;6;CP$UIDd;3;173E;K;4;nameD;K;6;CP$UIDd;3;215E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;216E;K;5;valueD;K;6;CP$UIDd;3;217E;E;S;3;AddS;21;{{20, 248}, {32, 17}}S;18;{{0, 0}, {32, 17}}d;2;12d;1;1S;6;Title:S;21;{{20, 280}, {32, 17}}S;4;URL:S;9;Bookmark2S;17;MyArrayControllerS;17;CPArrayControllerS;22;StringToURLTransformerS;12;No SelectionS;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;183E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;E;E;S;20;{{1, 1}, {492, 132}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;219E;E;S;21;{{1, 133}, {492, 17}}S;19;{{0, 0}, {492, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;183E;E;E;S;20;{{478, 0}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;222E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;223E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;224E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;S;5;TitleS;11;placeholderD;K;6;$classD;K;6;CP$UIDd;3;173E;K;4;nameD;K;6;CP$UIDd;3;225E;K;12;defaultValueD;K;6;CP$UIDd;3;110E;K;6;valuesD;K;6;CP$UIDd;3;226E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;227E;E;S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;223E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;228E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;E;E;f;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;221E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;164E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;164E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;132E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;116E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;S;13;Lucida Granded;2;11S;4;fontD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;230E;E;E;S;39;{"top":0,"right":5,"bottom":0,"left":5}d;2;13D;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;231E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;182E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;113E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;192E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;182E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;113E;E;S;17;Arial, sans-serifE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;62E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;63E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;42E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;69E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;56E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;57E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;76E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;77E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;54E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;82E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;85E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;88E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;91E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;94E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;95E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;96E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;97E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;98E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;38E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;102E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;108E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;109E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;115E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;118E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;120E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;107E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;11;$aalignmentD;K;6;CP$UIDd;3;132E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;133E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;134E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;136E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;137E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;139E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;140E;K;11;$aalignmentD;K;6;CP$UIDd;3;141E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;142E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;134E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;143E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;137E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;145E;K;11;$aalignmentD;K;6;CP$UIDd;3;146E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;147E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;134E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;148E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;149E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;153E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;155E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;156E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;50E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;49E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;138E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;138E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;138E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;138E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;119E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;119E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;107E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;157E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;125E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;156E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;158E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;158E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;156E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;160E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;52E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;161E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;165E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;166E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;107E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;168E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;169E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;170E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;165E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;172E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;119E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;173E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;174E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;175E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;12;$agrid-colorD;K;6;CP$UIDd;3;177E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;178E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;179E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;180E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;101E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;121E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;107E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;119E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;119E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;119E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;119E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;181E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;177E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;101E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;107E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;182E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;184E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;47E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;185E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;186E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;187E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;188E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;190E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;191E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;192E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;107E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;119E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;193E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;195E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;197E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;125E;K;16;$aimage-positionD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;199E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;125E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;200E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;201E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;134E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;107E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;202E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;119E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;101E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;119E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;204E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;195E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;197E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;125E;K;16;$aimage-positionD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;199E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;125E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;205E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;206E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;134E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;107E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;202E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;119E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;101E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;119E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;207E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;208E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;210E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;211E;K;11;$aalignmentD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;213E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;107E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;203E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;119E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;107E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;215E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;208E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;216E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;217E;K;11;$aalignmentD;K;6;CP$UIDd;3;218E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;219E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;220E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;107E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;203E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;119E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;107E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;221E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;119E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;107E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;3;107E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;3;107E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;223E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;119E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;119E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;119E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;119E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;119E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;107E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;107E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;224E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;225E;E;S;10;MyDocumentD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;E;E;S;9;addButtonS;15;arrayControllerS;9;nameFieldS;12;removeButtonS;26;selectedBookmarkTitleFieldS;24;selectedBookmarkURLFieldS;9;tableViewS;10;dataSourceS;8;delegateS;7;remove:S;4;add:S;24;contentArray: collectionS;12;contentArrayS;10;collectionD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;28;value: arrangedObjects.titleS;5;valueS;21;arrangedObjects.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;20;value: selection.URLS;13;selection.URLD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;226E;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;227E;E;E;S;22;value: selection.titleS;15;selection.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;227E;E;E;S;11;value: nameS;4;nameD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 368}, {534, 323}}S;21;{{0, 0}, {1440, 878}}d;2;15S;15;02_WithBindingsd;1;0S;20;{{0, 0}, {534, 323}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;59E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{19, 20}, {108, 17}}S;19;{{0, 0}, {108, 17}}d;2;36S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;230E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;236E;E;E;T;S;16;Collection Name:d;1;4d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;237E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;d;1;2S;22;{{130, 14}, {388, 22}}S;19;{{0, 0}, {388, 22}}d;2;34S;47;bezeled+controlSizeRegular+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;240E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;E;E;S;0;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;244E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;S;22;{{57, 242}, {461, 22}}S;19;{{0, 0}, {461, 22}}d;2;10D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;245E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;246E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;247E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;E;E;S;22;{{57, 274}, {461, 22}}D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;253E;D;K;6;CP$UIDd;3;254E;E;E;S;22;{{20, 47}, {494, 150}}S;20;{{0, 0}, {494, 150}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;E;E;d;2;18S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;255E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;174E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;257E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;258E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;259E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;260E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;261E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;262E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;263E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;263E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;264E;E;S;19;{{0, 0}, {492, 23}}S;14;tableHeaderRowD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;{{1, 2}, {492, 15}}S;19;{{0, 0}, {492, 15}}d;1;8S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:f;18;0.9904761910438538S;21;{{477, 1}, {15, 132}}S;19;{{0, 0}, {15, 132}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:f;18;0.6157894730567932S;20;{{0, 0}, {492, 132}}D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;265E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;266E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;54E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;3;267E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;183E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;268E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;271E;E;S;5;titlef;17;489.0575866699219f;18;31.557619094848633d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;263E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;263E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;272E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;273E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;274E;K;12;$atext-colorD;K;6;CP$UIDd;3;275E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;276E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;277E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;274E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;263E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;263E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;278E;K;6;$afontD;K;6;CP$UIDd;3;279E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;280E;K;11;$aalignmentD;K;6;CP$UIDd;3;281E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;282E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;283E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;257E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;121E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;101E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;107E;E;d;1;3S;22;{{436, 217}, {78, 25}}S;18;{{0, 0}, {78, 25}}d;1;9S;6;buttonS;35;bordered+controlSizeRegular+roundedD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;198E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;284E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;Removed;2;14d;1;1S;22;{{346, 217}, {78, 25}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;3;AddS;21;{{19, 248}, {34, 17}}S;18;{{0, 0}, {34, 17}}d;2;12D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;285E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;286E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;287E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;E;E;S;6;Title:S;21;{{19, 280}, {34, 17}}D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;289E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;292E;E;E;S;4;URL:S;9;Bookmark2D;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;222E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;17;MyArrayControllerS;17;CPArrayControllerS;22;StringToURLTransformerS;12;No SelectionS;4;fontD;K;6;$classD;K;6;CP$UIDd;3;198E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;284E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;294E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;40E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;40E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;296E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;203E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;298E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;41E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;300E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;301E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;41E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;302E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;303E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;42E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;42E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;304E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;305E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;42E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;42E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;307E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;43E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;43E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;309E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;43E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;43E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;310E;E;S;20;{{1, 1}, {492, 132}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;311E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{1, 133}, {492, 17}}S;19;{{0, 0}, {492, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;312E;D;K;6;CP$UIDd;3;312E;D;K;6;CP$UIDd;3;312E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;313E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;S;20;{{478, 0}, {14, 25}}S;18;{{0, 0}, {14, 25}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;315E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;198E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;284E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;209E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;316E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;5;TitleS;53;controlSizeRegular+editable+placeholder+tableDataViewD;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;318E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;319E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;320E;D;K;6;CP$UIDd;3;321E;E;E;d;4;3072S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;101E;K;6;normalD;K;6;CP$UIDd;3;101E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;203E;K;6;normalD;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;322E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;58E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;58E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;323E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;101E;K;6;normalD;K;6;CP$UIDd;3;101E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;203E;K;6;normalD;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;324E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;59E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;59E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;325E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;327E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;328E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;330E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;331E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;332E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;331E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;E;E;f;3;0.8D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;336E;D;K;6;CP$UIDd;3;337E;D;K;6;CP$UIDd;3;338E;D;K;6;CP$UIDd;3;203E;E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;314E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;339E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;340E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;151E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;341E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;342E;D;K;6;CP$UIDd;3;342E;D;K;6;CP$UIDd;3;342E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;43;editing+selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;229E;K;35;selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;229E;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;101E;K;6;normalD;K;6;CP$UIDd;3;101E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;343E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;191E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;191E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;345E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;191E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;191E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;346E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;347E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;348E;E;S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;60;{"origin":{"x":17,"y":286},"size":{"width":112,"height":17}}S;57;{"origin":{"x":0,"y":1},"size":{"width":380,"height":21}}S;61;{"origin":{"x":134,"y":285},"size":{"width":380,"height":21}}S;61;{"origin":{"x":134,"y":284},"size":{"width":380,"height":22}}S;57;{"origin":{"x":0,"y":1},"size":{"width":453,"height":21}}S;59;{"origin":{"x":61,"y":57},"size":{"width":453,"height":21}}S;59;{"origin":{"x":61,"y":56},"size":{"width":453,"height":22}}S;59;{"origin":{"x":61,"y":25},"size":{"width":453,"height":21}}S;59;{"origin":{"x":61,"y":24},"size":{"width":453,"height":22}}f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471S;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;f;18;0.5019607843137255D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;349E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;350E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;S;58;{"origin":{"x":17,"y":58},"size":{"width":38,"height":17}}S;58;{"origin":{"x":17,"y":26},"size":{"width":38,"height":17}}S;55;{"origin":{"x":0,"y":1},"size":{"width":0,"height":-1}}S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":1}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 43321a28c..70d8b7c04 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -629,6 +629,28 @@ var sharedObject = [CPObject new]; [self assertTrue:[[self stringForTesting] isEqual:string] message:"setAttributedString should have made strings equal, but they were not"]; } +- (void)testReplaceAttributedString +{ + var string = [[CPMutableAttributedString alloc] initWithString:"HELLO
THERE"]; + [string replaceOccurrencesOfString:"
" + withString:"" + options:0 + range:nil]; + + [self assertTrue:[string._string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string._string]; +} + +- (void)testReplaceAttributedStringWithRange +{ + var string = [[CPMutableAttributedString alloc] initWithString:"HELLO
THERE"]; + [string replaceOccurrencesOfString:"
" + withString:"" + options:0 + range:CPMakeRange(0, 4)]; + + [self assertTrue:[string._string isEqual:"HELLO
THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not respect the range restriction. Result is: " + string._string]; +} + - (void)testEncoding { // We can't test using [self stringForTesting] because it contains attributes without coding support. diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j b/Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j new file mode 100644 index 000000000..21976483b --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j @@ -0,0 +1,33 @@ +/* + * AppController.j + * Nib2CibSubviewsOrderTest + * + * Created by You on September 19, 2020. + * Copyright 2020, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:NO]; +} + +@end diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist b/Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist new file mode 100644 index 000000000..8ff942055 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + Nib2CibSubviewsOrderTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2020, Your Company All rights reserved. + + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile b/Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile new file mode 100644 index 000000000..9258affd9 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile @@ -0,0 +1,172 @@ +/* + * Jakefile + * Nib2CibSubviewsOrderTest + * + * Created by You on September 19, 2020. + * Copyright 2020, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "Nib2CibSubviewsOrderTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "Nib2CibSubviewsOrderTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("Nib2CibSubviewsOrderTest"); + task.setIdentifier("com.yourcompany.Nib2CibSubviewsOrderTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("Nib2CibSubviewsOrderTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g -S --inline-msg-send"); + else + task.setCompilerFlags("-O2"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib new file mode 100644 index 000000000..1b10d63d6 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;138E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;139E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;140E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;133E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;141E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;130E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;143E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;135E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;135E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;145E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;146E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;138E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;125E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;120E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;117E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;69E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;68E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;123E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;87E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;83E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;99E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;175E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;114E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;104E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;139E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;182E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;183E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;184E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;60E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;60E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;185E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;188E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;189E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;190E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;67E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;67E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;198E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;199E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;71E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;71E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;204E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;205E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;71E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;208E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;209E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;210E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;215E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;216E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;79E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;79E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;216E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;218E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;221E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;223E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;224E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;225E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;229E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;230E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;234E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;235E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;236E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;237E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;243E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;244E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;245E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;246E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;97E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;97E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;247E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;248E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;249E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;250E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;251E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;252E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;255E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;103E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;255E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;256E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;234E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;235E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;237E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;108E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;108E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;260E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;263E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;112E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;112E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;264E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;265E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;267E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;268E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;269E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;270E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;116E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;116E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;270E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;271E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;273E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;274E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;275E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;277E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;122E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;122E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;277E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;278E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;279E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;122E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;280E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;281E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;282E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;283E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;284E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;285E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;243E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;270E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;287E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;287E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;288E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;292E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;293E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;294E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;295E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;297E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;299E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;300E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;301E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;129E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;302E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;130E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;303E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;130E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;309E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;310E;K;11;$aalignmentD;K;6;CP$UIDd;3;311E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;312E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;313E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;314E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;318E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;300E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;319E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;129E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;320E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;133E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;321E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;322E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;133E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;323E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;324E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;326E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;327E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;314E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;328E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;300E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;329E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;129E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;330E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;332E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;333E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;11;$aalignmentD;K;6;CP$UIDd;3;335E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;336E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;337E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;314E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;338E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;341E;K;11;$aalignmentD;K;6;CP$UIDd;3;342E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;343E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;344E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;237E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;345E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;346E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;347E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;346E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;348E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;346E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;349E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;121E;E;E;S;14;NewApplicationS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;E;E;S;20;About NewApplicationT;S;0;F;S;12;Preferences…S;1;,S;19;Quit NewApplicationS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;72E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;107E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;6;DeleteS;10;Select AllS;1;aS;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;E;E;S;14;Show Spelling…S;1;:S;14;Check SpellingS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;123E;E;E;S;19;NewApplication HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1610612736S;23;{{335, 41}, {630, 447}}S;21;{{0, 0}, {1440, 878}}d;1;0S;20;{{0, 0}, {630, 447}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;137E;E;E;S;4;viewS;6;normalS;6;{1, 1}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{20, 20}, {590, 313}}S;20;{{0, 0}, {590, 313}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;135E;E;E;d;2;36D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;CPViewS;21;{{20, 20}, {163, 96}}S;19;{{0, 0}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{73, 29}, {16, 39}}S;18;{{0, 0}, {16, 39}}d;1;8S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;354E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;356E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;358E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;360E;E;E;S;1;1d;1;4d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;361E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;S;22;{{120, 76}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;134E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{73, 29}, {20, 39}}S;18;{{0, 0}, {20, 39}}D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;364E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;365E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;366E;E;E;S;1;2S;23;{{227, 136}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;136E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{73, 29}, {21, 39}}S;18;{{0, 0}, {21, 39}}D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;367E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;368E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;369E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;370E;E;E;S;1;3S;22;{{20, 341}, {590, 17}}S;19;{{0, 0}, {590, 17}}D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;371E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;372E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;373E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;374E;E;E;S;85;You should see, backmost to frontmost, red view (1), green view (2) and blue view (3)S;13;AppControllerS;15;backgroundColorD;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;375E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;376E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;377E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;S;4;fontD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;378E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;315E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;191E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;379E;K;6;normalD;K;6;CP$UIDd;3;379E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;314E;K;6;normalD;K;6;CP$UIDd;3;314E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;381E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;132E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;132E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;383E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;234E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;384E;K;6;normalD;K;6;CP$UIDd;3;384E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;314E;K;6;normalD;K;6;CP$UIDd;3;314E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;385E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;134E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;134E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;386E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;387E;K;6;normalD;K;6;CP$UIDd;3;387E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;314E;K;6;normalD;K;6;CP$UIDd;3;314E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;388E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;136E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;136E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;389E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;390E;K;6;normalD;K;6;CP$UIDd;3;390E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;391E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;137E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;137E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;393E;D;K;6;CP$UIDd;3;394E;D;K;6;CP$UIDd;3;395E;D;K;6;CP$UIDd;3;234E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;396E;D;K;6;CP$UIDd;3;397E;D;K;6;CP$UIDd;3;398E;D;K;6;CP$UIDd;3;234E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;399E;D;K;6;CP$UIDd;3;400E;D;K;6;CP$UIDd;3;401E;D;K;6;CP$UIDd;3;234E;E;E;S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;402E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;403E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;402E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;403E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;402E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;403E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;407E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;378E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;315E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;408E;E;f;12;0.1459769905f;12;0.7245902419f;11;0.131928131f;11;0.694875896f;13;0.05106510967f;12;0.1235313565f;12;0.1622937322f;11;0.217145443f;12;0.7033613324S;14;.SF NS Displayd;2;32S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;60;{"origin":{"x":111,"y":339},"size":{"width":20,"height":39}}S;60;{"origin":{"x":211,"y":283},"size":{"width":24,"height":39}}S;60;{"origin":{"x":318,"y":223},"size":{"width":25,"height":39}}S;59;{"origin":{"x":18,"y":89},"size":{"width":594,"height":17}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib new file mode 100644 index 000000000..c457e6021 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html b/Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html new file mode 100644 index 000000000..ae452f43d --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + Nib2CibSubviewsOrderTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/index.html b/Tests/Manual/Nib2CibSubviewsOrderTest/index.html new file mode 100644 index 000000000..a7bd83918 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + Nib2CibSubviewsOrderTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/main.j b/Tests/Manual/Nib2CibSubviewsOrderTest/main.j new file mode 100644 index 000000000..8e4a1ec6e --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * Nib2CibSubviewsOrderTest + * + * Created by You on September 19, 2020. + * Copyright 2020, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tools/nib2cib/NSBox.j b/Tools/nib2cib/NSBox.j index 87b558008..b702f9ca8 100644 --- a/Tools/nib2cib/NSBox.j +++ b/Tools/nib2cib/NSBox.j @@ -32,6 +32,7 @@ { _boxType = [aCoder decodeIntForKey:@"NSBoxType"]; _borderType = [aCoder decodeIntForKey:@"NSBorderType"]; + _transparent = [aCoder decodeBoolForKey:@"NSTransparent"]; var borderColor = [aCoder decodeObjectForKey:@"NSBorderColor2"], fillColor = [aCoder decodeObjectForKey:@"NSFillColor2"], @@ -70,7 +71,7 @@ - (CGRect)_nib2CibAdjustment { - if ((_boxType === CPBoxPrimary) || (_boxType === CPBoxSecondary)) + if ((_boxType !== CPBoxSeparator) && ((_boxType === CPBoxPrimary) || (_boxType === CPBoxSecondary))) { // We use a special nib2cib-adjustment-frame for primary/secondary boxes var theme = [Nib2Cib defaultTheme], diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index e3d2d31d8..954cab152 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -43,13 +43,13 @@ var NSButtonIsBorderedMask = 0x00800000, // don't really follow much of a pattern. NSButtonImagePositionMask = 0xFF0000, NSButtonImagePositionShift = 16, - NSButtonNoImagePositionMask = 0x04, - NSButtonImageAbovePositionMask = 0x0C, - NSButtonImageBelowPositionMask = 0x1C, - NSButtonImageRightPositionMask = 0x2C, - NSButtonImageLeftPositionMask = 0x3C, - NSButtonImageOnlyPositionMask = 0x44, - NSButtonImageOverlapsPositionMask = 0x6C, + NSButtonNoImagePositionMask = 0x00, + NSButtonImageAbovePositionMask = 0x08, + NSButtonImageBelowPositionMask = 0x18, + NSButtonImageRightPositionMask = 0x28, + NSButtonImageLeftPositionMask = 0x38, + NSButtonImageOnlyPositionMask = 0x40, + NSButtonImageOverlapsPositionMask = 0x48, // You cannot set neither highlightsBy nor showsStateBy in IB, // but you can set button type which implicitly sets the masks. @@ -111,9 +111,25 @@ var NSButtonIsBorderedMask = 0x00800000, _alternateTitle = [cell alternateTitle]; [self setBordered:[cell isBordered]]; - _bezelStyle = [cell bezelStyle]; - var fixedHeight; + var bezelStyleFromIB = [cell bezelStyle]; + + // Xcode IB is not consistent between popup and pulldown buttons : + // pulldown bordered buttons (type "push") get bezel type "rounded" + // pulldown unbordered buttons (type "bevel") get bezel type "regular square" + // popup bordered buttons (type "push") get bezel type "rounded" + // popup unbordered buttons (type "bevel") get bezel type "rounded" + // In order to fix consistency, we force bezel type to be "regular square" in the last case + + if ([self isKindOfClass:CPPopUpButton] && (![self isBordered])) + bezelStyleFromIB = CPRegularSquareBezelStyle; + + [self setBezelStyle:bezelStyleFromIB]; + + + var fixedHeight, + theme = [Nib2Cib defaultTheme], + isCSSBased = [theme valueForAttributeWithName:@"css-based" forClass:[CPView class]]; // Fix height switch (_bezelStyle) @@ -122,6 +138,9 @@ var NSButtonIsBorderedMask = 0x00800000, case CPRoundedBezelStyle: // Push IB style case CPTexturedRoundedBezelStyle: // Round Textured IB style case CPHUDBezelStyle: + case CPDisclosureBezelStyle: + case CPRoundedDisclosureBezelStyle: + case CPInlineBezelStyle: // approximations: case CPRoundRectBezelStyle: // Round Rect IB style @@ -139,10 +158,8 @@ var NSButtonIsBorderedMask = 0x00800000, break; // unsupported - case CPRoundedDisclosureBezelStyle: case CPHelpButtonBezelStyle: case CPCircularBezelStyle: - case CPDisclosureBezelStyle: CPLog.warn("NSButton [%s]: unsupported bezel style: %d", _title == null ? "" : '"' + _title + '"', _bezelStyle); _bezelStyle = CPHUDBezelStyle; fixedHeight = YES; @@ -165,9 +182,8 @@ var NSButtonIsBorderedMask = 0x00800000, - If there is just a max height, use that for only for fixed height buttons. - If there is no max height either, don't do any height adjustments. */ - var theme = [Nib2Cib defaultTheme], - minSize = [theme valueForAttributeWithName:@"min-size" forClass:[self class]], - maxSize = [theme valueForAttributeWithName:@"max-size" forClass:[self class]], + var minSize = [theme valueForAttributeWithName:@"min-size" inState:[self themeState] forClass:[self class]], + maxSize = [theme valueForAttributeWithName:@"max-size" inState:[self themeState] forClass:[self class]], adjustHeight = NO; if (minSize.height > 0 && maxSize.height > 0 && minSize.height === maxSize.height) @@ -220,10 +236,11 @@ var NSButtonIsBorderedMask = 0x00800000, var frameAdjustment = [super _nib2CibAdjustment], positionOffsetSizeWidth = 0, positionOffsetOriginX = 0, - positionOffsetOriginY = 0; + positionOffsetOriginY = 0, + directAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"direct-nib2cib-adjustment" inState:[self themeState] forClass:[self class]]; // We want certain control like CPPopupButton to have their own nib2cib-adjustment-frame theme attribute - if (![self isBordered] || [self isKindOfClass:[CPPopUpButton class]]) + if (![self isBordered] || [self isKindOfClass:[CPPopUpButton class]] || directAdjustment) return frameAdjustment; // Map Cocoa bezel styles to Cappuccino bezel styles and adjust frame diff --git a/Tools/nib2cib/NSCustomResource.j b/Tools/nib2cib/NSCustomResource.j index 2d78af3e0..3889025fb 100644 --- a/Tools/nib2cib/NSCustomResource.j +++ b/Tools/nib2cib/NSCustomResource.j @@ -34,6 +34,7 @@ var FILE = require("file"), supportedTemplateImages = { "NSAddTemplate": "CPAddTemplate", "NSRemoveTemplate": "CPRemoveTemplate", + "NSActionTemplate": "CPActionTemplate", "NSToolbarShowColors": "CPImageNameColorPanel" }; @@ -64,6 +65,12 @@ var FILE = require("file"), else [CPException raise:Nib2CibException format:@"The built in image “%@” is not supported.", _resourceName]; } + else if (/^(.+)@MaterialIcons+$/.test(_resourceName)) + { + // Catch a material icon specified by "icon-name@MaterialIcons" + // Just do nothing and leave _resourceName as is. + // It will be treated during runtime by _CPCibCustomResource + } else { var match = /^(.+)@(.+)$/.exec(_resourceName); diff --git a/Tools/nib2cib/NSCustomView.j b/Tools/nib2cib/NSCustomView.j index f5526c5d6..aedfd7097 100644 --- a/Tools/nib2cib/NSCustomView.j +++ b/Tools/nib2cib/NSCustomView.j @@ -41,6 +41,13 @@ var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; if (self) _className = [aCoder decodeObjectForKey:@"NSClassName"]; + // FIXME: Warning : trick here ! + // Workaround for the ibtool bug which reverses subviews order when using a custom view + // Valid as of ibtool version 14460.31 + // As nib2cib doesn't deal with DOM, we can simply use reverse() + + _subviews.reverse(); + return self; } diff --git a/Tools/nib2cib/NSSlider.j b/Tools/nib2cib/NSSlider.j index bfbc53ee3..a614af099 100644 --- a/Tools/nib2cib/NSSlider.j +++ b/Tools/nib2cib/NSSlider.j @@ -24,6 +24,7 @@ @import "NSCell.j" +@class Nib2Cib @implementation CPSlider (CPCoding) @@ -44,6 +45,9 @@ _altIncrementValue = [cell altIncrementValue]; [self setSliderType:[cell sliderType]]; + [self setAllowsTickMarkValuesOnly:[cell allowsTickMarkValuesOnly]]; + [self setTickMarkPosition:[cell tickMarkPosition]]; + [self setNumberOfTickMarks:[cell numberOfTickMarks]]; [self setEnabled:[cell isEnabled]]; } @@ -63,12 +67,17 @@ [self NS_initWithCell:cell]; [self _adjustNib2CibSize]; - var frame = [self frame]; + var directAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"direct-nib2cib-adjustment" forClass:[self class]]; - if ([self sliderType] === CPCircularSlider) - [self setFrameSize:CGSizeMake(frame.size.width + 2.0, frame.size.height + 2.0)]; - else - [self setFrame:CGRectMake(frame.origin.x + 2, frame.origin.y, frame.size.width - 4, frame.size.height)]; + if (!directAdjustment) + { + var frame = [self frame]; + + if ([self sliderType] === CPCircularSlider) + [self setFrameSize:CGSizeMake(frame.size.width + 2.0, frame.size.height + 2.0)]; + else + [self setFrame:CGRectMake(frame.origin.x + 2, frame.origin.y, frame.size.width - 4, frame.size.height)]; + } } return self; @@ -79,15 +88,62 @@ return [CPSlider class]; } +- (CGRect)_nib2CibAdjustment +{ + var directAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"direct-nib2cib-adjustment" forClass:[self class]]; + + if (!directAdjustment) + return [super _nib2CibAdjustment]; + + var size = [self frameSize], + state; + + if ([self sliderType] === CPCircularSlider) + state = CPThemeStateCircular; + else if (size.height > size.width) + { + state = CPThemeStateVertical; + state = state.and(([self tickMarkPosition] === CPTickMarkPositionTrailing) ? CPThemeStateBelowRightTickedSlider : CPThemeStateAboveLeftTickedSlider); + } + else + { + state = CPThemeStateNormal; + state = state.and(([self tickMarkPosition] === CPTickMarkPositionBelow) ? CPThemeStateBelowRightTickedSlider : CPThemeStateAboveLeftTickedSlider); + } + + if ([self numberOfTickMarks] > 0) + state = state.and(CPThemeStateTickedSlider); + + // Theme has not been loaded yet. + // Get attribute value directly from the theme or from the default value of the object otherwise. + var frameAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"nib2cib-adjustment-frame" inState:state forClass:[self class]]; + + if (frameAdjustment) + return frameAdjustment; + + if ([self hasThemeAttribute:@"nib2cib-adjustment-frame"]) + { + frameAdjustment = [self valueForThemeAttribute:@"nib2cib-adjustment-frame" inState:state]; + + if (frameAdjustment) + return frameAdjustment; + } + + return nil; +} + @end @implementation NSSliderCell : NSCell { - double _minValue @accessors(readonly, getter=minValue); - double _maxValue @accessors(readonly, getter=maxValue); - double _altIncrementValue @accessors(readonly, getter=altIncrementValue); - BOOL _vertical @accessors(readonly, getter=isVertical); - int _sliderType @accessors(readonly, getter=sliderType); + double _minValue @accessors(readonly, getter=minValue); + double _maxValue @accessors(readonly, getter=maxValue); + double _altIncrementValue @accessors(readonly, getter=altIncrementValue); + BOOL _vertical @accessors(readonly, getter=isVertical); + int _sliderType @accessors(readonly, getter=sliderType); + BOOL _allowsTickMarkValuesOnly @accessors(readonly, getter=allowsTickMarkValuesOnly); + int _tickMarkPosition @accessors(readonly, getter=tickMarkPosition); + int _numberOfTickMarks @accessors(readonly, getter=numberOfTickMarks); } - (id)initWithCoder:(CPCoder)aCoder @@ -103,7 +159,10 @@ self._altIncrementValue = [aCoder decodeDoubleForKey:@"NSAltIncValue"]; self._isVertical = [aCoder decodeBoolForKey:@"NSVertical"]; - self._sliderType = [aCoder decodeIntForKey:@"NSSliderType"]; + self._sliderType = [aCoder decodeIntForKey:@"NSSliderType"]; + self._allowsTickMarkValuesOnly = [aCoder decodeIntForKey:@"NSAllowsTickMarkValuesOnly"]; + self._tickMarkPosition = [aCoder decodeIntForKey:@"NSTickMarkPosition"]; + self._numberOfTickMarks = [aCoder decodeIntForKey:@"NSNumberOfTickMarks"]; } return self; diff --git a/Tools/nib2cib/NSTextField.j b/Tools/nib2cib/NSTextField.j index ddbf69b48..3a89e03e2 100644 --- a/Tools/nib2cib/NSTextField.j +++ b/Tools/nib2cib/NSTextField.j @@ -51,7 +51,7 @@ [self setLineBreakMode:[cell lineBreakMode]]; [self setAlignment:[cell alignment]]; - [self setTextFieldBackgroundColor:[cell backgroundColor]]; + [self setBackgroundColor:[cell backgroundColor]]; [self setPlaceholderString:[cell placeholderString]]; @@ -72,6 +72,38 @@ CPLog.debug(">> Formatter: " + [[self formatter] description]); } +// Labels WITHOUT background use a special adjustment frame. +// As we can't just let the theming system choose, we have to +// adapt _nib2cibAdjustment +- (CGRect)_nib2CibAdjustment +{ + // Theme has not been loaded yet. + // Get attribute value directly from the theme or from the default value of the object otherwise. + var theme = [Nib2Cib defaultTheme], + themeState = [self themeState]; + + // Is this a label with a background ? + if (!([self hasThemeState:CPThemeStateBezeled] || [self hasThemeState:CPThemeStateBordered]) && [self drawsBackground]) + + // Yes, so use normal frame adjustment (that is, consider it's bezeled) + themeState = themeState.and(CPThemeStateBezeled); + + var frameAdjustment = [theme valueForAttributeWithName:@"nib2cib-adjustment-frame" inState:themeState forClass:[self class]]; + + if (frameAdjustment) + return frameAdjustment; + + if ([self hasThemeAttribute:@"nib2cib-adjustment-frame"]) + { + frameAdjustment = [self valueForThemeAttribute:@"nib2cib-adjustment-frame" inState:themeState]; + + if (frameAdjustment) + return frameAdjustment; + } + + return nil; +} + @end @implementation NSTextField : CPTextField