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/opaque_browser_frame_view.h" | 5 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 23 matching lines...) Expand all Loading... | |
34 #include "ui/base/theme_provider.h" | 34 #include "ui/base/theme_provider.h" |
35 #include "ui/gfx/canvas_skia.h" | 35 #include "ui/gfx/canvas_skia.h" |
36 #include "ui/gfx/font.h" | 36 #include "ui/gfx/font.h" |
37 #include "ui/gfx/image/image.h" | 37 #include "ui/gfx/image/image.h" |
38 #include "ui/gfx/path.h" | 38 #include "ui/gfx/path.h" |
39 #include "ui/views/controls/button/image_button.h" | 39 #include "ui/views/controls/button/image_button.h" |
40 #include "ui/views/controls/image_view.h" | 40 #include "ui/views/controls/image_view.h" |
41 #include "ui/views/widget/root_view.h" | 41 #include "ui/views/widget/root_view.h" |
42 #include "ui/views/window/window_shape.h" | 42 #include "ui/views/window/window_shape.h" |
43 | 43 |
44 #if defined(USE_AURA) | |
45 #include "ui/aura/aura_switches.h" | |
46 #endif | |
47 | |
44 #if defined(USE_VIRTUAL_KEYBOARD) | 48 #if defined(USE_VIRTUAL_KEYBOARD) |
45 #include "chrome/browser/ui/virtual_keyboard/virtual_keyboard_manager.h" | 49 #include "chrome/browser/ui/virtual_keyboard/virtual_keyboard_manager.h" |
46 #endif | 50 #endif |
47 | 51 |
48 namespace { | 52 namespace { |
49 // The frame border is only visible in restored mode and is hardcoded to 4 px on | 53 // The frame border is only visible in restored mode and is hardcoded to 4 px on |
50 // each side regardless of the system window border size. | 54 // each side regardless of the system window border size. |
51 const int kFrameBorderThickness = 4; | 55 const int kFrameBorderThickness = 4; |
52 // Besides the frame border, there's another 11 px of empty space atop the | 56 // Besides the frame border, there's another 11 px of empty space atop the |
53 // window in restored mode, to use to drag the window around. | 57 // window in restored mode, to use to drag the window around. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
123 maximize_button_(new views::ImageButton(this))), | 127 maximize_button_(new views::ImageButton(this))), |
124 ALLOW_THIS_IN_INITIALIZER_LIST( | 128 ALLOW_THIS_IN_INITIALIZER_LIST( |
125 restore_button_(new views::ImageButton(this))), | 129 restore_button_(new views::ImageButton(this))), |
126 ALLOW_THIS_IN_INITIALIZER_LIST( | 130 ALLOW_THIS_IN_INITIALIZER_LIST( |
127 close_button_(new views::ImageButton(this))), | 131 close_button_(new views::ImageButton(this))), |
128 window_icon_(NULL) { | 132 window_icon_(NULL) { |
129 ui::ThemeProvider* tp = frame->GetThemeProvider(); | 133 ui::ThemeProvider* tp = frame->GetThemeProvider(); |
130 SkColor color = tp->GetColor(ThemeService::COLOR_BUTTON_BACKGROUND); | 134 SkColor color = tp->GetColor(ThemeService::COLOR_BUTTON_BACKGROUND); |
131 SkBitmap* background = | 135 SkBitmap* background = |
132 tp->GetBitmapNamed(IDR_THEME_WINDOW_CONTROL_BACKGROUND); | 136 tp->GetBitmapNamed(IDR_THEME_WINDOW_CONTROL_BACKGROUND); |
137 // TODO(jamescook): Refactor button setup into one button setup function. | |
133 minimize_button_->SetImage(views::CustomButton::BS_NORMAL, | 138 minimize_button_->SetImage(views::CustomButton::BS_NORMAL, |
134 tp->GetBitmapNamed(IDR_MINIMIZE)); | 139 tp->GetBitmapNamed(IDR_MINIMIZE)); |
135 minimize_button_->SetImage(views::CustomButton::BS_HOT, | 140 minimize_button_->SetImage(views::CustomButton::BS_HOT, |
136 tp->GetBitmapNamed(IDR_MINIMIZE_H)); | 141 tp->GetBitmapNamed(IDR_MINIMIZE_H)); |
137 minimize_button_->SetImage(views::CustomButton::BS_PUSHED, | 142 minimize_button_->SetImage(views::CustomButton::BS_PUSHED, |
138 tp->GetBitmapNamed(IDR_MINIMIZE_P)); | 143 tp->GetBitmapNamed(IDR_MINIMIZE_P)); |
139 if (browser_view->IsBrowserTypeNormal()) { | 144 if (browser_view->IsBrowserTypeNormal()) { |
140 minimize_button_->SetBackground(color, background, | 145 minimize_button_->SetBackground(color, background, |
141 tp->GetBitmapNamed(IDR_MINIMIZE_BUTTON_MASK)); | 146 tp->GetBitmapNamed(IDR_MINIMIZE_BUTTON_MASK)); |
142 } | 147 } |
143 minimize_button_->SetAccessibleName( | 148 minimize_button_->SetAccessibleName( |
144 l10n_util::GetStringUTF16(IDS_ACCNAME_MINIMIZE)); | 149 l10n_util::GetStringUTF16(IDS_ACCNAME_MINIMIZE)); |
145 AddChildView(minimize_button_); | 150 AddChildView(minimize_button_); |
146 #if defined(USE_AURA) | |
147 // TODO(jamescook): Remove this when Aura uses its own custom window frame, | |
148 // BrowserNonClientFrameViewAura. Layout code depends on this button's | |
149 // position, so just hide it. | |
150 minimize_button_->SetVisible(false); | |
151 #endif | |
152 | 151 |
153 maximize_button_->SetImage(views::CustomButton::BS_NORMAL, | 152 maximize_button_->SetImage(views::CustomButton::BS_NORMAL, |
154 tp->GetBitmapNamed(IDR_MAXIMIZE)); | 153 tp->GetBitmapNamed(IDR_MAXIMIZE)); |
155 maximize_button_->SetImage(views::CustomButton::BS_HOT, | 154 maximize_button_->SetImage(views::CustomButton::BS_HOT, |
156 tp->GetBitmapNamed(IDR_MAXIMIZE_H)); | 155 tp->GetBitmapNamed(IDR_MAXIMIZE_H)); |
157 maximize_button_->SetImage(views::CustomButton::BS_PUSHED, | 156 maximize_button_->SetImage(views::CustomButton::BS_PUSHED, |
158 tp->GetBitmapNamed(IDR_MAXIMIZE_P)); | 157 tp->GetBitmapNamed(IDR_MAXIMIZE_P)); |
159 if (browser_view->IsBrowserTypeNormal()) { | 158 if (browser_view->IsBrowserTypeNormal()) { |
160 maximize_button_->SetBackground(color, background, | 159 maximize_button_->SetBackground(color, background, |
161 tp->GetBitmapNamed(IDR_MAXIMIZE_BUTTON_MASK)); | 160 tp->GetBitmapNamed(IDR_MAXIMIZE_BUTTON_MASK)); |
(...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1014 // side of the caption buttons. In maximized mode we extend the rightmost | 1013 // side of the caption buttons. In maximized mode we extend the rightmost |
1015 // button to the screen corner to obey Fitts' Law. | 1014 // button to the screen corner to obey Fitts' Law. |
1016 int right_extra_width = is_maximized ? | 1015 int right_extra_width = is_maximized ? |
1017 (kFrameBorderThickness - kFrameShadowThickness) : 0; | 1016 (kFrameBorderThickness - kFrameShadowThickness) : 0; |
1018 gfx::Size close_button_size = close_button_->GetPreferredSize(); | 1017 gfx::Size close_button_size = close_button_->GetPreferredSize(); |
1019 close_button_->SetBounds(width() - FrameBorderThickness(false) - | 1018 close_button_->SetBounds(width() - FrameBorderThickness(false) - |
1020 right_extra_width - close_button_size.width(), caption_y, | 1019 right_extra_width - close_button_size.width(), caption_y, |
1021 close_button_size.width() + right_extra_width, | 1020 close_button_size.width() + right_extra_width, |
1022 close_button_size.height()); | 1021 close_button_size.height()); |
1023 | 1022 |
1024 #if defined(OS_CHROMEOS) && !defined(USE_AURA) | 1023 // Both ChromeOS and Aura laptop mode use a single main window. |
1025 // LayoutWindowControls could be triggered from | 1024 bool single_window_mode = false; |
1026 // NativeWidgetGtk::UpdateWindowTitle(), which could happen when user | 1025 #if defined(USE_AURA) |
sky
2011/12/12 15:46:29
How about a IsSingleWindow() on BrowserFrame?
James Cook
2011/12/12 18:33:36
Oh, good idea! Done.
| |
1027 // navigates in fullscreen mode. And because | 1026 single_window_mode = |
1028 // BrowserFrameChromeos::IsMaximized() return false for fullscreen mode, we | 1027 CommandLine::ForCurrentProcess()->HasSwitch(switches::kAuraLaptopMode); |
1029 // explicitly test fullscreen mode here and make it use the same code path | 1028 #elif defined(OS_CHROMEOS) |
1030 // as maximized mode. | 1029 single_window_mode = true; |
1031 // TODO(oshima): Optimize the relayout logic to defer the frame view's | 1030 #endif |
1032 // relayout until it is necessary, i.e when it becomes visible. | 1031 if (single_window_mode) { |
1033 if (is_maximized || frame()->IsFullscreen()) { | 1032 // LayoutWindowControls could be triggered from |
1034 minimize_button_->SetVisible(false); | 1033 // NativeWidgetGtk::UpdateWindowTitle(), which could happen when user |
1035 restore_button_->SetVisible(false); | 1034 // navigates in fullscreen mode. And because |
1036 maximize_button_->SetVisible(false); | 1035 // BrowserFrameChromeos::IsMaximized() return false for fullscreen mode, we |
1036 // explicitly test fullscreen mode here and make it use the same code path | |
1037 // as maximized mode. | |
1038 // TODO(oshima): Optimize the relayout logic to defer the frame view's | |
1039 // relayout until it is necessary, i.e when it becomes visible. | |
1040 if (is_maximized || frame()->IsFullscreen()) { | |
1041 minimize_button_->SetVisible(false); | |
1042 restore_button_->SetVisible(false); | |
1043 maximize_button_->SetVisible(false); | |
1037 | 1044 |
1038 if (browser_view()->browser()->is_devtools()) { | 1045 if (browser_view()->browser()->is_devtools()) { |
1039 close_button_->SetVisible(true); | 1046 close_button_->SetVisible(true); |
1040 minimize_button_->SetBounds(close_button_->bounds().x(), 0, 0, 0); | 1047 minimize_button_->SetBounds(close_button_->bounds().x(), 0, 0, 0); |
1041 } else { | 1048 } else { |
1042 close_button_->SetVisible(false); | 1049 close_button_->SetVisible(false); |
1043 // Set the bounds of the minimize button so that we don't have to change | 1050 // Set the bounds of the minimize button so that we don't have to change |
1044 // other places that rely on the bounds. Put it slightly to the right | 1051 // other places that rely on the bounds. Put it slightly to the right |
1045 // of the edge of the view, so that when we remove the spacing it lines | 1052 // of the edge of the view, so that when we remove the spacing it lines |
1046 // up with the edge. | 1053 // up with the edge. |
1047 minimize_button_->SetBounds(width() - FrameBorderThickness(false) + | 1054 minimize_button_->SetBounds(width() - FrameBorderThickness(false) + |
1048 kNewTabCaptionMaximizedSpacing, 0, 0, 0); | 1055 kNewTabCaptionMaximizedSpacing, 0, 0, 0); |
1056 } | |
1057 return; | |
1049 } | 1058 } |
1050 | |
1051 return; | |
1052 } else { | |
1053 close_button_->SetVisible(true); | 1059 close_button_->SetVisible(true); |
1054 } | 1060 } |
1055 #endif | |
1056 | 1061 |
1057 // When the window is restored, we show a maximized button; otherwise, we show | 1062 // When the window is restored, we show a maximized button; otherwise, we show |
1058 // a restore button. | 1063 // a restore button. |
1059 bool is_restored = !is_maximized && !frame()->IsMinimized(); | 1064 bool is_restored = !is_maximized && !frame()->IsMinimized(); |
1060 views::ImageButton* invisible_button = is_restored ? | 1065 views::ImageButton* invisible_button = is_restored ? |
1061 restore_button_ : maximize_button_; | 1066 restore_button_ : maximize_button_; |
1062 invisible_button->SetVisible(false); | 1067 invisible_button->SetVisible(false); |
1063 | 1068 |
1064 views::ImageButton* visible_button = is_restored ? | 1069 views::ImageButton* visible_button = is_restored ? |
1065 maximize_button_ : restore_button_; | 1070 maximize_button_ : restore_button_; |
1066 visible_button->SetVisible(true); | 1071 visible_button->SetVisible(true); |
1067 visible_button->SetImageAlignment(views::ImageButton::ALIGN_LEFT, | 1072 visible_button->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
1068 views::ImageButton::ALIGN_BOTTOM); | 1073 views::ImageButton::ALIGN_BOTTOM); |
1069 gfx::Size visible_button_size = visible_button->GetPreferredSize(); | 1074 gfx::Size visible_button_size = visible_button->GetPreferredSize(); |
1070 visible_button->SetBounds(close_button_->x() - visible_button_size.width(), | 1075 visible_button->SetBounds(close_button_->x() - visible_button_size.width(), |
1071 caption_y, visible_button_size.width(), | 1076 caption_y, visible_button_size.width(), |
1072 visible_button_size.height()); | 1077 visible_button_size.height()); |
1073 | 1078 |
1074 #if !defined(USE_AURA) | 1079 #if defined(USE_AURA) |
1075 // TODO(jamescook): Go back to showing minimize button when Aura uses its | 1080 // TODO(jamescook): Go back to showing minimize button when Aura uses its |
1076 // own custom window frame, BrowserNonClientFrameViewAura. | 1081 // own custom window frame, BrowserNonClientFrameViewAura. |
1082 minimize_button_->SetVisible(false); | |
1083 #else | |
1077 minimize_button_->SetVisible(true); | 1084 minimize_button_->SetVisible(true); |
1078 #endif | 1085 #endif |
1079 minimize_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, | 1086 minimize_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
1080 views::ImageButton::ALIGN_BOTTOM); | 1087 views::ImageButton::ALIGN_BOTTOM); |
1081 gfx::Size minimize_button_size = minimize_button_->GetPreferredSize(); | 1088 gfx::Size minimize_button_size = minimize_button_->GetPreferredSize(); |
1082 minimize_button_->SetBounds( | 1089 minimize_button_->SetBounds( |
1083 visible_button->x() - minimize_button_size.width(), caption_y, | 1090 visible_button->x() - minimize_button_size.width(), caption_y, |
1084 minimize_button_size.width(), | 1091 minimize_button_size.width(), |
1085 minimize_button_size.height()); | 1092 minimize_button_size.height()); |
1086 } | 1093 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1132 | 1139 |
1133 gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, | 1140 gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, |
1134 int height) const { | 1141 int height) const { |
1135 int top_height = NonClientTopBorderHeight(false); | 1142 int top_height = NonClientTopBorderHeight(false); |
1136 int border_thickness = NonClientBorderThickness(); | 1143 int border_thickness = NonClientBorderThickness(); |
1137 return gfx::Rect(border_thickness, top_height, | 1144 return gfx::Rect(border_thickness, top_height, |
1138 std::max(0, width - (2 * border_thickness)), | 1145 std::max(0, width - (2 * border_thickness)), |
1139 std::max(0, height - GetReservedHeight() - | 1146 std::max(0, height - GetReservedHeight() - |
1140 top_height - border_thickness)); | 1147 top_height - border_thickness)); |
1141 } | 1148 } |
OLD | NEW |