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