1// Copyright 2013 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 "ash/system/tray/tray_popup_label_button_border.h" 6 7#include "base/i18n/rtl.h" 8#include "grit/ash_resources.h" 9#include "ui/gfx/canvas.h" 10#include "ui/gfx/vector2d.h" 11#include "ui/native_theme/native_theme.h" 12#include "ui/views/controls/button/label_button.h" 13#include "ui/views/native_theme_delegate.h" 14 15namespace ash { 16 17TrayPopupLabelButtonBorder::TrayPopupLabelButtonBorder() 18 : LabelButtonBorder(views::Button::STYLE_TEXTBUTTON) { 19 const int kTrayPopupLabelButtonBorderImagesNormal[] = { 20 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 21 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 22 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 23 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 24 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 25 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 26 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 27 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 28 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 29 }; 30 SetPainter(false, views::Button::STATE_NORMAL, 31 views::Painter::CreateImageGridPainter( 32 kTrayPopupLabelButtonBorderImagesNormal)); 33 SetPainter(false, views::Button::STATE_DISABLED, 34 views::Painter::CreateImageGridPainter( 35 kTrayPopupLabelButtonBorderImagesNormal)); 36 37 const int kTrayPopupLabelButtonBorderImagesHovered[] = { 38 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 39 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 40 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 41 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 42 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND, 43 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 44 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 45 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 46 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_BORDER, 47 }; 48 SetPainter(false, views::Button::STATE_HOVERED, 49 views::Painter::CreateImageGridPainter( 50 kTrayPopupLabelButtonBorderImagesHovered)); 51 SetPainter(false, views::Button::STATE_PRESSED, 52 views::Painter::CreateImageGridPainter( 53 kTrayPopupLabelButtonBorderImagesHovered)); 54 55 const int kTrayPopupLabelButtonPaddingHorizontal = 16; 56 const int kTrayPopupLabelButtonPaddingVertical = 8; 57 set_insets(gfx::Insets(kTrayPopupLabelButtonPaddingVertical, 58 kTrayPopupLabelButtonPaddingHorizontal, 59 kTrayPopupLabelButtonPaddingVertical, 60 kTrayPopupLabelButtonPaddingHorizontal)); 61} 62 63TrayPopupLabelButtonBorder::~TrayPopupLabelButtonBorder() {} 64 65void TrayPopupLabelButtonBorder::Paint(const views::View& view, 66 gfx::Canvas* canvas) { 67 const views::NativeThemeDelegate* native_theme_delegate = 68 static_cast<const views::LabelButton*>(&view); 69 ui::NativeTheme::ExtraParams extra; 70 const ui::NativeTheme::State state = 71 native_theme_delegate->GetThemeState(&extra); 72 if (state == ui::NativeTheme::kNormal || 73 state == ui::NativeTheme::kDisabled) { 74 // In normal and disabled state, the border is a vertical bar separating the 75 // button from the preceding sibling. If this button is its parent's first 76 // visible child, the separator bar should be omitted. 77 const views::View* first_visible_child = NULL; 78 for (int i = 0; i < view.parent()->child_count(); ++i) { 79 const views::View* child = view.parent()->child_at(i); 80 if (child->visible()) { 81 first_visible_child = child; 82 break; 83 } 84 } 85 if (first_visible_child == &view) 86 return; 87 } 88 if (base::i18n::IsRTL()) { 89 canvas->Save(); 90 canvas->Translate(gfx::Vector2d(view.width(), 0)); 91 canvas->Scale(-1, 1); 92 LabelButtonBorder::Paint(view, canvas); 93 canvas->Restore(); 94 } else { 95 LabelButtonBorder::Paint(view, canvas); 96 } 97} 98 99} // namespace ash 100