From d7b5382c32e85add3367a631cb6de2aaf48c3db0 Mon Sep 17 00:00:00 2001 From: Sergio Felix Date: Mon, 13 May 2013 01:02:50 -0500 Subject: [PATCH 01/15] Fixed: CPTabView will now update its tabs labels when the layoutSubviews method is called. Fixes 1926 --- AppKit/CPTabView.j | 1 + 1 file changed, 1 insertion(+) diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index b6874a01b..e2c0cb983 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -379,6 +379,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame), CGRectGetHeight(aFrame) - segmentedHeight / 2)]; + [self _updateItems]; [self _repositionTabs]; } } From fcb1f4665ff6615ac65d2e5394a2131c519f3a3c Mon Sep 17 00:00:00 2001 From: Alos Date: Sun, 16 Feb 2014 22:38:41 -0600 Subject: [PATCH 02/15] Fixed an ugly merge --- AppKit/CPTabView.j | 2 +- AppKit/CPTabViewItem.j | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 6aa303cae..e126d3ba1 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -390,7 +390,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame), CGRectGetHeight(aFrame) - segmentedHeight / 2)]; - + [self _updateItems]; [self _repositionTabs]; } } diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index c2e4347ea..6c073b1d0 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -90,6 +90,7 @@ CPPressedTab = 2; - (void)setLabel:(CPString)aLabel { _label = aLabel; + [_tabView setNeedsLayout]; } /*! From 67767ede17ec432241937b1c77569cb0f9ea9b27 Mon Sep 17 00:00:00 2001 From: Alos Date: Sun, 16 Feb 2014 23:16:38 -0600 Subject: [PATCH 03/15] Fixed layoutSubviews Added missing setNeedsLayout --- AppKit/CPTabView.j | 1 + AppKit/CPTabViewItem.j | 1 + 2 files changed, 2 insertions(+) diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 6aa303cae..0e3ac7030 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -391,6 +391,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame), CGRectGetHeight(aFrame) - segmentedHeight / 2)]; + [self _updateItems]; [self _repositionTabs]; } } diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index c2e4347ea..6c073b1d0 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -90,6 +90,7 @@ CPPressedTab = 2; - (void)setLabel:(CPString)aLabel { _label = aLabel; + [_tabView setNeedsLayout]; } /*! From 9d25f1c073bd460798a7bccfaae4396fa72afff7 Mon Sep 17 00:00:00 2001 From: Alos Date: Sun, 16 Feb 2014 23:16:38 -0600 Subject: [PATCH 04/15] Fixed layoutSubviews Added missing setNeedsLayout --- AppKit/CPTabView.j | 2 +- AppKit/CPTabViewItem.j | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 6aa303cae..e126d3ba1 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -390,7 +390,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame), CGRectGetHeight(aFrame) - segmentedHeight / 2)]; - + [self _updateItems]; [self _repositionTabs]; } } diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index c2e4347ea..6c073b1d0 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -90,6 +90,7 @@ CPPressedTab = 2; - (void)setLabel:(CPString)aLabel { _label = aLabel; + [_tabView setNeedsLayout]; } /*! From f953b4dc0f27fbea5ab7e9ae4ed050c6d549567f Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Tue, 20 May 2014 13:37:53 -0700 Subject: [PATCH 05/15] FIXED: Warning when closing a popover for the first time Previously, the _CPPopoverWindow was trying to remove itself as observer while it wasn't defined as an observer. This would cause a warning. This patch encapsulates addObserver and removeObserver into methods that actually check if it's already observing/not observing when trying to observe/not observe --- AppKit/_CPPopoverWindow.j | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 8861a9f56..899fab08b 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -55,8 +55,9 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, int _appearance @accessors(getter=appearance); BOOL _isClosing @accessors(property=isClosing); - BOOL _closeOnBlur; BOOL _browserAnimates; + BOOL _closeOnBlur; + BOOL _isObservingFrame; BOOL _shouldPerformAnimation; CPInteger _implementedDelegateMethods; JSObject _orderOutTransitionFunction; @@ -160,6 +161,32 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, #pragma mark - #pragma mark Observer +/*! + @ignore + Adds self as frame observer if not already observing it +*/ +- (void)_addFrameObserver +{ + if (_isObservingFrame) + return; + + _isObservingFrame = YES; + [_targetView addObserver:self forKeyPath:@"frame" options:0 context:nil]; +} + +/*! + @ignore + Removes self as frame observer if already observing it +*/ +- (void)_removeFrameObserver +{ + if (!_isObservingFrame) + return; + + _isObservingFrame = NO; + [_targetView removeObserver:self forKeyPath:@"frame"]; +} + /*! Update the _CPPopoverWindow frame if a resize event is observed. */ @@ -331,7 +358,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, if (positioningView !== _targetView) { [[_targetView window] removeChildWindow:self]; - [_targetView removeObserver:self forKeyPath:@"frame"]; + [self _removeFrameObserver]; _targetView = positioningView; } @@ -521,14 +548,14 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, - (void)_orderFront { if (![self isVisible]) - [_targetView addObserver:self forKeyPath:@"frame" options:0 context:nil]; + [self _addFrameObserver]; [super _orderFront]; } - (void)_parentDidOrderInChild { - [_targetView addObserver:self forKeyPath:@"frame" options:0 context:nil]; + [self _addFrameObserver]; } /*! @@ -564,7 +591,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _DOMElement.removeEventListener(CPBrowserStyleProperty("transitionend"), _orderOutTransitionFunction, YES); #endif - [_targetView removeObserver:self forKeyPath:@"frame"]; + [self _removeFrameObserver]; [_parentWindow removeChildWindow:self]; [super _orderOutRecursively:recursive]; From 741ac31ba62e44c0bee892675c83e96b45493481 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 22 May 2014 15:17:40 -0700 Subject: [PATCH 06/15] Fixed: Issue when making a paste with a right click Previously when making a paste with a right click caused a crash because the location of the fake event was set to null. This crash occurs only if the user didn't hit the keyboard yet. Now, the location of the fake event takes the location of the last event of the app, who is the right click. --- AppKit/Platform/DOM/CPPlatformPasteboard.j | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/AppKit/Platform/DOM/CPPlatformPasteboard.j b/AppKit/Platform/DOM/CPPlatformPasteboard.j index 014d00d06..e749a1fae 100644 --- a/AppKit/Platform/DOM/CPPlatformPasteboard.j +++ b/AppKit/Platform/DOM/CPPlatformPasteboard.j @@ -71,7 +71,6 @@ var hasEditableTarget = function(aDOMEvent) BOOL hasBugWhichPreventsNonEditablePaste; BOOL hasBugWhichPreventsNonEditablePasteRedirect; - CPEvent _lastKeyDownEvent; BOOL currentEventIsNativePasteEvent; BOOL currentEventIsNativeCopyOrCutEvent; BOOL currentEventShouldBeSuppressed; @@ -208,8 +207,6 @@ var hasEditableTarget = function(aDOMEvent) if (!(modifierFlags & (CPControlKeyMask | CPCommandKeyMask))) return; - _lastKeyDownEvent = anEvent; - var aDOMEvent = anEvent._DOMEvent, characters = [anEvent characters], mayRequireDOMPasteboardElement = [self _mayRequireDOMPasteboardElementHack:aDOMEvent flags:modifierFlags]; @@ -302,7 +299,7 @@ var hasEditableTarget = function(aDOMEvent) timestamp = [CPEvent currentTimestamp], // fake event, might as well use current timestamp windowNumber = [[CPApp keyWindow] windowNumber], modifierFlags = CPPlatformActionKeyMask, - location = [_lastKeyDownEvent locationInWindow], + location = [[CPApp currentEvent] locationInWindow], anEvent = [CPEvent keyEventWithType:CPKeyDown location:location modifierFlags:modifierFlags timestamp:timestamp windowNumber:windowNumber context:nil characters:characters charactersIgnoringModifiers:characters isARepeat:NO keyCode:keyCode]; From 7958775c6a9b2773ea442d783359553dddb35731 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 23 May 2014 10:38:56 -0700 Subject: [PATCH 07/15] Fixed: bootstrap doesn't handle specific OpenJDK Runtime Environment version Previously, bootstrap didn't handle some OpenJDK Runtime Environment version as: rhel-2.4.7.1.el6_5-x86_64 u55-b13. Now it did, the regular expression to catch the version of the jdk was wrong. Fixes #2113 --- bootstrap.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 7ae61916e..92cc46028 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -134,8 +134,8 @@ function check_install_environment () { java_version=$(java -version 2>&1) echo $java_version | grep OpenJDK > /dev/null if [ "$?" = "0" ]; then # OpenJDK: make sure >= 6b18 - openjdk_version=$(echo $java_version | egrep -o '[0-9]b[0-9]+') - if [ $(echo $openjdk_version | tr -d 'b') -lt 618 ]; then + openjdk_version=$(echo $java_version | egrep -o '[0-9]\-?b[0-9]+') + if [ $(echo $openjdk_version | tr -d 'b' | tr -d '-') -lt 618 ]; then echo "Error: Narwhal is not compatible with your version of OpenJDK: $openjdk_version." echo "Please upgrade to OpenJDK >= 6b18 or switch to the Sun JVM. Then re-run bootstrap.sh." exit 1 From 089d564934047da0435d5d456172af32b4206d83 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 27 May 2014 10:12:02 -0700 Subject: [PATCH 08/15] Fixed: CPDatePicker firstResponder issue Previously, the textual datePicker didn't work because it couldn't become the firstResponder. This PR fixed another issue as well. Previously it wasn't possible to modify a date when moving only with tab and when the datePicker came firstResponder with tabulation. --- AppKit/CPDatePicker/CPDatePicker.j | 2 +- AppKit/CPDatePicker/_CPDatePickerTextField.j | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AppKit/CPDatePicker/CPDatePicker.j b/AppKit/CPDatePicker/CPDatePicker.j index 922e8cbd9..5a4f81727 100644 --- a/AppKit/CPDatePicker/CPDatePicker.j +++ b/AppKit/CPDatePicker/CPDatePicker.j @@ -533,7 +533,7 @@ CPEraDatePickerElementFlag = 0x0100; { if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle) { - if ([super becomeFirstResponder]) + if (![super becomeFirstResponder]) return NO; [_datePickerTextfield _selecteTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]]; diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index 02c7a7148..ddd6e3172 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -1226,14 +1226,14 @@ var CPMonthDateType = 0, CPTimer _timerEdition; } - -#pragma mark - -#pragma mark Getter Setter methods - -- (BOOL)acceptFirstResponder +- (id)init { - _firstEvent = YES; - return NO; + if (self = [super init]) + { + _firstEvent = YES; + } + + return self; } /*! Set the dateType of the textField From a83b9109bff9437b4cf6d3f88a61ec2cb4207ea8 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 29 May 2014 15:13:17 -0700 Subject: [PATCH 09/15] Fixed: typo in CPDatePicker --- AppKit/CPDatePicker/CPDatePicker.j | 2 +- AppKit/CPDatePicker/_CPDatePickerTextField.j | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPDatePicker/CPDatePicker.j b/AppKit/CPDatePicker/CPDatePicker.j index 5a4f81727..d7065ddc8 100644 --- a/AppKit/CPDatePicker/CPDatePicker.j +++ b/AppKit/CPDatePicker/CPDatePicker.j @@ -536,7 +536,7 @@ CPEraDatePickerElementFlag = 0x0100; if (![super becomeFirstResponder]) return NO; - [_datePickerTextfield _selecteTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]]; + [_datePickerTextfield _selectTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]]; return YES; } diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index ddd6e3172..e002707ad 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -180,7 +180,7 @@ var CPZeroKeyCode = 48, #pragma mark - #pragma mark SelectTextField action -- (void)_selecteTextFieldWithFlags:(unsigned)flags +- (void)_selectTextFieldWithFlags:(unsigned)flags { [_datePickerElementView _updateResponderTextField]; From a5448549b1a9682b1b4ad834bff84390a41ef84d Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Sat, 31 May 2014 21:33:59 -0700 Subject: [PATCH 10/15] New: Added feature to select a set of dates with a shift click in CPDatePicker Previously it wasn't possible to select a set of dates with a shift click, now we can. This works only when the mode CPRangeDateMode is set. It has the same behavior as in Cocoa. --- AppKit/CPDatePicker/_CPDatePickerCalendar.j | 44 ++++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/AppKit/CPDatePicker/_CPDatePickerCalendar.j b/AppKit/CPDatePicker/_CPDatePickerCalendar.j index a7e444ca8..165e91ec1 100644 --- a/AppKit/CPDatePicker/_CPDatePickerCalendar.j +++ b/AppKit/CPDatePicker/_CPDatePickerCalendar.j @@ -894,14 +894,46 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su" // Check if we have to change or not the month of the component if ([dayTile date].getMonth() == _date.getMonth()) { - var minDate = [[_datePicker minDate] copy], - maxDate = [[_datePicker maxDate] copy]; + if ([_datePicker datePickerMode] == CPRangeDateMode && [anEvent modifierFlags] & CPShiftKeyMask) + { + var dateValueAtMidnight = [[_datePicker dateValue] copy]; - [minDate _resetToMidnight]; - [maxDate _resetToLastSeconds]; + [dateValueAtMidnight _resetToMidnight]; - if (dateTile >= minDate && dateTile <= maxDate) - [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:0]; + if (dateTile < dateValueAtMidnight) + { + var interval; + + if (dateTile == dateValueAtMidnight) + interval = [_datePicker timeInterval]; + else + interval = ([dateValueAtMidnight timeIntervalSinceDate:dateTile] + [_datePicker timeInterval]); + + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:interval]; + } + else if ([[dayTile date] isEqualToDate:dateValueAtMidnight]) + { + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:0]; + } + else + { + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:[dateValueAtMidnight copy]] timeInterval:([dateTile timeIntervalSinceDate:dateValueAtMidnight])]; + } + + // Be sure to display the good month + [_delegate setDateValue:dateTile]; + } + else + { + var minDate = [[_datePicker minDate] copy], + maxDate = [[_datePicker maxDate] copy]; + + [minDate _resetToMidnight]; + [maxDate _resetToLastSeconds]; + + if (dateTile >= minDate && dateTile <= maxDate) + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:0]; + } } else { From ac53b30f25e87e966b9e43fe6d011105f811492e Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Sun, 1 Jun 2014 21:18:14 -0700 Subject: [PATCH 11/15] Fixed: CPComboBox doesn't work in modal. Previously a CPComboBox didn't work when its parent window was in modal. Now it works. Fixed #2122 --- AppKit/_CPPopUpList.j | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/AppKit/_CPPopUpList.j b/AppKit/_CPPopUpList.j index b6e400ff0..f69f68f0a 100644 --- a/AppKit/_CPPopUpList.j +++ b/AppKit/_CPPopUpList.j @@ -863,6 +863,15 @@ var _CPPopUpListDataSourceKey = @"_CPPopUpListDataSourceKey", return self; } +/*! + Returns \c YES if the receiver is able to receive input events + even when a modal session is active. +*/ +- (BOOL)worksWhenModal +{ + return YES; +} + - (void)sendEvent:(CPEvent)anEvent { var type = [anEvent type]; From 1e1297378c3d56462da0c300d5554613aa30f729 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 2 Jun 2014 17:31:32 -0700 Subject: [PATCH 12/15] Fixed: font cell of a CPTableView comes black when editing another cell The font of a default dataView came black when editing another cell of the tableView. Now it stays black. Fixed #2130 --- AppKit/Themes/Aristo/ThemeDescriptors.j | 28 ++++++++++++------------ AppKit/Themes/Aristo2/ThemeDescriptors.j | 26 +++++++++++----------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 9d7eff56c..f621c2a26 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -986,22 +986,22 @@ var themedButtonValues = nil, [@"vertical-alignment", CPCenterVerticalTextAlignment, CPThemeStateTableDataView], [@"content-inset", CGInsetMake(3.0, 3.0, 3.0, 5.0), CPThemeStateTableDataView], - [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], - [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], - [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], - [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditable]], - [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditing]], - [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateBezeled]], - [@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 5.0), [CPThemeStateTableDataView, CPThemeStateEditing]], - [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateEditing]], - [@"bezel-inset", CGInsetMake(-1.0, -1.0, -1.0, -1.0), [CPThemeStateTableDataView, CPThemeStateEditing]], + [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], + [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateKeyWindow]], + [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], + [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditable]], + [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditing]], + [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 5.0), [CPThemeStateTableDataView, CPThemeStateEditing]], + [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateEditing]], + [@"bezel-inset", CGInsetMake(-1.0, -1.0, -1.0, -1.0), [CPThemeStateTableDataView, CPThemeStateEditing]], [@"text-color", [CPColor colorWithCalibratedWhite:125.0 / 255.0 alpha:1.0], [CPThemeStateTableDataView, CPThemeStateGroupRow]], - [@"text-color", [CPColor colorWithCalibratedWhite:1.0 alpha:1.0], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView]], - [@"text-shadow-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateGroupRow]], - [@"text-shadow-offset", CGSizeMake(0,1), [CPThemeStateTableDataView, CPThemeStateGroupRow]], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.6], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView]], - [@"font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateGroupRow]] + [@"text-color", [CPColor colorWithCalibratedWhite:1.0 alpha:1.0], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView]], + [@"text-shadow-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateGroupRow]], + [@"text-shadow-offset", CGSizeMake(0,1), [CPThemeStateTableDataView, CPThemeStateGroupRow]], + [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.6], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView]], + [@"font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateGroupRow]] ]; [self registerThemeValues:themedTextFieldValues forView:textfield]; diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index a970a203e..e994e72ea 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -558,21 +558,21 @@ var themedButtonValues = nil, [@"vertical-alignment", CPCenterVerticalTextAlignment, CPThemeStateTableDataView], [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 5.0), CPThemeStateTableDataView], - [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], - [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], - [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], - [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditing, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], - [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditable, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], - [@"content-inset", CGInsetMake(7.0, 7.0, 5.0, 10.0), [CPThemeStateTableDataView, CPThemeStateEditable]], - [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateEditing]], - [@"bezel-inset", CGInsetMake(-2.0, -2.0, -2.0, -2.0), [CPThemeStateTableDataView, CPThemeStateEditing]], + [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], + [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateKeyWindow]], + [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], + [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditing, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], + [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditable, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], + [@"content-inset", CGInsetMake(7.0, 7.0, 5.0, 10.0), [CPThemeStateTableDataView, CPThemeStateEditable]], + [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateEditing]], + [@"bezel-inset", CGInsetMake(-2.0, -2.0, -2.0, -2.0), [CPThemeStateTableDataView, CPThemeStateEditing]], [@"text-color", [CPColor colorWithCalibratedWhite:125.0 / 255.0 alpha:1.0], [CPThemeStateTableDataView, CPThemeStateGroupRow]], - [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], - [@"text-shadow-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateGroupRow]], - [@"text-shadow-offset", CGSizeMake(0, 1), [CPThemeStateTableDataView, CPThemeStateGroupRow]], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.6], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], - [@"font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateGroupRow]] + [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], + [@"text-shadow-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateGroupRow]], + [@"text-shadow-offset", CGSizeMake(0, 1), [CPThemeStateTableDataView, CPThemeStateGroupRow]], + [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.6], [CPThemeStateTableDataView, CPThemeStateGroupRow, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], + [@"font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateGroupRow]] ]; [self registerThemeValues:themedTextFieldValues forView:textfield]; From 7c6ef51cb20b631c0a43f1e70dbf7e0080470401 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Tue, 3 Jun 2014 17:41:30 +0100 Subject: [PATCH 13/15] New: CPDate dateByAddingTimeInterval:. Refs #2126. --- Foundation/CPDate.j | 9 +++++++++ Tests/Foundation/CPDateTest.j | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index 86bf25deb..736ca9ff2 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -146,6 +146,15 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); return [[CPDate date] timeIntervalSinceReferenceDate]; } +/** + Return a new date representing the receiver's time plus the given interval into the future, + or into the past for a negative interval. +*/ +- (id)dateByAddingTimeInterval:(CPTimeInterval)seconds +{ + return [[CPDate alloc] initWithTimeInterval:seconds sinceDate:self]; +} + - (BOOL)isEqual:(CPDate)aDate { if (self === aDate) diff --git a/Tests/Foundation/CPDateTest.j b/Tests/Foundation/CPDateTest.j index 996d05787..4223e2168 100644 --- a/Tests/Foundation/CPDateTest.j +++ b/Tests/Foundation/CPDateTest.j @@ -35,6 +35,30 @@ [self assert:middle equals:[middle laterDate:past] message:"laterDate incorrect"]; } +- (void)testDateByAddingTimeIntervalZeroShouldReturnSameDate +{ + var a = [CPDate dateWithTimeIntervalSince1970:1231889490.0], + b = [a dateByAddingTimeInterval:0]; + + [self assert:[b timeIntervalSince1970] equals:1231889490]; +} + +- (void)testDateByAddingTimeIntervalPositiveShouldReturnNewerDate +{ + var a = [CPDate dateWithTimeIntervalSince1970:1231889490.0], + b = [a dateByAddingTimeInterval:789]; + + [self assert:[b timeIntervalSince1970] equals:1231889490 + 789]; +} + +- (void)testDateByAddingTimeIntervalNegativeShouldReturnOlderDate +{ + var a = [CPDate dateWithTimeIntervalSince1970:1231889490.0], + b = [a dateByAddingTimeInterval:-789]; + + [self assert:[b timeIntervalSince1970] equals:1231889490 - 789]; +} + - (void)testEquals { var now = [CPDate date]; From c64e5a5799703b9cf951ccf5f529c4bc52946531 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 4 Jun 2014 11:19:32 -0700 Subject: [PATCH 14/15] Fixed: font cell of a CPTableView comes black when editing another cell Previously, when editing a cell, the other cells of the tableView lost the themeState of the firstResponder. Now the other cells, as the tableView, keep this state when a cell is editing. Fixed #2133 --- AppKit/CPTableView.j | 6 ++++++ AppKit/Themes/Aristo/ThemeDescriptors.j | 2 +- AppKit/Themes/Aristo2/ThemeDescriptors.j | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 90afa2ee4..713cd40e8 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -5143,12 +5143,18 @@ Your delegate can implement this method to avoid subclassing the tableview to ad { _editingRow = CPNotFound; _editingColumn = CPNotFound; + + // This is needed to unset the themeState firstResponder of the tableView + [self _notifyViewDidResignFirstResponder]; return; } _editingRow = [self rowForView:responder]; _editingColumn = [self columnForView:responder]; + // This is needed to set the themeState firstResponder of the tableView + [self _notifyViewDidBecomeFirstResponder]; + if (_editingRow !== CPNotFound && [responder isKindOfClass:[CPTextField class]] && ![responder isBezeled]) { [responder setBezeled:YES]; diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index f621c2a26..f4ba002a3 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -987,7 +987,7 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(3.0, 3.0, 3.0, 5.0), CPThemeStateTableDataView], [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], - [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateKeyWindow]], + [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder,CPThemeStateKeyWindow]], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditable]], [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditing]], diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index e994e72ea..960d5d994 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -559,7 +559,7 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 5.0), CPThemeStateTableDataView], [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], - [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateKeyWindow]], + [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditing, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditable, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], From 2a78da6d078bc25e1b37b6dabb2ad0c967cc0161 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Tue, 10 Jun 2014 11:03:08 +0200 Subject: [PATCH 15/15] Formatting and comment on table view first responder change. Refs #2133. --- AppKit/CPTableView.j | 3 ++- AppKit/Themes/Aristo/ThemeDescriptors.j | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 713cd40e8..e597f2646 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -5152,7 +5152,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad _editingRow = [self rowForView:responder]; _editingColumn = [self columnForView:responder]; - // This is needed to set the themeState firstResponder of the tableView + // We want to keep the 'First Responder' theme state for the table view as a whole, even when a subview is being edited. + // This makes sure the theming effects of a focused table remain in effect even as cells are being edited in it. [self _notifyViewDidBecomeFirstResponder]; if (_editingRow !== CPNotFound && [responder isKindOfClass:[CPTextField class]] && ![responder isBezeled]) diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index f4ba002a3..a88a1de84 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -987,7 +987,7 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(3.0, 3.0, 3.0, 5.0), CPThemeStateTableDataView], [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView], - [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder,CPThemeStateKeyWindow]], + [@"text-color", [CPColor whiteColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], [CPThemeStateTableDataView, CPThemeStateSelectedDataView]], [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateEditable]], [@"text-color", [CPColor blackColor], [CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateEditing]],