1 // Copyright (c) 2011 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 "chrome/browser/chromeos/status/status_area_button.h"
6
7 #include "content/common/notification_service.h"
8 #include "grit/theme_resources.h"
9 #include "ui/base/resource/resource_bundle.h"
10 #include "ui/gfx/canvas.h"
11 #include "ui/gfx/skbitmap_operations.h"
12 #include "views/border.h"
13 #include "views/view.h"
14
15 namespace chromeos {
16
17 // Colors for different text styles.
18 static const SkColor kWhitePlainTextColor = 0x99ffffff;
19 static const SkColor kWhiteHaloedTextColor = 0xb3ffffff;
20 static const SkColor kWhiteHaloedHaloColor = 0xb3000000;
21 static const SkColor kGrayEmbossedTextColor = 0xff4c4c4c;
22 static const SkColor kGrayEmbossedShadowColor = 0x80ffffff;
23
24 // Status area font is bigger.
25 const int kFontSizeDelta = 1;
26
27 ////////////////////////////////////////////////////////////////////////////////
28 // StatusAreaButton
29
StatusAreaButton(StatusAreaHost * host,views::ViewMenuDelegate * menu_delegate)30 StatusAreaButton::StatusAreaButton(StatusAreaHost* host,
31 views::ViewMenuDelegate* menu_delegate)
32 : MenuButton(NULL, std::wstring(), menu_delegate, false),
33 use_menu_button_paint_(false),
34 active_(true),
35 host_(host) {
36 set_border(NULL);
37 set_use_menu_button_paint(true);
38 gfx::Font font =
39 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont);
40 font = font.DeriveFont(3, gfx::Font::BOLD);
41 SetFont(font);
42 SetShowMultipleIconStates(false);
43 set_alignment(TextButton::ALIGN_CENTER);
44 set_border(NULL);
45
46 // Use an offset that is top aligned with toolbar.
47 set_menu_offset(0, 4);
48
49 UpdateTextStyle();
50 }
51
PaintButton(gfx::Canvas * canvas,PaintButtonMode mode)52 void StatusAreaButton::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
53 if (state() == BS_PUSHED) {
54 // Apply 10% white when pushed down.
55 canvas->FillRectInt(SkColorSetARGB(0x19, 0xFF, 0xFF, 0xFF),
56 0, 0, width(), height());
57 }
58
59 if (use_menu_button_paint_) {
60 views::MenuButton::PaintButton(canvas, mode);
61 } else {
62 canvas->DrawBitmapInt(icon(), horizontal_padding(), 0);
63 OnPaintFocusBorder(canvas);
64 }
65 }
66
SetText(const std::wstring & text)67 void StatusAreaButton::SetText(const std::wstring& text) {
68 // TextButtons normally remember the max text size, so the button's preferred
69 // size will always be as large as the largest text ever put in it.
70 // We clear that max text size, so we can adjust the size to fit the text.
71 // The order is important. ClearMaxTextSize sets the size to that of the
72 // current text, so it must be called after SetText.
73 views::MenuButton::SetText(text);
74 ClearMaxTextSize();
75 PreferredSizeChanged();
76 }
77
Activate()78 bool StatusAreaButton::Activate() {
79 if (active_) {
80 return views::MenuButton::Activate();
81 } else {
82 return true;
83 }
84 }
85
GetPreferredSize()86 gfx::Size StatusAreaButton::GetPreferredSize() {
87 gfx::Insets insets = views::MenuButton::GetInsets();
88 gfx::Size prefsize(icon_width() + insets.width(),
89 icon_height() + insets.height());
90
91 // Adjusts size when use menu button paint.
92 if (use_menu_button_paint_) {
93 gfx::Size menu_button_size = views::MenuButton::GetPreferredSize();
94 prefsize.SetSize(
95 std::max(prefsize.width(), menu_button_size.width()),
96 std::max(prefsize.height(), menu_button_size.height())
97 );
98
99 // Shift 1-pixel down for odd number of pixels in vertical space.
100 if ((prefsize.height() - menu_button_size.height()) % 2) {
101 insets_.Set(insets.top() + 1, insets.left(),
102 insets.bottom(), insets.right());
103 }
104 }
105
106 // Add padding.
107 prefsize.Enlarge(2 * horizontal_padding(), 0);
108
109 return prefsize;
110 }
111
GetInsets() const112 gfx::Insets StatusAreaButton::GetInsets() const {
113 return insets_;
114 }
115
OnThemeChanged()116 void StatusAreaButton::OnThemeChanged() {
117 UpdateTextStyle();
118 }
119
UpdateTextStyle()120 void StatusAreaButton::UpdateTextStyle() {
121 ClearEmbellishing();
122 switch (host_->GetTextStyle()) {
123 case StatusAreaHost::kWhitePlain:
124 SetEnabledColor(kWhitePlainTextColor);
125 break;
126 case StatusAreaHost::kWhiteHaloed:
127 SetEnabledColor(kWhiteHaloedTextColor);
128 SetTextHaloColor(kWhiteHaloedHaloColor);
129 break;
130 case StatusAreaHost::kGrayEmbossed:
131 SetEnabledColor(kGrayEmbossedTextColor);
132 SetTextShadowColors(kGrayEmbossedShadowColor, kGrayEmbossedShadowColor);
133 SetTextShadowOffset(0, 1);
134 break;
135 }
136 }
137
138 } // namespace chromeos
139