| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/views/bubble/bubble_frame_view.h" | 5 #include "ui/views/bubble/bubble_frame_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "grit/ui_resources.h" | 9 #include "grit/ui_resources.h" |
| 10 #include "ui/base/hit_test.h" | 10 #include "ui/base/hit_test.h" |
| 11 #include "ui/base/resource/resource_bundle.h" | 11 #include "ui/base/resource/resource_bundle.h" |
| 12 #include "ui/gfx/path.h" | 12 #include "ui/gfx/path.h" |
| 13 #include "ui/gfx/screen.h" | 13 #include "ui/gfx/screen.h" |
| 14 #include "ui/gfx/skia_util.h" | 14 #include "ui/gfx/skia_util.h" |
| 15 #include "ui/native_theme/native_theme.h" | 15 #include "ui/native_theme/native_theme.h" |
| 16 #include "ui/views/bubble/bubble_border.h" | 16 #include "ui/views/bubble/bubble_border.h" |
| 17 #include "ui/views/controls/button/label_button.h" | 17 #include "ui/views/controls/button/label_button.h" |
| 18 #include "ui/views/widget/widget.h" | 18 #include "ui/views/widget/widget.h" |
| 19 #include "ui/views/widget/widget_delegate.h" | 19 #include "ui/views/widget/widget_delegate.h" |
| 20 #include "ui/views/window/client_view.h" | 20 #include "ui/views/window/client_view.h" |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 // Padding, in pixels, for the title view, when it exists. | 24 // Insets for the title bar views in pixels. |
| 25 const int kTitleTopInset = 12; | 25 const int kTitleTopInset = 12; |
| 26 const int kTitleLeftInset = 19; | 26 const int kTitleLeftInset = 19; |
| 27 const int kTitleBottomInset = 12; | 27 const int kTitleBottomInset = 12; |
| 28 const int kTitleRightInset = 7; |
| 28 | 29 |
| 29 // Get the |vertical| or horizontal amount that |available_bounds| overflows | 30 // Get the |vertical| or horizontal amount that |available_bounds| overflows |
| 30 // |window_bounds|. | 31 // |window_bounds|. |
| 31 int GetOffScreenLength(const gfx::Rect& available_bounds, | 32 int GetOffScreenLength(const gfx::Rect& available_bounds, |
| 32 const gfx::Rect& window_bounds, | 33 const gfx::Rect& window_bounds, |
| 33 bool vertical) { | 34 bool vertical) { |
| 34 if (available_bounds.IsEmpty() || available_bounds.Contains(window_bounds)) | 35 if (available_bounds.IsEmpty() || available_bounds.Contains(window_bounds)) |
| 35 return 0; | 36 return 0; |
| 36 | 37 |
| 37 // window_bounds | 38 // window_bounds |
| (...skipping 13 matching lines...) Expand all Loading... |
| 51 | 52 |
| 52 } // namespace | 53 } // namespace |
| 53 | 54 |
| 54 namespace views { | 55 namespace views { |
| 55 | 56 |
| 56 // static | 57 // static |
| 57 const char BubbleFrameView::kViewClassName[] = "BubbleFrameView"; | 58 const char BubbleFrameView::kViewClassName[] = "BubbleFrameView"; |
| 58 | 59 |
| 59 // static | 60 // static |
| 60 gfx::Insets BubbleFrameView::GetTitleInsets() { | 61 gfx::Insets BubbleFrameView::GetTitleInsets() { |
| 61 return gfx::Insets(kTitleTopInset, kTitleLeftInset, kTitleBottomInset, 0); | 62 return gfx::Insets(kTitleTopInset, kTitleLeftInset, |
| 63 kTitleBottomInset, kTitleRightInset); |
| 62 } | 64 } |
| 63 | 65 |
| 64 BubbleFrameView::BubbleFrameView(const gfx::Insets& content_margins) | 66 BubbleFrameView::BubbleFrameView(const gfx::Insets& content_margins) |
| 65 : bubble_border_(NULL), | 67 : bubble_border_(NULL), |
| 66 content_margins_(content_margins), | 68 content_margins_(content_margins), |
| 67 title_(NULL), | 69 title_(NULL), |
| 68 close_(NULL), | 70 close_(NULL), |
| 69 titlebar_extra_view_(NULL) { | 71 titlebar_extra_view_(NULL) { |
| 70 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 72 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 71 title_ = new Label(base::string16(), | 73 title_ = new Label(base::string16(), |
| 72 rb.GetFontList(ui::ResourceBundle::MediumFont)); | 74 rb.GetFontList(ui::ResourceBundle::MediumFont)); |
| 73 title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 75 title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 74 AddChildView(title_); | 76 AddChildView(title_); |
| 75 | 77 |
| 76 close_ = new LabelButton(this, base::string16()); | 78 close_ = new LabelButton(this, base::string16()); |
| 77 close_->SetImage(CustomButton::STATE_NORMAL, | 79 close_->SetImage(CustomButton::STATE_NORMAL, |
| 78 *rb.GetImageNamed(IDR_CLOSE_DIALOG).ToImageSkia()); | 80 *rb.GetImageNamed(IDR_CLOSE_DIALOG).ToImageSkia()); |
| 79 close_->SetImage(CustomButton::STATE_HOVERED, | 81 close_->SetImage(CustomButton::STATE_HOVERED, |
| 80 *rb.GetImageNamed(IDR_CLOSE_DIALOG_H).ToImageSkia()); | 82 *rb.GetImageNamed(IDR_CLOSE_DIALOG_H).ToImageSkia()); |
| 81 close_->SetImage(CustomButton::STATE_PRESSED, | 83 close_->SetImage(CustomButton::STATE_PRESSED, |
| 82 *rb.GetImageNamed(IDR_CLOSE_DIALOG_P).ToImageSkia()); | 84 *rb.GetImageNamed(IDR_CLOSE_DIALOG_P).ToImageSkia()); |
| 85 close_->SetBorder(scoped_ptr<Border>()); |
| 83 close_->SetSize(close_->GetPreferredSize()); | 86 close_->SetSize(close_->GetPreferredSize()); |
| 84 close_->SetBorder(scoped_ptr<Border>()); | |
| 85 close_->SetVisible(false); | 87 close_->SetVisible(false); |
| 86 AddChildView(close_); | 88 AddChildView(close_); |
| 87 } | 89 } |
| 88 | 90 |
| 89 BubbleFrameView::~BubbleFrameView() {} | 91 BubbleFrameView::~BubbleFrameView() {} |
| 90 | 92 |
| 91 gfx::Rect BubbleFrameView::GetBoundsForClientView() const { | 93 gfx::Rect BubbleFrameView::GetBoundsForClientView() const { |
| 92 gfx::Rect client_bounds = GetLocalBounds(); | 94 gfx::Rect client_bounds = GetLocalBounds(); |
| 93 client_bounds.Inset(GetInsets()); | 95 client_bounds.Inset(GetInsets()); |
| 94 client_bounds.Inset(bubble_border_->GetInsets()); | 96 client_bounds.Inset(bubble_border_->GetInsets()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 gfx::Size BubbleFrameView::GetPreferredSize() const { | 175 gfx::Size BubbleFrameView::GetPreferredSize() const { |
| 174 return GetSizeForClientSize(GetWidget()->client_view()->GetPreferredSize()); | 176 return GetSizeForClientSize(GetWidget()->client_view()->GetPreferredSize()); |
| 175 } | 177 } |
| 176 | 178 |
| 177 gfx::Size BubbleFrameView::GetMinimumSize() const { | 179 gfx::Size BubbleFrameView::GetMinimumSize() const { |
| 178 return GetSizeForClientSize(GetWidget()->client_view()->GetMinimumSize()); | 180 return GetSizeForClientSize(GetWidget()->client_view()->GetMinimumSize()); |
| 179 } | 181 } |
| 180 | 182 |
| 181 void BubbleFrameView::Layout() { | 183 void BubbleFrameView::Layout() { |
| 182 gfx::Rect bounds(GetContentsBounds()); | 184 gfx::Rect bounds(GetContentsBounds()); |
| 185 bounds.Inset(GetTitleInsets()); |
| 183 if (bounds.IsEmpty()) | 186 if (bounds.IsEmpty()) |
| 184 return; | 187 return; |
| 185 | 188 |
| 186 // Small additional insets yield the desired 10px visual close button insets. | 189 // The close button top inset is actually smaller than the title top inset. |
| 187 bounds.Inset(0, 0, close_->width() + 1, 0); | 190 close_->SetPosition(gfx::Point(bounds.right() - close_->width(), |
| 188 close_->SetPosition(gfx::Point(bounds.right(), bounds.y() + 2)); | 191 bounds.y() - 5)); |
| 189 | 192 |
| 190 gfx::Rect title_bounds(bounds); | |
| 191 title_bounds.Inset(kTitleLeftInset, kTitleTopInset, 0, 0); | |
| 192 gfx::Size title_size(title_->GetPreferredSize()); | 193 gfx::Size title_size(title_->GetPreferredSize()); |
| 193 const int title_width = std::max(0, close_->bounds().x() - title_bounds.x()); | 194 const int title_width = std::max(0, close_->x() - bounds.x()); |
| 194 title_size.SetToMin(gfx::Size(title_width, title_size.height())); | 195 title_size.SetToMin(gfx::Size(title_width, title_size.height())); |
| 195 title_bounds.set_size(title_size); | 196 bounds.set_size(title_size); |
| 196 title_->SetBoundsRect(title_bounds); | 197 title_->SetBoundsRect(bounds); |
| 197 | 198 |
| 198 if (titlebar_extra_view_) { | 199 if (titlebar_extra_view_) { |
| 199 const int extra_width = close_->bounds().x() - title_->bounds().right(); | 200 const int extra_width = close_->x() - title_->bounds().right(); |
| 200 gfx::Size size = titlebar_extra_view_->GetPreferredSize(); | 201 gfx::Size size = titlebar_extra_view_->GetPreferredSize(); |
| 201 size.SetToMin(gfx::Size(std::max(0, extra_width), size.height())); | 202 size.SetToMin(gfx::Size(std::max(0, extra_width), size.height())); |
| 202 gfx::Rect titlebar_extra_view_bounds( | 203 gfx::Rect titlebar_extra_view_bounds( |
| 203 bounds.right() - size.width(), | 204 close_->x() - size.width(), |
| 204 title_bounds.y(), | 205 bounds.y(), |
| 205 size.width(), | 206 size.width(), |
| 206 title_bounds.height()); | 207 bounds.height()); |
| 207 titlebar_extra_view_bounds.Subtract(title_bounds); | 208 titlebar_extra_view_bounds.Subtract(bounds); |
| 208 titlebar_extra_view_->SetBoundsRect(titlebar_extra_view_bounds); | 209 titlebar_extra_view_->SetBoundsRect(titlebar_extra_view_bounds); |
| 209 } | 210 } |
| 210 } | 211 } |
| 211 | 212 |
| 212 const char* BubbleFrameView::GetClassName() const { | 213 const char* BubbleFrameView::GetClassName() const { |
| 213 return kViewClassName; | 214 return kViewClassName; |
| 214 } | 215 } |
| 215 | 216 |
| 216 void BubbleFrameView::ChildPreferredSizeChanged(View* child) { | 217 void BubbleFrameView::ChildPreferredSizeChanged(View* child) { |
| 217 if (child == titlebar_extra_view_ || child == title_) | 218 if (child == titlebar_extra_view_ || child == title_) |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 if (titlebar_extra_view_ != NULL) | 357 if (titlebar_extra_view_ != NULL) |
| 357 title_bar_width += titlebar_extra_view_->GetPreferredSize().width(); | 358 title_bar_width += titlebar_extra_view_->GetPreferredSize().width(); |
| 358 gfx::Size size(client_size); | 359 gfx::Size size(client_size); |
| 359 size.SetToMax(gfx::Size(title_bar_width, 0)); | 360 size.SetToMax(gfx::Size(title_bar_width, 0)); |
| 360 const gfx::Insets insets(GetInsets()); | 361 const gfx::Insets insets(GetInsets()); |
| 361 size.Enlarge(insets.width(), insets.height()); | 362 size.Enlarge(insets.width(), insets.height()); |
| 362 return size; | 363 return size; |
| 363 } | 364 } |
| 364 | 365 |
| 365 } // namespace views | 366 } // namespace views |
| OLD | NEW |