Merge branch 'refs/heads/master' into slevenbits

This commit is contained in:
Alexander Ljungberg committed 2012-08-02 15:54:36 +01:00
commit 23ed09a84e
14 files changed
+199 -71

No files matched your search

+16 -1
View File
@@ -33,7 +33,8 @@
var CPMainCibFile = @"CPMainCibFile",
CPMainCibFileHumanFriendly = @"Main cib file base name";
CPMainCibFileHumanFriendly = @"Main cib file base name",
CPEventModifierFlags = 0;
CPApp = nil;
@@ -575,6 +576,7 @@ CPRunContinuesResponse = -1002;
- (void)sendEvent:(CPEvent)anEvent
{
_currentEvent = anEvent;
CPEventModifierFlags = [anEvent modifierFlags];
#if PLATFORM(DOM)
var willPropagate = [[[anEvent window] platformWindow] _willPropagateCurrentDOMEvent];
@@ -1379,3 +1381,16 @@ var _CPAppBootstrapperActions = nil;
}
@end
@implementation CPEvent (CPApplicationModifierFlags)
/*!
Returns the currently pressed modifier flags.
*/
+ (unsigned)modifierFlags
{
return CPEventModifierFlags;
}
@end
+35
View File
@@ -204,6 +204,8 @@ var _CPEventPeriodicEventPeriod = 0,
BOOL _isARepeat;
unsigned _keyCode;
DOMEvent _DOMEvent;
int _data1;
int _data2;
float _deltaX;
float _deltaY;
@@ -517,6 +519,16 @@ var _CPEventPeriodicEventPeriod = 0,
return _DOMEvent;
}
- (int)data1
{
return _data1;
}
- (int)data2
{
return _data2;
}
// Getting Scroll Wheel Event Information
/*!
Returns the change in the x-axis for a mouse event.
@@ -630,6 +642,29 @@ var _CPEventPeriodicEventPeriod = 0,
_CPEventPeriodicEventTimer = nil;
}
- (CPString)description
{
switch (_type)
{
case CPKeyDown:
case CPKeyUp:
case CPFlagsChanged:
return [CPString stringWithFormat:@"CPEvent: type=%d loc=%@ time=%.1f flags=0x%X win=%@ winNum=%d ctxt=%@ chars=\"%@\" unmodchars=\"%@\" repeat=%d keyCode=%d", _type, CPStringFromPoint(_location), _timestamp, _modifierFlags, _window, _windowNumber, _context, _characters, _charactersIgnoringModifiers, _isARepeat, _keyCode];
case CPLeftMouseDown:
case CPLeftMouseUp:
case CPRightMouseDown:
case CPRightMouseUp:
case CPMouseMoved:
case CPLeftMouseDragged:
case CPRightMouseDragged:
case CPMouseEntered:
case CPMouseExited:
return [CPString stringWithFormat:@"CPEvent: type=%d loc=%@ time=%.1f flags=0x%X win=%@ winNum=%d ctxt=%@ evNum=%d click=%d buttonNumber=%d pressure=%f", _type, CPStringFromPoint(_location), _timestamp, _modifierFlags, _window, _windowNumber, _context, _eventNumber, _clickCount, [self buttonNumber], _pressure];
default:
return [CPString stringWithFormat:@"CPEvent: type=%d loc=%@ time=%.1f flags=0x%X win=%@ winNum=%d ctxt=%@ subtype=%d data1=%d data2=%d", _type, CPStringFromPoint(_location), _timestamp, _modifierFlags, _window, _windowNumber, _context, _subtype, _data1, _data2];
}
}
@end
function _CPEventFirePeriodEvent()
+2 -5
View File
@@ -4037,8 +4037,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
*/
- (BOOL)startTrackingAt:(CGPoint)aPoint
{
if (![[self window] makeFirstResponder:self])
return NO;
// Try to become the first responder, but if we can't, that's okay.
[[self window] makeFirstResponder:self];
var row = [self rowAtPoint:aPoint];
@@ -4189,9 +4189,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
*/
- (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
{
if ([[self window] firstResponder] !== self)
return;
_isSelectingSession = NO;
var CLICK_TIME_DELTA = 1000,
+19 -9
View File
@@ -1008,8 +1008,9 @@ var CPScrollDestinationNone = 0,
r.origin.y = offset.y;
// Make sure the frame fits.
if (_CGRectGetHeight([contentView bounds]) < offset.y + height)
[contentView setFrame:_CGRectMake(0, 0, _CGRectGetWidth([_tokenScrollView bounds]), offset.y + height)];
var scrollHeight = offset.y + tokenHeight + CEIL(spaceBetweenTokens.height / 2.0);
if (_CGRectGetHeight([contentView bounds]) < scrollHeight)
[contentView setFrameSize:_CGSizeMake(_CGRectGetWidth([_tokenScrollView bounds]), scrollHeight)];
offset.x += width + spaceBetweenTokens.width;
@@ -1033,6 +1034,7 @@ var CPScrollDestinationNone = 0,
}
_inputFrame = fitAndFrame(textWidth, tokenHeight);
_inputFrame.size.height = lineHeight;
element.style.left = (_inputFrame.origin.x + editorInset.left) + "px";
@@ -1042,7 +1044,7 @@ var CPScrollDestinationNone = 0,
// When editing, always scroll to the cursor.
if (_selectedRange.length == 0)
[[_tokenScrollView documentView] scrollRectToVisible:_inputFrame];
[[_tokenScrollView documentView] scrollPoint:_CGPointMake(0, _inputFrame.origin.y)];
};
for (var i = 0, count = [tokens count]; i < count; i++)
@@ -1074,13 +1076,21 @@ var CPScrollDestinationNone = 0,
if (isEditing && _selectedRange.length)
{
_inputFrame = nil;
[self _inputElement].style.left = "-10000px";
[self _inputElement].focus();
var inputElement = [self _inputElement];
inputElement.style.display = "none";
}
else if (isEditing)
{
var inputElement = [self _inputElement];
inputElement.style.display = "block";
if (document.activeElement !== inputElement)
inputElement.focus();
}
// Trim off any excess height downwards.
if (_CGRectGetHeight([contentView bounds]) > offset.y + tokenHeight)
[contentView setFrame:_CGRectMake(0, 0, _CGRectGetWidth([_tokenScrollView bounds]), offset.y + tokenHeight)];
// Trim off any excess height downwards (in case we shrank).
var scrollHeight = offset.y + tokenHeight + CEIL(spaceBetweenTokens.height / 2.0);
if (_CGRectGetHeight([contentView bounds]) > scrollHeight)
[contentView setFrameSize:_CGSizeMake(_CGRectGetWidth([_tokenScrollView bounds]), scrollHeight)];
if (_shouldScrollTo !== CPScrollDestinationNone)
{
@@ -1105,7 +1115,7 @@ var CPScrollDestinationNone = 0,
if (!aToken)
return;
return [[_tokenScrollView documentView] scrollRectToVisible:[aToken frame]];
return [[_tokenScrollView documentView] scrollPoint:_CGPointMake(0, [aToken frameOrigin].y)];
}
@end
@@ -38,7 +38,7 @@ var _CPToolbarViewBackgroundColor = nil;
_CPToolbarViewBackgroundColor = CPColorWithImages([
["_CPToolbarView/toolbar-background-top.png", 1, 1, bundle],
["_CPToolbarView/toolbar-background-center.png", 1, 57.0, bundle],
["_CPToolbarView/toolbar-background-bottom.png", 1, 1, bundle],
["_CPToolbarView/toolbar-background-bottom.png", 1, 1, bundle]
], CPColorPatternIsVertical);
}
+4
View File
@@ -61,6 +61,10 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
if (self)
{
_data = [CPURLConnection sendSynchronousRequest:[CPURLRequest requestWithURL:aURL] returningResponse:nil];
if (!_data)
return nil;
_awakenCustomResources = YES;
}
+3 -3
View File
@@ -1031,13 +1031,13 @@ var themedButtonValues = nil,
[@"editor-inset", CGInsetMake(2.0, 0.0, 0.0, 0.0)],
// Non-bezeled token field with tokens
[@"content-inset", CGInsetMake(5.0, 8.0, 4.0, 8.0)],
[@"content-inset", CGInsetMake(6.0, 8.0, 4.0, 8.0)],
// Non-bezeled token field with no tokens
[@"content-inset", CGInsetMake(7.0, 8.0, 6.0, 8.0), CPTextFieldStatePlaceholder],
// Bezeled token field with tokens
[@"content-inset", CGInsetMake(6.0, 8.0, 2.0, 8.0), CPThemeStateBezeled],
[@"content-inset", CGInsetMake(6.0, 5.0, 4.0, 5.0), CPThemeStateBezeled],
// Bezeled token field with no tokens
[@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 8.0), CPThemeStateBezeled | CPTextFieldStatePlaceholder]
@@ -1089,7 +1089,7 @@ var themedButtonValues = nil,
[@"text-color", textHighlightedColor, CPThemeStateHighlighted],
[@"bezel-inset", CGInsetMakeZero(), CPThemeStateBezeled],
[@"content-inset", CGInsetMake(1.0, 22.0, 3.0, 15.0), CPThemeStateBezeled],
[@"content-inset", CGInsetMake(2.0, 22.0, 2.0, 15.0), CPThemeStateBezeled],
// Minimum height == maximum height since tokens are fixed height.
[@"min-size", CGSizeMake(0.0, 19.0)],
+8 -8
View File
@@ -65,7 +65,7 @@ var _CPAutocompleteMenuMaximumHeight = 307;
[scrollView setHasHorizontalScroller:NO];
[contentView addSubview:scrollView];
tableView = [[CPTableView alloc] initWithFrame:CPRectMakeZero()];
tableView = [[_CPNonFirstResponderTableView alloc] initWithFrame:CPRectMakeZero()];
var tableColumn = [CPTableColumn new];
[tableColumn setResizingMask:CPTableColumnAutoresizingMask];
@@ -251,14 +251,14 @@ var _CPAutocompleteMenuMaximumHeight = 307;
return [contentArray objectAtIndex:row];
}
- (void)tableViewSelectionDidChange:(CPNotification)notification
@end
@implementation _CPNonFirstResponderTableView : CPTableView
- (BOOL)acceptsFirstResponder
{
// FIXME
// make sure a mouse click in the tableview doesn't steal first responder state
window.setTimeout(function()
{
[[textField window] makeFirstResponder:textField];
}, 2.0);
return NO;
}
@end
+2 -1
View File
@@ -104,7 +104,7 @@ var ListColumnIdentifier = @"1";
_tableView = [self makeTableView];
// Start with a default size, we will resize it later
frame = CGRectMake(0, 0, 200, 200);
var frame = CGRectMake(0, 0, 200, 200);
_tableColumn = [[CPTableColumn alloc] initWithIdentifier:ListColumnIdentifier];
[_tableColumn setWidth:CGRectGetWidth(frame) - [CPScroller scrollerWidth]];
@@ -656,6 +656,7 @@ var ListColumnIdentifier = @"1";
else
return YES;
}
#pragma mark Internal Helpers
/*! @ignore */
+6 -7
View File
@@ -229,12 +229,12 @@ CFData.encodeBase64Array = function(input)
// pad with "=" and revert array to previous state
if (pad > 0)
{
output[output.length-1] = "=";
output[output.length - 1] = "=";
input.pop();
}
if (pad > 1)
{
output[output.length-2] = "=";
output[output.length - 2] = "=";
input.pop();
}
@@ -279,13 +279,12 @@ CFData.bytesToUtf16String = function(bytes)
{
// Strings are encoded with 16 bits per character.
var temp = [];
for (var i = 0; i < bytes.length; i+=2)
temp.push(bytes[i+1] << 8 | bytes[i]);
for (var i = 0; i < bytes.length; i += 2)
temp.push(bytes[i + 1] << 8 | bytes[i]);
// This is relatively efficient, I think:
return String.fromCharCode.apply(NULL, temp);
};
CFData.encodeBase64Utf16String = function(input)
{
// charCodeAt returns UTF-16.
@@ -293,8 +292,8 @@ CFData.encodeBase64Utf16String = function(input)
for (var i = 0; i < input.length; i++)
{
var c = input.charCodeAt(i);
temp.push(input.charCodeAt(i) & 0xFF);
temp.push((input.charCodeAt(i) & 0xFF00) >> 8);
temp.push(c & 0xFF);
temp.push((c & 0xFF00) >> 8);
}
return CFData.encodeBase64Array(temp);
+39 -1
View File
@@ -1,9 +1,16 @@
@import <AppKit/CPApplication.j>
@import <AppKit/CPEvent.j>
@implementation CPEventTest : OJTestCase
{
}
- (void)setUp
{
// CPApplication must be initialised for some event handling to work.
[CPApplication sharedApplication];
}
/*!
This test isn't very useful but it checks for any trouble related to issue #1202.
*/
@@ -16,4 +23,35 @@
[self assert:0 equals:[anEvent deltaZ] message:"default event delta Z should be 0"];
}
@end
- (void)testDescription
{
var anEvent = [CPEvent mouseEventWithType:CPLeftMouseUp location:CGPointMake(50, 50) modifierFlags:CPShiftKeyMask
timestamp:400.5 windowNumber:300 context:nil eventNumber:0 clickCount:2 pressure:0.5];
[self assert:@"CPEvent: type=2 loc={50, 50} time=400.5 flags=0x20000 win=undefined winNum=0 ctxt=null evNum=0 click=2 buttonNumber=0 pressure=0.5" equals:[anEvent description]];
anEvent = [CPEvent keyEventWithType:CPKeyDown location:CGPointMakeZero() modifierFlags:CPShiftKeyMask | CPCommandKeyMask timestamp:12345.6 windowNumber:10 context:nil characters:"X" charactersIgnoringModifiers:"x" isARepeat:NO keyCode:10];
[self assert:@"CPEvent: type=10 loc={0, 0} time=12345.6 flags=0x120000 win=null winNum=10 ctxt=null chars=\"X\" unmodchars=\"x\" repeat=0 keyCode=10" equals:[anEvent description]];
anEvent = [CPEvent otherEventWithType:CPApplicationDefined location:CGPointMakeZero() modifierFlags:0 timestamp:500.5 windowNumber:2 context:nil subtype:5 data1:15 data2:25];
[self assert:@"CPEvent: type=15 loc={0, 0} time=500.5 flags=0x0 win=null winNum=0 ctxt=null subtype=5 data1=15 data2=25" equals:[anEvent description]];
}
- (void)testModifierFlags
{
[self assert:0 equals:[CPEvent modifierFlags] message:@"no modifier flags active in a newly started app"];
var anEvent = [CPEvent keyEventWithType:CPKeyDown location:CGPointMakeZero() modifierFlags:CPShiftKeyMask timestamp:0 windowNumber:0 context:nil characters:"A" charactersIgnoringModifiers:"a" isARepeat:NO keyCode:0];
[CPApp sendEvent:anEvent];
[self assert:CPShiftKeyMask equals:[CPEvent modifierFlags] message:@"shift key pressed"];
// When the key up event is sent the modifier flags are cleared.
anEvent = [CPEvent keyEventWithType:CPKeyUp location:CGPointMakeZero() modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:"A" charactersIgnoringModifiers:"a" isARepeat:NO keyCode:0];
[CPApp sendEvent:anEvent];
[self assert:0 equals:[CPEvent modifierFlags] message:@"shift key released"];
}
@end
+35 -13
View File
@@ -4,6 +4,7 @@
@implementation CPTableViewTest : OJTestCase
{
CPWindow theWindow;
CPTableView tableView;
CPTableColumn tableColumn;
@@ -15,19 +16,21 @@
- (void)setUp
{
// setup a reasonable table
tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0)
styleMask:CPWindowNotSizable];
tableView = [[FirstResponderConfigurableTableView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
tableColumn = [[CPTableColumn alloc] initWithIdentifier:@"Foo"];
tableView.acceptsFirstResponder = YES;
[tableView addTableColumn:tableColumn];
[[theWindow contentView] addSubview:tableView];
}
- (void)testDoubleAction
{
doubleActionReceived = NO;
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0)
styleMask:CPWindowNotSizable];
[[theWindow contentView] addSubview:tableView];
[tableView setTarget:self];
[tableView setDoubleAction:@selector(doubleAction:)];
@@ -44,6 +47,20 @@
[tableView trackMouse:dblClkUp];
[self assertTrue:doubleActionReceived];
// The event should also work even if the table is not the first responder.
tableView.acceptsFirstResponder = NO;
[theWindow makeFirstResponder:nil];
doubleActionReceived = NO;
[[CPApplication sharedApplication] sendEvent:dblClkDown];
[tableView trackMouse:dblClkDown];
[[CPApplication sharedApplication] sendEvent:dblClkUp];
[tableView trackMouse:dblClkUp];
[self assertTrue:doubleActionReceived];
}
- (void)doubleAction:(id)sender
@@ -124,11 +141,6 @@
*/
- (void)testEditCell
{
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0, 0, 200, 150)
styleMask:CPWindowNotSizable];
[[theWindow contentView] addSubview:tableView];
var dataSource = [TestDataSource new];
[dataSource setTableEntries:["A", "B", "C"]];
@@ -230,9 +242,7 @@
- (void)testContentBinding
{
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0, 0, 200, 150)
styleMask:CPWindowNotSizable],
contentBindingTable = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)],
var contentBindingTable = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)],
tableColumn = [[CPTableColumn alloc] initWithIdentifier:@"A"],
delegate = [ContentBindingTableDelegate new];
@@ -259,6 +269,18 @@
@end
@implementation FirstResponderConfigurableTableView : CPTableView
{
BOOL acceptsFirstResponder;
}
- (BOOL)acceptsFirstResponder
{
return acceptsFirstResponder;
}
@end
@implementation TestDataSource : CPObject
{
CPArray tableEntries @accessors;
-1
View File
@@ -52,7 +52,6 @@
// The default run loop undo grouping won't be closed until the next run loop cycle.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
CPLog.error("receivedNotifications: %@", receivedNotifications);
[self assert:CPUndoManagerDidCloseUndoGroupNotification equals:[receivedNotifications[0] name]];
[[CPNotificationCenter defaultCenter] removeObserver:self];
+29 -21
View File
@@ -10,6 +10,7 @@ tableTestDragType = @"CPTableViewTestDragType";
CPImage iconImage;
CPArray dataSet1;
CPArray dataSet2;
CPArray dataSet3;
CPTableColumn randomColumn;
}
@@ -28,9 +29,15 @@ tableTestDragType = @"CPTableViewTestDragType";
}
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(50,50,700,500) styleMask:CPClosableWindowMask],
contentView = [theWindow contentView];
contentView = [theWindow contentView],
label = [CPTextField new];
tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 400.0)];
[label setStringValue:@"This table refuses to become the first responder but can still be interacted with."];
[label sizeToFit];
[label setFrameOrigin:CGPointMake(200, 10)]
[contentView addSubview:label];
tableView = [[CUTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 400.0)];
[tableView setAllowsMultipleSelection:YES];
[tableView setAllowsColumnSelection:YES];
@@ -172,7 +179,6 @@ tableTestDragType = @"CPTableViewTestDragType";
- (void)newWindow
{
var window2 = [[CPWindow alloc] initWithContentRect:CGRectMake(450, 50, 500, 400) styleMask:CPTitledWindowMask | CPResizableWindowMask];
tableView2 = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 500.0, 500.0)];
@@ -186,7 +192,6 @@ tableTestDragType = @"CPTableViewTestDragType";
[tableView2 setDelegate:self];
[tableView2 setDataSource:self];
var checkBox = [[CPCheckBox alloc] initWithFrame:CGRectMake(5,3,24,24)],
checkBoxColumn = [[CPTableColumn alloc] initWithIdentifier:@"checkBox"];
[checkBoxColumn setDataView:checkBox];
@@ -299,20 +304,9 @@ tableTestDragType = @"CPTableViewTestDragType";
[aTableView reloadData];
}
- (void)tableViewSelectionIsChanging:(CPNotification)aNotification
{
//CPLog.debug(@"changing! %@", [aNotification description]);
}
- (void)tableViewSelectionDidChange:(CPNotification)aNotification
{
//CPLog.debug(@"did change! %@", [aNotification description]);
}
- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(int)rowIndex
{
//CPLog.debug(@"tableView:shouldSelectRow");
CPLog.debug(@"tableView:shouldSelectRow");
return true;
}
@@ -324,18 +318,19 @@ tableTestDragType = @"CPTableViewTestDragType";
- (void)tableViewSelectionDidChange:(id)notification
{
//CPLogConsole(_cmd + [notification description]);
CPLogConsole(_cmd + [notification description]);
}
- (void)tableViewSelectionIsChanging:(id)notification
{
//CPLogConsole(_cmd + [notification description]);
CPLogConsole(_cmd + [notification description]);
}
- (void)_tableViewColumnDidResize:(id)notification
{
//CPLogConsole(_cmd + [notification description]);
CPLogConsole(_cmd + [notification description]);
}
- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)tableColumn row:(int)row
{
if (aTableView === tableView3)
@@ -425,8 +420,8 @@ tableTestDragType = @"CPTableViewTestDragType";
}
else
{
var destIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(row, [sourceIndexes count])];
var sourceObjects = [sourceDataSet objectsAtIndexes:sourceIndexes];
var destIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(row, [sourceIndexes count])],
sourceObjects = [sourceDataSet objectsAtIndexes:sourceIndexes];
[destinationDataSet insertObjects:sourceObjects atIndexes:destIndexes];
[destinationTable reloadData];
@@ -485,3 +480,16 @@ tableTestDragType = @"CPTableViewTestDragType";
}
@end
@implementation CUTableView : CPTableView
{
}
- (BOOL)acceptsFirstResponder
{
return NO;
}
@end