• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "ui/views/controls/menu/menu_config.h"
6 
7 #include <windows.h>
8 #include <uxtheme.h>
9 #include <Vssym32.h>
10 
11 #include "base/logging.h"
12 #include "base/win/scoped_gdi_object.h"
13 #include "base/win/win_util.h"
14 #include "ui/base/l10n/l10n_util_win.h"
15 #include "ui/gfx/color_utils.h"
16 #include "ui/native_theme/native_theme_win.h"
17 
18 #if defined(USE_AURA)
19 #include "ui/native_theme/native_theme_aura.h"
20 #endif
21 
22 using ui::NativeTheme;
23 using ui::NativeThemeWin;
24 
25 namespace views {
26 
Init(const NativeTheme * theme)27 void MenuConfig::Init(const NativeTheme* theme) {
28 #if defined(USE_AURA)
29   if (theme == ui::NativeThemeAura::instance()) {
30     InitAura(theme);
31     return;
32   }
33 #endif
34   text_color = NativeThemeWin::instance()->GetThemeColorWithDefault(
35       NativeThemeWin::MENU, MENU_POPUPITEM, MPI_NORMAL, TMT_TEXTCOLOR,
36       COLOR_MENUTEXT);
37 
38   arrow_color = color_utils::GetSysSkColor(COLOR_MENUTEXT);
39 
40   NONCLIENTMETRICS metrics;
41   base::win::GetNonClientMetrics(&metrics);
42   l10n_util::AdjustUIFont(&(metrics.lfMenuFont));
43   {
44     base::win::ScopedHFONT new_font(CreateFontIndirect(&metrics.lfMenuFont));
45     DLOG_ASSERT(new_font.Get());
46     font = gfx::Font(new_font);
47   }
48   NativeTheme::ExtraParams extra;
49   extra.menu_check.is_radio = false;
50   extra.menu_check.is_selected = false;
51   gfx::Size check_size = NativeThemeWin::instance()->GetPartSize(
52       NativeTheme::kMenuCheck, NativeTheme::kNormal, extra);
53   if (!check_size.IsEmpty()) {
54     check_width = check_size.width();
55     check_height = check_size.height();
56   } else {
57     check_width = GetSystemMetrics(SM_CXMENUCHECK);
58     check_height = GetSystemMetrics(SM_CYMENUCHECK);
59   }
60 
61   extra.menu_check.is_radio = true;
62   gfx::Size radio_size = NativeThemeWin::instance()->GetPartSize(
63       NativeTheme::kMenuCheck, NativeTheme::kNormal, extra);
64   if (!radio_size.IsEmpty()) {
65     radio_width = radio_size.width();
66     radio_height = radio_size.height();
67   } else {
68     radio_width = GetSystemMetrics(SM_CXMENUCHECK);
69     radio_height = GetSystemMetrics(SM_CYMENUCHECK);
70   }
71 
72   gfx::Size arrow_size = NativeThemeWin::instance()->GetPartSize(
73       NativeTheme::kMenuPopupArrow, NativeTheme::kNormal, extra);
74   if (!arrow_size.IsEmpty()) {
75     arrow_width = arrow_size.width();
76     arrow_height = arrow_size.height();
77   } else {
78     // Sadly I didn't see a specify metrics for this.
79     arrow_width = GetSystemMetrics(SM_CXMENUCHECK);
80     arrow_height = GetSystemMetrics(SM_CYMENUCHECK);
81   }
82 
83   BOOL show_cues;
84   show_mnemonics =
85       (SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &show_cues, 0) &&
86        show_cues == TRUE);
87 
88   SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &show_delay, 0);
89 }
90 
91 // static
instance(const ui::NativeTheme * theme)92 const MenuConfig& MenuConfig::instance(const ui::NativeTheme* theme) {
93   // NOTE: |theme| may be NULL if used before the menu is running.
94   if (!theme || theme == NativeThemeWin::instance()) {
95     static MenuConfig* win_instance = NULL;
96     if (!win_instance)
97       win_instance = new MenuConfig(NativeThemeWin::instance());
98     return *win_instance;
99   }
100   static MenuConfig* views_instance = NULL;
101   if (!views_instance)
102     views_instance = new MenuConfig(theme);
103   return *views_instance;
104 }
105 
106 }  // namespace views
107