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

Side by Side Diff: ui/views/cocoa/bridged_content_view.mm

Issue 1137653005: MacViews: Implement Tooltips (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: @class ToolTip is not a thing Created 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #import "ui/views/cocoa/bridged_content_view.h" 5 #import "ui/views/cocoa/bridged_content_view.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #import "base/mac/scoped_nsobject.h" 8 #import "base/mac/scoped_nsobject.h"
9 #include "base/strings/sys_string_conversions.h" 9 #include "base/strings/sys_string_conversions.h"
10 #include "ui/base/ime/text_input_client.h" 10 #include "ui/base/ime/text_input_client.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 ui::POST_DISPATCH_NONE) 51 ui::POST_DISPATCH_NONE)
52 return true; 52 return true;
53 } 53 }
54 return false; 54 return false;
55 } 55 }
56 56
57 } // namespace 57 } // namespace
58 58
59 @interface BridgedContentView () 59 @interface BridgedContentView ()
60 60
61 // Translates the location of |theEvent| to toolkit-views coordinates and passes
62 // the event to NativeWidgetMac for handling.
63 - (void)handleMouseEvent:(NSEvent*)theEvent;
64
65 // Translates keycodes and modifiers on |theEvent| to ui::KeyEvents and passes 61 // Translates keycodes and modifiers on |theEvent| to ui::KeyEvents and passes
66 // the event to the InputMethod for dispatch. 62 // the event to the InputMethod for dispatch.
67 - (void)handleKeyEvent:(NSEvent*)theEvent; 63 - (void)handleKeyEvent:(NSEvent*)theEvent;
68 64
69 // Handles an NSResponder Action Message by mapping it to a corresponding text 65 // Handles an NSResponder Action Message by mapping it to a corresponding text
70 // editing command from ui_strings.grd and, when not being sent to a 66 // editing command from ui_strings.grd and, when not being sent to a
71 // TextInputClient, the keyCode that toolkit-views expects internally. 67 // TextInputClient, the keyCode that toolkit-views expects internally.
72 // For example, moveToLeftEndOfLine: would pass ui::VKEY_HOME in non-RTL locales 68 // For example, moveToLeftEndOfLine: would pass ui::VKEY_HOME in non-RTL locales
73 // even though the Home key on Mac defaults to moveToBeginningOfDocument:. 69 // even though the Home key on Mac defaults to moveToBeginningOfDocument:.
74 // This approach also allows action messages a user 70 // This approach also allows action messages a user
(...skipping 28 matching lines...) Expand all
103 gfx::Rect bounds = viewToHost->bounds(); 99 gfx::Rect bounds = viewToHost->bounds();
104 // To keep things simple, assume the origin is (0, 0) until there exists a use 100 // To keep things simple, assume the origin is (0, 0) until there exists a use
105 // case for something other than that. 101 // case for something other than that.
106 DCHECK(bounds.origin().IsOrigin()); 102 DCHECK(bounds.origin().IsOrigin());
107 NSRect initialFrame = NSMakeRect(0, 0, bounds.width(), bounds.height()); 103 NSRect initialFrame = NSMakeRect(0, 0, bounds.width(), bounds.height());
108 if ((self = [super initWithFrame:initialFrame])) { 104 if ((self = [super initWithFrame:initialFrame])) {
109 hostedView_ = viewToHost; 105 hostedView_ = viewToHost;
110 106
111 // Apple's documentation says that NSTrackingActiveAlways is incompatible 107 // Apple's documentation says that NSTrackingActiveAlways is incompatible
112 // with NSTrackingCursorUpdate, so use NSTrackingActiveInActiveApp. 108 // with NSTrackingCursorUpdate, so use NSTrackingActiveInActiveApp.
113 trackingArea_.reset([[CrTrackingArea alloc] 109 cursorTrackingArea_.reset([[CrTrackingArea alloc]
114 initWithRect:NSZeroRect 110 initWithRect:NSZeroRect
115 options:NSTrackingMouseMoved | NSTrackingCursorUpdate | 111 options:NSTrackingMouseMoved | NSTrackingCursorUpdate |
116 NSTrackingActiveInActiveApp | NSTrackingInVisibleRect 112 NSTrackingActiveInActiveApp | NSTrackingInVisibleRect
117 owner:self 113 owner:self
118 userInfo:nil]); 114 userInfo:nil]);
119 [self addTrackingArea:trackingArea_.get()]; 115 [self addTrackingArea:cursorTrackingArea_.get()];
120 } 116 }
121 return self; 117 return self;
122 } 118 }
123 119
124 - (void)clearView { 120 - (void)clearView {
125 hostedView_ = NULL; 121 hostedView_ = NULL;
126 [trackingArea_.get() clearOwner]; 122 [cursorTrackingArea_.get() clearOwner];
127 [self removeTrackingArea:trackingArea_.get()]; 123 [self removeTrackingArea:cursorTrackingArea_.get()];
128 } 124 }
129 125
130 - (void)processCapturedMouseEvent:(NSEvent*)theEvent { 126 - (void)processCapturedMouseEvent:(NSEvent*)theEvent {
131 if (!hostedView_) 127 if (!hostedView_)
132 return; 128 return;
133 129
134 NSWindow* source = [theEvent window]; 130 NSWindow* source = [theEvent window];
135 NSWindow* target = [self window]; 131 NSWindow* target = [self window];
136 DCHECK(target); 132 DCHECK(target);
137 133
138 // If it's the view's window, process normally. 134 // If it's the view's window, process normally.
139 if ([target isEqual:source]) { 135 if ([target isEqual:source]) {
140 [self handleMouseEvent:theEvent]; 136 [self mouseEvent:theEvent];
141 return; 137 return;
142 } 138 }
143 139
144 ui::MouseEvent event(theEvent); 140 ui::MouseEvent event(theEvent);
145 event.set_location( 141 event.set_location(
146 MovePointToWindow([theEvent locationInWindow], source, target)); 142 MovePointToWindow([theEvent locationInWindow], source, target));
147 hostedView_->GetWidget()->OnMouseEvent(&event); 143 hostedView_->GetWidget()->OnMouseEvent(&event);
148 } 144 }
149 145
146 - (void)updateTooltipIfRequiredAt:(const gfx::Point&)locationInWindow {
147 DCHECK(hostedView_);
148 base::string16 newTooltipText;
149
150 views::View* view = hostedView_->GetTooltipHandlerForPoint(locationInWindow);
151 if (view) {
152 gfx::Point viewPoint = locationInWindow;
153 views::View::ConvertPointToTarget(hostedView_, view, &viewPoint);
154 if (!view->GetTooltipText(viewPoint, &newTooltipText))
155 DCHECK(newTooltipText.empty());
156 }
157 if (newTooltipText != lastTooltipText_) {
158 std::swap(newTooltipText, lastTooltipText_);
159 [self setToolTipAtMousePoint:base::SysUTF16ToNSString(lastTooltipText_)];
160 }
161 }
162
150 // BridgedContentView private implementation. 163 // BridgedContentView private implementation.
151 164
152 - (void)handleMouseEvent:(NSEvent*)theEvent {
153 if (!hostedView_)
154 return;
155
156 ui::MouseEvent event(theEvent);
157 hostedView_->GetWidget()->OnMouseEvent(&event);
158 }
159
160 - (void)handleKeyEvent:(NSEvent*)theEvent { 165 - (void)handleKeyEvent:(NSEvent*)theEvent {
161 if (!hostedView_) 166 if (!hostedView_)
162 return; 167 return;
163 168
164 DCHECK(theEvent); 169 DCHECK(theEvent);
165 ui::KeyEvent event(theEvent); 170 ui::KeyEvent event(theEvent);
166 if (DispatchEventToMenu(hostedView_->GetWidget(), event.key_code())) 171 if (DispatchEventToMenu(hostedView_->GetWidget(), event.key_code()))
167 return; 172 return;
168 173
169 hostedView_->GetWidget()->GetInputMethod()->DispatchKeyEvent(event); 174 hostedView_->GetWidget()->GetInputMethod()->DispatchKeyEvent(event);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 } 241 }
237 242
238 - (void)selectAll:(id)sender { 243 - (void)selectAll:(id)sender {
239 DCHECK(textInputClient_->IsEditCommandEnabled(IDS_APP_SELECT_ALL)); 244 DCHECK(textInputClient_->IsEditCommandEnabled(IDS_APP_SELECT_ALL));
240 [self handleAction:IDS_APP_SELECT_ALL 245 [self handleAction:IDS_APP_SELECT_ALL
241 keyCode:ui::VKEY_A 246 keyCode:ui::VKEY_A
242 domCode:ui::DomCode::KEY_A 247 domCode:ui::DomCode::KEY_A
243 eventFlags:ui::EF_CONTROL_DOWN]; 248 eventFlags:ui::EF_CONTROL_DOWN];
244 } 249 }
245 250
251 // BaseView implementation.
252
253 // Don't use tracking areas from BaseView. BridgedContentView's tracks
254 // NSTrackingCursorUpdate and Apple's documentation suggests it's incompatible.
255 - (void)enableTracking {
256 }
257
258 // Translates the location of |theEvent| to toolkit-views coordinates and passes
259 // the event to NativeWidgetMac for handling.
260 - (void)mouseEvent:(NSEvent*)theEvent {
261 if (!hostedView_)
262 return;
263
264 ui::MouseEvent event(theEvent);
265
266 // Aura updates tooltips with the help of aura::Window::AddPreTargetHandler().
267 // Mac hooks in here.
268 [self updateTooltipIfRequiredAt:event.location()];
269
270 hostedView_->GetWidget()->OnMouseEvent(&event);
271 }
272
246 // NSView implementation. 273 // NSView implementation.
247 274
248 - (BOOL)acceptsFirstResponder { 275 - (BOOL)acceptsFirstResponder {
249 return YES; 276 return YES;
250 } 277 }
251 278
252 - (void)viewDidMoveToWindow { 279 - (void)viewDidMoveToWindow {
253 // When this view is added to a window, AppKit calls setFrameSize before it is 280 // When this view is added to a window, AppKit calls setFrameSize before it is
254 // added to the window, so the behavior in setFrameSize is not triggered. 281 // added to the window, so the behavior in setFrameSize is not triggered.
255 NSWindow* window = [self window]; 282 NSWindow* window = [self window];
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 331
305 // NSResponder implementation. 332 // NSResponder implementation.
306 333
307 - (void)keyDown:(NSEvent*)theEvent { 334 - (void)keyDown:(NSEvent*)theEvent {
308 // Convert the event into an action message, according to OSX key mappings. 335 // Convert the event into an action message, according to OSX key mappings.
309 inKeyDown_ = YES; 336 inKeyDown_ = YES;
310 [self interpretKeyEvents:@[ theEvent ]]; 337 [self interpretKeyEvents:@[ theEvent ]];
311 inKeyDown_ = NO; 338 inKeyDown_ = NO;
312 } 339 }
313 340
314 - (void)mouseDown:(NSEvent*)theEvent {
315 [self handleMouseEvent:theEvent];
316 }
317
318 - (void)rightMouseDown:(NSEvent*)theEvent {
319 [self handleMouseEvent:theEvent];
320 }
321
322 - (void)otherMouseDown:(NSEvent*)theEvent {
323 [self handleMouseEvent:theEvent];
324 }
325
326 - (void)mouseUp:(NSEvent*)theEvent {
327 [self handleMouseEvent:theEvent];
328 }
329
330 - (void)rightMouseUp:(NSEvent*)theEvent {
331 [self handleMouseEvent:theEvent];
332 }
333
334 - (void)otherMouseUp:(NSEvent*)theEvent {
335 [self handleMouseEvent:theEvent];
336 }
337
338 - (void)mouseDragged:(NSEvent*)theEvent {
339 [self handleMouseEvent:theEvent];
340 }
341
342 - (void)rightMouseDragged:(NSEvent*)theEvent {
343 [self handleMouseEvent:theEvent];
344 }
345
346 - (void)otherMouseDragged:(NSEvent*)theEvent {
347 [self handleMouseEvent:theEvent];
348 }
349
350 - (void)mouseMoved:(NSEvent*)theEvent {
351 // Note: mouseEntered: and mouseExited: are not handled separately.
352 // |hostedView_| is responsible for converting the move events into entered
353 // and exited events for the view heirarchy.
354 [self handleMouseEvent:theEvent];
355 }
356
357 - (void)scrollWheel:(NSEvent*)theEvent { 341 - (void)scrollWheel:(NSEvent*)theEvent {
358 if (!hostedView_) 342 if (!hostedView_)
359 return; 343 return;
360 344
361 ui::MouseWheelEvent event(theEvent); 345 ui::MouseWheelEvent event(theEvent);
362 hostedView_->GetWidget()->OnMouseEvent(&event); 346 hostedView_->GetWidget()->OnMouseEvent(&event);
363 } 347 }
364 348
365 //////////////////////////////////////////////////////////////////////////////// 349 ////////////////////////////////////////////////////////////////////////////////
366 // NSResponder Action Messages. Keep sorted according NSResponder.h (from the 350 // NSResponder Action Messages. Keep sorted according NSResponder.h (from the
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 } 705 }
722 706
723 return [super accessibilityAttributeValue:attribute]; 707 return [super accessibilityAttributeValue:attribute];
724 } 708 }
725 709
726 - (id)accessibilityHitTest:(NSPoint)point { 710 - (id)accessibilityHitTest:(NSPoint)point {
727 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point]; 711 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point];
728 } 712 }
729 713
730 @end 714 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698