Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1202)

Side by Side Diff: chrome/browser/autocomplete/autocomplete_edit_view_mac.mm

Issue 115573: Mac: Modify Omnibox to notice when the window loses key, too. (Closed)
Patch Set: Unregister notifications before releasing edit_helper_. Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_mac.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698