Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: ui/views/window/custom_frame_view.cc

Issue 240163006: Linux Aura Task Manager Frame Buttons Misaligned (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/views/window/custom_frame_view.h ('k') | ui/views/window/custom_frame_view_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/window/custom_frame_view.h" 5 #include "ui/views/window/custom_frame_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "grit/ui_resources.h" 10 #include "grit/ui_resources.h"
11 #include "grit/ui_strings.h" 11 #include "grit/ui_strings.h"
12 #include "ui/base/hit_test.h" 12 #include "ui/base/hit_test.h"
13 #include "ui/base/l10n/l10n_util.h" 13 #include "ui/base/l10n/l10n_util.h"
14 #include "ui/base/resource/resource_bundle.h" 14 #include "ui/base/resource/resource_bundle.h"
15 #include "ui/gfx/canvas.h" 15 #include "ui/gfx/canvas.h"
16 #include "ui/gfx/font.h" 16 #include "ui/gfx/font.h"
17 #include "ui/gfx/image/image.h" 17 #include "ui/gfx/image/image.h"
18 #include "ui/gfx/path.h" 18 #include "ui/gfx/path.h"
19 #include "ui/views/color_constants.h" 19 #include "ui/views/color_constants.h"
20 #include "ui/views/controls/button/image_button.h" 20 #include "ui/views/controls/button/image_button.h"
21
22 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
23 #include "ui/views/linux_ui/linux_ui.h"
24 #endif
25
21 #include "ui/views/views_delegate.h" 26 #include "ui/views/views_delegate.h"
22 #include "ui/views/widget/native_widget_aura.h" 27 #include "ui/views/widget/native_widget_aura.h"
23 #include "ui/views/widget/widget.h" 28 #include "ui/views/widget/widget.h"
24 #include "ui/views/widget/widget_delegate.h" 29 #include "ui/views/widget/widget_delegate.h"
25 #include "ui/views/window/client_view.h" 30 #include "ui/views/window/client_view.h"
26 #include "ui/views/window/frame_background.h" 31 #include "ui/views/window/frame_background.h"
27 #include "ui/views/window/window_resources.h" 32 #include "ui/views/window/window_resources.h"
28 #include "ui/views/window/window_shape.h" 33 #include "ui/views/window/window_shape.h"
29 34
30 namespace views { 35 namespace views {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 // CustomFrameView, public: 78 // CustomFrameView, public:
74 79
75 CustomFrameView::CustomFrameView() 80 CustomFrameView::CustomFrameView()
76 : frame_(NULL), 81 : frame_(NULL),
77 window_icon_(NULL), 82 window_icon_(NULL),
78 minimize_button_(NULL), 83 minimize_button_(NULL),
79 maximize_button_(NULL), 84 maximize_button_(NULL),
80 restore_button_(NULL), 85 restore_button_(NULL),
81 close_button_(NULL), 86 close_button_(NULL),
82 should_show_maximize_button_(false), 87 should_show_maximize_button_(false),
83 frame_background_(new FrameBackground()) { 88 frame_background_(new FrameBackground()),
89 minimum_title_bar_x_(0),
90 maximum_title_bar_x_(INT_MAX) {
flackr 2014/04/25 16:04:18 Rather than initializing this to INT_MAX, since th
jonross 2014/04/29 15:26:04 Done.
91 trailing_buttons_.push_back(views::FRAME_BUTTON_MINIMIZE);
92 trailing_buttons_.push_back(views::FRAME_BUTTON_MAXIMIZE);
93 trailing_buttons_.push_back(views::FRAME_BUTTON_CLOSE);
84 } 94 }
85 95
86 CustomFrameView::~CustomFrameView() { 96 CustomFrameView::~CustomFrameView() {
87 } 97 }
88 98
89 void CustomFrameView::Init(Widget* frame) { 99 void CustomFrameView::Init(Widget* frame) {
90 frame_ = frame; 100 frame_ = frame;
91 101
92 close_button_ = new ImageButton(this); 102 close_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_CLOSE,
93 close_button_->SetAccessibleName( 103 IDR_CLOSE, IDR_CLOSE_H, IDR_CLOSE_P);
94 l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE));
95
96 // Close button images will be set in LayoutWindowControls().
97 AddChildView(close_button_);
98 104
99 minimize_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_MINIMIZE, 105 minimize_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_MINIMIZE,
100 IDR_MINIMIZE, IDR_MINIMIZE_H, IDR_MINIMIZE_P); 106 IDR_MINIMIZE, IDR_MINIMIZE_H, IDR_MINIMIZE_P);
101 107
102 maximize_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_MAXIMIZE, 108 maximize_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_MAXIMIZE,
103 IDR_MAXIMIZE, IDR_MAXIMIZE_H, IDR_MAXIMIZE_P); 109 IDR_MAXIMIZE, IDR_MAXIMIZE_H, IDR_MAXIMIZE_P);
104 110
105 restore_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_RESTORE, 111 restore_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_RESTORE,
106 IDR_RESTORE, IDR_RESTORE_H, IDR_RESTORE_P); 112 IDR_RESTORE, IDR_RESTORE_H, IDR_RESTORE_P);
107 113
108 should_show_maximize_button_ = frame_->widget_delegate()->CanMaximize(); 114 should_show_maximize_button_ = frame_->widget_delegate()->CanMaximize();
109 115
110 if (frame_->widget_delegate()->ShouldShowWindowIcon()) { 116 if (frame_->widget_delegate()->ShouldShowWindowIcon()) {
111 window_icon_ = new ImageButton(this); 117 window_icon_ = new ImageButton(this);
112 AddChildView(window_icon_); 118 AddChildView(window_icon_);
113 } 119 }
120
121 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
122 views::LinuxUI* ui = views::LinuxUI::instance();
123 if (ui)
124 ui->AddWindowButtonOrderObserver(this);
125 #endif
114 } 126 }
115 127
116 /////////////////////////////////////////////////////////////////////////////// 128 ///////////////////////////////////////////////////////////////////////////////
117 // CustomFrameView, NonClientFrameView implementation: 129 // CustomFrameView, NonClientFrameView implementation:
118 130
119 gfx::Rect CustomFrameView::GetBoundsForClientView() const { 131 gfx::Rect CustomFrameView::GetBoundsForClientView() const {
120 return client_view_bounds_; 132 return client_view_bounds_;
121 } 133 }
122 134
123 gfx::Rect CustomFrameView::GetWindowBoundsForClientBounds( 135 gfx::Rect CustomFrameView::GetWindowBoundsForClientBounds(
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 gfx::Size CustomFrameView::GetMaximumSize() { 245 gfx::Size CustomFrameView::GetMaximumSize() {
234 gfx::Size max_size = frame_->client_view()->GetMaximumSize(); 246 gfx::Size max_size = frame_->client_view()->GetMaximumSize();
235 gfx::Size converted_size = 247 gfx::Size converted_size =
236 frame_->non_client_view()->GetWindowBoundsForClientBounds( 248 frame_->non_client_view()->GetWindowBoundsForClientBounds(
237 gfx::Rect(max_size)).size(); 249 gfx::Rect(max_size)).size();
238 return gfx::Size(max_size.width() == 0 ? 0 : converted_size.width(), 250 return gfx::Size(max_size.width() == 0 ? 0 : converted_size.width(),
239 max_size.height() == 0 ? 0 : converted_size.height()); 251 max_size.height() == 0 ? 0 : converted_size.height());
240 } 252 }
241 253
242 /////////////////////////////////////////////////////////////////////////////// 254 ///////////////////////////////////////////////////////////////////////////////
243 // CustomFrameView, ButtonListener implementation: 255 // CustomFrameView, WindowButtonOrderObserver:
256
257 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
258 void CustomFrameView::OnWindowButtonOrderingChange(
259 const std::vector<views::FrameButton>& leading_buttons,
260 const std::vector<views::FrameButton>& trailing_buttons) {
261 leading_buttons_ = leading_buttons;
262 trailing_buttons_ = trailing_buttons;
263 }
264 #endif
265
266 ///////////////////////////////////////////////////////////////////////////////
267 //// CustomFrameView, ButtonListener implementation:
244 268
245 void CustomFrameView::ButtonPressed(Button* sender, const ui::Event& event) { 269 void CustomFrameView::ButtonPressed(Button* sender, const ui::Event& event) {
246 if (sender == close_button_) 270 if (sender == close_button_)
247 frame_->Close(); 271 frame_->Close();
248 else if (sender == minimize_button_) 272 else if (sender == minimize_button_)
249 frame_->Minimize(); 273 frame_->Minimize();
250 else if (sender == maximize_button_) 274 else if (sender == maximize_button_)
251 frame_->Maximize(); 275 frame_->Maximize();
252 else if (sender == restore_button_) 276 else if (sender == restore_button_)
253 frame_->Restore(); 277 frame_->Restore();
(...skipping 14 matching lines...) Expand all
268 292
269 int CustomFrameView::NonClientTopBorderHeight() const { 293 int CustomFrameView::NonClientTopBorderHeight() const {
270 return std::max(FrameBorderThickness() + IconSize(), 294 return std::max(FrameBorderThickness() + IconSize(),
271 CaptionButtonY() + kCaptionButtonHeightWithPadding) + 295 CaptionButtonY() + kCaptionButtonHeightWithPadding) +
272 TitlebarBottomThickness(); 296 TitlebarBottomThickness();
273 } 297 }
274 298
275 int CustomFrameView::CaptionButtonY() const { 299 int CustomFrameView::CaptionButtonY() const {
276 // Maximized buttons start at window top so that even if their images aren't 300 // Maximized buttons start at window top so that even if their images aren't
277 // drawn flush with the screen edge, they still obey Fitts' Law. 301 // drawn flush with the screen edge, they still obey Fitts' Law.
278 return frame_->IsMaximized() ? FrameBorderThickness() : kFrameShadowThickness; 302 return frame_->IsMaximized() ? FrameBorderThickness() : kFrameBorderThickness;
279 } 303 }
280 304
281 int CustomFrameView::TitlebarBottomThickness() const { 305 int CustomFrameView::TitlebarBottomThickness() const {
282 return kTitlebarTopAndBottomEdgeThickness + 306 return kTitlebarTopAndBottomEdgeThickness +
283 (ShouldShowClientEdge() ? kClientEdgeThickness : 0); 307 (ShouldShowClientEdge() ? kClientEdgeThickness : 0);
284 } 308 }
285 309
286 int CustomFrameView::IconSize() const { 310 int CustomFrameView::IconSize() const {
287 #if defined(OS_WIN) 311 #if defined(OS_WIN)
288 // This metric scales up if either the titlebar height or the titlebar font 312 // This metric scales up if either the titlebar height or the titlebar font
(...skipping 17 matching lines...) Expand all
306 // from below the 3D edge. 330 // from below the 3D edge.
307 int unavailable_px_at_top = frame_->IsMaximized() ? 331 int unavailable_px_at_top = frame_->IsMaximized() ?
308 frame_thickness : kTitlebarTopAndBottomEdgeThickness; 332 frame_thickness : kTitlebarTopAndBottomEdgeThickness;
309 // When the icon is shorter than the minimum space we reserve for the caption 333 // When the icon is shorter than the minimum space we reserve for the caption
310 // button, we vertically center it. We want to bias rounding to put extra 334 // button, we vertically center it. We want to bias rounding to put extra
311 // space above the icon, since the 3D edge (+ client edge, for restored 335 // space above the icon, since the 3D edge (+ client edge, for restored
312 // windows) below looks (to the eye) more like additional space than does the 336 // windows) below looks (to the eye) more like additional space than does the
313 // 3D edge (or nothing at all, for maximized windows) above; hence the +1. 337 // 3D edge (or nothing at all, for maximized windows) above; hence the +1.
314 int y = unavailable_px_at_top + (NonClientTopBorderHeight() - 338 int y = unavailable_px_at_top + (NonClientTopBorderHeight() -
315 unavailable_px_at_top - size - TitlebarBottomThickness() + 1) / 2; 339 unavailable_px_at_top - size - TitlebarBottomThickness() + 1) / 2;
316 return gfx::Rect(frame_thickness + kIconLeftSpacing, y, size, size); 340 return gfx::Rect(frame_thickness + kIconLeftSpacing + minimum_title_bar_x_,
341 y, size, size);
317 } 342 }
318 343
319 bool CustomFrameView::ShouldShowTitleBarAndBorder() const { 344 bool CustomFrameView::ShouldShowTitleBarAndBorder() const {
320 if (frame_->IsFullscreen()) 345 if (frame_->IsFullscreen())
321 return false; 346 return false;
322 347
323 if (ViewsDelegate::views_delegate) { 348 if (ViewsDelegate::views_delegate) {
324 return !ViewsDelegate::views_delegate->WindowManagerProvidesTitleBar( 349 return !ViewsDelegate::views_delegate->WindowManagerProvidesTitleBar(
325 frame_->IsMaximized()); 350 frame_->IsMaximized());
326 } 351 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 484
460 SkColor CustomFrameView::GetFrameColor() const { 485 SkColor CustomFrameView::GetFrameColor() const {
461 return frame_->IsActive() ? kDefaultColorFrame : kDefaultColorFrameInactive; 486 return frame_->IsActive() ? kDefaultColorFrame : kDefaultColorFrameInactive;
462 } 487 }
463 488
464 const gfx::ImageSkia* CustomFrameView::GetFrameImage() const { 489 const gfx::ImageSkia* CustomFrameView::GetFrameImage() const {
465 return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 490 return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
466 frame_->IsActive() ? IDR_FRAME : IDR_FRAME_INACTIVE).ToImageSkia(); 491 frame_->IsActive() ? IDR_FRAME : IDR_FRAME_INACTIVE).ToImageSkia();
467 } 492 }
468 493
494 void CustomFrameView::LayoutButton(ImageButton* button, int x, int y) {
495 button->SetVisible(true);
496 button->SetImageAlignment(ImageButton::ALIGN_LEFT,
497 ImageButton::ALIGN_BOTTOM);
498 gfx::Size button_size = button->GetPreferredSize();
499 button->SetBounds(x, y, button_size.width(), button_size.height());
500 }
501
469 void CustomFrameView::LayoutWindowControls() { 502 void CustomFrameView::LayoutWindowControls() {
470 close_button_->SetImageAlignment(ImageButton::ALIGN_LEFT, 503 minimum_title_bar_x_ = 0;
471 ImageButton::ALIGN_BOTTOM); 504 maximum_title_bar_x_ = width();
472 int caption_y = CaptionButtonY(); 505 int caption_y = CaptionButtonY();
473 bool is_maximized = frame_->IsMaximized(); 506 bool is_maximized = frame_->IsMaximized();
474 // There should always be the same number of non-shadow pixels visible to the 507 // There should always be the same number of non-shadow pixels visible to the
475 // side of the caption buttons. In maximized mode we extend the rightmost 508 // side of the caption buttons. In maximized mode we extend the edge button
476 // button to the screen corner to obey Fitts' Law. 509 // to the screen corner to obey Fitts' Law.
477 int right_extra_width = is_maximized ? 510 int extra_width = is_maximized ?
478 (kFrameBorderThickness - kFrameShadowThickness) : 0; 511 (kFrameBorderThickness - kFrameShadowThickness) : 0;
479 gfx::Size close_button_size = close_button_->GetPreferredSize(); 512 int next_button_x = FrameBorderThickness() + extra_width;
480 close_button_->SetBounds(width() - FrameBorderThickness() -
481 right_extra_width - close_button_size.width(), caption_y,
482 close_button_size.width() + right_extra_width,
483 close_button_size.height());
484 513
485 // When the window is restored, we show a maximized button; otherwise, we show
486 // a restore button.
487 bool is_restored = !is_maximized && !frame_->IsMinimized(); 514 bool is_restored = !is_maximized && !frame_->IsMinimized();
488 ImageButton* invisible_button = is_restored ? restore_button_ 515 ImageButton* invisible_button = is_restored ? restore_button_
489 : maximize_button_; 516 : maximize_button_;
490 invisible_button->SetVisible(false); 517 invisible_button->SetVisible(false);
491 518
492 ImageButton* visible_button = is_restored ? maximize_button_ 519 ImageButton* button = NULL;
493 : restore_button_; 520 for (std::vector<views::FrameButton>::const_iterator it =
494 FramePartImage normal_part, hot_part, pushed_part; 521 leading_buttons_.begin(); it != leading_buttons_.end(); ++it) {
495 int next_button_x; 522 button = GetImageButton(*it);
496 if (should_show_maximize_button_) { 523 if (!button)
497 visible_button->SetVisible(true); 524 continue;
498 visible_button->SetImageAlignment(ImageButton::ALIGN_LEFT, 525 LayoutButton(button, next_button_x, caption_y);
499 ImageButton::ALIGN_BOTTOM); 526 next_button_x += button->width();
500 gfx::Size visible_button_size = visible_button->GetPreferredSize(); 527 minimum_title_bar_x_ = next_button_x;
501 visible_button->SetBounds(close_button_->x() - visible_button_size.width(),
502 caption_y, visible_button_size.width(),
503 visible_button_size.height());
504 next_button_x = visible_button->x();
505 } else {
506 visible_button->SetVisible(false);
507 next_button_x = close_button_->x();
508 } 528 }
509 529
510 minimize_button_->SetVisible(true); 530 // Trailing buttions are laid out in a RTL fashion
511 minimize_button_->SetImageAlignment(ImageButton::ALIGN_LEFT, 531 next_button_x = width() - FrameBorderThickness() - extra_width;
512 ImageButton::ALIGN_BOTTOM); 532 for (std::vector<views::FrameButton>::const_reverse_iterator it =
513 gfx::Size minimize_button_size = minimize_button_->GetPreferredSize(); 533 trailing_buttons_.rbegin(); it != trailing_buttons_.rend(); ++it) {
514 minimize_button_->SetBounds( 534 button = GetImageButton(*it);
515 next_button_x - minimize_button_size.width(), caption_y, 535 if (!button)
516 minimize_button_size.width(), 536 continue;
517 minimize_button_size.height()); 537 gfx::Size button_size = button->GetPreferredSize();
518 538 next_button_x -= button_size.width();
519 normal_part = IDR_CLOSE; 539 LayoutButton(button, next_button_x, caption_y);
520 hot_part = IDR_CLOSE_H; 540 next_button_x = button->x();
521 pushed_part = IDR_CLOSE_P; 541 maximum_title_bar_x_ = next_button_x;
522 542 }
523 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
524
525 close_button_->SetImage(CustomButton::STATE_NORMAL,
526 rb.GetImageNamed(normal_part).ToImageSkia());
527 close_button_->SetImage(CustomButton::STATE_HOVERED,
528 rb.GetImageNamed(hot_part).ToImageSkia());
529 close_button_->SetImage(CustomButton::STATE_PRESSED,
530 rb.GetImageNamed(pushed_part).ToImageSkia());
531 } 543 }
532 544
533 void CustomFrameView::LayoutTitleBar() { 545 void CustomFrameView::LayoutTitleBar() {
534 // The window title position is calculated based on the icon position, even 546 // The window title position is calculated based on the icon position, even
535 // when there is no icon. 547 // when there is no icon.
536 gfx::Rect icon_bounds(IconBounds()); 548 gfx::Rect icon_bounds(IconBounds());
537 bool show_window_icon = window_icon_ != NULL; 549 bool show_window_icon = window_icon_ != NULL;
538 if (show_window_icon) 550 if (show_window_icon)
539 window_icon_->SetBoundsRect(icon_bounds); 551 window_icon_->SetBoundsRect(icon_bounds);
540 552
541 // The offset between the window left edge and the title text. 553 // The offset between the window left edge and the title text.
542 int title_x = show_window_icon ? icon_bounds.right() + kTitleIconOffsetX 554 int title_x = show_window_icon ? icon_bounds.right() + kTitleIconOffsetX
543 : icon_bounds.x(); 555 : icon_bounds.x();
544 int title_height = GetTitleFontList().GetHeight(); 556 int title_height = GetTitleFontList().GetHeight();
545 // We bias the title position so that when the difference between the icon and 557 // We bias the title position so that when the difference between the icon and
546 // title heights is odd, the extra pixel of the title is above the vertical 558 // title heights is odd, the extra pixel of the title is above the vertical
547 // midline rather than below. This compensates for how the icon is already 559 // midline rather than below. This compensates for how the icon is already
548 // biased downwards (see IconBounds()) and helps prevent descenders on the 560 // biased downwards (see IconBounds()) and helps prevent descenders on the
549 // title from overlapping the 3D edge at the bottom of the titlebar. 561 // title from overlapping the 3D edge at the bottom of the titlebar.
550 title_bounds_.SetRect(title_x, 562 title_bounds_.SetRect(title_x,
551 icon_bounds.y() + ((icon_bounds.height() - title_height - 1) / 2), 563 icon_bounds.y() + ((icon_bounds.height() - title_height - 1) / 2),
552 std::max(0, minimize_button_->x() - kTitleCaptionSpacing - 564 std::max(0, maximum_title_bar_x_ - kTitleCaptionSpacing -
553 title_x), title_height); 565 title_x), title_height);
554 } 566 }
555 567
556 void CustomFrameView::LayoutClientView() { 568 void CustomFrameView::LayoutClientView() {
557 if (!ShouldShowTitleBarAndBorder()) { 569 if (!ShouldShowTitleBarAndBorder()) {
558 client_view_bounds_ = bounds(); 570 client_view_bounds_ = bounds();
559 return; 571 return;
560 } 572 }
561 573
562 int top_height = NonClientTopBorderHeight(); 574 int top_height = NonClientTopBorderHeight();
(...skipping 14 matching lines...) Expand all
577 button->SetImage(CustomButton::STATE_NORMAL, 589 button->SetImage(CustomButton::STATE_NORMAL,
578 rb.GetImageNamed(normal_image_id).ToImageSkia()); 590 rb.GetImageNamed(normal_image_id).ToImageSkia());
579 button->SetImage(CustomButton::STATE_HOVERED, 591 button->SetImage(CustomButton::STATE_HOVERED,
580 rb.GetImageNamed(hot_image_id).ToImageSkia()); 592 rb.GetImageNamed(hot_image_id).ToImageSkia());
581 button->SetImage(CustomButton::STATE_PRESSED, 593 button->SetImage(CustomButton::STATE_PRESSED,
582 rb.GetImageNamed(pushed_image_id).ToImageSkia()); 594 rb.GetImageNamed(pushed_image_id).ToImageSkia());
583 AddChildView(button); 595 AddChildView(button);
584 return button; 596 return button;
585 } 597 }
586 598
599 ImageButton* CustomFrameView::GetImageButton(views::FrameButton frame_button) {
600 ImageButton* button = NULL;
601 switch (frame_button) {
602 case views::FRAME_BUTTON_MINIMIZE: {
603 button = minimize_button_;
604 break;
605 }
606 case views::FRAME_BUTTON_MAXIMIZE: {
607 bool is_restored = !frame_->IsMaximized() && !frame_->IsMinimized();
608 button = is_restored ? maximize_button_ : restore_button_;
609 if (!should_show_maximize_button_) {
610 button->SetVisible(false);
611 return NULL;
612 }
613 break;
614 }
615 case views::FRAME_BUTTON_CLOSE: {
616 button = close_button_;
617 break;
618 }
619 }
620 return button;
621 }
622
587 } // namespace views 623 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/window/custom_frame_view.h ('k') | ui/views/window/custom_frame_view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698