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