| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/views/text_button.h" | 5 #include "chrome/views/text_button.h" |
| 6 | 6 |
| 7 #include "chrome/app/theme/theme_resources.h" | 7 #include "chrome/app/theme/theme_resources.h" |
| 8 #include "chrome/common/gfx/chrome_canvas.h" | 8 #include "chrome/common/gfx/chrome_canvas.h" |
| 9 #include "chrome/common/resource_bundle.h" | 9 #include "chrome/common/resource_bundle.h" |
| 10 #include "chrome/common/throb_animation.h" | 10 #include "chrome/common/throb_animation.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 kPreferredPaddingVertical, kPreferredPaddingHorizontal); | 136 kPreferredPaddingVertical, kPreferredPaddingHorizontal); |
| 137 } | 137 } |
| 138 | 138 |
| 139 //////////////////////////////////////////////////////////////////////////////// | 139 //////////////////////////////////////////////////////////////////////////////// |
| 140 // | 140 // |
| 141 // TextButton - Implementation | 141 // TextButton - Implementation |
| 142 // | 142 // |
| 143 //////////////////////////////////////////////////////////////////////////////// | 143 //////////////////////////////////////////////////////////////////////////////// |
| 144 | 144 |
| 145 TextButton::TextButton(const std::wstring& text) | 145 TextButton::TextButton(const std::wstring& text) |
| 146 : max_text_size_(CSize(0, 0)), | 146 : font_(ResourceBundle::GetSharedInstance().GetFont( |
| 147 font_(ResourceBundle::GetSharedInstance().GetFont( | |
| 148 ResourceBundle::BaseFont)), | 147 ResourceBundle::BaseFont)), |
| 149 color_(kEnabledColor), | 148 color_(kEnabledColor), |
| 150 BaseButton(), | 149 BaseButton(), |
| 151 max_width_(0), | 150 max_width_(0), |
| 152 alignment_(ALIGN_LEFT) { | 151 alignment_(ALIGN_LEFT) { |
| 153 SetText(text); | 152 SetText(text); |
| 154 SetBorder(new TextButtonBorder); | 153 SetBorder(new TextButtonBorder); |
| 155 SetAnimationDuration(kHoverAnimationDurationMs); | 154 SetAnimationDuration(kHoverAnimationDurationMs); |
| 156 } | 155 } |
| 157 | 156 |
| 158 TextButton::~TextButton() { | 157 TextButton::~TextButton() { |
| 159 } | 158 } |
| 160 | 159 |
| 161 void TextButton::GetPreferredSize(CSize *result) { | 160 gfx::Size TextButton::GetPreferredSize() { |
| 162 gfx::Insets insets = GetInsets(); | 161 gfx::Insets insets = GetInsets(); |
| 163 | 162 |
| 164 // Use the max size to set the button boundaries. | 163 // Use the max size to set the button boundaries. |
| 165 result->cx = max_text_size_.cx + icon_.width() + insets.width(); | 164 gfx::Size prefsize(max_text_size_.width() + icon_.width() + insets.width(), |
| 166 result->cy = std::max(static_cast<int>(max_text_size_.cy), icon_.height()) + | 165 std::max(max_text_size_.height(), icon_.height()) + |
| 167 insets.height(); | 166 insets.height()); |
| 168 | 167 |
| 169 if (icon_.width() > 0 && !text_.empty()) | 168 if (icon_.width() > 0 && !text_.empty()) |
| 170 result->cx += kIconTextPadding; | 169 prefsize.Enlarge(kIconTextPadding, 0); |
| 171 | 170 |
| 172 if (max_width_ > 0) | 171 if (max_width_ > 0) |
| 173 result->cx = std::min(max_width_, static_cast<int>(result->cx)); | 172 prefsize.set_width(std::min(max_width_, prefsize.width())); |
| 173 |
| 174 return prefsize; |
| 174 } | 175 } |
| 175 | 176 |
| 176 void TextButton::GetMinimumSize(CSize *result) { | 177 gfx::Size TextButton::GetMinimumSize() { |
| 177 result->cx = max_text_size_.cx; | 178 return max_text_size_; |
| 178 result->cy = max_text_size_.cy; | |
| 179 } | 179 } |
| 180 | 180 |
| 181 bool TextButton::OnMousePressed(const ChromeViews::MouseEvent& e) { | 181 bool TextButton::OnMousePressed(const ChromeViews::MouseEvent& e) { |
| 182 return true; | 182 return true; |
| 183 } | 183 } |
| 184 | 184 |
| 185 void TextButton::SetText(const std::wstring& text) { | 185 void TextButton::SetText(const std::wstring& text) { |
| 186 text_ = text; | 186 text_ = text; |
| 187 // Update our new current and max text size | 187 // Update our new current and max text size |
| 188 text_size_.cx = font_.GetStringWidth(text_); | 188 text_size_.SetSize(font_.GetStringWidth(text_), font_.height()); |
| 189 text_size_.cy = font_.height(); | 189 max_text_size_.SetSize(std::max(max_text_size_.width(), text_size_.width()), |
| 190 max_text_size_.cx = std::max(max_text_size_.cx, text_size_.cx); | 190 std::max(max_text_size_.height(), |
| 191 max_text_size_.cy = std::max(max_text_size_.cy, text_size_.cy); | 191 text_size_.height())); |
| 192 } | 192 } |
| 193 | 193 |
| 194 void TextButton::SetIcon(const SkBitmap& icon) { | 194 void TextButton::SetIcon(const SkBitmap& icon) { |
| 195 icon_ = icon; | 195 icon_ = icon; |
| 196 } | 196 } |
| 197 | 197 |
| 198 void TextButton::ClearMaxTextSize() { | 198 void TextButton::ClearMaxTextSize() { |
| 199 max_text_size_ = text_size_; | 199 max_text_size_ = text_size_; |
| 200 } | 200 } |
| 201 | 201 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 220 PaintBorder(canvas); | 220 PaintBorder(canvas); |
| 221 } | 221 } |
| 222 | 222 |
| 223 PaintFocusBorder(canvas); | 223 PaintFocusBorder(canvas); |
| 224 } | 224 } |
| 225 | 225 |
| 226 gfx::Insets insets = GetInsets(); | 226 gfx::Insets insets = GetInsets(); |
| 227 int available_width = width() - insets.width(); | 227 int available_width = width() - insets.width(); |
| 228 int available_height = height() - insets.height(); | 228 int available_height = height() - insets.height(); |
| 229 // Use the actual text (not max) size to properly center the text. | 229 // Use the actual text (not max) size to properly center the text. |
| 230 int content_width = text_size_.cx; | 230 int content_width = text_size_.width(); |
| 231 if (icon_.width() > 0) { | 231 if (icon_.width() > 0) { |
| 232 content_width += icon_.width(); | 232 content_width += icon_.width(); |
| 233 if (!text_.empty()) | 233 if (!text_.empty()) |
| 234 content_width += kIconTextPadding; | 234 content_width += kIconTextPadding; |
| 235 } | 235 } |
| 236 // Place the icon along the left edge. | 236 // Place the icon along the left edge. |
| 237 int icon_x; | 237 int icon_x; |
| 238 if (alignment_ == ALIGN_LEFT) { | 238 if (alignment_ == ALIGN_LEFT) { |
| 239 icon_x = insets.left(); | 239 icon_x = insets.left(); |
| 240 } else if (alignment_ == ALIGN_RIGHT) { | 240 } else if (alignment_ == ALIGN_RIGHT) { |
| 241 icon_x = available_width - content_width; | 241 icon_x = available_width - content_width; |
| 242 } else { | 242 } else { |
| 243 icon_x = | 243 icon_x = |
| 244 std::max(0, (available_width - content_width) / 2) + insets.left(); | 244 std::max(0, (available_width - content_width) / 2) + insets.left(); |
| 245 } | 245 } |
| 246 int text_x = icon_x; | 246 int text_x = icon_x; |
| 247 if (icon_.width() > 0) | 247 if (icon_.width() > 0) |
| 248 text_x += icon_.width() + kIconTextPadding; | 248 text_x += icon_.width() + kIconTextPadding; |
| 249 const int text_width = std::min(static_cast<int>(text_size_.cx), | 249 const int text_width = std::min(text_size_.width(), |
| 250 width() - insets.right() - text_x); | 250 width() - insets.right() - text_x); |
| 251 int text_y = (available_height - text_size_.cy) / 2 + insets.top(); | 251 int text_y = (available_height - text_size_.height()) / 2 + insets.top(); |
| 252 | 252 |
| 253 if (text_width > 0) { | 253 if (text_width > 0) { |
| 254 // Because the text button can (at times) draw multiple elements on the | 254 // Because the text button can (at times) draw multiple elements on the |
| 255 // canvas, we can not mirror the button by simply flipping the canvas as | 255 // canvas, we can not mirror the button by simply flipping the canvas as |
| 256 // doing this will mirror the text itself. Flipping the canvas will also | 256 // doing this will mirror the text itself. Flipping the canvas will also |
| 257 // make the icons look wrong because icons are almost always represented as | 257 // make the icons look wrong because icons are almost always represented as |
| 258 // direction insentisive bitmaps and such bitmaps should never be flipped | 258 // direction insentisive bitmaps and such bitmaps should never be flipped |
| 259 // horizontally. | 259 // horizontally. |
| 260 // | 260 // |
| 261 // Due to the above, we must perform the flipping manually for RTL UIs. | 261 // Due to the above, we must perform the flipping manually for RTL UIs. |
| 262 gfx::Rect text_bounds(text_x, text_y, text_width, text_size_.cy); | 262 gfx::Rect text_bounds(text_x, text_y, text_width, text_size_.height()); |
| 263 text_bounds.set_x(MirroredLeftPointForRect(text_bounds)); | 263 text_bounds.set_x(MirroredLeftPointForRect(text_bounds)); |
| 264 | 264 |
| 265 // Draw bevel highlight | 265 // Draw bevel highlight |
| 266 canvas->DrawStringInt(text_, | 266 canvas->DrawStringInt(text_, |
| 267 font_, | 267 font_, |
| 268 kHighlightColor, | 268 kHighlightColor, |
| 269 text_bounds.x() + 1, | 269 text_bounds.x() + 1, |
| 270 text_bounds.y() + 1, | 270 text_bounds.y() + 1, |
| 271 text_bounds.width(), | 271 text_bounds.width(), |
| 272 text_bounds.height()); | 272 text_bounds.height()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 293 void TextButton::SetEnabled(bool enabled) { | 293 void TextButton::SetEnabled(bool enabled) { |
| 294 if (enabled == IsEnabled()) | 294 if (enabled == IsEnabled()) |
| 295 return; | 295 return; |
| 296 BaseButton::SetEnabled(enabled); | 296 BaseButton::SetEnabled(enabled); |
| 297 color_ = enabled ? kEnabledColor : kDisabledColor; | 297 color_ = enabled ? kEnabledColor : kDisabledColor; |
| 298 SchedulePaint(); | 298 SchedulePaint(); |
| 299 } | 299 } |
| 300 | 300 |
| 301 } // namespace ChromeViews | 301 } // namespace ChromeViews |
| 302 | 302 |
| OLD | NEW |