diff options
Diffstat (limited to 'chrome/views/controls/button/text_button.cc')
-rw-r--r-- | chrome/views/controls/button/text_button.cc | 325 |
1 files changed, 0 insertions, 325 deletions
diff --git a/chrome/views/controls/button/text_button.cc b/chrome/views/controls/button/text_button.cc deleted file mode 100644 index d175fd4..0000000 --- a/chrome/views/controls/button/text_button.cc +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/views/controls/button/text_button.h" - -#include "app/gfx/chrome_canvas.h" -#include "app/l10n_util.h" -#include "app/throb_animation.h" -#include "app/resource_bundle.h" -#include "chrome/views/controls/button/button.h" -#include "chrome/views/event.h" -#include "grit/theme_resources.h" - -namespace views { - -// Padding between the icon and text. -static const int kIconTextPadding = 5; - -// Preferred padding between text and edge -static const int kPreferredPaddingHorizontal = 6; -static const int kPreferredPaddingVertical = 5; - -static const SkColor kEnabledColor = SkColorSetRGB(6, 45, 117); -static const SkColor kHighlightColor = SkColorSetARGB(200, 255, 255, 255); -static const SkColor kDisabledColor = SkColorSetRGB(161, 161, 146); - -// How long the hover fade animation should last. -static const int kHoverAnimationDurationMs = 170; - -//////////////////////////////////////////////////////////////////////////////// -// -// TextButtonBorder - constructors, destructors, initialization -// -//////////////////////////////////////////////////////////////////////////////// - -TextButtonBorder::TextButtonBorder() { - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - - hot_set_.top_left = rb.GetBitmapNamed(IDR_TEXTBUTTON_TOP_LEFT_H); - hot_set_.top = rb.GetBitmapNamed(IDR_TEXTBUTTON_TOP_H); - hot_set_.top_right = rb.GetBitmapNamed(IDR_TEXTBUTTON_TOP_RIGHT_H); - hot_set_.left = rb.GetBitmapNamed(IDR_TEXTBUTTON_LEFT_H); - hot_set_.center = rb.GetBitmapNamed(IDR_TEXTBUTTON_CENTER_H); - hot_set_.right = rb.GetBitmapNamed(IDR_TEXTBUTTON_RIGHT_H); - hot_set_.bottom_left = rb.GetBitmapNamed(IDR_TEXTBUTTON_BOTTOM_LEFT_H); - hot_set_.bottom = rb.GetBitmapNamed(IDR_TEXTBUTTON_BOTTOM_H); - hot_set_.bottom_right = rb.GetBitmapNamed(IDR_TEXTBUTTON_BOTTOM_RIGHT_H); - - pushed_set_.top_left = rb.GetBitmapNamed(IDR_TEXTBUTTON_TOP_LEFT_P); - pushed_set_.top = rb.GetBitmapNamed(IDR_TEXTBUTTON_TOP_P); - pushed_set_.top_right = rb.GetBitmapNamed(IDR_TEXTBUTTON_TOP_RIGHT_P); - pushed_set_.left = rb.GetBitmapNamed(IDR_TEXTBUTTON_LEFT_P); - pushed_set_.center = rb.GetBitmapNamed(IDR_TEXTBUTTON_CENTER_P); - pushed_set_.right = rb.GetBitmapNamed(IDR_TEXTBUTTON_RIGHT_P); - pushed_set_.bottom_left = rb.GetBitmapNamed(IDR_TEXTBUTTON_BOTTOM_LEFT_P); - pushed_set_.bottom = rb.GetBitmapNamed(IDR_TEXTBUTTON_BOTTOM_P); - pushed_set_.bottom_right = rb.GetBitmapNamed(IDR_TEXTBUTTON_BOTTOM_RIGHT_P); -} - -TextButtonBorder::~TextButtonBorder() { -} - -//////////////////////////////////////////////////////////////////////////////// -// -// TextButtonBackground - painting -// -//////////////////////////////////////////////////////////////////////////////// - -void TextButtonBorder::Paint(const View& view, ChromeCanvas* canvas) const { - const TextButton* mb = static_cast<const TextButton*>(&view); - int state = mb->state(); - - // TextButton takes care of deciding when to call Paint. - const MBBImageSet* set = &hot_set_; - if (state == TextButton::BS_PUSHED) - set = &pushed_set_; - - if (set) { - gfx::Rect bounds = view.bounds(); - - // Draw the top left image - canvas->DrawBitmapInt(*set->top_left, 0, 0); - - // Tile the top image - canvas->TileImageInt( - *set->top, - set->top_left->width(), - 0, - bounds.width() - set->top_right->width() - set->top_left->width(), - set->top->height()); - - // Draw the top right image - canvas->DrawBitmapInt(*set->top_right, - bounds.width() - set->top_right->width(), 0); - - // Tile the left image - canvas->TileImageInt( - *set->left, - 0, - set->top_left->height(), - set->top_left->width(), - bounds.height() - set->top->height() - set->bottom_left->height()); - - // Tile the center image - canvas->TileImageInt( - *set->center, - set->left->width(), - set->top->height(), - bounds.width() - set->right->width() - set->left->width(), - bounds.height() - set->bottom->height() - set->top->height()); - - // Tile the right image - canvas->TileImageInt( - *set->right, - bounds.width() - set->right->width(), - set->top_right->height(), - bounds.width(), - bounds.height() - set->bottom_right->height() - - set->top_right->height()); - - // Draw the bottom left image - canvas->DrawBitmapInt(*set->bottom_left, - 0, - bounds.height() - set->bottom_left->height()); - - // Tile the bottom image - canvas->TileImageInt( - *set->bottom, - set->bottom_left->width(), - bounds.height() - set->bottom->height(), - bounds.width() - set->bottom_right->width() - - set->bottom_left->width(), - set->bottom->height()); - - // Draw the bottom right image - canvas->DrawBitmapInt(*set->bottom_right, - bounds.width() - set->bottom_right->width(), - bounds.height() - set->bottom_right->height()); - } else { - // Do nothing - } -} - -void TextButtonBorder::GetInsets(gfx::Insets* insets) const { - insets->Set(kPreferredPaddingVertical, kPreferredPaddingHorizontal, - kPreferredPaddingVertical, kPreferredPaddingHorizontal); -} - -//////////////////////////////////////////////////////////////////////////////// -// TextButton, public: - -TextButton::TextButton(ButtonListener* listener, const std::wstring& text) - : CustomButton(listener), - alignment_(ALIGN_LEFT), - font_(ResourceBundle::GetSharedInstance().GetFont( - ResourceBundle::BaseFont)), - color_(kEnabledColor), - max_width_(0) { - SetText(text); - set_border(new TextButtonBorder); - SetAnimationDuration(kHoverAnimationDurationMs); -} - -TextButton::~TextButton() { -} - -void TextButton::SetText(const std::wstring& text) { - text_ = text; - // Update our new current and max text size - text_size_.SetSize(font_.GetStringWidth(text_), font_.height()); - max_text_size_.SetSize(std::max(max_text_size_.width(), text_size_.width()), - std::max(max_text_size_.height(), - text_size_.height())); -} - -void TextButton::SetIcon(const SkBitmap& icon) { - icon_ = icon; -} - -void TextButton::ClearMaxTextSize() { - max_text_size_ = text_size_; -} - -void TextButton::Paint(ChromeCanvas* canvas, bool for_drag) { - if (!for_drag) { - PaintBackground(canvas); - - if (hover_animation_->IsAnimating()) { - // Draw the hover bitmap into an offscreen buffer, then blend it - // back into the current canvas. - canvas->saveLayerAlpha(NULL, - static_cast<int>(hover_animation_->GetCurrentValue() * 255), - SkCanvas::kARGB_NoClipLayer_SaveFlag); - canvas->drawARGB(0, 255, 255, 255, SkPorterDuff::kClear_Mode); - PaintBorder(canvas); - canvas->restore(); - } else if (state_ == BS_HOT || state_ == BS_PUSHED) { - PaintBorder(canvas); - } - - PaintFocusBorder(canvas); - } - - gfx::Insets insets = GetInsets(); - int available_width = width() - insets.width(); - int available_height = height() - insets.height(); - // Use the actual text (not max) size to properly center the text. - int content_width = text_size_.width(); - if (icon_.width() > 0) { - content_width += icon_.width(); - if (!text_.empty()) - content_width += kIconTextPadding; - } - // Place the icon along the left edge. - int icon_x; - if (alignment_ == ALIGN_LEFT) { - icon_x = insets.left(); - } else if (alignment_ == ALIGN_RIGHT) { - icon_x = available_width - content_width; - } else { - icon_x = - std::max(0, (available_width - content_width) / 2) + insets.left(); - } - int text_x = icon_x; - if (icon_.width() > 0) - text_x += icon_.width() + kIconTextPadding; - const int text_width = std::min(text_size_.width(), - width() - insets.right() - text_x); - int text_y = (available_height - text_size_.height()) / 2 + insets.top(); - - if (text_width > 0) { - // Because the text button can (at times) draw multiple elements on the - // canvas, we can not mirror the button by simply flipping the canvas as - // doing this will mirror the text itself. Flipping the canvas will also - // make the icons look wrong because icons are almost always represented as - // direction insentisive bitmaps and such bitmaps should never be flipped - // horizontally. - // - // Due to the above, we must perform the flipping manually for RTL UIs. - gfx::Rect text_bounds(text_x, text_y, text_width, text_size_.height()); - text_bounds.set_x(MirroredLeftPointForRect(text_bounds)); - - if (for_drag) { -#if defined(OS_WIN) - // TODO(erg): Either port DrawStringWithHalo to linux or find an - // alternative here. - canvas->DrawStringWithHalo(text_, font_, color_, kHighlightColor, - text_bounds.x(), - text_bounds.y(), - text_bounds.width(), - text_bounds.height(), - l10n_util::DefaultCanvasTextAlignment()); -#endif - } else { - // Draw bevel highlight - canvas->DrawStringInt(text_, - font_, - kHighlightColor, - text_bounds.x() + 1, - text_bounds.y() + 1, - text_bounds.width(), - text_bounds.height()); - - canvas->DrawStringInt(text_, - font_, - color_, - text_bounds.x(), - text_bounds.y(), - text_bounds.width(), - text_bounds.height()); - } - } - - if (icon_.width() > 0) { - int icon_y = (available_height - icon_.height()) / 2 + insets.top(); - - // Mirroring the icon position if necessary. - gfx::Rect icon_bounds(icon_x, icon_y, icon_.width(), icon_.height()); - icon_bounds.set_x(MirroredLeftPointForRect(icon_bounds)); - canvas->DrawBitmapInt(icon_, icon_bounds.x(), icon_bounds.y()); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// TextButton, View overrides: - -gfx::Size TextButton::GetPreferredSize() { - gfx::Insets insets = GetInsets(); - - // Use the max size to set the button boundaries. - gfx::Size prefsize(max_text_size_.width() + icon_.width() + insets.width(), - std::max(max_text_size_.height(), icon_.height()) + - insets.height()); - - if (icon_.width() > 0 && !text_.empty()) - prefsize.Enlarge(kIconTextPadding, 0); - - if (max_width_ > 0) - prefsize.set_width(std::min(max_width_, prefsize.width())); - - return prefsize; -} - -gfx::Size TextButton::GetMinimumSize() { - return max_text_size_; -} - -void TextButton::SetEnabled(bool enabled) { - if (enabled == IsEnabled()) - return; - CustomButton::SetEnabled(enabled); - color_ = enabled ? kEnabledColor : kDisabledColor; - SchedulePaint(); -} - -bool TextButton::OnMousePressed(const MouseEvent& e) { - return true; -} - -void TextButton::Paint(ChromeCanvas* canvas) { - Paint(canvas, false); -} - -} // namespace views |