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/login/shutdown_button.h" 6 7 #include "base/utf_string_conversions.h" 8 #include "chrome/browser/chromeos/cros/cros_library.h" 9 #include "chrome/browser/chromeos/cros/power_library.h" 10 #include "chrome/browser/chromeos/login/rounded_rect_painter.h" 11 #include "chrome/browser/chromeos/view_ids.h" 12 #include "grit/generated_resources.h" 13 #include "grit/theme_resources.h" 14 #include "ui/base/l10n/l10n_util.h" 15 #include "ui/base/resource/resource_bundle.h" 16 #include "ui/gfx/gtk_util.h" 17 #include "views/background.h" 18 19 namespace { 20 21 // Style parameters for Shutdown button. 22 23 // Bottom/Right padding to locale the shutdown button. 24 const int kBottomPadding = 12; 25 const int kRightPadding = 12; 26 27 // Normal/Hover colors. 28 const SkColor kShutdownButtonColor = 0xFF303845; 29 const SkColor kShutdownHoverColor = 0xFF353E4E; 30 31 // Padding inside button. 32 const int kVerticalPadding = 13; 33 const int kIconTextPadding = 10; 34 const int kHorizontalPadding = 13; 35 36 // Rounded corner radious. 37 const int kCornerRadius = 4; 38 39 class HoverBackground : public views::Background { 40 public: 41 HoverBackground(views::Background* normal, views::Background* hover) 42 : normal_(normal), hover_(hover) { 43 } 44 45 // views::Background implementation. 46 virtual void Paint(gfx::Canvas* canvas, views::View* view) const { 47 views::TextButton* button = static_cast<views::TextButton*>(view); 48 if (button->state() == views::CustomButton::BS_HOT) { 49 hover_->Paint(canvas, view); 50 } else { 51 normal_->Paint(canvas, view); 52 } 53 } 54 55 private: 56 views::Background* normal_; 57 views::Background* hover_; 58 59 DISALLOW_COPY_AND_ASSIGN(HoverBackground); 60 }; 61 62 } // namespace 63 64 namespace chromeos { 65 66 ShutdownButton::ShutdownButton() 67 : ALLOW_THIS_IN_INITIALIZER_LIST(TextButton(this, std::wstring())) { 68 } 69 70 void ShutdownButton::Init() { 71 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 72 SetIcon(*rb.GetBitmapNamed(IDR_SHUTDOWN_ICON)); 73 set_icon_text_spacing(kIconTextPadding); 74 SetFocusable(true); 75 SetID(VIEW_ID_SCREEN_LOCKER_SHUTDOWN); 76 // Set label colors. 77 SetEnabledColor(SK_ColorWHITE); 78 SetDisabledColor(SK_ColorWHITE); 79 SetHighlightColor(SK_ColorWHITE); 80 SetHoverColor(SK_ColorWHITE); 81 // Disable throbbing and make border always visible. 82 SetAnimationDuration(0); 83 SetNormalHasBorder(true); 84 // Setup round shapes. 85 set_background( 86 new HoverBackground( 87 CreateRoundedBackground( 88 kCornerRadius, 0, kShutdownButtonColor, 0), 89 CreateRoundedBackground( 90 kCornerRadius, 0, kShutdownHoverColor, 0))); 91 set_border( 92 views::Border::CreateEmptyBorder(kVerticalPadding, 93 kHorizontalPadding, 94 kVerticalPadding, 95 kHorizontalPadding)); 96 OnLocaleChanged(); // set text 97 } 98 99 void ShutdownButton::LayoutIn(views::View* parent) { 100 // No RTL for now. RTL will be handled in new WebUI based Login/Locker. 101 gfx::Size button_size = GetPreferredSize(); 102 SetBounds( 103 parent->width() - button_size.width()- kRightPadding, 104 parent->height() - button_size.height() - kBottomPadding, 105 button_size.width(), 106 button_size.height()); 107 } 108 109 void ShutdownButton::OnLocaleChanged() { 110 SetText(UTF8ToWide(l10n_util::GetStringUTF8(IDS_SHUTDOWN_BUTTON))); 111 if (parent()) { 112 parent()->Layout(); 113 parent()->SchedulePaint(); 114 } 115 } 116 117 gfx::NativeCursor ShutdownButton::GetCursorForPoint( 118 ui::EventType event_type, 119 const gfx::Point& p) { 120 if (!IsEnabled()) { 121 return NULL; 122 } 123 return gfx::GetCursor(GDK_HAND2); 124 } 125 126 void ShutdownButton::ButtonPressed(views::Button* sender, 127 const views::Event& event) { 128 DCHECK(CrosLibrary::Get()->EnsureLoaded()); 129 CrosLibrary::Get()->GetPowerLibrary()->RequestShutdown(); 130 } 131 132 } // namespace chromeos 133