Place token autocomplete underneath what's being completed.

This matches Cocoa.
This commit is contained in:
Alexander Ljungberg
2012-06-16 12:31:48 +01:00
parent 33fe1573ad
commit 85cfb18906
2 changed files with 38 additions and 19 deletions
+17 -6
View File
@@ -64,6 +64,7 @@ var CPScrollDestinationNone = 0,
CPRange _selectedRange;
_CPAutocompleteMenu _autocompleteMenu;
CGRect _inputFrame;
CPTimeInterval _completionDelay;
@@ -924,16 +925,16 @@ var CPScrollDestinationNone = 0,
textWidth = MAX(contentSize.width - offset.x - 1, textWidth);
}
var inputFrame = fitAndFrame(textWidth, tokenHeight);
_inputFrame = fitAndFrame(textWidth, tokenHeight);
element.style.left = inputFrame.origin.x + "px";
element.style.top = inputFrame.origin.y + "px";
element.style.width = inputFrame.size.width + "px";
element.style.height = inputFrame.size.height + "px";
element.style.left = _inputFrame.origin.x + "px";
element.style.top = _inputFrame.origin.y + "px";
element.style.width = _inputFrame.size.width + "px";
element.style.height = _inputFrame.size.height + "px";
// When editing, always scroll to the cursor.
if (_selectedRange.length == 0)
[[_tokenScrollView documentView] scrollRectToVisible:inputFrame];
[[_tokenScrollView documentView] scrollRectToVisible:_inputFrame];
};
for (var i = 0, count = [tokens count]; i < count; i++)
@@ -964,6 +965,7 @@ var CPScrollDestinationNone = 0,
// so we can continue using our standard keyboard handling events.
if (isEditing && _selectedRange.length)
{
_inputFrame = nil;
[self _inputElement].style.left = "-10000px";
[self _inputElement].focus();
}
@@ -1021,6 +1023,15 @@ var CPScrollDestinationNone = 0,
return [];
}
/*!
Private API used by the _CPAutocompleteMenu to determine where to place the menu in local coordinates.
*/
- (CGPoint)_completionOrigin:(_CPAutocompleteMenu)anAutocompleteMenu
{
var relativeFrame = _inputFrame ? [[_tokenScrollView documentView] convertRect:_inputFrame toView:self ] : [self bounds];
return CGPointMake(CGRectGetMinX(relativeFrame), CGRectGetMaxY(relativeFrame));
}
/*!
Private API to get the delegate tokenField:displayStringForRepresentedObject: result.
+21 -13
View File
@@ -114,25 +114,33 @@
{
// TODO
/*
The autocompletion menu should be underneath the word/text being autocompleted. It should at least be wide enough to
fit the widest
option but no wider than the width of the text field. It might stick out on the right side, so that if the edited text
is on the right of the text field the menu might extend a full text field width more into space on the right
side. It should not stick out outside of the screen. The height should be the smallest possible to fit all options
or at most ~307px (based on Cocoa). If the options don't fit horizontally they should be truncated with an ellipsis.
The autocompletion menu should be underneath the word/text being
autocompleted. It should at least be wide enough to fit the widest option
but no wider than the width of the text field. It might stick out on the
right side, so that if the edited text is on the right of the text field
the menu might extend a full text field width more into space on the right
side. It should not stick out outside of the screen. The height should be
the smallest possible to fit all options or at most ~307px (based on
Cocoa). If the options don't fit horizontally they should be truncated
with an ellipsis.
*/
var frame = [textField frame];
var frame = [textField frame],
origin = frame.origin;
if ([textField respondsToSelector:@selector(_completionOrigin:)])
origin = [textField _completionOrigin:self];
// Manually sizeToFit because CPTableView's sizeToFit doesn't work properly
var frameOrigin = [textField convertPoint:origin toView:nil],
newFrame = CGRectMake(frameOrigin.x, frameOrigin.y, CPRectGetWidth([textField bounds]), 92.0);
newFrame = [_menuWindow frameRectForContentRect:newFrame];
[_menuWindow setFrame:newFrame];
[scrollView setFrame:CGRectInset([[_menuWindow contentView] bounds], 1.0, 1.0)];
// Correctly size the tableview
// FIXME Horizontal scrolling will not work because we are not actually looking at the content to set the width for the table column
[[[tableView tableColumns] firstObject] setWidth:[[scrollView contentView] frame].size.width];
// Manually sizeToFit because CPTableView's sizeToFit doesn't work properly
var frameOrigin = [textField convertPoint:[textField bounds].origin toView:nil],
newFrame = CGRectMake(frameOrigin.x, frameOrigin.y + frame.size.height, CPRectGetWidth([textField bounds]), 92.0);
[_menuWindow setFrame:[_menuWindow frameRectForContentRect:newFrame]];
[scrollView setFrame:CGRectInset([[_menuWindow contentView] bounds], 1.0, 1.0)];
}
- (void)_showCompletions:(CPTimer)timer