| 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/views/tab_contents/tab_contents_view_win.h" | 5 #include "chrome/browser/views/tab_contents/tab_contents_view_win.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 | 8 |
| 9 #include "app/gfx/canvas_paint.h" | 9 #include "app/gfx/canvas_paint.h" |
| 10 #include "app/os_exchange_data.h" | 10 #include "app/os_exchange_data.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 using WebKit::WebDragOperationsMask; | 40 using WebKit::WebDragOperationsMask; |
| 41 using WebKit::WebInputEvent; | 41 using WebKit::WebInputEvent; |
| 42 | 42 |
| 43 // static | 43 // static |
| 44 TabContentsView* TabContentsView::Create(TabContents* tab_contents) { | 44 TabContentsView* TabContentsView::Create(TabContents* tab_contents) { |
| 45 return new TabContentsViewWin(tab_contents); | 45 return new TabContentsViewWin(tab_contents); |
| 46 } | 46 } |
| 47 | 47 |
| 48 TabContentsViewWin::TabContentsViewWin(TabContents* tab_contents) | 48 TabContentsViewWin::TabContentsViewWin(TabContents* tab_contents) |
| 49 : TabContentsView(tab_contents), | 49 : TabContentsView(tab_contents), |
| 50 ignore_next_char_event_(false), | |
| 51 focus_manager_(NULL), | 50 focus_manager_(NULL), |
| 52 close_tab_after_drag_ends_(false), | 51 close_tab_after_drag_ends_(false), |
| 53 sad_tab_(NULL) { | 52 sad_tab_(NULL) { |
| 54 last_focused_view_storage_id_ = | 53 last_focused_view_storage_id_ = |
| 55 views::ViewStorage::GetSharedInstance()->CreateStorageID(); | 54 views::ViewStorage::GetSharedInstance()->CreateStorageID(); |
| 56 } | 55 } |
| 57 | 56 |
| 58 TabContentsViewWin::~TabContentsViewWin() { | 57 TabContentsViewWin::~TabContentsViewWin() { |
| 59 // Makes sure to remove any stored view we may still have in the ViewStorage. | 58 // Makes sure to remove any stored view we may still have in the ViewStorage. |
| 60 // | 59 // |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 views::FocusManager* focus_manager = | 354 views::FocusManager* focus_manager = |
| 356 views::FocusManager::GetFocusManagerForNativeView(GetNativeView()); | 355 views::FocusManager::GetFocusManagerForNativeView(GetNativeView()); |
| 357 | 356 |
| 358 // We may not have a focus manager if the tab has been switched before this | 357 // We may not have a focus manager if the tab has been switched before this |
| 359 // message arrived. | 358 // message arrived. |
| 360 if (focus_manager) | 359 if (focus_manager) |
| 361 focus_manager->AdvanceFocus(reverse); | 360 focus_manager->AdvanceFocus(reverse); |
| 362 } | 361 } |
| 363 } | 362 } |
| 364 | 363 |
| 365 bool TabContentsViewWin::HandleKeyboardEvent( | |
| 366 const NativeWebKeyboardEvent& event) { | |
| 367 // Previous calls to TranslateMessage can generate CHAR events as well as | |
| 368 // RAW_KEY_DOWN events, even if the latter triggered an accelerator. In these | |
| 369 // cases, we discard the CHAR events. | |
| 370 if (event.type == WebInputEvent::Char && ignore_next_char_event_) { | |
| 371 ignore_next_char_event_ = false; | |
| 372 return true; | |
| 373 } | |
| 374 ignore_next_char_event_ = false; | |
| 375 | |
| 376 // The renderer returned a keyboard event it did not process. This may be | |
| 377 // a keyboard shortcut that we have to process. | |
| 378 if (event.type == WebInputEvent::RawKeyDown) { | |
| 379 views::FocusManager* focus_manager = | |
| 380 views::FocusManager::GetFocusManagerForNativeView(GetNativeView()); | |
| 381 // We may not have a focus_manager at this point (if the tab has been | |
| 382 // switched by the time this message returned). | |
| 383 if (focus_manager) { | |
| 384 views::Accelerator accelerator( | |
| 385 win_util::WinToKeyboardCode(event.windowsKeyCode), | |
| 386 (event.modifiers & WebInputEvent::ShiftKey) == | |
| 387 WebInputEvent::ShiftKey, | |
| 388 (event.modifiers & WebInputEvent::ControlKey) == | |
| 389 WebInputEvent::ControlKey, | |
| 390 (event.modifiers & WebInputEvent::AltKey) == | |
| 391 WebInputEvent::AltKey); | |
| 392 | |
| 393 // This is tricky: we want to set ignore_next_char_event_ if | |
| 394 // ProcessAccelerator returns true. But ProcessAccelerator might delete | |
| 395 // |this| if the accelerator is a "close tab" one. So we speculatively | |
| 396 // set the flag and fix it if no event was handled. | |
| 397 ignore_next_char_event_ = true; | |
| 398 if (focus_manager->ProcessAccelerator(accelerator)) { | |
| 399 // DANGER: |this| could be deleted now! | |
| 400 return true; | |
| 401 } else { | |
| 402 // ProcessAccelerator didn't handle the accelerator, so we know both | |
| 403 // that |this| is still valid, and that we didn't want to set the flag. | |
| 404 ignore_next_char_event_ = false; | |
| 405 } | |
| 406 } | |
| 407 } | |
| 408 | |
| 409 if (tab_contents()->delegate() && | |
| 410 tab_contents()->delegate()->HandleKeyboardEvent(event)) { | |
| 411 // At this point the only tab contents delegate which handles a keyboard | |
| 412 // event is ChromeFrame. When the message comes back from ChromeFrame it | |
| 413 // is DefWindowProc'ed. We return false here on the same lines as below:- | |
| 414 return false; | |
| 415 } | |
| 416 | |
| 417 // Any unhandled keyboard/character messages should be defproced. | |
| 418 // This allows stuff like Alt+F4, etc to work correctly. | |
| 419 DefWindowProc(event.os_event.hwnd, event.os_event.message, | |
| 420 event.os_event.wParam, event.os_event.lParam); | |
| 421 | |
| 422 // DefWindowProc() always returns 0, which means it handled the event. | |
| 423 // But actually DefWindowProc() will only handle very few system key strokes, | |
| 424 // such as F10, Alt+Tab, Alt+F4, Alt+Esc, etc. | |
| 425 // So returning false here is just ok for most cases. | |
| 426 // Reference: http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx | |
| 427 return false; | |
| 428 } | |
| 429 | |
| 430 views::FocusManager* TabContentsViewWin::GetFocusManager() { | 364 views::FocusManager* TabContentsViewWin::GetFocusManager() { |
| 431 views::FocusManager* focus_manager = WidgetWin::GetFocusManager(); | 365 views::FocusManager* focus_manager = WidgetWin::GetFocusManager(); |
| 432 if (focus_manager) { | 366 if (focus_manager) { |
| 433 // If focus_manager_ is non NULL, it means we have been reparented, in which | 367 // If focus_manager_ is non NULL, it means we have been reparented, in which |
| 434 // case its value may not be valid anymore. | 368 // case its value may not be valid anymore. |
| 435 focus_manager_ = NULL; | 369 focus_manager_ = NULL; |
| 436 return focus_manager; | 370 return focus_manager; |
| 437 } | 371 } |
| 438 // TODO(jcampan): we should DCHECK on focus_manager_, as it should not be | 372 // TODO(jcampan): we should DCHECK on focus_manager_, as it should not be |
| 439 // NULL. We are not doing it as it breaks some unit-tests. We should | 373 // NULL. We are not doing it as it breaks some unit-tests. We should |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 } | 606 } |
| 673 return false; | 607 return false; |
| 674 } | 608 } |
| 675 | 609 |
| 676 void TabContentsViewWin::WheelZoom(int distance) { | 610 void TabContentsViewWin::WheelZoom(int distance) { |
| 677 if (tab_contents()->delegate()) { | 611 if (tab_contents()->delegate()) { |
| 678 bool zoom_in = distance > 0; | 612 bool zoom_in = distance > 0; |
| 679 tab_contents()->delegate()->ContentsZoomChange(zoom_in); | 613 tab_contents()->delegate()->ContentsZoomChange(zoom_in); |
| 680 } | 614 } |
| 681 } | 615 } |
| OLD | NEW |