OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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/browser/ui/views/frame/contents_container.h" | 5 #include "chrome/browser/ui/views/frame/contents_container.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "ui/views/layout/fill_layout.h" | |
8 | 9 |
9 using content::WebContents; | 10 using content::WebContents; |
10 | 11 |
12 class ContentsContainer::HeaderView : public views::View { | |
13 public: | |
14 HeaderView(); | |
15 | |
16 bool should_show() { return child_count() && child_at(0)->visible(); } | |
Peter Kasting
2012/06/22 20:33:22
Nit: const
| |
17 | |
18 protected: | |
19 // views::View overrides: | |
20 virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE; | |
21 | |
22 private: | |
23 bool child_visibile_; | |
Peter Kasting
2012/06/22 20:33:22
Nit: Maybe call this child_was_visible_ and add so
| |
24 | |
25 DISALLOW_COPY_AND_ASSIGN(HeaderView); | |
26 }; | |
27 | |
28 ContentsContainer::HeaderView::HeaderView() : child_visibile_(false) {} | |
29 | |
30 void ContentsContainer::HeaderView::ChildPreferredSizeChanged( | |
31 views::View* child) { | |
32 if (parent() && (child->visible() || child_visibile_)) | |
33 parent()->Layout(); | |
34 child_visibile_ = child->visible(); | |
35 } | |
36 | |
11 // static | 37 // static |
12 const char ContentsContainer::kViewClassName[] = | 38 const char ContentsContainer::kViewClassName[] = |
13 "browser/ui/views/frame/ContentsContainer"; | 39 "browser/ui/views/frame/ContentsContainer"; |
14 | 40 |
15 ContentsContainer::ContentsContainer(views::View* active) | 41 ContentsContainer::ContentsContainer(views::View* active) |
16 : active_(active), | 42 : header_(new HeaderView()), |
43 active_(active), | |
17 preview_(NULL), | 44 preview_(NULL), |
18 preview_web_contents_(NULL), | 45 preview_web_contents_(NULL), |
19 active_top_margin_(0) { | 46 active_top_margin_(0) { |
20 AddChildView(active_); | 47 AddChildView(active_); |
48 header_->SetLayoutManager(new views::FillLayout); | |
49 AddChildView(header_); | |
21 } | 50 } |
22 | 51 |
23 ContentsContainer::~ContentsContainer() { | 52 ContentsContainer::~ContentsContainer() { |
24 } | 53 } |
25 | 54 |
55 views::View* ContentsContainer::header() { return header_; } | |
56 | |
26 void ContentsContainer::MakePreviewContentsActiveContents() { | 57 void ContentsContainer::MakePreviewContentsActiveContents() { |
27 DCHECK(preview_); | 58 DCHECK(preview_); |
28 | 59 |
29 active_ = preview_; | 60 active_ = preview_; |
30 preview_ = NULL; | 61 preview_ = NULL; |
31 preview_web_contents_ = NULL; | 62 preview_web_contents_ = NULL; |
32 Layout(); | 63 Layout(); |
33 } | 64 } |
34 | 65 |
35 void ContentsContainer::SetPreview(views::View* preview, | 66 void ContentsContainer::SetPreview(views::View* preview, |
(...skipping 21 matching lines...) Expand all Loading... | |
57 InvalidateLayout(); | 88 InvalidateLayout(); |
58 } | 89 } |
59 | 90 |
60 gfx::Rect ContentsContainer::GetPreviewBounds() { | 91 gfx::Rect ContentsContainer::GetPreviewBounds() { |
61 gfx::Point screen_loc; | 92 gfx::Point screen_loc; |
62 ConvertPointToScreen(this, &screen_loc); | 93 ConvertPointToScreen(this, &screen_loc); |
63 return gfx::Rect(screen_loc, size()); | 94 return gfx::Rect(screen_loc, size()); |
64 } | 95 } |
65 | 96 |
66 void ContentsContainer::Layout() { | 97 void ContentsContainer::Layout() { |
67 // The active view always gets the full bounds. | 98 int content_y = active_top_margin_; |
68 active_->SetBounds(0, active_top_margin_, width(), | 99 int content_height = std::max(0, height() - content_y); |
69 std::max(0, height() - active_top_margin_)); | 100 if (header_->should_show()) { |
101 gfx::Size header_pref = header_->GetPreferredSize(); | |
102 int header_height = std::min(content_height, header_pref.height()); | |
103 content_height -= header_height; | |
104 header_->SetBounds(0, content_y, width(), header_height); | |
105 content_y += header_height; | |
106 } else { | |
107 header_->SetBoundsRect(gfx::Rect()); | |
108 } | |
109 active_->SetBounds(0, content_y, width(), content_height); | |
70 | 110 |
71 if (preview_) | 111 if (preview_) |
72 preview_->SetBounds(0, 0, width(), height()); | 112 preview_->SetBounds(0, 0, width(), height()); |
73 | 113 |
74 // Need to invoke views::View in case any views whose bounds didn't change | 114 // Need to invoke views::View in case any views whose bounds didn't change |
75 // still need a layout. | 115 // still need a layout. |
76 views::View::Layout(); | 116 views::View::Layout(); |
77 } | 117 } |
78 | 118 |
79 std::string ContentsContainer::GetClassName() const { | 119 std::string ContentsContainer::GetClassName() const { |
80 return kViewClassName; | 120 return kViewClassName; |
81 } | 121 } |
OLD | NEW |