OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autocomplete/autocomplete_edit_view_mac.h" | 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_mac.h" |
6 | 6 |
7 #include "base/sys_string_conversions.h" | 7 #include "base/sys_string_conversions.h" |
8 #include "chrome/browser/autocomplete/autocomplete_edit.h" | 8 #include "chrome/browser/autocomplete/autocomplete_edit.h" |
9 #include "chrome/browser/autocomplete/autocomplete_popup_model.h" | 9 #include "chrome/browser/autocomplete/autocomplete_popup_model.h" |
10 #include "chrome/browser/autocomplete/autocomplete_popup_view_mac.h" | 10 #include "chrome/browser/autocomplete/autocomplete_popup_view_mac.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 90 |
91 // Thin Obj-C bridge class that is the delegate of the omnibox field. | 91 // Thin Obj-C bridge class that is the delegate of the omnibox field. |
92 // It intercepts various control delegate methods and vectors them to | 92 // It intercepts various control delegate methods and vectors them to |
93 // the edit view. | 93 // the edit view. |
94 | 94 |
95 @interface AutocompleteFieldDelegate : NSObject { | 95 @interface AutocompleteFieldDelegate : NSObject { |
96 @private | 96 @private |
97 AutocompleteEditViewMac* edit_view_; // weak, owns us. | 97 AutocompleteEditViewMac* edit_view_; // weak, owns us. |
98 } | 98 } |
99 - initWithEditView:(AutocompleteEditViewMac*)view; | 99 - initWithEditView:(AutocompleteEditViewMac*)view; |
| 100 - (void)windowDidResignKey:(NSNotification*)notification; |
| 101 - (void)windowDidBecomeKey:(NSNotification*)notification; |
100 @end | 102 @end |
101 | 103 |
102 AutocompleteEditViewMac::AutocompleteEditViewMac( | 104 AutocompleteEditViewMac::AutocompleteEditViewMac( |
103 AutocompleteEditController* controller, | 105 AutocompleteEditController* controller, |
104 ToolbarModel* toolbar_model, | 106 ToolbarModel* toolbar_model, |
105 Profile* profile, | 107 Profile* profile, |
106 CommandUpdater* command_updater, | 108 CommandUpdater* command_updater, |
107 NSTextField* field) | 109 NSTextField* field) |
108 : model_(new AutocompleteEditModel(this, controller, profile)), | 110 : model_(new AutocompleteEditModel(this, controller, profile)), |
109 popup_view_(new AutocompletePopupViewMac(this, model_.get(), profile, | 111 popup_view_(new AutocompletePopupViewMac(this, model_.get(), profile, |
110 field)), | 112 field)), |
111 controller_(controller), | 113 controller_(controller), |
112 toolbar_model_(toolbar_model), | 114 toolbar_model_(toolbar_model), |
113 command_updater_(command_updater), | 115 command_updater_(command_updater), |
114 field_(field), | 116 field_(field), |
115 edit_helper_([[AutocompleteFieldDelegate alloc] initWithEditView:this]) { | 117 edit_helper_([[AutocompleteFieldDelegate alloc] initWithEditView:this]) { |
116 DCHECK(controller); | 118 DCHECK(controller); |
117 DCHECK(toolbar_model); | 119 DCHECK(toolbar_model); |
118 DCHECK(profile); | 120 DCHECK(profile); |
119 DCHECK(command_updater); | 121 DCHECK(command_updater); |
120 DCHECK(field); | 122 DCHECK(field); |
121 [field_ setDelegate:edit_helper_]; | 123 [field_ setDelegate:edit_helper_]; |
122 | 124 |
123 // Needed so that editing doesn't lose the styling. | 125 // Needed so that editing doesn't lose the styling. |
124 [field_ setAllowsEditingTextAttributes:YES]; | 126 [field_ setAllowsEditingTextAttributes:YES]; |
| 127 |
| 128 // Track the window's key status for signalling focus changes to |
| 129 // |model_|. |
| 130 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; |
| 131 [nc addObserver:edit_helper_ |
| 132 selector:@selector(windowDidResignKey:) |
| 133 name:NSWindowDidResignKeyNotification |
| 134 object:[field_ window]]; |
| 135 [nc addObserver:edit_helper_ |
| 136 selector:@selector(windowDidBecomeKey:) |
| 137 name:NSWindowDidBecomeKeyNotification |
| 138 object:[field_ window]]; |
125 } | 139 } |
126 | 140 |
127 AutocompleteEditViewMac::~AutocompleteEditViewMac() { | 141 AutocompleteEditViewMac::~AutocompleteEditViewMac() { |
128 // TODO(shess): Having to be aware of destructor ordering in this | 142 // TODO(shess): Having to be aware of destructor ordering in this |
129 // way seems brittle. There must be a better way. | 143 // way seems brittle. There must be a better way. |
130 | 144 |
131 // Destroy popup view before this object in case it tries to call us | 145 // Destroy popup view before this object in case it tries to call us |
132 // back in the destructor. Likewise for destroying the model before | 146 // back in the destructor. Likewise for destroying the model before |
133 // this object. | 147 // this object. |
134 popup_view_.reset(); | 148 popup_view_.reset(); |
135 model_.reset(); | 149 model_.reset(); |
136 | 150 |
137 // Disconnect field_ from edit_helper_ so that we don't get calls | 151 // Disconnect field_ from edit_helper_ so that we don't get calls |
138 // after destruction. | 152 // after destruction. |
139 [field_ setDelegate:nil]; | 153 [field_ setDelegate:nil]; |
| 154 |
| 155 // Disconnect notifications so they don't signal a dead object. |
| 156 [[NSNotificationCenter defaultCenter] removeObserver:edit_helper_]; |
140 } | 157 } |
141 | 158 |
142 void AutocompleteEditViewMac::SaveStateToTab(TabContents* tab) { | 159 void AutocompleteEditViewMac::SaveStateToTab(TabContents* tab) { |
143 DCHECK(tab); | 160 DCHECK(tab); |
144 | 161 |
145 NSRange range; | 162 NSRange range; |
146 if (model_->has_focus()) { | 163 if (model_->has_focus()) { |
147 range = GetSelectedRange(); | 164 range = GetSelectedRange(); |
148 } else { | 165 } else { |
149 // If we are not focussed, there is no selection. Manufacture | 166 // If we are not focussed, there is no selection. Manufacture |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 } | 450 } |
434 | 451 |
435 void AutocompleteEditViewMac::OnUpOrDownKeyPressed(bool up, bool by_page) { | 452 void AutocompleteEditViewMac::OnUpOrDownKeyPressed(bool up, bool by_page) { |
436 const int count = by_page ? model_->result().size() : 1; | 453 const int count = by_page ? model_->result().size() : 1; |
437 model_->OnUpOrDownKeyPressed(up ? -count : count); | 454 model_->OnUpOrDownKeyPressed(up ? -count : count); |
438 } | 455 } |
439 void AutocompleteEditViewMac::OnEscapeKeyPressed() { | 456 void AutocompleteEditViewMac::OnEscapeKeyPressed() { |
440 model_->OnEscapeKeyPressed(); | 457 model_->OnEscapeKeyPressed(); |
441 } | 458 } |
442 void AutocompleteEditViewMac::OnSetFocus(bool f) { | 459 void AutocompleteEditViewMac::OnSetFocus(bool f) { |
443 model_->OnSetFocus(f); | 460 // Only forward if we actually do have the focus. |
| 461 if ([field_ currentEditor]) { |
| 462 model_->OnSetFocus(f); |
| 463 } |
444 } | 464 } |
445 void AutocompleteEditViewMac::OnKillFocus() { | 465 void AutocompleteEditViewMac::OnKillFocus() { |
446 // TODO(shess): This would seem to be a job for |model_|. | 466 // TODO(shess): This would seem to be a job for |model_|. |
447 ClosePopup(); | 467 ClosePopup(); |
448 | 468 |
449 // Tell the model to reset itself. | 469 // Tell the model to reset itself. |
450 model_->OnKillFocus(); | 470 model_->OnKillFocus(); |
451 } | 471 } |
452 void AutocompleteEditViewMac::AcceptInput( | 472 void AutocompleteEditViewMac::AcceptInput( |
453 WindowOpenDisposition disposition, bool for_drop) { | 473 WindowOpenDisposition disposition, bool for_drop) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 | 550 |
531 - (BOOL)control:(NSControl*)control textShouldEndEditing:(NSText*)fieldEditor { | 551 - (BOOL)control:(NSControl*)control textShouldEndEditing:(NSText*)fieldEditor { |
532 edit_view_->OnKillFocus(); | 552 edit_view_->OnKillFocus(); |
533 | 553 |
534 return YES; | 554 return YES; |
535 | 555 |
536 // TODO(shess): Figure out where the selection belongs. On GTK, | 556 // TODO(shess): Figure out where the selection belongs. On GTK, |
537 // it's set to the start of the text. | 557 // it's set to the start of the text. |
538 } | 558 } |
539 | 559 |
| 560 // Signal that we've lost focus when the window resigns key. |
| 561 - (void)windowDidResignKey:(NSNotification*)notification { |
| 562 edit_view_->OnKillFocus(); |
| 563 } |
| 564 |
| 565 // Signal that we may have regained focus. |
| 566 - (void)windowDidBecomeKey:(NSNotification*)notification { |
| 567 edit_view_->OnSetFocus(false); |
| 568 } |
| 569 |
540 @end | 570 @end |
OLD | NEW |