From 8edee4e755f2bbce2f0b84298970a841cabe2911 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Wed, 15 Dec 2010 15:59:44 +0100 Subject: [PATCH 1/2] Fix accidental globals, cleanup. --- Foundation/CPException.j | 4 ++-- Foundation/CPKeyValueCoding.j | 11 ++++++---- Foundation/CPKeyValueObserving.j | 36 +++++++++++++++++--------------- Foundation/CPKeyedUnarchiver.j | 2 +- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Foundation/CPException.j b/Foundation/CPException.j index feac9eb6d..68b0d4279 100755 --- a/Foundation/CPException.j +++ b/Foundation/CPException.j @@ -145,8 +145,8 @@ if (input == nil) if (!anObject || !anObject.isa) return NO; - return [anObject isKindOfClass:CPException] && - name === [anObject name] && + return [anObject isKindOfClass:CPException] && + name === [anObject name] && message === [anObject message] && (_userInfo === [anObject userInfo] || ([_userInfo isEqual:[anObject userInfo]])); } diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index d530e4e3b..a4b02c50d 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -252,11 +252,14 @@ var _ivarForKey = function(theObject, aKey) - (void)setValuesForKeysWithDictionary:(CPDictionary)keyedValues { - var value, key, keyEnumerator = [keyedValues keyEnumerator]; - while(key = [keyEnumerator nextObject]) + var value, + key, + keyEnumerator = [keyedValues keyEnumerator]; + + while (key = [keyEnumerator nextObject]) { value = [keyedValues objectForKey: key]; - if(value === [CPNull null]) + if (value === [CPNull null]) [self setValue: nil forKey: key]; else [self setValue: value forKey: key]; @@ -284,7 +287,7 @@ var _ivarForKey = function(theObject, aKey) - (void)setValue:(id)aValue forKey:(CPString)aKey { - if(aValue) + if (aValue) [self setObject:aValue forKey:aKey]; else [self removeObjectForKey: aKey]; diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index fc9deadea..8fc5ca9ac 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -92,7 +92,7 @@ newValue = [aChange objectForKey:CPKeyValueChangeNewKey], indexes = [aChange objectForKey:CPKeyValueChangeIndexesKey]; - if(newValue === [CPNull null]) + if (newValue === [CPNull null]) newValue = nil; if (changeKind === CPKeyValueChangeSetting) @@ -102,7 +102,7 @@ } //decide if this is a unordered or ordered to-many relationship - if([newValue isKindOfClass: [CPSet class]] || [oldValue isKindOfClass: [CPSet class]]) + if ([newValue isKindOfClass: [CPSet class]] || [oldValue isKindOfClass: [CPSet class]]) { if (changeKind === CPKeyValueChangeInsertion) [[self mutableSetValueForKeyPath:aKeyPath] unionSet:newValue]; @@ -205,7 +205,7 @@ _CPKeyValueChangeSetMutationNewValueKey = @"_CPKeyValueChangeSetMutationNewValue var _changeKindForSetMutationKind = function(mutationKind) { - switch(mutationKind) + switch (mutationKind) { case CPKeyValueUnionSetMutation: return CPKeyValueChangeInsertion; @@ -247,7 +247,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld, - (id)initWithTarget:(id)aTarget { - if(self = [super init]) + if (self = [super init]) { _targetObject = aTarget; _nativeClass = [aTarget class]; @@ -460,14 +460,15 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld, { changes = changeOptions; - var indexes = [changes objectForKey:CPKeyValueChangeIndexesKey]; - var setMutationKind = changes[_CPKeyValueChangeSetMutationKindKey]; + var indexes = [changes objectForKey:CPKeyValueChangeIndexesKey], + setMutationKind = changes[_CPKeyValueChangeSetMutationKindKey]; - if(setMutationKind) + if (setMutationKind) { - var setMutationObjects = [changes[_CPKeyValueChangeSetMutationObjectsKey] copy]; - var setExistingObjects = [[_targetObject valueForKey: aKey] copy]; - if(setMutationKind == CPKeyValueMinusSetMutation) + var setMutationObjects = [changes[_CPKeyValueChangeSetMutationObjectsKey] copy], + setExistingObjects = [[_targetObject valueForKey: aKey] copy]; + + if (setMutationKind == CPKeyValueMinusSetMutation) { [setExistingObjects intersectSet: setMutationObjects]; [changes setValue:setExistingObjects forKey:CPKeyValueChangeOldKey]; @@ -477,13 +478,13 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld, [setExistingObjects minusSet: setMutationObjects]; [changes setValue:setExistingObjects forKey:CPKeyValueChangeOldKey]; } - + //for unordered to-many relationships (CPSet) even new values can only be calculated before!!! if (setMutationKind === CPKeyValueUnionSetMutation || setMutationKind === CPKeyValueSetSetMutation) { [setMutationObjects minusSet: setExistingObjects]; //hide new value (for CPKeyValueObservingOptionPrior messages) - //as long as "didChangeValue..." is not yet called! + //as long as "didChangeValue..." is not yet called! changes[_CPKeyValueChangeSetMutationNewValueKey] = setMutationObjects; } } @@ -519,10 +520,10 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld, [changes removeObjectForKey:CPKeyValueChangeNotificationIsPriorKey]; - var indexes = [changes objectForKey:CPKeyValueChangeIndexesKey]; - var setMutationKind = changes[_CPKeyValueChangeSetMutationKindKey]; + var indexes = [changes objectForKey:CPKeyValueChangeIndexesKey], + setMutationKind = changes[_CPKeyValueChangeSetMutationKindKey]; - if(setMutationKind) + if (setMutationKind) { //old and new values for unordered to-many relationships can only be calculated before //set precalculated hidden new value as soon as "didChangeValue..." is called! @@ -668,8 +669,9 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld, if (!aKey) return; - var changeKind = _changeKindForSetMutationKind(mutationKind); - var changeOptions = [CPDictionary dictionaryWithObject:changeKind forKey:CPKeyValueChangeKindKey]; + + var changeKind = _changeKindForSetMutationKind(mutationKind), + changeOptions = [CPDictionary dictionaryWithObject:changeKind forKey:CPKeyValueChangeKindKey]; //set hidden change-dict ivars to support unordered to-many relationships changeOptions[_CPKeyValueChangeSetMutationObjectsKey] = objects; changeOptions[_CPKeyValueChangeSetMutationKindKey] = mutationKind; diff --git a/Foundation/CPKeyedUnarchiver.j b/Foundation/CPKeyedUnarchiver.j index e5c0823f5..a98853038 100644 --- a/Foundation/CPKeyedUnarchiver.j +++ b/Foundation/CPKeyedUnarchiver.j @@ -39,7 +39,7 @@ var _CPKeyedUnarchiverCannotDecodeObjectOfClassNameOriginalClassesSelector _CPKeyedUnarchiverDidFinishSelector = 1 << 4, CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_ = 1 << 5; -var _CPKeyedArchiverNullString = "$null" +var _CPKeyedArchiverNullString = "$null", _CPKeyedArchiverUIDKey = "CP$UID", From d587016cc3b2f72ab511f9f53c5b2a09d58d6dc8 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Wed, 15 Dec 2010 23:26:31 +0100 Subject: [PATCH 2/2] Fixed: CPSegmentedControl did not take divider width into account when auto sizing. This resolves the incorrect tab sizes in CPTabView. If a segmented control was initialised with a zero width and then expanded with setSegmentCount, it would not allocate space for any needed dividers. The more tabs were added the more the segmented control would be undersized. The fix is to automatically adjust the width when dividers are added or removed. --- AppKit/CPSegmentedControl.j | 14 +++++++++-- Tests/Manual/CPTabView2/AppController.j | 31 +++++++++++++++---------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/AppKit/CPSegmentedControl.j b/AppKit/CPSegmentedControl.j index 3c0928bec..017d15b61 100644 --- a/AppKit/CPSegmentedControl.j +++ b/AppKit/CPSegmentedControl.j @@ -94,7 +94,9 @@ CPSegmentSwitchTrackingMomentary = 2; if (_segments.length == aCount) return; - var height = CGRectGetHeight([self bounds]); + var height = CGRectGetHeight([self bounds]), + dividersBefore = MAX(0, _segments.length - 1), + dividersAfter = MAX(0, aCount - 1); if (_segments.length < aCount) { @@ -113,6 +115,14 @@ CPSegmentSwitchTrackingMomentary = 2; if (_selectedSegment >= _segments.length) _selectedSegment = -1; + // Make space for/remove space used by dividers. + var thickness = [self currentValueForThemeAttribute:@"divider-thickness"], + delta = thickness * (dividersAfter - dividersBefore), + frame = [self frame]; + + if (delta) + [self setFrameSize:CGSizeMake(frame.size.width + delta, frame.size.height)]; + [self tileWithChangedSegment:0]; } @@ -607,7 +617,7 @@ CPSegmentSwitchTrackingMomentary = 2; segmentWidth = [segment width], themeState = _themeStates[aSegment] | (_themeState & CPThemeStateDisabled), contentInset = [self valueForThemeAttribute:@"content-inset" inState:themeState], - font = [self valueForThemeAttribute:@"font" inState:themeState]; + font = [self font]; if (!segmentWidth) { diff --git a/Tests/Manual/CPTabView2/AppController.j b/Tests/Manual/CPTabView2/AppController.j index 1eca4568c..22658b7a2 100644 --- a/Tests/Manual/CPTabView2/AppController.j +++ b/Tests/Manual/CPTabView2/AppController.j @@ -21,19 +21,26 @@ [tabView setTabViewType:CPNoTabsBezelBorder]; [tabView setTabViewType:CPTopTabsBezelBorder]; - var view = [[CPView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)]; - [view addSubview:[CPTextField labelWithTitle:@"First"]]; - var item = [[CPTabViewItem alloc] initWithIdentifier:@"a"]; - [item setView:view]; - [item setLabel:"Test"]; - [tabView addTabViewItem:item]; + var tabs = [ + "First Tab", "a label", + "Second Tab", "another label", + "Third Tab", "a third label", + "Fourth Tab", "label 4", + /*"5th Tab", "label 5", + "6th Tab", "label 6", + "7th Tab", "label 7",*/ + ]; - view = [[CPView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)]; - [view addSubview:[CPTextField labelWithTitle:@"Second"]]; - item = [[CPTabViewItem alloc] initWithIdentifier:@"a"]; - [item setView:view]; - [item setLabel:"Test2"]; - [tabView addTabViewItem:item]; + for (var i = 0; i < tabs.length; i += 2) + { + var view = [[CPView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)]; + [view addSubview:[CPTextField labelWithTitle:tabs[i + 1]]]; + + var item = [[CPTabViewItem alloc] initWithIdentifier:tabs[i]]; + [item setView:view]; + [item setLabel:tabs[i]]; + [tabView addTabViewItem:item]; + } [contentView addSubview:tabView];