| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/chromeos/frame/bubble_frame_view.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 | |
| 9 #include "base/utf_string_conversions.h" | |
| 10 #include "chrome/browser/chromeos/frame/bubble_window.h" | |
| 11 #include "chrome/browser/chromeos/login/helper.h" | |
| 12 #include "grit/theme_resources_standard.h" | |
| 13 #include "third_party/skia/include/core/SkColor.h" | |
| 14 #include "third_party/skia/include/core/SkPaint.h" | |
| 15 #include "ui/base/hit_test.h" | |
| 16 #include "ui/base/resource/resource_bundle.h" | |
| 17 #include "ui/gfx/canvas_skia.h" | |
| 18 #include "ui/gfx/font.h" | |
| 19 #include "ui/gfx/insets.h" | |
| 20 #include "ui/gfx/path.h" | |
| 21 #include "ui/gfx/rect.h" | |
| 22 #include "ui/views/controls/button/image_button.h" | |
| 23 #include "ui/views/controls/label.h" | |
| 24 #include "ui/views/controls/throbber.h" | |
| 25 #include "ui/views/widget/widget.h" | |
| 26 #include "ui/views/widget/widget_delegate.h" | |
| 27 | |
| 28 namespace { | |
| 29 | |
| 30 const int kTitleTopPadding = 10; | |
| 31 const int kTitleContentPadding = 10; | |
| 32 const int kHorizontalPadding = 10; | |
| 33 | |
| 34 // Title font size correction. | |
| 35 #if defined(CROS_FONTS_USING_BCI) | |
| 36 const int kTitleFontSizeDelta = 0; | |
| 37 #else | |
| 38 const int kTitleFontSizeDelta = 1; | |
| 39 #endif | |
| 40 | |
| 41 } // namespace | |
| 42 | |
| 43 namespace chromeos { | |
| 44 | |
| 45 BubbleFrameView::BubbleFrameView(views::Widget* frame, | |
| 46 views::WidgetDelegate* widget_delegate, | |
| 47 DialogStyle style) | |
| 48 : frame_(frame), | |
| 49 style_(style), | |
| 50 title_(NULL), | |
| 51 close_button_(NULL), | |
| 52 throbber_(NULL) { | |
| 53 if (widget_delegate->ShouldShowWindowTitle()) { | |
| 54 title_ = new views::Label(widget_delegate->GetWindowTitle()); | |
| 55 title_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | |
| 56 title_->SetFont(title_->font().DeriveFont(kFontSizeCorrectionDelta, | |
| 57 gfx::Font::BOLD)); | |
| 58 AddChildView(title_); | |
| 59 } | |
| 60 | |
| 61 if (style_ & STYLE_XBAR) { | |
| 62 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
| 63 close_button_ = new views::ImageButton(this); | |
| 64 close_button_->SetImage(views::CustomButton::BS_NORMAL, | |
| 65 rb.GetBitmapNamed(IDR_CLOSE_BAR)); | |
| 66 close_button_->SetImage(views::CustomButton::BS_HOT, | |
| 67 rb.GetBitmapNamed(IDR_CLOSE_BAR_H)); | |
| 68 close_button_->SetImage(views::CustomButton::BS_PUSHED, | |
| 69 rb.GetBitmapNamed(IDR_CLOSE_BAR_P)); | |
| 70 AddChildView(close_button_); | |
| 71 } | |
| 72 | |
| 73 if (style_ & STYLE_THROBBER) { | |
| 74 throbber_ = CreateDefaultSmoothedThrobber(); | |
| 75 AddChildView(throbber_); | |
| 76 } | |
| 77 } | |
| 78 | |
| 79 BubbleFrameView::~BubbleFrameView() { | |
| 80 } | |
| 81 | |
| 82 void BubbleFrameView::StartThrobber() { | |
| 83 DCHECK(throbber_ != NULL); | |
| 84 if (title_) | |
| 85 title_->SetText(string16()); | |
| 86 throbber_->Start(); | |
| 87 } | |
| 88 | |
| 89 void BubbleFrameView::StopThrobber() { | |
| 90 DCHECK(throbber_ != NULL); | |
| 91 throbber_->Stop(); | |
| 92 if (title_) | |
| 93 title_->SetText(frame_->widget_delegate()->GetWindowTitle()); | |
| 94 } | |
| 95 | |
| 96 gfx::Rect BubbleFrameView::GetBoundsForClientView() const { | |
| 97 return client_view_bounds_; | |
| 98 } | |
| 99 | |
| 100 gfx::Rect BubbleFrameView::GetWindowBoundsForClientBounds( | |
| 101 const gfx::Rect& client_bounds) const { | |
| 102 gfx::Insets insets = GetInsets(); | |
| 103 | |
| 104 gfx::Size title_size; | |
| 105 if (title_) | |
| 106 title_size = title_->GetPreferredSize(); | |
| 107 gfx::Size close_button_size; | |
| 108 if (close_button_) | |
| 109 close_button_size = close_button_->GetPreferredSize(); | |
| 110 gfx::Size throbber_size; | |
| 111 if (throbber_) | |
| 112 throbber_size = throbber_->GetPreferredSize(); | |
| 113 | |
| 114 int top_height = insets.top(); | |
| 115 if (title_size.height() > 0 || | |
| 116 close_button_size.height() > 0 || | |
| 117 throbber_size.height() > 0) { | |
| 118 top_height += kTitleContentPadding + std::max( | |
| 119 std::max(title_size.height(), close_button_size.height()), | |
| 120 throbber_size.height()); | |
| 121 } | |
| 122 return gfx::Rect(std::max(0, client_bounds.x() - insets.left()), | |
| 123 std::max(0, client_bounds.y() - top_height), | |
| 124 client_bounds.width() + insets.width(), | |
| 125 client_bounds.height() + top_height + insets.bottom()); | |
| 126 } | |
| 127 | |
| 128 int BubbleFrameView::NonClientHitTest(const gfx::Point& point) { | |
| 129 return HTNOWHERE; | |
| 130 } | |
| 131 | |
| 132 void BubbleFrameView::GetWindowMask(const gfx::Size& size, | |
| 133 gfx::Path* window_mask) { | |
| 134 } | |
| 135 | |
| 136 void BubbleFrameView::ResetWindowControls() { | |
| 137 } | |
| 138 | |
| 139 void BubbleFrameView::UpdateWindowIcon() { | |
| 140 } | |
| 141 | |
| 142 gfx::Insets BubbleFrameView::GetInsets() const { | |
| 143 return (style_ & STYLE_FLUSH || style_ & STYLE_FLUSH_CONTENT) ? | |
| 144 gfx::Insets() : | |
| 145 gfx::Insets(kTitleTopPadding, | |
| 146 kHorizontalPadding, | |
| 147 0, | |
| 148 kHorizontalPadding); | |
| 149 } | |
| 150 | |
| 151 gfx::Size BubbleFrameView::GetPreferredSize() { | |
| 152 gfx::Size pref = frame_->client_view()->GetPreferredSize(); | |
| 153 gfx::Rect bounds(0, 0, pref.width(), pref.height()); | |
| 154 return frame_->non_client_view()->GetWindowBoundsForClientBounds( | |
| 155 bounds).size(); | |
| 156 } | |
| 157 | |
| 158 void BubbleFrameView::Layout() { | |
| 159 gfx::Insets insets = GetInsets(); | |
| 160 | |
| 161 gfx::Size title_size; | |
| 162 if (title_) | |
| 163 title_size = title_->GetPreferredSize(); | |
| 164 gfx::Size close_button_size; | |
| 165 if (close_button_) | |
| 166 close_button_size = close_button_->GetPreferredSize(); | |
| 167 gfx::Size throbber_size; | |
| 168 if (throbber_) | |
| 169 throbber_size = throbber_->GetPreferredSize(); | |
| 170 | |
| 171 // Need to center elements which are shorter. | |
| 172 int max_height = std::max(title_size.height(), | |
| 173 std::max(close_button_size.height(), | |
| 174 throbber_size.height())); | |
| 175 | |
| 176 gfx::Insets title_insets = gfx::Insets(); | |
| 177 // Need to insert title padding for STYLE_FLUSH_CONTENT. | |
| 178 if (style_ & STYLE_FLUSH_CONTENT) | |
| 179 title_insets = gfx::Insets(kTitleTopPadding, | |
| 180 kHorizontalPadding, | |
| 181 0, | |
| 182 kHorizontalPadding); | |
| 183 | |
| 184 if (title_) { | |
| 185 title_->SetBounds( | |
| 186 insets.left() + title_insets.left(), | |
| 187 insets.top() + title_insets.top() + | |
| 188 (max_height - title_size.height())/2, // Center. | |
| 189 std::max(0, width() - insets.width() - title_insets.width() - | |
| 190 close_button_size.width()), | |
| 191 title_size.height()); | |
| 192 } | |
| 193 | |
| 194 if (close_button_) { | |
| 195 close_button_->SetBounds( | |
| 196 width() - insets.right() - title_insets.right() - | |
| 197 close_button_size.width(), | |
| 198 insets.top() + title_insets.top() + | |
| 199 (max_height - close_button_size.height())/2, | |
| 200 close_button_size.width(), | |
| 201 close_button_size.height()); | |
| 202 } | |
| 203 | |
| 204 if (throbber_) { | |
| 205 throbber_->SetBounds( | |
| 206 insets.left() + title_insets.left(), | |
| 207 insets.top() + title_insets.top() + | |
| 208 (max_height - throbber_size.height())/2, | |
| 209 std::min(throbber_size.width(), width()), | |
| 210 throbber_size.height()); | |
| 211 } | |
| 212 | |
| 213 int top_height = insets.top() + title_insets.top(); | |
| 214 if (title_size.height() > 0 || | |
| 215 close_button_size.height() > 0 || | |
| 216 throbber_size.height() > 0) { | |
| 217 top_height += kTitleContentPadding + std::max( | |
| 218 std::max(title_size.height(), close_button_size.height()), | |
| 219 throbber_size.height()); | |
| 220 } | |
| 221 client_view_bounds_.SetRect(insets.left(), top_height, | |
| 222 std::max(0, width() - insets.width()), | |
| 223 std::max(0, height() - top_height - insets.bottom())); | |
| 224 } | |
| 225 | |
| 226 void BubbleFrameView::OnPaint(gfx::Canvas* canvas) { | |
| 227 SkPaint paint; | |
| 228 paint.setStyle(SkPaint::kFill_Style); | |
| 229 paint.setColor(kBubbleWindowBackgroundColor); | |
| 230 gfx::Path path; | |
| 231 gfx::Rect bounds(GetContentsBounds()); | |
| 232 SkRect rect; | |
| 233 rect.set(SkIntToScalar(bounds.x()), SkIntToScalar(bounds.y()), | |
| 234 SkIntToScalar(bounds.right()), SkIntToScalar(bounds.bottom())); | |
| 235 path.addRect(rect); | |
| 236 canvas->GetSkCanvas()->drawPath(path, paint); | |
| 237 } | |
| 238 | |
| 239 void BubbleFrameView::ButtonPressed(views::Button* sender, | |
| 240 const views::Event& event) { | |
| 241 if (close_button_ != NULL && sender == close_button_) | |
| 242 frame_->Close(); | |
| 243 } | |
| 244 | |
| 245 } // namespace chromeos | |
| OLD | NEW |