Index: chrome/browser/autocomplete/autocomplete_edit_view_mac.mm |
diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm b/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm |
index a003166bc4d071ed7db2a3c3485b3d423d01cca4..c2841f46a3296a0011f4723b4a3778c652cc9591 100644 |
--- a/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm |
+++ b/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm |
@@ -216,7 +216,7 @@ void AutocompleteEditViewMac::SaveStateToTab(TabContents* tab) { |
} else { |
// If we are not focussed, there is no selection. Manufacture |
// something reasonable in case it starts to matter in the future. |
- range = NSMakeRange(0, [[field_ stringValue] length]); |
+ range = NSMakeRange(0, GetTextLength()); |
} |
AutocompleteEditViewMacState state(model_->GetStateForTabSwitch(), |
@@ -296,8 +296,7 @@ string16 AutocompleteEditViewMac::GetText() const { |
} |
bool AutocompleteEditViewMac::IsEditingOrEmpty() const { |
- return model_->user_input_in_progress() || |
- ([[field_ stringValue] length] == 0); |
+ return model_->user_input_in_progress() || !GetTextLength(); |
} |
int AutocompleteEditViewMac::GetIcon() const { |
@@ -324,7 +323,6 @@ void AutocompleteEditViewMac::SetUserText(const string16& text, |
} |
NSRange AutocompleteEditViewMac::GetSelectedRange() const { |
- DCHECK([field_ currentEditor]); |
return [[field_ currentEditor] selectedRange]; |
} |
@@ -374,7 +372,7 @@ void AutocompleteEditViewMac::SetForcedQuery() { |
bool AutocompleteEditViewMac::IsSelectAll() { |
if (![field_ currentEditor]) |
return true; |
- const NSRange all_range = NSMakeRange(0, GetText().length()); |
+ const NSRange all_range = NSMakeRange(0, GetTextLength()); |
return NSEqualRanges(all_range, GetSelectedRange()); |
} |
@@ -401,7 +399,7 @@ void AutocompleteEditViewMac::SelectAll(bool reversed) { |
// TODO(shess): Verify that we should be stealing focus at this |
// point. |
- SetSelectedRange(NSMakeRange(0, GetText().length())); |
+ SetSelectedRange(NSMakeRange(0, GetTextLength())); |
} |
void AutocompleteEditViewMac::RevertAll() { |
@@ -422,16 +420,8 @@ void AutocompleteEditViewMac::UpdatePopup() { |
// * The caret/selection isn't at the end of the text |
// * The user has just pasted in something that replaced all the text |
// * The user is trying to compose something in an IME |
- bool prevent_inline_autocomplete = IsImeComposing(); |
- NSTextView* editor = (NSTextView*)[field_ currentEditor]; |
- if (editor) { |
- if (NSMaxRange([editor selectedRange]) < |
- [[editor textStorage] length] - suggest_text_length_) |
- prevent_inline_autocomplete = true; |
- } |
- |
- model_->StartAutocomplete([editor selectedRange].length != 0, |
- prevent_inline_autocomplete); |
+ model_->StartAutocomplete(GetSelectedRange().length != 0, |
+ IsImeComposing() || !IsCaretAtEnd()); |
} |
void AutocompleteEditViewMac::ClosePopup() { |
@@ -444,19 +434,6 @@ void AutocompleteEditViewMac::ClosePopup() { |
void AutocompleteEditViewMac::SetFocus() { |
} |
-bool AutocompleteEditViewMac::CommitSuggestText() { |
- if (suggest_text_length_ == 0) |
- return false; |
- |
- string16 input_text(GetText()); |
- suggest_text_length_ = 0; |
- string16 text(GetText()); |
- // Call SetText() to force a redraw and move the cursor to the end. |
- SetText(text); |
- model()->FinalizeInstantQuery(input_text, text.substr(input_text.size())); |
- return true; |
-} |
- |
void AutocompleteEditViewMac::SetText(const string16& display_text) { |
// If we are setting the text directly, there cannot be any suggest text. |
suggest_text_length_ = 0; |
@@ -507,6 +484,16 @@ NSString* AutocompleteEditViewMac::GetNonSuggestTextSubstring() const { |
return text; |
} |
+NSString* AutocompleteEditViewMac::GetSuggestTextSubstring() const { |
+ if (suggest_text_length_ == 0) |
+ return nil; |
+ |
+ NSString* text = [field_ stringValue]; |
+ NSUInteger length = [text length]; |
+ DCHECK_LE(suggest_text_length_, length); |
+ return [text substringFromIndex:(length - suggest_text_length_)]; |
+} |
+ |
void AutocompleteEditViewMac::EmphasizeURLComponents() { |
NSTextView* editor = (NSTextView*)[field_ currentEditor]; |
// If the autocomplete text field is in editing mode, then we can just change |
@@ -723,6 +710,11 @@ void AutocompleteEditViewMac::SetInstantSuggestion( |
} |
} |
+string16 AutocompleteEditViewMac::GetInstantSuggestion() const { |
+ return suggest_text_length_ ? |
+ base::SysNSStringToUTF16(GetSuggestTextSubstring()) : string16(); |
+} |
+ |
int AutocompleteEditViewMac::TextWidth() const { |
// Not used on mac. |
NOTREACHED(); |
@@ -785,12 +777,8 @@ bool AutocompleteEditViewMac::OnDoCommandBySelector(SEL cmd) { |
if (cmd == @selector(moveRight:)) { |
// Only commit suggested text if the cursor is all the way to the right and |
// there is no selection. |
- NSRange range = GetSelectedRange(); |
- if (range.length == 0 && |
- suggest_text_length_ > 0 && |
- (range.location + suggest_text_length_ == |
- [[field_ stringValue] length])) { |
- controller_->OnCommitSuggestedText(GetText()); |
+ if (suggest_text_length_ > 0 && IsCaretAtEnd()) { |
+ controller_->OnCommitSuggestedText(true); |
return true; |
} |
} |
@@ -815,7 +803,15 @@ bool AutocompleteEditViewMac::OnDoCommandBySelector(SEL cmd) { |
return model_->AcceptKeyword(); |
if (suggest_text_length_ > 0) { |
- controller_->OnCommitSuggestedText(GetText()); |
+ controller_->OnCommitSuggestedText(true); |
+ return true; |
+ } |
+ |
+ if (!IsCaretAtEnd()) { |
+ PlaceCaretAt(GetTextLength()); |
+ // OnDidChange() will not be triggered when setting selected range in this |
+ // method, so we need to call it explicitly. |
+ OnDidChange(); |
return true; |
} |
@@ -1094,3 +1090,19 @@ NSFont* AutocompleteEditViewMac::GetFieldFont() { |
ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
return rb.GetFont(ResourceBundle::BaseFont).GetNativeFont(); |
} |
+ |
+NSUInteger AutocompleteEditViewMac::GetTextLength() const { |
+ return ([field_ currentEditor] ? |
+ [[[field_ currentEditor] string] length] : |
+ [[field_ stringValue] length]) - suggest_text_length_; |
+} |
+ |
+void AutocompleteEditViewMac::PlaceCaretAt(NSUInteger pos) { |
+ DCHECK(pos <= GetTextLength()); |
+ SetSelectedRange(NSMakeRange(pos, pos)); |
+} |
+ |
+bool AutocompleteEditViewMac::IsCaretAtEnd() const { |
+ const NSRange selection = GetSelectedRange(); |
+ return selection.length == 0 && selection.location == GetTextLength(); |
+} |