OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/views/frame/browser_frame_win.h" | 5 #include "chrome/browser/ui/views/frame/browser_frame_win.h" |
6 | 6 |
7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
8 #include <shellapi.h> | 8 #include <shellapi.h> |
9 #include <set> | 9 #include <set> |
10 | 10 |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
13 #include "base/win/metro.h" | 13 #include "base/win/metro.h" |
14 #include "chrome/app/chrome_command_ids.h" | 14 #include "chrome/app/chrome_command_ids.h" |
15 #include "chrome/browser/lifetime/application_lifetime.h" | 15 #include "chrome/browser/lifetime/application_lifetime.h" |
16 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
17 #include "chrome/browser/search_engines/template_url.h" | 17 #include "chrome/browser/search_engines/template_url.h" |
18 #include "chrome/browser/search_engines/template_url_service.h" | 18 #include "chrome/browser/search_engines/template_url_service.h" |
19 #include "chrome/browser/search_engines/template_url_service_factory.h" | 19 #include "chrome/browser/search_engines/template_url_service_factory.h" |
20 #include "chrome/browser/ui/browser_commands.h" | 20 #include "chrome/browser/ui/browser_commands.h" |
21 #include "chrome/browser/ui/browser_finder.h" | 21 #include "chrome/browser/ui/browser_finder.h" |
22 #include "chrome/browser/ui/browser_tabstrip.h" | 22 #include "chrome/browser/ui/browser_tabstrip.h" |
23 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" | |
24 #include "chrome/browser/ui/views/frame/browser_view.h" | 23 #include "chrome/browser/ui/views/frame/browser_view.h" |
25 #include "chrome/browser/ui/views/frame/system_menu_model.h" | |
26 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" | |
27 #include "chrome/browser/ui/views/tabs/tab_strip.h" | 24 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
28 #include "chrome/common/chrome_constants.h" | 25 #include "chrome/common/chrome_constants.h" |
29 #include "chrome/common/chrome_switches.h" | 26 #include "chrome/common/chrome_switches.h" |
30 #include "content/public/browser/browser_accessibility_state.h" | 27 #include "content/public/browser/browser_accessibility_state.h" |
31 #include "content/public/browser/page_navigator.h" | 28 #include "content/public/browser/page_navigator.h" |
32 #include "content/public/browser/web_contents.h" | 29 #include "content/public/browser/web_contents.h" |
33 #include "content/public/common/page_transition_types.h" | 30 #include "content/public/common/page_transition_types.h" |
34 #include "googleurl/src/gurl.h" | 31 #include "googleurl/src/gurl.h" |
35 #include "grit/generated_resources.h" | 32 #include "grit/generated_resources.h" |
36 #include "grit/theme_resources.h" | 33 #include "grit/theme_resources.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 return switcher_button; | 90 return switcher_button; |
94 } | 91 } |
95 | 92 |
96 /////////////////////////////////////////////////////////////////////////////// | 93 /////////////////////////////////////////////////////////////////////////////// |
97 // BrowserFrameWin, public: | 94 // BrowserFrameWin, public: |
98 | 95 |
99 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, | 96 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, |
100 BrowserView* browser_view) | 97 BrowserView* browser_view) |
101 : views::NativeWidgetWin(browser_frame), | 98 : views::NativeWidgetWin(browser_frame), |
102 browser_view_(browser_view), | 99 browser_view_(browser_view), |
103 browser_frame_(browser_frame), | 100 browser_frame_(browser_frame) { |
104 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, | |
105 browser_view->browser())) { | |
106 if (win8::IsSingleWindowMetroMode()) { | 101 if (win8::IsSingleWindowMetroMode()) { |
107 browser_view->SetWindowSwitcherButton( | 102 browser_view->SetWindowSwitcherButton( |
108 MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord())); | 103 MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord())); |
109 } | 104 } |
110 } | 105 } |
111 | 106 |
112 BrowserFrameWin::~BrowserFrameWin() { | 107 BrowserFrameWin::~BrowserFrameWin() { |
113 } | 108 } |
114 | 109 |
115 // static | 110 // static |
(...skipping 21 matching lines...) Expand all Loading... |
137 #endif // USE_AURA | 132 #endif // USE_AURA |
138 HMODULE metro = base::win::GetMetroModule(); | 133 HMODULE metro = base::win::GetMetroModule(); |
139 if (!metro) | 134 if (!metro) |
140 return; | 135 return; |
141 CloseFrameWindow close_frame_window = reinterpret_cast<CloseFrameWindow>( | 136 CloseFrameWindow close_frame_window = reinterpret_cast<CloseFrameWindow>( |
142 ::GetProcAddress(metro, "CloseFrameWindow")); | 137 ::GetProcAddress(metro, "CloseFrameWindow")); |
143 close_frame_window(browser_frame_->GetNativeWindow()); | 138 close_frame_window(browser_frame_->GetNativeWindow()); |
144 } | 139 } |
145 | 140 |
146 | 141 |
| 142 views::NativeMenuWin* BrowserFrameWin::GetSystemMenu() { |
| 143 if (!system_menu_.get()) { |
| 144 system_menu_.reset( |
| 145 new views::NativeMenuWin(browser_frame_->GetSystemMenuModel(), |
| 146 GetNativeView())); |
| 147 system_menu_->Rebuild(); |
| 148 } |
| 149 return system_menu_.get(); |
| 150 } |
| 151 |
147 /////////////////////////////////////////////////////////////////////////////// | 152 /////////////////////////////////////////////////////////////////////////////// |
148 // BrowserFrameWin, views::NativeWidgetWin overrides: | 153 // BrowserFrameWin, views::NativeWidgetWin overrides: |
149 | 154 |
150 int BrowserFrameWin::GetInitialShowState() const { | 155 int BrowserFrameWin::GetInitialShowState() const { |
151 if (explicit_show_state != -1) | 156 if (explicit_show_state != -1) |
152 return explicit_show_state; | 157 return explicit_show_state; |
153 | 158 |
154 STARTUPINFO si = {0}; | 159 STARTUPINFO si = {0}; |
155 si.cb = sizeof(si); | 160 si.cb = sizeof(si); |
156 si.dwFlags = STARTF_USESHOWWINDOW; | 161 si.dwFlags = STARTF_USESHOWWINDOW; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 SRCCOPY); | 225 SRCCOPY); |
221 ::ReleaseDC(GetNativeView(), src_dc); | 226 ::ReleaseDC(GetNativeView(), src_dc); |
222 *result = 0; | 227 *result = 0; |
223 return true; | 228 return true; |
224 } | 229 } |
225 return false; | 230 return false; |
226 case WM_ENDSESSION: | 231 case WM_ENDSESSION: |
227 browser::SessionEnding(); | 232 browser::SessionEnding(); |
228 return true; | 233 return true; |
229 case WM_INITMENUPOPUP: | 234 case WM_INITMENUPOPUP: |
230 system_menu_->UpdateStates(); | 235 GetSystemMenu()->UpdateStates(); |
231 return true; | 236 return true; |
232 } | 237 } |
233 return false; | 238 return false; |
234 } | 239 } |
235 | 240 |
236 void BrowserFrameWin::PostHandleMSG(UINT message, | 241 void BrowserFrameWin::PostHandleMSG(UINT message, |
237 WPARAM w_param, | 242 WPARAM w_param, |
238 LPARAM l_param) { | 243 LPARAM l_param) { |
239 switch (message) { | 244 switch (message) { |
240 case WM_CREATE: | 245 case WM_CREATE: |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 // BrowserFrameWin, NativeBrowserFrame implementation: | 364 // BrowserFrameWin, NativeBrowserFrame implementation: |
360 | 365 |
361 views::NativeWidget* BrowserFrameWin::AsNativeWidget() { | 366 views::NativeWidget* BrowserFrameWin::AsNativeWidget() { |
362 return this; | 367 return this; |
363 } | 368 } |
364 | 369 |
365 const views::NativeWidget* BrowserFrameWin::AsNativeWidget() const { | 370 const views::NativeWidget* BrowserFrameWin::AsNativeWidget() const { |
366 return this; | 371 return this; |
367 } | 372 } |
368 | 373 |
369 void BrowserFrameWin::InitSystemContextMenu() { | 374 bool BrowserFrameWin::UsesNativeSystemMenu() const { |
370 system_menu_contents_.reset(new SystemMenuModel(system_menu_delegate_.get())); | 375 return true; |
371 // We add the menu items in reverse order so that insertion_index never needs | |
372 // to change. | |
373 if (browser_view_->IsBrowserTypeNormal()) | |
374 BuildSystemMenuForBrowserWindow(); | |
375 else | |
376 BuildSystemMenuForAppOrPopupWindow(); | |
377 AddFrameToggleItems(); | |
378 system_menu_.reset( | |
379 new views::NativeMenuWin(system_menu_contents_.get(), GetNativeWindow())); | |
380 system_menu_->Rebuild(); | |
381 } | 376 } |
382 | 377 |
383 int BrowserFrameWin::GetMinimizeButtonOffset() const { | 378 int BrowserFrameWin::GetMinimizeButtonOffset() const { |
384 return minimize_button_metrics_.GetMinimizeButtonOffsetX(); | 379 return minimize_button_metrics_.GetMinimizeButtonOffsetX(); |
385 } | 380 } |
386 | 381 |
387 void BrowserFrameWin::TabStripDisplayModeChanged() { | 382 void BrowserFrameWin::TabStripDisplayModeChanged() { |
388 UpdateDWMFrame(); | 383 UpdateDWMFrame(); |
389 } | 384 } |
390 | 385 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 if (!IsFullscreen()) { | 454 if (!IsFullscreen()) { |
460 gfx::Rect tabstrip_bounds( | 455 gfx::Rect tabstrip_bounds( |
461 browser_frame_->GetBoundsForTabStrip(browser_view_->tabstrip())); | 456 browser_frame_->GetBoundsForTabStrip(browser_view_->tabstrip())); |
462 margins.cyTopHeight = tabstrip_bounds.bottom() + kDWMFrameTopOffset; | 457 margins.cyTopHeight = tabstrip_bounds.bottom() + kDWMFrameTopOffset; |
463 } | 458 } |
464 } | 459 } |
465 | 460 |
466 DwmExtendFrameIntoClientArea(GetNativeView(), &margins); | 461 DwmExtendFrameIntoClientArea(GetNativeView(), &margins); |
467 } | 462 } |
468 | 463 |
469 void BrowserFrameWin::BuildSystemMenuForBrowserWindow() { | |
470 system_menu_contents_->AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); | |
471 system_menu_contents_->AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB); | |
472 if (chrome::CanOpenTaskManager()) { | |
473 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
474 system_menu_contents_->AddItemWithStringId(IDC_TASK_MANAGER, | |
475 IDS_TASK_MANAGER); | |
476 } | |
477 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
478 // If it's a regular browser window with tabs, we don't add any more items, | |
479 // since it already has menus (Page, Chrome). | |
480 } | |
481 | |
482 void BrowserFrameWin::BuildSystemMenuForAppOrPopupWindow() { | |
483 Browser* browser = browser_view()->browser(); | |
484 system_menu_contents_->AddItemWithStringId(IDC_BACK, | |
485 IDS_CONTENT_CONTEXT_BACK); | |
486 system_menu_contents_->AddItemWithStringId(IDC_FORWARD, | |
487 IDS_CONTENT_CONTEXT_FORWARD); | |
488 system_menu_contents_->AddItemWithStringId(IDC_RELOAD, IDS_APP_MENU_RELOAD); | |
489 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
490 if (browser->is_app()) { | |
491 system_menu_contents_->AddItemWithStringId(IDC_NEW_TAB, | |
492 IDS_APP_MENU_NEW_WEB_PAGE); | |
493 } else { | |
494 system_menu_contents_->AddItemWithStringId(IDC_SHOW_AS_TAB, | |
495 IDS_SHOW_AS_TAB); | |
496 } | |
497 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
498 system_menu_contents_->AddItemWithStringId(IDC_CUT, IDS_CUT); | |
499 system_menu_contents_->AddItemWithStringId(IDC_COPY, IDS_COPY); | |
500 system_menu_contents_->AddItemWithStringId(IDC_PASTE, IDS_PASTE); | |
501 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
502 system_menu_contents_->AddItemWithStringId(IDC_FIND, IDS_FIND); | |
503 system_menu_contents_->AddItemWithStringId(IDC_PRINT, IDS_PRINT); | |
504 zoom_menu_contents_.reset(new ZoomMenuModel(system_menu_delegate_.get())); | |
505 system_menu_contents_->AddSubMenuWithStringId(IDC_ZOOM_MENU, IDS_ZOOM_MENU, | |
506 zoom_menu_contents_.get()); | |
507 encoding_menu_contents_.reset(new EncodingMenuModel(browser)); | |
508 system_menu_contents_->AddSubMenuWithStringId(IDC_ENCODING_MENU, | |
509 IDS_ENCODING_MENU, | |
510 encoding_menu_contents_.get()); | |
511 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
512 if (browser->is_app() && chrome::CanOpenTaskManager()) { | |
513 system_menu_contents_->AddItemWithStringId(IDC_TASK_MANAGER, | |
514 IDS_TASK_MANAGER); | |
515 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
516 } | |
517 } | |
518 | |
519 void BrowserFrameWin::AddFrameToggleItems() { | |
520 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
521 switches::kDebugEnableFrameToggle)) { | |
522 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, | |
523 L"Toggle Frame Type"); | |
524 system_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); | |
525 } | |
526 } | |
527 | |
528 void BrowserFrameWin::HandleMetroNavSearchRequest(WPARAM w_param, | 464 void BrowserFrameWin::HandleMetroNavSearchRequest(WPARAM w_param, |
529 LPARAM l_param) { | 465 LPARAM l_param) { |
530 if (!base::win::IsMetroProcess()) { | 466 if (!base::win::IsMetroProcess()) { |
531 NOTREACHED() << "Received unexpected metro navigation request"; | 467 NOTREACHED() << "Received unexpected metro navigation request"; |
532 return; | 468 return; |
533 } | 469 } |
534 | 470 |
535 if (!w_param && !l_param) { | 471 if (!w_param && !l_param) { |
536 NOTREACHED() << "Invalid metro request parameters"; | 472 NOTREACHED() << "Invalid metro request parameters"; |
537 return; | 473 return; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 | 549 |
614 //////////////////////////////////////////////////////////////////////////////// | 550 //////////////////////////////////////////////////////////////////////////////// |
615 // NativeBrowserFrame, public: | 551 // NativeBrowserFrame, public: |
616 | 552 |
617 // static | 553 // static |
618 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( | 554 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( |
619 BrowserFrame* browser_frame, | 555 BrowserFrame* browser_frame, |
620 BrowserView* browser_view) { | 556 BrowserView* browser_view) { |
621 return new BrowserFrameWin(browser_frame, browser_view); | 557 return new BrowserFrameWin(browser_frame, browser_view); |
622 } | 558 } |
OLD | NEW |