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