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 "chrome/browser/ui/views/constrained_window_frame_simple.h" | 5 #include "chrome/browser/ui/views/constrained_window_frame_simple.h" |
6 | 6 |
7 #include "chrome/browser/ui/constrained_window.h" | 7 #include "chrome/browser/ui/constrained_window.h" |
8 #include "chrome/browser/ui/views/constrained_window_views.h" | 8 #include "chrome/browser/ui/views/constrained_window_views.h" |
9 #include "grit/ui_resources.h" | 9 #include "grit/ui_resources.h" |
10 #include "grit/chromium_strings.h" | 10 #include "grit/chromium_strings.h" |
(...skipping 16 matching lines...) Expand all Loading... | |
27 #include "ui/views/widget/widget_delegate.h" | 27 #include "ui/views/widget/widget_delegate.h" |
28 | 28 |
29 namespace { | 29 namespace { |
30 | 30 |
31 typedef ConstrainedWindowFrameSimple::HeaderViews HeaderViews; | 31 typedef ConstrainedWindowFrameSimple::HeaderViews HeaderViews; |
32 | 32 |
33 // A layout manager that lays out the header view with proper padding, | 33 // A layout manager that lays out the header view with proper padding, |
34 // and sized to the widget's client view. | 34 // and sized to the widget's client view. |
35 class HeaderLayout : public views::LayoutManager { | 35 class HeaderLayout : public views::LayoutManager { |
36 public: | 36 public: |
37 explicit HeaderLayout(views::Widget* container) : container_(container) {} | 37 explicit HeaderLayout( |
38 views::Widget* container, | |
39 int client_left_inset, | |
40 int client_right_inset); | |
38 virtual ~HeaderLayout() {} | 41 virtual ~HeaderLayout() {} |
39 | 42 |
40 // Overridden from LayoutManager | 43 // Overridden from LayoutManager |
41 virtual void Layout(views::View* host); | 44 virtual void Layout(views::View* host); |
42 virtual gfx::Size GetPreferredSize(views::View* host); | 45 virtual gfx::Size GetPreferredSize(views::View* host); |
43 | 46 |
44 private: | 47 private: |
45 views::Widget* container_; | 48 views::Widget* container_; |
49 int client_left_inset_; | |
50 int client_right_inset_; | |
46 | 51 |
47 DISALLOW_COPY_AND_ASSIGN(HeaderLayout); | 52 DISALLOW_COPY_AND_ASSIGN(HeaderLayout); |
48 }; | 53 }; |
49 | 54 |
55 HeaderLayout::HeaderLayout( | |
56 views::Widget* container, | |
57 int client_left_inset, | |
58 int client_right_inset) | |
59 : container_(container), | |
60 client_left_inset_(client_left_inset), | |
61 client_right_inset_(client_right_inset) {} | |
62 | |
50 void HeaderLayout::Layout(views::View* host) { | 63 void HeaderLayout::Layout(views::View* host) { |
51 if (!host->has_children()) | 64 if (!host->has_children()) |
52 return; | 65 return; |
53 | 66 |
54 int horizontal_padding = ConstrainedWindow::kHorizontalPadding; | 67 int top_padding = ConstrainedWindow::kCloseButtonPadding; |
55 int vertical_padding = ConstrainedWindow::kVerticalPadding; | 68 int left_padding = ConstrainedWindow::kHorizontalPadding; |
56 int row_padding = ConstrainedWindow::kRowPadding; | 69 int right_padding = ConstrainedWindow::kCloseButtonPadding; |
57 | 70 |
58 views::View* header = host->child_at(0); | 71 views::View* header = host->child_at(0); |
59 gfx::Size preferred_size = GetPreferredSize(host); | 72 gfx::Size preferred_size = GetPreferredSize(host); |
60 int width = preferred_size.width() - 2 * horizontal_padding; | 73 int width = preferred_size.width() - left_padding - right_padding; |
61 int height = preferred_size.height() - vertical_padding - row_padding; | 74 int height = preferred_size.height() - top_padding; |
62 | 75 |
63 header->SetBounds(horizontal_padding, vertical_padding, width, height); | 76 header->SetBounds(left_padding, top_padding, width, height); |
64 } | 77 } |
65 | 78 |
66 gfx::Size HeaderLayout::GetPreferredSize(views::View* host) { | 79 gfx::Size HeaderLayout::GetPreferredSize(views::View* host) { |
67 int horizontal_padding = ConstrainedWindow::kHorizontalPadding; | 80 int left_padding = ConstrainedWindow::kHorizontalPadding; |
68 int vertical_padding = ConstrainedWindow::kVerticalPadding; | 81 int top_padding = ConstrainedWindow::kCloseButtonPadding; |
69 int row_padding = ConstrainedWindow::kRowPadding; | 82 int right_padding = ConstrainedWindow::kCloseButtonPadding; |
70 | 83 |
71 views::View* header = host->child_at(0); | 84 views::View* header = host->child_at(0); |
72 views::View* client_view = container_->client_view(); | 85 views::View* client_view = container_->client_view(); |
73 | 86 |
74 gfx::Size header_size = header ? header->GetPreferredSize() : gfx::Size(); | 87 gfx::Size header_size = header ? header->GetPreferredSize() : gfx::Size(); |
75 gfx::Size client_size = | 88 gfx::Size client_size = |
76 client_view ? client_view->GetPreferredSize() : gfx::Size(); | 89 client_view ? client_view->GetPreferredSize() : gfx::Size(); |
77 int width = std::max(client_size.width(), header_size.width()) + | 90 int width = std::max( |
78 2 * horizontal_padding; | 91 client_left_inset_ + client_size.width() + client_right_inset_, |
79 int height = vertical_padding + header_size.height() + row_padding; | 92 left_padding + header_size.width() + right_padding); |
93 int height = header_size.height() + top_padding; | |
80 return gfx::Size(width, height); | 94 return gfx::Size(width, height); |
81 } | 95 } |
82 | 96 |
97 // Utility function to add padding to a view. | |
98 views::View* AddPadding( | |
99 views::View* viewToPad, | |
Peter Kasting
2012/10/09 19:31:10
Nit: Use underscores
please use gerrit instead
2012/10/10 19:12:58
I've removed this method entirely in favor of set_
| |
100 int top, | |
101 int left, | |
102 int bottom, | |
103 int right) { | |
104 views::View* result = new views::View(); | |
105 views::GridLayout* layout = new views::GridLayout(result); | |
106 result->SetLayoutManager(layout); | |
107 layout->SetInsets(top, left, bottom, right); | |
108 views::ColumnSet* cs = layout->AddColumnSet(0); | |
109 cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, | |
110 views::GridLayout::USE_PREF, 0, 0); | |
111 layout->StartRow(0, 0); | |
112 layout->AddView(viewToPad); | |
113 return result; | |
114 } | |
115 | |
83 } // namespace | 116 } // namespace |
84 | 117 |
85 ConstrainedWindowFrameSimple::HeaderViews::HeaderViews( | 118 ConstrainedWindowFrameSimple::HeaderViews::HeaderViews( |
86 views::View* header, | 119 views::View* header, |
87 views::Label* title_label, | 120 views::Label* title_label, |
88 views::Button* close_button) | 121 views::Button* close_button) |
89 : header(header), | 122 : header(header), |
90 title_label(title_label), | 123 title_label(title_label), |
91 close_button(close_button) { | 124 close_button(close_button) { |
92 DCHECK(header); | 125 DCHECK(header); |
93 } | 126 } |
94 | 127 |
95 ConstrainedWindowFrameSimple::ConstrainedWindowFrameSimple( | 128 ConstrainedWindowFrameSimple::ConstrainedWindowFrameSimple( |
96 ConstrainedWindowViews* container) | 129 ConstrainedWindowViews* container) |
97 : container_(container) { | 130 : container_(container), |
131 client_insets_(ConstrainedWindow::kRowPadding, | |
132 ConstrainedWindow::kHorizontalPadding, | |
133 ConstrainedWindow::kVerticalPadding, | |
134 ConstrainedWindow::kHorizontalPadding) { | |
Peter Kasting
2012/10/09 19:31:10
Instead of constructing an Insets member, do somet
Mike Wittman
2012/10/09 22:55:46
This is good advice, but if you go this route plea
please use gerrit instead
2012/10/10 19:12:58
wittman@: Please try the latest patch set on your
please use gerrit instead
2012/10/10 19:12:58
I am using set_border now, but I want to keep |cli
| |
98 container_->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); | 135 container_->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); |
99 | 136 |
100 layout_ = new HeaderLayout(container_); | 137 layout_ = new HeaderLayout(container_, client_insets_.left(), |
138 client_insets_.right()); | |
Peter Kasting
2012/10/09 19:31:10
Nit: Indent even
please use gerrit instead
2012/10/10 19:12:58
Done.
| |
101 SetLayoutManager(layout_); | 139 SetLayoutManager(layout_); |
102 | 140 |
103 SetHeaderView(CreateDefaultHeaderView()); | 141 SetHeaderView(CreateDefaultHeaderView()); |
104 | 142 |
105 set_background(views::Background::CreateSolidBackground( | 143 set_background(views::Background::CreateSolidBackground( |
106 ConstrainedWindow::GetBackgroundColor())); | 144 ConstrainedWindow::GetBackgroundColor())); |
107 } | 145 } |
108 | 146 |
109 ConstrainedWindowFrameSimple::~ConstrainedWindowFrameSimple() { | 147 ConstrainedWindowFrameSimple::~ConstrainedWindowFrameSimple() { |
110 } | 148 } |
111 | 149 |
112 void ConstrainedWindowFrameSimple::SetHeaderView(HeaderViews* header_views) | 150 void ConstrainedWindowFrameSimple::SetHeaderView(HeaderViews* header_views) |
113 { | 151 { |
114 RemoveAllChildViews(true); | 152 RemoveAllChildViews(true); |
115 | 153 |
116 header_views_.reset(header_views); | 154 header_views_.reset(header_views); |
117 | 155 |
118 AddChildView(header_views_->header); | 156 AddChildView(header_views_->header); |
119 } | 157 } |
120 | 158 |
121 HeaderViews* ConstrainedWindowFrameSimple::CreateDefaultHeaderView() { | 159 HeaderViews* ConstrainedWindowFrameSimple::CreateDefaultHeaderView() { |
160 const int kTitleTopPadding = ConstrainedWindow::kTitleTopPadding - | |
161 ConstrainedWindow::kCloseButtonPadding; | |
162 const int kTitleLeftPadding = 0; | |
163 const int kTitleBottomPadding = 0; | |
164 const int kTitleRightPadding = 0; | |
165 | |
122 views::View* header_view = new views::View; | 166 views::View* header_view = new views::View; |
123 | 167 |
124 views::GridLayout* grid_layout = new views::GridLayout(header_view); | 168 views::GridLayout* grid_layout = new views::GridLayout(header_view); |
125 header_view->SetLayoutManager(grid_layout); | 169 header_view->SetLayoutManager(grid_layout); |
126 | 170 |
127 views::ColumnSet* header_cs = grid_layout->AddColumnSet(0); | 171 views::ColumnSet* header_cs = grid_layout->AddColumnSet(0); |
128 header_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, | 172 header_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, |
129 views::GridLayout::USE_PREF, 0, 0); // Title. | 173 views::GridLayout::USE_PREF, 0, 0); // Title. |
130 header_cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); | 174 header_cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); |
131 header_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, | 175 header_cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, |
132 views::GridLayout::USE_PREF, 0, 0); // Close Button. | 176 0, views::GridLayout::USE_PREF, 0, 0); // Close Button. |
133 | 177 |
134 // Header row. | 178 // Header row. |
135 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 179 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
136 grid_layout->StartRow(0, 0); | 180 grid_layout->StartRow(0, 0); |
181 | |
137 views::Label* title_label = new views::Label(); | 182 views::Label* title_label = new views::Label(); |
138 title_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | 183 title_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
139 title_label->SetFont(rb.GetFont(ConstrainedWindow::kTitleFontStyle)); | 184 title_label->SetFont(rb.GetFont(ConstrainedWindow::kTitleFontStyle)); |
140 title_label->SetEnabledColor(ConstrainedWindow::GetTextColor()); | 185 title_label->SetEnabledColor(ConstrainedWindow::GetTextColor()); |
141 title_label->SetText(container_->widget_delegate()->GetWindowTitle()); | 186 title_label->SetText(container_->widget_delegate()->GetWindowTitle()); |
142 grid_layout->AddView(title_label); | 187 grid_layout->AddView(AddPadding(title_label, kTitleTopPadding, |
188 kTitleLeftPadding, kTitleBottomPadding, kTitleRightPadding)); | |
143 | 189 |
144 views::Button* close_button = CreateCloseButton(); | 190 views::Button* close_button = CreateCloseButton(); |
145 grid_layout->AddView(close_button); | 191 grid_layout->AddView(close_button); |
146 | 192 |
147 return new HeaderViews(header_view, title_label, close_button); | 193 return new HeaderViews(header_view, title_label, close_button); |
148 } | 194 } |
149 | 195 |
150 gfx::Rect ConstrainedWindowFrameSimple::GetBoundsForClientView() const { | 196 gfx::Rect ConstrainedWindowFrameSimple::GetBoundsForClientView() const { |
151 int horizontal_padding = ConstrainedWindow::kHorizontalPadding; | |
152 int vertical_padding = ConstrainedWindow::kVerticalPadding; | |
153 int row_padding = ConstrainedWindow::kRowPadding; | |
154 gfx::Size header_size = | 197 gfx::Size header_size = |
Peter Kasting
2012/10/09 19:31:10
Nit: Simpler:
gfx::Rect bounds(GetContentsBound
please use gerrit instead
2012/10/10 19:12:58
Done.
| |
155 header_views_->header ? | 198 header_views_->header ? |
156 header_views_->header->GetPreferredSize() : gfx::Size(); | 199 header_views_->header->GetPreferredSize() : gfx::Size(); |
157 | 200 |
158 return gfx::Rect(horizontal_padding, | 201 int client_x = client_insets_.left(); |
159 vertical_padding + header_size.height() + row_padding, | 202 int client_y = header_size.height() + client_insets_.top(); |
160 std::max(0, width() - 2 * horizontal_padding), | 203 int client_width = width() - client_x - client_insets_.right(); |
161 std::max(0, (height() - 2 * vertical_padding - | 204 int client_height = height() - client_y - client_insets_.bottom(); |
162 header_size.height() - row_padding))); | 205 |
206 client_width = std::max(0, client_width); | |
207 client_height = std::max(0, client_height); | |
208 | |
209 return gfx::Rect(client_x, client_y, client_width, client_height); | |
163 } | 210 } |
164 | 211 |
165 gfx::Rect ConstrainedWindowFrameSimple::GetWindowBoundsForClientBounds( | 212 gfx::Rect ConstrainedWindowFrameSimple::GetWindowBoundsForClientBounds( |
166 const gfx::Rect& client_bounds) const { | 213 const gfx::Rect& client_bounds) const { |
167 int horizontal_padding = ConstrainedWindow::kHorizontalPadding; | |
168 int vertical_padding = ConstrainedWindow::kVerticalPadding; | |
169 int row_padding = ConstrainedWindow::kRowPadding; | |
170 gfx::Size header_size = | 214 gfx::Size header_size = |
Peter Kasting
2012/10/09 19:31:10
Nit: Simplify by rewriting like the function above
please use gerrit instead
2012/10/10 19:12:58
Done.
| |
171 header_views_->header ? | 215 header_views_->header ? |
172 header_views_->header->GetPreferredSize() : gfx::Size(); | 216 header_views_->header->GetPreferredSize() : gfx::Size(); |
173 | 217 |
174 int x = client_bounds.x() - horizontal_padding; | 218 int x = client_bounds.x() - client_insets_.left(); |
175 int y = client_bounds.y() - vertical_padding - header_size.height() - | 219 int y = client_bounds.y() - header_size.height() - client_insets_.top(); |
176 row_padding; | 220 int width = client_bounds.width() + client_insets_.left() + |
177 int width = client_bounds.width() + 2 * horizontal_padding; | 221 client_insets_.right(); |
178 int height = client_bounds.height() + 2 * vertical_padding + | 222 int height = client_bounds.height() + header_size.height() + |
179 header_size.height() + row_padding; | 223 client_insets_.top() + client_insets_.bottom(); |
180 | 224 |
181 return gfx::Rect(x, y, width, height); | 225 return gfx::Rect(x, y, width, height); |
182 } | 226 } |
183 | 227 |
184 int ConstrainedWindowFrameSimple::NonClientHitTest(const gfx::Point& point) { | 228 int ConstrainedWindowFrameSimple::NonClientHitTest(const gfx::Point& point) { |
185 if (!bounds().Contains(point)) | 229 if (!bounds().Contains(point)) |
186 return HTNOWHERE; | 230 return HTNOWHERE; |
187 return HTCLIENT; | 231 return HTCLIENT; |
188 } | 232 } |
189 | 233 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
228 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 272 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
229 views::ImageButton* close_button = new views::ImageButton(this); | 273 views::ImageButton* close_button = new views::ImageButton(this); |
230 close_button->SetImage(views::CustomButton::BS_NORMAL, | 274 close_button->SetImage(views::CustomButton::BS_NORMAL, |
231 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X)); | 275 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X)); |
232 close_button->SetImage(views::CustomButton::BS_HOT, | 276 close_button->SetImage(views::CustomButton::BS_HOT, |
233 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER)); | 277 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER)); |
234 close_button->SetImage(views::CustomButton::BS_PUSHED, | 278 close_button->SetImage(views::CustomButton::BS_PUSHED, |
235 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER)); | 279 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER)); |
236 return close_button; | 280 return close_button; |
237 } | 281 } |
OLD | NEW |