| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/tab_contents/tab_contents_view_mac.h" | 5 #include "chrome/browser/tab_contents/tab_contents_view_mac.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "chrome/browser/browser.h" // TODO(beng): this dependency is awful. | 9 #include "chrome/browser/browser.h" // TODO(beng): this dependency is awful. |
| 10 #include "chrome/browser/cocoa/sad_tab_view.h" | 10 #include "chrome/browser/cocoa/sad_tab_view.h" |
| 11 #import "chrome/browser/cocoa/web_drag_source.h" | 11 #import "chrome/browser/cocoa/web_drag_source.h" |
| 12 #import "chrome/browser/cocoa/web_drop_target.h" | 12 #import "chrome/browser/cocoa/web_drop_target.h" |
| 13 #include "chrome/browser/renderer_host/render_widget_host.h" | 13 #include "chrome/browser/renderer_host/render_widget_host.h" |
| 14 #include "chrome/browser/renderer_host/render_widget_host_view_mac.h" | 14 #include "chrome/browser/renderer_host/render_widget_host_view_mac.h" |
| 15 #include "chrome/browser/tab_contents/render_view_context_menu_mac.h" | 15 #include "chrome/browser/tab_contents/render_view_context_menu_mac.h" |
| 16 #include "chrome/browser/tab_contents/tab_contents.h" | 16 #include "chrome/browser/tab_contents/tab_contents.h" |
| 17 #include "chrome/common/notification_type.h" | 17 #include "chrome/common/notification_type.h" |
| 18 #include "chrome/common/notification_service.h" | 18 #include "chrome/common/notification_service.h" |
| 19 #include "chrome/common/render_messages.h" | 19 #include "chrome/common/render_messages.h" |
| 20 #import "third_party/mozilla/include/NSPasteboard+Utils.h" | 20 #import "third_party/mozilla/include/NSPasteboard+Utils.h" |
| 21 | 21 |
| 22 #include "chrome/common/temp_scaffolding_stubs.h" | 22 #include "chrome/common/temp_scaffolding_stubs.h" |
| 23 | 23 |
| 24 using WebKit::WebDragOperation; |
| 25 using WebKit::WebDragOperationsMask; |
| 26 |
| 27 // Ensure that the WebKit::WebDragOperation enum values stay in sync with |
| 28 // NSDragOperation constants, since the code below static_casts between 'em. |
| 29 #define COMPILE_ASSERT_MATCHING_ENUM(name) \ |
| 30 COMPILE_ASSERT(int(NS##name) == int(WebKit::Web##name), enum_mismatch_##name) |
| 31 COMPILE_ASSERT_MATCHING_ENUM(DragOperationNone); |
| 32 COMPILE_ASSERT_MATCHING_ENUM(DragOperationCopy); |
| 33 COMPILE_ASSERT_MATCHING_ENUM(DragOperationLink); |
| 34 COMPILE_ASSERT_MATCHING_ENUM(DragOperationGeneric); |
| 35 COMPILE_ASSERT_MATCHING_ENUM(DragOperationPrivate); |
| 36 COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove); |
| 37 COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete); |
| 38 COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery); |
| 39 |
| 24 @interface TabContentsViewCocoa (Private) | 40 @interface TabContentsViewCocoa (Private) |
| 25 - (id)initWithTabContentsViewMac:(TabContentsViewMac*)w; | 41 - (id)initWithTabContentsViewMac:(TabContentsViewMac*)w; |
| 26 - (void)processKeyboardEvent:(NSEvent*)event; | 42 - (void)processKeyboardEvent:(NSEvent*)event; |
| 27 - (void)registerDragTypes; | 43 - (void)registerDragTypes; |
| 28 - (void)setIsDropTarget:(BOOL)isTarget; | 44 - (void)setCurrentDragOperation:(NSDragOperation)operation; |
| 29 - (void)startDragWithDropData:(const WebDropData&)dropData; | 45 - (void)startDragWithDropData:(const WebDropData&)dropData |
| 46 dragOperationMask:(NSDragOperation)operationMask; |
| 30 @end | 47 @end |
| 31 | 48 |
| 32 // static | 49 // static |
| 33 TabContentsView* TabContentsView::Create(TabContents* tab_contents) { | 50 TabContentsView* TabContentsView::Create(TabContents* tab_contents) { |
| 34 return new TabContentsViewMac(tab_contents); | 51 return new TabContentsViewMac(tab_contents); |
| 35 } | 52 } |
| 36 | 53 |
| 37 TabContentsViewMac::TabContentsViewMac(TabContents* tab_contents) | 54 TabContentsViewMac::TabContentsViewMac(TabContents* tab_contents) |
| 38 : TabContentsView(tab_contents) { | 55 : TabContentsView(tab_contents) { |
| 39 registrar_.Add(this, NotificationType::TAB_CONTENTS_CONNECTED, | 56 registrar_.Add(this, NotificationType::TAB_CONTENTS_CONNECTED, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 } | 93 } |
| 77 | 94 |
| 78 gfx::NativeWindow TabContentsViewMac::GetTopLevelNativeWindow() const { | 95 gfx::NativeWindow TabContentsViewMac::GetTopLevelNativeWindow() const { |
| 79 return [cocoa_view_.get() window]; | 96 return [cocoa_view_.get() window]; |
| 80 } | 97 } |
| 81 | 98 |
| 82 void TabContentsViewMac::GetContainerBounds(gfx::Rect* out) const { | 99 void TabContentsViewMac::GetContainerBounds(gfx::Rect* out) const { |
| 83 *out = [cocoa_view_.get() NSRectToRect:[cocoa_view_.get() bounds]]; | 100 *out = [cocoa_view_.get() NSRectToRect:[cocoa_view_.get() bounds]]; |
| 84 } | 101 } |
| 85 | 102 |
| 86 void TabContentsViewMac::StartDragging(const WebDropData& drop_data) { | 103 void TabContentsViewMac::StartDragging(const WebDropData& drop_data, |
| 104 WebDragOperationsMask allowed_operations) { |
| 87 // The drag invokes a nested event loop, but we need to continue processing | 105 // The drag invokes a nested event loop, but we need to continue processing |
| 88 // events. | 106 // events. |
| 89 MessageLoop::current()->SetNestableTasksAllowed(true); | 107 MessageLoop::current()->SetNestableTasksAllowed(true); |
| 90 [cocoa_view_ startDragWithDropData:drop_data]; | 108 NSDragOperation mask = static_cast<NSDragOperation>(allowed_operations); |
| 109 [cocoa_view_ startDragWithDropData:drop_data |
| 110 dragOperationMask:mask]; |
| 91 MessageLoop::current()->SetNestableTasksAllowed(false); | 111 MessageLoop::current()->SetNestableTasksAllowed(false); |
| 92 } | 112 } |
| 93 | 113 |
| 94 void TabContentsViewMac::OnContentsDestroy() { | 114 void TabContentsViewMac::OnContentsDestroy() { |
| 95 } | 115 } |
| 96 | 116 |
| 97 void TabContentsViewMac::RenderViewCreated(RenderViewHost* host) { | 117 void TabContentsViewMac::RenderViewCreated(RenderViewHost* host) { |
| 98 // We want updates whenever the intrinsic width of the webpage | 118 // We want updates whenever the intrinsic width of the webpage |
| 99 // changes. Put the RenderView into that mode. | 119 // changes. Put the RenderView into that mode. |
| 100 int routing_id = host->routing_id(); | 120 int routing_id = host->routing_id(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 latent_focus_view_.reset(); | 179 latent_focus_view_.reset(); |
| 160 } else { | 180 } else { |
| 161 // TODO(shess): If location-bar gets focus by default, this will | 181 // TODO(shess): If location-bar gets focus by default, this will |
| 162 // select-all in the field. If there was a specific selection in | 182 // select-all in the field. If there was a specific selection in |
| 163 // the field when we navigated away from it, we should restore | 183 // the field when we navigated away from it, we should restore |
| 164 // that selection. | 184 // that selection. |
| 165 SetInitialFocus(); | 185 SetInitialFocus(); |
| 166 } | 186 } |
| 167 } | 187 } |
| 168 | 188 |
| 169 void TabContentsViewMac::UpdateDragCursor(bool is_drop_target) { | 189 void TabContentsViewMac::UpdateDragCursor(WebDragOperation operation) { |
| 170 [cocoa_view_ setIsDropTarget:is_drop_target ? YES : NO]; | 190 [cocoa_view_ setCurrentDragOperation: operation]; |
| 171 } | 191 } |
| 172 | 192 |
| 173 void TabContentsViewMac::GotFocus() { | 193 void TabContentsViewMac::GotFocus() { |
| 174 NOTIMPLEMENTED(); | 194 NOTIMPLEMENTED(); |
| 175 } | 195 } |
| 176 | 196 |
| 177 // This is called when we the renderer asks us to take focus back (i.e., it has | 197 // This is called when we the renderer asks us to take focus back (i.e., it has |
| 178 // iterated past the last focusable element on the page). | 198 // iterated past the last focusable element on the page). |
| 179 void TabContentsViewMac::TakeFocus(bool reverse) { | 199 void TabContentsViewMac::TakeFocus(bool reverse) { |
| 180 if (reverse) { | 200 if (reverse) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 } | 282 } |
| 263 | 283 |
| 264 // Registers for the view for the appropriate drag types. | 284 // Registers for the view for the appropriate drag types. |
| 265 // TODO(pinkerton): register for file drags. | 285 // TODO(pinkerton): register for file drags. |
| 266 - (void)registerDragTypes { | 286 - (void)registerDragTypes { |
| 267 NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, | 287 NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, |
| 268 NSHTMLPboardType, NSURLPboardType, nil]; | 288 NSHTMLPboardType, NSURLPboardType, nil]; |
| 269 [self registerForDraggedTypes:types]; | 289 [self registerForDraggedTypes:types]; |
| 270 } | 290 } |
| 271 | 291 |
| 272 - (void)setIsDropTarget:(BOOL)isTarget { | 292 - (void)setCurrentDragOperation:(NSDragOperation)operation { |
| 273 [dropTarget_ setIsDropTarget:isTarget]; | 293 [dropTarget_ setCurrentOperation:operation]; |
| 274 } | 294 } |
| 275 | 295 |
| 276 - (TabContents*)tabContents { | 296 - (TabContents*)tabContents { |
| 277 return tabContentsView_->tab_contents(); | 297 return tabContentsView_->tab_contents(); |
| 278 } | 298 } |
| 279 | 299 |
| 280 - (void)processKeyboardEvent:(NSEvent*)event { | 300 - (void)processKeyboardEvent:(NSEvent*)event { |
| 281 if ([event type] == NSKeyDown) | 301 if ([event type] == NSKeyDown) |
| 282 [super keyDown:event]; | 302 [super keyDown:event]; |
| 283 else if ([event type] == NSKeyUp) | 303 else if ([event type] == NSKeyUp) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 | 338 |
| 319 - (void)paste:(id)sender { | 339 - (void)paste:(id)sender { |
| 320 [self tabContents]->Paste(); | 340 [self tabContents]->Paste(); |
| 321 } | 341 } |
| 322 | 342 |
| 323 - (void)pasteboard:(NSPasteboard*)sender provideDataForType:(NSString*)type { | 343 - (void)pasteboard:(NSPasteboard*)sender provideDataForType:(NSString*)type { |
| 324 [dragSource_ lazyWriteToPasteboard:sender | 344 [dragSource_ lazyWriteToPasteboard:sender |
| 325 forType:type]; | 345 forType:type]; |
| 326 } | 346 } |
| 327 | 347 |
| 328 - (void)startDragWithDropData:(const WebDropData&)dropData { | 348 - (void)startDragWithDropData:(const WebDropData&)dropData |
| 349 dragOperationMask:(NSDragOperation)operationMask { |
| 329 dragSource_.reset([[WebDragSource alloc] | 350 dragSource_.reset([[WebDragSource alloc] |
| 330 initWithContentsView:self | 351 initWithContentsView:self |
| 331 dropData:&dropData | 352 dropData:&dropData |
| 332 pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard]]); | 353 pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard] |
| 354 dragOperationMask:operationMask]); |
| 333 [dragSource_ startDrag]; | 355 [dragSource_ startDrag]; |
| 334 } | 356 } |
| 335 | 357 |
| 336 // NSDraggingSource methods | 358 // NSDraggingSource methods |
| 337 | 359 |
| 338 // Returns what kind of drag operations are available. This is a required | 360 // Returns what kind of drag operations are available. This is a required |
| 339 // method for NSDraggingSource. | 361 // method for NSDraggingSource. |
| 340 - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { | 362 - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { |
| 341 // TODO(pinkerton): I think this is right... | 363 return [dragSource_ draggingSourceOperationMaskForLocal:isLocal]; |
| 342 return NSDragOperationCopy; | |
| 343 } | 364 } |
| 344 | 365 |
| 345 // Called when a drag initiated in our view ends. | 366 // Called when a drag initiated in our view ends. |
| 346 - (void)draggedImage:(NSImage*)anImage | 367 - (void)draggedImage:(NSImage*)anImage |
| 347 endedAt:(NSPoint)screenPoint | 368 endedAt:(NSPoint)screenPoint |
| 348 operation:(NSDragOperation)operation { | 369 operation:(NSDragOperation)operation { |
| 349 [dragSource_ endDragAt:screenPoint | 370 [dragSource_ endDragAt:screenPoint operation:operation]; |
| 350 isCancelled:(operation == NSDragOperationNone)]; | |
| 351 | 371 |
| 352 // Might as well throw out this object now. | 372 // Might as well throw out this object now. |
| 353 dragSource_.reset(); | 373 dragSource_.reset(); |
| 354 } | 374 } |
| 355 | 375 |
| 356 // Called when a drag initiated in our view moves. | 376 // Called when a drag initiated in our view moves. |
| 357 - (void)draggedImage:(NSImage*)draggedImage movedTo:(NSPoint)screenPoint { | 377 - (void)draggedImage:(NSImage*)draggedImage movedTo:(NSPoint)screenPoint { |
| 358 [dragSource_ moveDragTo:screenPoint]; | 378 [dragSource_ moveDragTo:screenPoint]; |
| 359 } | 379 } |
| 360 | 380 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 385 } | 405 } |
| 386 | 406 |
| 387 - (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { | 407 - (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { |
| 388 return [dropTarget_ performDragOperation:sender view:self]; | 408 return [dropTarget_ performDragOperation:sender view:self]; |
| 389 } | 409 } |
| 390 | 410 |
| 391 // Tons of stuff goes here, where we grab events going on in Cocoaland and send | 411 // Tons of stuff goes here, where we grab events going on in Cocoaland and send |
| 392 // them into the C++ system. TODO(avi): all that jazz | 412 // them into the C++ system. TODO(avi): all that jazz |
| 393 | 413 |
| 394 @end | 414 @end |
| OLD | NEW |