From 1ffbf7857f3067a168ba8fe0d2bca86544a59411 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 8 Sep 2010 22:08:40 +0200 Subject: [PATCH] Overhaul of CPButton and supporting classes to support image positioning the way Cocoa does. --- AppKit/CPButton.j | 31 +- AppKit/CPCheckBox.j | 2 +- AppKit/CPRadio.j | 28 +- AppKit/CPView.j | 8 + AppKit/Cib/_CPCibCustomResource.j | 20 +- ...abled.png => check-box-image-disabled.png} | Bin ...ed.png => check-box-image-highlighted.png} | Bin ...png => check-box-image-mixed-disabled.png} | Bin ... => check-box-image-mixed-highlighted.png} | Bin ...el-mixed.png => check-box-image-mixed.png} | Bin ... => check-box-image-selected-disabled.png} | Bin ... check-box-image-selected-highlighted.png} | Bin ...ected.png => check-box-image-selected.png} | Bin ...heck-box-bezel.png => check-box-image.png} | Bin ...-disabled.png => radio-image-disabled.png} | Bin ...ighted.png => radio-image-highlighted.png} | Bin ....png => radio-image-selected-disabled.png} | Bin ...g => radio-image-selected-highlighted.png} | Bin ...-selected.png => radio-image-selected.png} | Bin .../{radio-bezel.png => radio-image.png} | Bin AppKit/Themes/Aristo/ThemeDescriptors.j | 192 ++-- AppKit/_CPImageAndTextView.j | 10 +- .../Manual/CPButtonImageTest/AppController.j | 107 +++ Tests/Manual/CPButtonImageTest/Info.plist | 12 + .../CPButtonImageTest/Resources/MainMenu.cib | 1 + .../CPButtonImageTest/Resources/MainMenu.xib | 834 ++++++++++++++++++ .../CPButtonImageTest/Resources/spinner.gif | Bin 0 -> 1849 bytes .../Manual/CPButtonImageTest/index-debug.html | 69 ++ Tests/Manual/CPButtonImageTest/index.html | 68 ++ Tests/Manual/CPButtonImageTest/main.j | 18 + Tools/nib2cib/Converter+Mac.j | 12 +- Tools/nib2cib/NSButton.j | 66 +- Tools/nib2cib/NSMatrix.j | 32 +- 33 files changed, 1327 insertions(+), 183 deletions(-) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-disabled.png => check-box-image-disabled.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-highlighted.png => check-box-image-highlighted.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-mixed-disabled.png => check-box-image-mixed-disabled.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-mixed-highlighted.png => check-box-image-mixed-highlighted.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-mixed.png => check-box-image-mixed.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-selected-disabled.png => check-box-image-selected-disabled.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-selected-highlighted.png => check-box-image-selected-highlighted.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel-selected.png => check-box-image-selected.png} (100%) rename AppKit/Themes/Aristo/Resources/{check-box-bezel.png => check-box-image.png} (100%) rename AppKit/Themes/Aristo/Resources/{radio-bezel-disabled.png => radio-image-disabled.png} (100%) rename AppKit/Themes/Aristo/Resources/{radio-bezel-highlighted.png => radio-image-highlighted.png} (100%) rename AppKit/Themes/Aristo/Resources/{radio-bezel-selected-disabled.png => radio-image-selected-disabled.png} (100%) rename AppKit/Themes/Aristo/Resources/{radio-bezel-selected-highlighted.png => radio-image-selected-highlighted.png} (100%) rename AppKit/Themes/Aristo/Resources/{radio-bezel-selected.png => radio-image-selected.png} (100%) rename AppKit/Themes/Aristo/Resources/{radio-bezel.png => radio-image.png} (100%) create mode 100644 Tests/Manual/CPButtonImageTest/AppController.j create mode 100644 Tests/Manual/CPButtonImageTest/Info.plist create mode 100644 Tests/Manual/CPButtonImageTest/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPButtonImageTest/Resources/MainMenu.xib create mode 100644 Tests/Manual/CPButtonImageTest/Resources/spinner.gif create mode 100644 Tests/Manual/CPButtonImageTest/index-debug.html create mode 100644 Tests/Manual/CPButtonImageTest/index.html create mode 100755 Tests/Manual/CPButtonImageTest/main.j diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 34b6b0a3e..c9a7467e0 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -463,8 +463,20 @@ CPButtonStateMixed = CPThemeState("mixed"); */ - (void)sizeToFit { - var size = [([self title] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]], - contentInset = [self currentValueForThemeAttribute:@"content-inset"], + [self layoutSubviews]; + + var size, + contentView = [self ephemeralSubviewNamed:@"content-view"]; + + if (contentView) + { + [contentView sizeToFit]; + size = [contentView frameSize]; + } + else + size = [([self title] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]]; + + var contentInset = [self currentValueForThemeAttribute:@"content-inset"], minSize = [self currentValueForThemeAttribute:@"min-size"], maxSize = [self currentValueForThemeAttribute:@"max-size"]; @@ -642,7 +654,9 @@ var CPButtonImageKey = @"CPButtonImageKey", CPButtonTitleKey = @"CPButtonTitleKey", CPButtonAlternateTitleKey = @"CPButtonAlternateTitleKey", CPButtonIsBorderedKey = @"CPButtonIsBorderedKey", + CPButtonAllowsMixedStateKey = @"CPButtonAllowsMixedStateKey", CPButtonImageDimsWhenDisabledKey = @"CPButtonImageDimsWhenDisabledKey", + CPButtonImagePositionKey = @"CPButtonImagePositionKey", CPButtonKeyEquivalentKey = @"CPButtonKeyEquivalentKey", CPButtonKeyEquivalentMaskKey = @"CPButtonKeyEquivalentMaskKey"; @@ -666,12 +680,18 @@ var CPButtonImageKey = @"CPButtonImageKey", _title = [aCoder decodeObjectForKey:CPButtonTitleKey]; _alternateTitle = [aCoder decodeObjectForKey:CPButtonAlternateTitleKey]; + if ([aCoder containsValueForKey:CPButtonAllowsMixedStateKey]) + _allowsMixedState = [aCoder decodeBoolForKey:CPButtonAllowsMixedStateKey]; + [self setImageDimsWhenDisabled:[aCoder decodeObjectForKey:CPButtonImageDimsWhenDisabledKey]]; + if ([aCoder containsValueForKey:CPButtonImagePositionKey]) + [self setImagePosition:[aCoder decodeIntForKey:CPButtonImagePositionKey]]; + if ([aCoder containsValueForKey:CPButtonKeyEquivalentKey]) [self setKeyEquivalent:CFData.decodeBase64ToUtf16String([aCoder decodeObjectForKey:CPButtonKeyEquivalentKey])]; - _keyEquivalentModifierMask = [aCoder decodeObjectForKey:CPButtonKeyEquivalentMaskKey]; + _keyEquivalentModifierMask = [aCoder decodeIntForKey:CPButtonKeyEquivalentMaskKey]; [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -694,7 +714,10 @@ var CPButtonImageKey = @"CPButtonImageKey", [aCoder encodeObject:_title forKey:CPButtonTitleKey]; [aCoder encodeObject:_alternateTitle forKey:CPButtonAlternateTitleKey]; - [aCoder encodeObject:[self imageDimsWhenDisabled] forKey:CPButtonImageDimsWhenDisabledKey]; + [aCoder encodeBool:_allowsMixedState forKey:CPButtonAllowsMixedStateKey]; + + [aCoder encodeBool:[self imageDimsWhenDisabled] forKey:CPButtonImageDimsWhenDisabledKey]; + [aCoder encodeInt:[self imagePosition] forKey:CPButtonImagePositionKey]; if (_keyEquivalent) [aCoder encodeObject:CFData.encodeBase64Utf16String(_keyEquivalent) forKey:CPButtonKeyEquivalentKey]; diff --git a/AppKit/CPCheckBox.j b/AppKit/CPCheckBox.j index eec4de33b..f4da84fcf 100644 --- a/AppKit/CPCheckBox.j +++ b/AppKit/CPCheckBox.j @@ -55,7 +55,7 @@ [self setImagePosition:CPImageLeft]; [self setAlignment:CPLeftTextAlignment]; - [self setBordered:YES]; + [self setBordered:NO]; } return self; diff --git a/AppKit/CPRadio.j b/AppKit/CPRadio.j index 551f0d8e4..e22a1d6f1 100644 --- a/AppKit/CPRadio.j +++ b/AppKit/CPRadio.j @@ -27,26 +27,26 @@ /*! @ingroup appkit - + from this mailing list thread: - http://groups.google.com/group/objectivej/browse_thread/thread/7c41cbd9cbee9ea3 - + http://groups.google.com/group/objectivej/browse_thread/thread/7c41cbd9cbee9ea3 + ----------------------------------- - + Creating a checkbox is easy enough: - + checkbox = [[CPCheckBox alloc] initWithFrame:aFrame]; - + That's basically all there is to it. Radio buttons are very similar, the key difference is the introduction of a new class CPRadioGroup, which defines which radio buttons are part of the same group: - + [myRadioButton setRadioGroup:aRadioGroup]; - + Every radio button receives a unique radio group by default (so if you do nothing further, they will all behave independently), but you can use an existing radio button's group with other buttons as so: - + button1 = [[CPRadio alloc] initWithFrame:aFrame]; ... button2 = [[CPRadio alloc] initWithFrame:aFrame radioGroup:[button1 @@ -55,7 +55,7 @@ button3 = [[CPRadio alloc] initWithFrame:aFrame radioGroup:[button1 radioGroup]]; ...etc... - + Here, all the radio buttons will act "together". [[button1 radioGroup] allRadios] returns every button that's part of this group, and [[button1 radioGroup] selectedRadio] returns the currently selected @@ -95,7 +95,7 @@ - (id)initWithFrame:(CGRect)aFrame radioGroup:(CPRadioGroup)aRadioGroup { self = [super initWithFrame:aFrame]; - + if (self) { [self setRadioGroup:aRadioGroup]; @@ -109,8 +109,8 @@ [self setBordered:YES]; } - - return self; + + return self; } - (id)initWithFrame:(CGRect)aFrame @@ -141,7 +141,7 @@ - (void)setObjectValue:(id)aValue { [super setObjectValue:aValue]; - + if ([self state] === CPOnState) [_radioGroup _setSelectedRadio:self]; } diff --git a/AppKit/CPView.j b/AppKit/CPView.j index c153dda8a..32494b3d4 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -2480,6 +2480,14 @@ setBoundsOrigin: return _ephemeralSubviewsForNames[aViewName]; } +- (CPView)ephemeralSubviewNamed:(CPString)aViewName +{ + if (!_ephemeralSubviewsForNames) + return nil; + + return (_ephemeralSubviewsForNames[aViewName] || nil); +} + @end var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", diff --git a/AppKit/Cib/_CPCibCustomResource.j b/AppKit/Cib/_CPCibCustomResource.j index 06e7d189e..995cbef67 100644 --- a/AppKit/Cib/_CPCibCustomResource.j +++ b/AppKit/Cib/_CPCibCustomResource.j @@ -46,28 +46,28 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", - (id)initWithClassName:(CPString)aClassName resourceName:(CPString)aResourceName properties:(CPDictionary)properties { self = [super init]; - + if (self) { _className = aClassName; _resourceName = aResourceName; _properties = properties; } - + return self; } - (id)initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) { _className = [aCoder decodeObjectForKey:_CPCibCustomResourceClassNameKey]; _resourceName = [aCoder decodeObjectForKey:_CPCibCustomResourceResourceNameKey]; _properties = [aCoder decodeObjectForKey:_CPCibCustomResourcePropertiesKey]; } - + return self; } @@ -80,7 +80,7 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", - (id)awakeAfterUsingCoder:(CPCoder)aCoder { - if ([aCoder respondsToSelector:@selector(bundle)] && + if ([aCoder respondsToSelector:@selector(bundle)] && (![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources])) if (_className === @"CPImage") return [[CPImage alloc] initWithContentsOfFile:[[aCoder bundle] pathForResource:_resourceName] size:_properties.valueForKey(@"size")]; @@ -112,4 +112,14 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", return NO; } +- (unsigned)loadStatus +{ + return CPImageLoadStatusCompleted; +} + +- (id)delegate +{ + return nil; +} + @end diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-disabled.png b/AppKit/Themes/Aristo/Resources/check-box-image-disabled.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-disabled.png rename to AppKit/Themes/Aristo/Resources/check-box-image-disabled.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-highlighted.png b/AppKit/Themes/Aristo/Resources/check-box-image-highlighted.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-highlighted.png rename to AppKit/Themes/Aristo/Resources/check-box-image-highlighted.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-mixed-disabled.png b/AppKit/Themes/Aristo/Resources/check-box-image-mixed-disabled.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-mixed-disabled.png rename to AppKit/Themes/Aristo/Resources/check-box-image-mixed-disabled.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-mixed-highlighted.png b/AppKit/Themes/Aristo/Resources/check-box-image-mixed-highlighted.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-mixed-highlighted.png rename to AppKit/Themes/Aristo/Resources/check-box-image-mixed-highlighted.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-mixed.png b/AppKit/Themes/Aristo/Resources/check-box-image-mixed.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-mixed.png rename to AppKit/Themes/Aristo/Resources/check-box-image-mixed.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-selected-disabled.png b/AppKit/Themes/Aristo/Resources/check-box-image-selected-disabled.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-selected-disabled.png rename to AppKit/Themes/Aristo/Resources/check-box-image-selected-disabled.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-selected-highlighted.png b/AppKit/Themes/Aristo/Resources/check-box-image-selected-highlighted.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-selected-highlighted.png rename to AppKit/Themes/Aristo/Resources/check-box-image-selected-highlighted.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel-selected.png b/AppKit/Themes/Aristo/Resources/check-box-image-selected.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel-selected.png rename to AppKit/Themes/Aristo/Resources/check-box-image-selected.png diff --git a/AppKit/Themes/Aristo/Resources/check-box-bezel.png b/AppKit/Themes/Aristo/Resources/check-box-image.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/check-box-bezel.png rename to AppKit/Themes/Aristo/Resources/check-box-image.png diff --git a/AppKit/Themes/Aristo/Resources/radio-bezel-disabled.png b/AppKit/Themes/Aristo/Resources/radio-image-disabled.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/radio-bezel-disabled.png rename to AppKit/Themes/Aristo/Resources/radio-image-disabled.png diff --git a/AppKit/Themes/Aristo/Resources/radio-bezel-highlighted.png b/AppKit/Themes/Aristo/Resources/radio-image-highlighted.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/radio-bezel-highlighted.png rename to AppKit/Themes/Aristo/Resources/radio-image-highlighted.png diff --git a/AppKit/Themes/Aristo/Resources/radio-bezel-selected-disabled.png b/AppKit/Themes/Aristo/Resources/radio-image-selected-disabled.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/radio-bezel-selected-disabled.png rename to AppKit/Themes/Aristo/Resources/radio-image-selected-disabled.png diff --git a/AppKit/Themes/Aristo/Resources/radio-bezel-selected-highlighted.png b/AppKit/Themes/Aristo/Resources/radio-image-selected-highlighted.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/radio-bezel-selected-highlighted.png rename to AppKit/Themes/Aristo/Resources/radio-image-selected-highlighted.png diff --git a/AppKit/Themes/Aristo/Resources/radio-bezel-selected.png b/AppKit/Themes/Aristo/Resources/radio-image-selected.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/radio-bezel-selected.png rename to AppKit/Themes/Aristo/Resources/radio-image-selected.png diff --git a/AppKit/Themes/Aristo/Resources/radio-bezel.png b/AppKit/Themes/Aristo/Resources/radio-image.png similarity index 100% rename from AppKit/Themes/Aristo/Resources/radio-bezel.png rename to AppKit/Themes/Aristo/Resources/radio-image.png diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 2d1259916..b47b7cccb 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -779,162 +779,94 @@ var themedButtonValues = nil, + (CPRadioButton)themedRadioButton { - var button = [[CPRadio alloc] initWithFrame:CGRectMake(0.0, 0.0, 120.0, 17.0)], + var button = [CPRadio radioWithTitle:@"Hello Friend!"], - bezelColor = PatternColor( - [ - ["radio-bezel.png", 17.0, 17.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorSelected = PatternColor( - [ - ["radio-bezel-selected.png", 17.0, 17.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorSelectedHighlighted = PatternColor( - [ - ["radio-bezel-selected-highlighted.png", 17.0, 17.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorSelectedDisabled = PatternColor( - [ - ["radio-bezel-selected-disabled.png", 17.0, 17.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorDisabled = PatternColor( - [ - ["radio-bezel-disabled.png", 17.0, 17.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorHighlighted = PatternColor( - [ - ["radio-bezel-highlighted.png", 17.0, 17.0], nil, nil - ], - PatternIsHorizontal), + imageNormal = PatternImage("radio-image.png", 17.0, 17.0), + imageSelected = PatternImage("radio-image-selected.png", 17.0, 17.0), + imageSelectedHighlighted = PatternImage("radio-image-selected-highlighted.png", 17.0, 17.0), + imageSelectedDisabled = PatternImage("radio-image-selected-disabled.png", 17.0, 17.0), + imageDisabled = PatternImage("radio-image-disabled.png", 17.0, 17.0), + imageHighlighted = PatternImage("radio-image-highlighted.png", 17.0, 17.0), themeValues = [ - [@"alignment", CPLeftTextAlignment, CPThemeStateBordered], - [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateBordered], - [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 20.0), CPThemeStateBordered], - [@"bezel-color", bezelColor, CPThemeStateBordered], - [@"bezel-color", bezelColorSelected, CPThemeStateBordered | CPThemeStateSelected], - [@"bezel-color", bezelColorSelectedHighlighted, CPThemeStateBordered | CPThemeStateSelected | CPThemeStateHighlighted], - [@"bezel-color", bezelColorHighlighted, CPThemeStateBordered | CPThemeStateHighlighted], - [@"bezel-color", bezelColorDisabled, CPThemeStateBordered | CPThemeStateDisabled], - [@"bezel-color", bezelColorSelectedDisabled, CPThemeStateBordered | CPThemeStateSelected | CPThemeStateDisabled], + [@"alignment", CPLeftTextAlignment, CPThemeStateNormal], + [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateNormal], + [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateNormal], + + [@"image", imageNormal, CPThemeStateNormal], + [@"image", imageSelected, CPThemeStateSelected], + [@"image", imageSelectedHighlighted, CPThemeStateSelected | CPThemeStateHighlighted], + [@"image", imageHighlighted, CPThemeStateHighlighted], + [@"image", imageDisabled, CPThemeStateDisabled], + [@"image", imageSelectedDisabled, CPThemeStateSelected | CPThemeStateDisabled], + [@"imageOffset", 4.0], [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], CPThemeStateDisabled], - [@"min-size", CGSizeMake(0.0, 17.0)] + [@"min-size", CGSizeMake(0.0, 17.0)], + [@"max-size", CGSizeMake(-1.0, -1.0)] ]; [self registerThemeValues:themeValues forView:button]; - [button setTitle:@"Hello Friend!"]; - return button; } -+ (CPRadioButton)themedCheckBoxButton ++ (CPCheckBox)themedCheckBoxButton { - var button = [[CPCheckBox alloc] initWithFrame:CGRectMake(0.0, 0.0, 120.0, 17.0)], + var button = [CPCheckBox checkBoxWithTitle:@"Another Option"], - bezelColor = PatternColor( - [ - ["check-box-bezel.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorSelected = PatternColor( - [ - ["check-box-bezel-selected.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorSelectedHighlighted = PatternColor( - [ - ["check-box-bezel-selected-highlighted.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorSelectedDisabled = PatternColor( - [ - ["check-box-bezel-selected-disabled.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorDisabled = PatternColor( - [ - ["check-box-bezel-disabled.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - bezelColorHighlighted = PatternColor( - [ - ["check-box-bezel-highlighted.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), + imageNormal = PatternImage("check-box-image.png", 15.0, 16.0), + imageSelected = PatternImage("check-box-image-selected.png", 15.0, 16.0), + imageSelectedHighlighted = PatternImage("check-box-image-selected-highlighted.png", 15.0, 16.0), + imageSelectedDisabled = PatternImage("check-box-image-selected-disabled.png", 15.0, 16.0), + imageDisabled = PatternImage("check-box-image-disabled.png", 15.0, 16.0), + imageHighlighted = PatternImage("check-box-image-highlighted.png", 15.0, 16.0), themeValues = [ - [@"alignment", CPLeftTextAlignment, CPThemeStateBordered], - [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateBordered], - [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 20.0), CPThemeStateBordered], - [@"bezel-color", bezelColor, CPThemeStateBordered], - [@"bezel-color", bezelColorSelected, CPThemeStateBordered | CPThemeStateSelected], - [@"bezel-color", bezelColorSelectedHighlighted, CPThemeStateBordered | CPThemeStateSelected | CPThemeStateHighlighted], - [@"bezel-color", bezelColorHighlighted, CPThemeStateBordered | CPThemeStateHighlighted], - [@"bezel-color", bezelColorDisabled, CPThemeStateBordered | CPThemeStateDisabled], - [@"bezel-color", bezelColorSelectedDisabled, CPThemeStateBordered | CPThemeStateSelected | CPThemeStateDisabled], + [@"alignment", CPLeftTextAlignment, CPThemeStateNormal], + [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateNormal], + [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateNormal], + + [@"image", imageNormal, CPThemeStateNormal], + [@"image", imageSelected, CPThemeStateSelected], + [@"image", imageSelectedHighlighted, CPThemeStateSelected | CPThemeStateHighlighted], + [@"image", imageHighlighted, CPThemeStateHighlighted], + [@"image", imageDisabled, CPThemeStateDisabled], + [@"image", imageSelectedDisabled, CPThemeStateSelected | CPThemeStateDisabled], + [@"imageOffset", 4.0], [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], CPThemeStateDisabled], - [@"min-size", CGSizeMake(0.0, 17.0)] + [@"min-size", CGSizeMake(0.0, 17.0)], + [@"max-size", CGSizeMake(-1.0, -1.0)] ]; [self registerThemeValues:themeValues forView:button]; - [button setTitle:@"Another option"]; - return button; } -+ (CPRadioButton)themedMixedCheckBoxButton ++ (CPCheckBox)themedMixedCheckBoxButton { var button = [self themedCheckBoxButton]; [button setAllowsMixedState:YES]; [button setState:CPMixedState]; - var mixedSelectedColor = PatternColor( - [ - ["check-box-bezel-mixed-highlighted.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - mixedDisabledColor = PatternColor( - [ - ["check-box-bezel-mixed-disabled.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), - - mixedColor = PatternColor( - [ - ["check-box-bezel-mixed.png", 15.0, 16.0], nil, nil - ], - PatternIsHorizontal), + var mixedHighlightedImage = PatternImage("check-box-image-mixed-highlighted.png", 15.0, 16.0), + mixedDisabledImage = PatternImage("check-box-image-mixed-disabled.png", 15.0, 16.0), + mixedImage = PatternImage("check-box-image-mixed.png", 15.0, 16.0), themeValues = [ - [@"bezel-color", mixedColor, CPButtonStateMixed | CPThemeStateBordered], - [@"bezel-color", mixedSelectedColor, CPButtonStateMixed | CPThemeStateBordered | CPThemeStateSelected], - [@"bezel-color", mixedDisabledColor, CPButtonStateMixed | CPThemeStateBordered | CPThemeStateDisabled] + [@"image", mixedImage, CPButtonStateMixed], + [@"image", mixedHighlightedImage, CPButtonStateMixed | CPThemeStateHighlighted], + [@"image", mixedDisabledImage, CPButtonStateMixed | CPThemeStateDisabled], + [@"imageOffset", 4.0, CPButtonStateMixed], + [@"max-size", CGSizeMake(-1.0, -1.0)] ]; [self registerThemeValues:themeValues forView:button]; @@ -1355,17 +1287,17 @@ var themedButtonValues = nil, themedAlertValues = [ - [@"size", size], - [@"content-inset", inset], - [@"message-text-alignment", CPJustifiedTextAlignment], - [@"message-text-color", [CPColor blackColor]], - [@"message-text-font", messageFont], - [@"informative-text-alignment", CPJustifiedTextAlignment], - [@"informative-text-color", [CPColor blackColor]], - [@"informative-text-font", informativeFont], + [@"size", size], + [@"content-inset", inset], + [@"message-text-alignment", CPJustifiedTextAlignment], + [@"message-text-color", [CPColor blackColor]], + [@"message-text-font", messageFont], + [@"informative-text-alignment", CPJustifiedTextAlignment], + [@"informative-text-color", [CPColor blackColor]], + [@"informative-text-font", informativeFont], [@"image-offset", imageOffset], - [@"information-image", informationIcon], - [@"warning-image", warningIcon], + [@"information-image", informationIcon], + [@"warning-image", warningIcon], [@"error-image", errorIcon] ]; @@ -1507,8 +1439,8 @@ var themedButtonValues = nil, hudSpecificValues = [ - [@"message-text-color", [CPColor whiteColor]], - [@"informative-text-color", [CPColor whiteColor]], + [@"message-text-color", [CPColor whiteColor]], + [@"informative-text-color", [CPColor whiteColor]], ]; [self registerThemeValues:hudSpecificValues forView:alert inherit:themedAlertValues]; diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index dde3311f5..5c1d17dba 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -184,6 +184,11 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, if (_imagePosition == anImagePosition) return; + // If the position was CPNoImage, there is an image now, + // so mark the flags accordingly so that the image will load. + if (_imagePosition == CPNoImage) + _flags |= _CPImageAndTextViewImageChangedFlag; + _imagePosition = anImagePosition; _flags |= _CPImageAndTextViewImagePositionChangedFlag; @@ -616,7 +621,8 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, } else if (_imagePosition === CPImageAbove) { - CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, FLOOR(centerX - imageWidth / 2.0), 0); + imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px"; + imageStyle.top = 0 + "px"; textRect.origin.y += imageHeight + _imageOffset; textRect.size.height = size.height - imageHeight - _imageOffset; @@ -636,7 +642,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, textRect.size.width -= imageWidth + _imageOffset; } - else if (_imagePosition === CPImageOnly) + else if (_imagePosition === CPImageOnly || _imagePosition == CPImageOverlaps) { imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px"; imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px"; diff --git a/Tests/Manual/CPButtonImageTest/AppController.j b/Tests/Manual/CPButtonImageTest/AppController.j new file mode 100644 index 000000000..202656c04 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/AppController.j @@ -0,0 +1,107 @@ +/* + * AppController.j + * CPButtonImageTest + * + * Created by Aparajita Fishman on August 31, 2010. + */ + +@import + +CPLogRegister(CPLogConsole); + + +@implementation AppController : CPObject +{ + CPWindow theWindow; + + @outlet CPButton button; + @outlet CPButton imageButton; + @outlet CPCheckBox checkbox; + @outlet CPCheckBox multiCheckbox; + @outlet CPRadio radio1; + @outlet CPRadio radio2; + @outlet CPPopUpButton positionMenu; + + CPArray buttons; + CPArray checksAndRadios; +} + +- (void)awakeFromCib +{ + var path = [[CPBundle bundleForClass:[CPView class]] pathForResource:@"action_button.png"]; + [imageButton setImage:[[CPImage alloc] initWithContentsOfFile:path size:CGSizeMake(22.0, 14.0)]]; + + [self _setImagePosition:CPImageLeft]; + [positionMenu selectItemAtIndex:CPImageLeft]; + [self _setupButtons]; +} + +- (void)_setupButtons +{ + buttons = [button, imageButton]; + checksAndRadios = [checkbox, multiCheckbox, radio1, radio2]; + + var checkboxHeight = [checkbox frameSize].height, + radioHeight = [radio1 frameSize].height; + + [buttons makeObjectsPerformSelector:@selector(sizeToFit)]; + [checksAndRadios makeObjectsPerformSelector:@selector(sizeToFit)]; + + [checkbox setFrameSize:CGSizeMake([checkbox frameSize].width, checkboxHeight)]; + [multiCheckbox setFrameSize:CGSizeMake([multiCheckbox frameSize].width, checkboxHeight)]; + + [radio1 setFrameSize:CGSizeMake([radio1 frameSize].width, radioHeight)]; + [radio2 setFrameSize:CGSizeMake([radio2 frameSize].width, radioHeight)]; + + [multiCheckbox setState:CPMixedState]; +} + +- (void)setImagePosition:(id)sender +{ + [self _setImagePosition:[sender indexOfSelectedItem]]; +} + +- (void)_setImagePosition:(unsigned)position +{ + [buttons makeObjectsPerformSelector:@selector(setImagePosition:) withObject:position]; + [checksAndRadios makeObjectsPerformSelector:@selector(setImagePosition:) withObject:position]; + + var alignment; + + switch (position) + { + case CPImageOnly: + return; + + case CPNoImage: + case CPImageAbove: + case CPImageBelow: + case CPImageOverlaps: + alignment = CPCenterTextAlignment; + break; + + case CPImageLeft: + alignment = CPLeftTextAlignment; + break; + + case CPImageRight: + alignment = CPRightTextAlignment; + break; + } + + [checksAndRadios makeObjectsPerformSelector:@selector(setAlignment:) withObject:alignment]; +} + +@end + +@implementation BezelView : CPView + +- (void)drawRect:(CGRect)dirtyRect +{ + var sides = [CPMinYEdge, CPMaxYEdge, CPMinXEdge, CPMaxXEdge], + grays = [0.75, 1.0, 0.75, 1.0]; + + CPDrawTiledRects(dirtyRect, dirtyRect, sides, grays); +} + +@end diff --git a/Tests/Manual/CPButtonImageTest/Info.plist b/Tests/Manual/CPButtonImageTest/Info.plist new file mode 100644 index 000000000..14fcbd763 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/Info.plist @@ -0,0 +1,12 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPButtonImageTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/CPButtonImageTest/Resources/MainMenu.cib b/Tests/Manual/CPButtonImageTest/Resources/MainMenu.cib new file mode 100644 index 000000000..70a8a51c5 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/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;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;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;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;1;0E;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;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;39E;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;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;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;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;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;89E;E;E;S;16;IBCocoaFrameworkD;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;1;0E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;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;2;45E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;25E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;43E;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;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;90E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;92E;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;20E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;93E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;97E;K;11;$aalignmentD;K;6;CP$UIDd;2;98E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;97E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;100E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;97E;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;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;103E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;104E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;106E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;107E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;108E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;112E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;97E;K;11;$aalignmentD;K;6;CP$UIDd;2;98E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;97E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;114E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;97E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;115E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;116E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;118E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;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;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;121E;K;16;$aimage-positionD;K;6;CP$UIDd;2;98E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;97E;K;11;$aalignmentD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;122E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;123E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;97E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;90E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;121E;K;16;$aimage-positionD;K;6;CP$UIDd;2;98E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;97E;K;11;$aalignmentD;K;6;CP$UIDd;2;98E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;126E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;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;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;98E;K;11;$aalignmentD;K;6;CP$UIDd;2;99E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;129E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;101E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;101E;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;2;98E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;99E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;132E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;43E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;109E;K;21;CPMenuItemIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;118E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;25E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;133E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;133E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;134E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;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;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;99E;K;11;$aalignmentD;K;6;CP$UIDd;2;97E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopUpButtonMenuKeyD;K;6;CP$UIDd;2;25E;K;29;CPPopUpButtonSelectedIndexKeyD;K;6;CP$UIDd;2;97E;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;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;139E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;140E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;141E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;142E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;143E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;144E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;145E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;146E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;41E;E;S;14;App ControllerS;31;Push Button (Button With Image)S;6;MatrixS;21;Button Cell (Radio 2)S;20;Button Cell (Button)S;17;Menu (OtherViews)S;17;Menu Item (Right)S;12;File's OwnerS;33;Text Field Cell (Image Position:)S;17;Menu Item (Above)S;20;Push Button (Button)S;16;Menu Item (Left)S;17;Menu Item (Below)S;20;Menu Item (No Image)S;31;Check Box (Multistate Checkbox)S;21;Button Cell (Radio 1)S;11;ApplicationS;20;Check Box (Checkbox)S;29;Static Text (Image Position:)S;33;Button Cell (Multistate Checkbox)S;22;Button Cell (Checkbox)S;29;Pop Up Button Cell (No Image)S;20;Menu Item (Overlaps)S;22;Menu Item (Image Only)S;31;Button Cell (Button With Image)S;12;Content ViewS;29;Prototype Button Cell (Radio)S;13;Pop Up ButtonS;10;Bezel ViewS;28;Window (CPButton Image Test)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;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;19E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;21E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;154E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;156E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;47E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;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;88E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;19E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;E;E;S;13;AppControllerS;22;{{143, 20}, {176, 24}}S;19;{{0, 0}, {176, 24}}d;2;36S;8;borderedd;1;0d;1;2d;1;4S;17;Button With ImageF;S;22;{{31, 120}, {168, 40}}S;19;{{0, 0}, {168, 40}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;156E;E;E;S;6;normalS;10;OtherViewsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;39E;E;E;S;5;RightS;17;_popUpItemAction:d;7;1048576S;5;AboveS;20;{{24, 20}, {96, 24}}S;18;{{0, 0}, {96, 24}}S;6;ButtonS;4;LeftS;5;BelowS;8;No Imaged;1;1S;22;{{163, 65}, {152, 40}}S;19;{{0, 0}, {152, 40}}S;17;selected+borderedS;19;Multistate CheckboxT;S;20;{{29, 65}, {85, 40}}S;18;{{0, 0}, {85, 40}}S;8;CheckboxS;22;{{40, 216}, {101, 17}}S;19;{{0, 0}, {101, 17}}S;15;Image Position:d;4;3072S;8;OverlapsS;10;Image OnlyS;20;{{0, 0}, {380, 253}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;E;E;d;2;18S;23;{{140, 209}, {207, 24}}S;19;{{0, 0}, {207, 24}}S;22;{{20, 20}, {340, 174}}S;20;{{0, 0}, {340, 174}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;29E;E;E;S;9;BezelViewS;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;23;{{408, 63}, {380, 253}}d;1;7S;19;CPButton Image TestS;8;delegateS;6;buttonS;8;checkboxS;11;imageButtonS;13;multiCheckboxS;12;positionMenuD;K;10;$classnameS;7;CPRadioK;8;$classesA;S;7;CPRadioS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;153E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;160E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;135E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;162E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;98E;K;16;$aimage-positionD;K;6;CP$UIDd;2;98E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;98E;K;11;$aalignmentD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;163E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;97E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;3;165E;E;S;6;radio1D;K;6;$classD;K;6;CP$UIDd;3;153E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;166E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;135E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;162E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;96E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;98E;K;16;$aimage-positionD;K;6;CP$UIDd;2;98E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;98E;K;11;$aalignmentD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;97E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;99E;K;16;CPButtonImageKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateImageKeyD;K;6;CP$UIDd;1;0E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;167E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;1;0E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;98E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;97E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;3;165E;E;S;6;radio2S;9;theWindowS;17;setImagePosition:S;18;{{0, 0}, {82, 40}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;161E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;S;7;Radio 1D;K;10;$classnameS;12;CPRadioGroupK;8;$classesA;S;12;CPRadioGroupS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;21;CPRadioGroupRadiosKeyD;K;6;CP$UIDd;3;169E;K;28;CPRadioGroupSelectedRadioKeyD;K;6;CP$UIDd;3;154E;E;S;19;{{86, 0}, {82, 40}}S;7;Radio 2D;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;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;156E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPButtonImageTest/Resources/MainMenu.xib b/Tests/Manual/CPButtonImageTest/Resources/MainMenu.xib new file mode 100644 index 000000000..568e3a007 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/Resources/MainMenu.xib @@ -0,0 +1,834 @@ + + + + 1060 + 10F569 + 788 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 788 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + 7 + 2 + {{408, 712}, {380, 253}} + 1946157056 + CPButton Image Test + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 274 + + + + 268 + {{40, 20}, {101, 17}} + + YES + + 68288064 + 272630784 + Image Position: + + LucidaGrande + 13 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{140, 16}, {207, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + No Image + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + OtherViews + + + + + Image Only + + 1048576 + 2147483647 + + + _popUpItemAction: + 1 + + + + + Left + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Right + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Below + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Above + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Overlaps + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + + + + 268 + + + + 268 + {{31, 14}, {168, 40}} + + YES + 1 + 2 + + + -2080244224 + 0 + Radio 1 + + + 1 + 1211912703 + 0 + + NSRadioButton + + + + 200 + 25 + + + 67239424 + 0 + Radio 2 + + + 1211912703 + 0 + + 400 + 75 + + + {82, 40} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + 3 + MCAwAA + + + + 400 + 75 + + + + + 3 + MQA + + + + + + 268 + {{163, 69}, {152, 40}} + + YES + + -2080244224 + 16777216 + Multistate Checkbox + + + 1211912703 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + + 268 + {{29, 69}, {85, 40}} + + YES + + -2080244224 + 134217728 + Checkbox + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{143, 126}, {176, 32}} + + YES + + 67239424 + 134217728 + Button With Image + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{24, 126}, {96, 32}} + + YES + + 67239424 + 134217728 + Button + + + -2038284033 + 129 + + + 200 + 25 + + + + {{20, 59}, {340, 174}} + + BezelView + + + {380, 253} + + + {{0, 0}, {1680, 1028}} + {1.79769e+308, 1.79769e+308} + + + AppController + + + + + + + delegate + + + + 451 + + + + theWindow + + + + 1090 + + + + button + + + + 1174 + + + + imageButton + + + + 1175 + + + + checkbox + + + + 1176 + + + + multiCheckbox + + + + 1177 + + + + radio1 + + + + 1178 + + + + radio2 + + + + 1179 + + + + setImagePosition: + + + + 1180 + + + + positionMenu + + + + 1181 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 371 + + + + + + + + 372 + + + + + + + + + + 450 + + + + + 1148 + + + + + + + + 1149 + + + + + 1150 + + + + + + + + 1151 + + + + + + + + 1152 + + + + + + + + + + + + + + 1153 + + + + + 1154 + + + + + 1155 + + + + + 1163 + + + + + 1164 + + + + + 1165 + + + + + 1166 + + + + + 1182 + + + + + + + + + + + + 1130 + + + + + + + + 1131 + + + + + 1132 + + + + + + + + 1133 + + + + + 1134 + + + + + + + + 1135 + + + + + 1140 + + + + + + + + 1141 + + + + + 1142 + + + + + + + + + + 1146 + + + + + 1145 + + + + + 1143 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{615, 541}, {207, 143}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{902, 462}, {380, 253}} + com.apple.InterfaceBuilder.CocoaPlugin + {{902, 462}, {380, 253}} + + {{33, 99}, {480, 360}} + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 1182 + + + + + AppController + NSObject + + setImagePosition: + id + + + setImagePosition: + + setImagePosition: + id + + + + NSButton + NSButton + NSButton + NSButton + NSPopUpButton + id + id + NSWindow + + + + button + NSButton + + + checkbox + NSButton + + + imageButton + NSButton + + + multiCheckbox + NSButton + + + positionMenu + NSPopUpButton + + + radio1 + id + + + radio2 + id + + + theWindow + NSWindow + + + + IBUserSource + + + + + BezelView + NSView + + IBUserSource + + + + + + 0 + IBCocoaFramework + YES + ../registration.xcodeproj + 3 + + {9, 8} + {7, 2} + {15, 15} + + + diff --git a/Tests/Manual/CPButtonImageTest/Resources/spinner.gif b/Tests/Manual/CPButtonImageTest/Resources/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dbc2bc21dddcf0e09b566d5b211aee89570f52 GIT binary patch literal 1849 zcma*odr(tX9tZHtz31lM+(&Y`A`Ou`NeG&R#DrIfV%?hng21vs6v>ooRQQFbk7E_K!V( z{?5!fpZWgIZ%*d6t%i*j24bL}AZUJm9)h6R*;%L4IWse3G#VWaN1#$zSSXcBhlYlH zJ|D}n{r&w2f+Qp)SS*&n?*G4}{}!h?td_mjU6Kad-rW*QwWYCUk7d^e+sjpZAn6kT z5rM;`{~_}-wm+L@%+E;JphLm}C3WzQAQD0wBoY|rOTQX{(@pp-WAA8Iw0HKl|15j) zhGh(SFWu#5zUCw^T!}C~eC}~?{xG-r7ugQC>taC+|L^xr&a%{#cgUOZXIM&v?)k^2 z1i5%0!U00wq)r4vlAwXBA_m5J5WNeuBm-XJQ5pG4GD%vc|K){+TJ{AkHqN@SJKczX zU}QRd9n*_bf^h94)6Ctv{CUfz_;qs#RDuQ$DR%y1&5G-a6rhf*4Y zl+UOD1*GE{GQ7vv;c-tTIMkz0ovO>9j%b5hpa@a*CBJ#W!0@ndSwF|%hMkdFtXiU) z`BEp+yhkt8ZY>tg&uyH@%^%K4jDrbA;et&vnnzZ3z22@e6<27z2Vk13kb7OtISyxv z(XoO-LNQCZe3lfzc%*pNqU<9T+p~teThOEB+~e&U0mC|zS{Q)dJZ)!^1f7L(zg*L> z*vSW%?dR~@@0(}x6-V^A`~ImD;)NaBUnP8;RH=bS2@pk`wp>>8r&jGjmGPy%1BW}v zoPo}ca$~bze@efc3kapuEVW1!%teOZT3j2Tw5=hjiAf02d}7dL0oFC%@=RXp5Ow#% z@a>+AM|YWt$n&e`>sB-32gBcuTi>R>*|8@lp`y6thc7ydyqDsuUn~YzZf|{-R@-3y zL#wx{Ii}xxL_csiW*LBn0-A$>zp4WOmkf6=ilrjlW?-l9+bCd7|i?*b5NTmy<<6NZ0T8$SN@mwdC2f z6jqK=N@bS@!=YSj%>h0}*4p+%0HbTIrE$w7UMT6+AZZ&DAo*qZAAi(OtNbIfl#Dw^ zJWeiCp~zi#&t6x}m9)O^eR4HiLV3QA<<0>HZ8%$^lrSE94Wb}=+MM^!b>n#5&-JQR zkr-CEu9C;_F*7DqDisulV6Pmg$nFL0TPn%~*m^-`Z3^BgU(sNpnx%nW(!eV9A&FvI zHL3X3lw8Wji^6=8KbQDE-e%b?svdFxxdh$8r97@7$ojeI`6AL8Ob6QC$qh&>ZWVDX1F{0vJnT%%mE;GveKWR%C} zM&4d;Jf3s9|HAA)yVUPo`Aq;0do#)uHSXi5*QF*)x@MVVHr+cN)uMZ__F|&Ta#p8d z53TOKtce!PJUuie8UWol-S(`c2nH?UGqJP{!4RR4u$LCfn)q-hj0^f=h(VYy)T6eN zhRO!ja-aDBTcgeyP(8Ua4IdiOog^*CQa?R(cP#9AgL9`j>EX-6Yf1lzX(!~``M1XC zNmM<4<6d~wWZ$Xrk0K}UteTrq@LBBk#MsjkK;pbuVhe)NI7(7Pf(l?lxC7=1Z7Pzl zMbS;nV4NI5_N{1$P)&XC)huOGQ+h^zpYUZfb*1n6>!`#*b3y52LGmi+<4sY5jyD#- zw&$d}DTguLAfnRtjrM*JfqtHqUu6rQoU=g%1E9xk%;)TDm^2<8n-0IhTsQFaek)MY}>PK4;nBk=ow4pF>vzkO& gna%Org-kgQCf=+BeMi^RbuY;YE~rTjend;_cdi8t>i_@% literal 0 HcmV?d00001 diff --git a/Tests/Manual/CPButtonImageTest/index-debug.html b/Tests/Manual/CPButtonImageTest/index-debug.html new file mode 100644 index 000000000..c67d51ba6 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/index-debug.html @@ -0,0 +1,69 @@ + + + + + + + + CPButton Image Test + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPButtonImageTest/index.html b/Tests/Manual/CPButtonImageTest/index.html new file mode 100644 index 000000000..efa84e4a0 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/index.html @@ -0,0 +1,68 @@ + + + + + + + + CPButton Image Test + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPButtonImageTest/main.j b/Tests/Manual/CPButtonImageTest/main.j new file mode 100755 index 000000000..af6279da3 --- /dev/null +++ b/Tests/Manual/CPButtonImageTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * TableCibTest + * + * Created by Francisco Tolmasky on July 5, 2009. + * Copyright 2009, 280 North, Inc. All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tools/nib2cib/Converter+Mac.j b/Tools/nib2cib/Converter+Mac.j index 982f10801..ccf3d71c2 100644 --- a/Tools/nib2cib/Converter+Mac.j +++ b/Tools/nib2cib/Converter+Mac.j @@ -33,7 +33,7 @@ objectData = [unarchiver decodeObjectForKey:@"IB.objectdata"]; // Perform a bit of post-processing on views since all CP views are flipped. - // It's better to do this here (instead of say, in NSView::initWithCoder:), + // It's better to do this here (instead of say, in NSView::initWithCoder:), // because at this point all the objects an mappings are stabilized. var objects = [unarchiver allObjects], count = [objects count]; @@ -76,10 +76,20 @@ var convertedData = [CPData data], archiver = [[CPKeyedArchiver alloc] initForWritingWithMutableData:convertedData]; + [archiver setDelegate:self]; [archiver encodeObject:objectData forKey:@"CPCibObjectDataKey"]; [archiver finishEncoding]; return convertedData; } +// For some reason, occasionally an attempt is made to archive NSMatrix. That will fail, so prevent it here. +- (id)archiver:(CPKeyedArchiver)archiver willEncodeObject:(id)object +{ + if ([object isKindOfClass:[NSMatrix class]]) + return nil; + else + return object; +} + @end diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index ecd9dc5d6..1eba013d1 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -36,6 +36,22 @@ _CPButtonBezelStyleHeights[CPRoundedBezelStyle] = 18; _CPButtonBezelStyleHeights[CPTexturedRoundedBezelStyle] = 20; _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; +var NSButtonIsBorderedMask = 0x00800000, + NSButtonAllowsMixedStateMask = 0x1000000, + + // The image position is contained in the third byte, and the values + // 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; + + @implementation CPButton (NSCoding) - (id)NS_initWithCoder:(CPCoder)aCoder @@ -47,13 +63,13 @@ _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; var cell = [aCoder decodeObjectForKey:@"NSCell"]; NIB_CONNECTION_EQUIVALENCY_TABLE[[cell UID]] = self; + _title = [cell title]; + if (![self NS_isCheckBox] && ![self NS_isRadio]) { _controlSize = CPRegularControlSize; - _title = [cell title]; [self setBordered:[cell isBordered]]; - _bezelStyle = [cell bezelStyle]; // clean up: @@ -112,7 +128,6 @@ _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; } [self setBordered:YES]; - self._title = [cell title]; } } @@ -178,14 +193,17 @@ _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; else if ([alternateImage imageName] === @"NSRadioButton") { _isRadio = YES; - self._radioGroup = [CPRadioGroup new]; + _radioGroup = [CPRadioGroup new]; } } - var self = [self NS_initWithCoder:aCoder]; + self = [self NS_initWithCoder:aCoder]; + + self._allowsMixedState = [cell allowsMixedState]; + [self setImagePosition:[cell imagePosition]]; [self setKeyEquivalent:[cell keyEquivalent]]; - _keyEquivalentModifierMask = [cell keyEquivalentModifierMask]; + self._keyEquivalentModifierMask = [cell keyEquivalentModifierMask]; return self; } @@ -205,11 +223,14 @@ _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; @implementation NSButtonCell : NSActionCell { - BOOL _isBordered @accessors(readonly, getter=isBordered); - int _bezelStyle @accessors(readonly, getter=bezelStyle); + BOOL _isBordered @accessors(readonly, getter=isBordered); + int _bezelStyle @accessors(readonly, getter=bezelStyle); - CPString _title @accessors(readonly, getter=title); - CPImage _alternateImage @accessors(readonly, getter=alternateImage); + CPString _title @accessors(readonly, getter=title); + CPImage _alternateImage @accessors(readonly, getter=alternateImage); + + BOOL _allowsMixedState @accessors(readonly, getter=allowsMixedState); + BOOL _imagePosition @accessors(readonly, getter=imagePosition); CPString _keyEquivalent @accessors(readonly, getter=keyEquivalent); unsigned _keyEquivalentModifierMask @accessors(readonly, getter=keyEquivalentModifierMask); @@ -222,9 +243,11 @@ _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; if (self) { var buttonFlags = [aCoder decodeIntForKey:@"NSButtonFlags"], - buttonFlags2 = [aCoder decodeIntForKey:@"NSButtonFlags2"]; + buttonFlags2 = [aCoder decodeIntForKey:@"NSButtonFlags2"], + cellFlags2 = [aCoder decodeIntForKey:@"NSCellFlags2"], + position = (buttonFlags & NSButtonImagePositionMask) >> NSButtonImagePositionShift; - _isBordered = (buttonFlags & 0x00800000) ? YES : NO; + _isBordered = (buttonFlags & NSButtonIsBorderedMask) ? YES : NO; _bezelStyle = (buttonFlags2 & 0x7) | ((buttonFlags2 & 0x20) >> 2); // NSContents for NSButton is actually the title @@ -233,6 +256,25 @@ _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; _objectValue = [self state]; _alternateImage = [aCoder decodeObjectForKey:@"NSAlternateImage"]; + _allowsMixedState = (cellFlags2 & NSButtonAllowsMixedStateMask) ? YES : NO; + + // Test in decreasing order of mask value to ensure the correct match, + // because some of the positions don't care about some bits. + + if ((position & NSButtonImageOverlapsPositionMask) == NSButtonImageOverlapsPositionMask) + _imagePosition = CPImageOverlaps; + else if ((position & NSButtonImageOnlyPositionMask) == NSButtonImageOnlyPositionMask) + _imagePosition = CPImageOnly; + else if ((position & NSButtonImageLeftPositionMask) == NSButtonImageLeftPositionMask) + _imagePosition = CPImageLeft; + else if ((position & NSButtonImageRightPositionMask) == NSButtonImageRightPositionMask) + _imagePosition = CPImageRight; + else if ((position & NSButtonImageBelowPositionMask) == NSButtonImageBelowPositionMask) + _imagePosition = CPImageBelow; + else if ((position & NSButtonImageAbovePositionMask) == NSButtonImageAbovePositionMask) + _imagePosition = CPImageAbove; + else if ((position & NSButtonNoImagePositionMask) == NSButtonNoImagePositionMask) + _imagePosition = CPNoImage; _keyEquivalent = [aCoder decodeObjectForKey:@"NSKeyEquivalent"]; _keyEquivalentModifierMask = buttonFlags2 >> 8; diff --git a/Tools/nib2cib/NSMatrix.j b/Tools/nib2cib/NSMatrix.j index 254acabcc..100c66277 100644 --- a/Tools/nib2cib/NSMatrix.j +++ b/Tools/nib2cib/NSMatrix.j @@ -4,6 +4,11 @@ @import "NSView.j" + +var NSMatrixRadioModeMask = 0x40000000, + NSMatrixDrawsBackgroundMask = 0x01000000; + + @implementation NSMatrix : CPObject { } @@ -11,41 +16,37 @@ - (id)initWithCoder:(CPCoder)aCoder { var view = [[CPView alloc] NS_initWithCoder:aCoder]; - - [view setBackgroundColor:[aCoder decodeObjectForKey:@"NSBackgroundColor"]]; var numberOfRows = [aCoder decodeIntForKey:@"NSNumRows"], numberOfColumns = [aCoder decodeIntForKey:@"NSNumCols"], cellSize = [aCoder decodeSizeForKey:@"NSCellSize"], intercellSpacing = [aCoder decodeSizeForKey:@"NSIntercellSpacing"], - cellBackgroundColor = [aCoder decodeObjectForKey:@"NSCellBackgroundColor"], - //cellClassName = [aCoder decodeObjectForKey:@"NSCellClass"];alert("6"); flags = [aCoder decodeIntForKey:@"NSMatrixFlags"], + isRadioMode = flags & NSMatrixRadioModeMask, + drawsBackground = flags & NSMatrixDrawsBackgroundMask, + backgroundColor = [aCoder decodeObjectForKey:@"NSBackgroundColor"], cells = [aCoder decodeObjectForKey:@"NSCells"], selectedCell = [aCoder decodeObjectForKey:@"NSSelectedCell"]; - if (/*(cellClassName === @"NSButtonCell") &&*/ (flags & 0x40000000)) + if (isRadioMode) { - var radioGroup = [CPRadioGroup new]; + var radioGroup = [CPRadioGroup new], frame = CGRectMake(0.0, 0.0, cellSize.width, cellSize.height); - rowIndex = 0; - for (; rowIndex < numberOfRows; ++rowIndex) + for (var rowIndex = 0; rowIndex < numberOfRows; ++rowIndex) { - var columnIndex = 0; - frame.origin.x = 0; - for (; columnIndex < numberOfColumns; ++columnIndex) + for (var columnIndex = 0; columnIndex < numberOfColumns; ++columnIndex) { var cell = cells[rowIndex * numberOfColumns + columnIndex], cellView = [[CPRadio alloc] initWithFrame:frame radioGroup:radioGroup]; [cellView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; [cellView setTitle:[cell title]]; - [cellView setBackgroundColor:cellBackgroundColor]; + [cellView setBackgroundColor:[CPColor clearColor]]; // the IB default [cellView setObjectValue:[cell objectValue]]; - + [view addSubview:cellView]; NIB_CONNECTION_EQUIVALENCY_TABLE[[cell UID]] = cellView; @@ -56,7 +57,10 @@ frame.origin.y = CGRectGetMaxY(frame) + intercellSpacing.height; } - NIB_CONNECTION_EQUIVALENCY_TABLE[self] = view; + if (drawsBackground) + [view setBackgroundColor:backgroundColor]; + + NIB_CONNECTION_EQUIVALENCY_TABLE[[self UID]] = view; } return view;