1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/message_center/views/padded_button.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/canvas.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/message_center/message_center_style.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/image_button.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/painter.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace message_center { 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PaddedButton::PaddedButton(views::ButtonListener* listener) 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : views::ImageButton(listener) { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFocusable(true); 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) set_request_focus_on_press(false); 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetFocusPainter(views::Painter::CreateSolidFocusPainter( 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kFocusBorderColor, 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Insets(1, 2, 2, 2))); 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PaddedButton::~PaddedButton() { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PaddedButton::SetPadding(int horizontal_padding, int vertical_padding) { 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) padding_.Set(std::max(vertical_padding, 0), 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::max(horizontal_padding, 0), 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::max(-vertical_padding, 0), 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::max(-horizontal_padding, 0)); 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PaddedButton::SetNormalImage(int resource_id) { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetImage(views::CustomButton::STATE_NORMAL, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resource_id)); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PaddedButton::SetHoveredImage(int resource_id) { 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetImage(views::CustomButton::STATE_HOVERED, 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resource_id)); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PaddedButton::SetPressedImage(int resource_id) { 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetImage(views::CustomButton::STATE_PRESSED, 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resource_id)); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size PaddedButton::GetPreferredSize() const { 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gfx::Size(message_center::kControlButtonSize, 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_center::kControlButtonSize); 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PaddedButton::OnPaint(gfx::Canvas* canvas) { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is the same implementation as ImageButton::OnPaint except 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // that it calls ComputePaddedImagePaintPosition() instead of 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ComputeImagePaintPosition(), in effect overriding that private method. 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) View::OnPaint(canvas); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ImageSkia image = GetImageToPaint(); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!image.isNull()) { 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Point position = ComputePaddedImagePaintPosition(image); 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!background_image_.isNull()) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas->DrawImageInt(background_image_, position.x(), position.y()); 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas->DrawImageInt(image, position.x(), position.y()); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) views::Painter::PaintFocusPainter(this, canvas, focus_painter()); 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PaddedButton::OnFocus() { 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::ImageButton::OnFocus(); 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScrollRectToVisible(GetLocalBounds()); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Point PaddedButton::ComputePaddedImagePaintPosition( 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::ImageSkia& image) { 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2d offset; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect bounds = GetContentsBounds(); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bounds.Inset(padding_); 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (padding_.left() == 0 && padding_.right() == 0) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) offset.set_x((bounds.width() - image.width()) / 2); // Center align. 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else if (padding_.right() > 0) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) offset.set_x(bounds.width() - image.width()); // Right align. 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (padding_.top() == 0 && padding_.bottom() == 0) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) offset.set_y((bounds.height() - image.height()) / 2); // Middle align. 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else if (padding_.bottom() > 0) 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) offset.set_y(bounds.height() - image.height()); // Bottom align. 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return bounds.origin() + offset; 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace message_center 97