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

Side by Side Diff: chrome/browser/ui/views/frame/browser_frame_win.cc

Issue 11819008: Refactors building the system menu model into a common place (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to trunk and fix windows build Created 7 years, 11 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/frame/browser_frame_win.h ('k') | chrome/browser/ui/views/frame/desktop_browser_frame_aura.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698