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 "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/browser/prefs/pref_service.h" | 10 #include "chrome/browser/prefs/pref_service.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 minimize_button_(new views::ImageButton(this))), | 131 minimize_button_(new views::ImageButton(this))), |
132 ALLOW_THIS_IN_INITIALIZER_LIST( | 132 ALLOW_THIS_IN_INITIALIZER_LIST( |
133 maximize_button_(new views::ImageButton(this))), | 133 maximize_button_(new views::ImageButton(this))), |
134 ALLOW_THIS_IN_INITIALIZER_LIST( | 134 ALLOW_THIS_IN_INITIALIZER_LIST( |
135 restore_button_(new views::ImageButton(this))), | 135 restore_button_(new views::ImageButton(this))), |
136 ALLOW_THIS_IN_INITIALIZER_LIST( | 136 ALLOW_THIS_IN_INITIALIZER_LIST( |
137 close_button_(new views::ImageButton(this))), | 137 close_button_(new views::ImageButton(this))), |
138 window_icon_(NULL), | 138 window_icon_(NULL), |
139 frame_(frame), | 139 frame_(frame), |
140 browser_view_(browser_view) { | 140 browser_view_(browser_view) { |
141 ui::ThemeProvider* tp = frame_->GetThemeProviderForFrame(); | 141 ui::ThemeProvider* tp = frame_->GetThemeProvider(); |
142 SkColor color = tp->GetColor(ThemeService::COLOR_BUTTON_BACKGROUND); | 142 SkColor color = tp->GetColor(ThemeService::COLOR_BUTTON_BACKGROUND); |
143 SkBitmap* background = | 143 SkBitmap* background = |
144 tp->GetBitmapNamed(IDR_THEME_WINDOW_CONTROL_BACKGROUND); | 144 tp->GetBitmapNamed(IDR_THEME_WINDOW_CONTROL_BACKGROUND); |
145 minimize_button_->SetImage(views::CustomButton::BS_NORMAL, | 145 minimize_button_->SetImage(views::CustomButton::BS_NORMAL, |
146 tp->GetBitmapNamed(IDR_MINIMIZE)); | 146 tp->GetBitmapNamed(IDR_MINIMIZE)); |
147 minimize_button_->SetImage(views::CustomButton::BS_HOT, | 147 minimize_button_->SetImage(views::CustomButton::BS_HOT, |
148 tp->GetBitmapNamed(IDR_MINIMIZE_H)); | 148 tp->GetBitmapNamed(IDR_MINIMIZE_H)); |
149 minimize_button_->SetImage(views::CustomButton::BS_PUSHED, | 149 minimize_button_->SetImage(views::CustomButton::BS_PUSHED, |
150 tp->GetBitmapNamed(IDR_MINIMIZE_P)); | 150 tp->GetBitmapNamed(IDR_MINIMIZE_P)); |
151 if (browser_view_->IsBrowserTypeNormal()) { | 151 if (browser_view_->IsBrowserTypeNormal()) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 return gfx::Rect( | 236 return gfx::Rect( |
237 client_view_bounds.x(), | 237 client_view_bounds.x(), |
238 client_view_bounds.y() + client_view_bounds.height(), | 238 client_view_bounds.y() + client_view_bounds.height(), |
239 client_view_bounds.width(), | 239 client_view_bounds.width(), |
240 GetReservedHeight()); | 240 GetReservedHeight()); |
241 } | 241 } |
242 | 242 |
243 int OpaqueBrowserFrameView::NonClientTopBorderHeight( | 243 int OpaqueBrowserFrameView::NonClientTopBorderHeight( |
244 bool restored, | 244 bool restored, |
245 bool ignore_vertical_tabs) const { | 245 bool ignore_vertical_tabs) const { |
246 views::Window* window = frame_->GetWindow(); | 246 views::WindowDelegate* delegate = frame_->window_delegate(); |
247 views::WindowDelegate* delegate = window->window_delegate(); | |
248 // |delegate| may be NULL if called from callback of InputMethodChanged while | 247 // |delegate| may be NULL if called from callback of InputMethodChanged while |
249 // a window is being destroyed. | 248 // a window is being destroyed. |
250 // See more discussion at http://crosbug.com/8958 | 249 // See more discussion at http://crosbug.com/8958 |
251 if ((delegate && delegate->ShouldShowWindowTitle()) || | 250 if ((delegate && delegate->ShouldShowWindowTitle()) || |
252 (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs && | 251 (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs && |
253 browser_view_->UseVerticalTabs())) { | 252 browser_view_->UseVerticalTabs())) { |
254 return std::max(FrameBorderThickness(restored) + IconSize(), | 253 return std::max(FrameBorderThickness(restored) + IconSize(), |
255 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + | 254 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + |
256 TitlebarBottomThickness(restored); | 255 TitlebarBottomThickness(restored); |
257 } | 256 } |
258 | 257 |
259 return FrameBorderThickness(restored) - | 258 return FrameBorderThickness(restored) - |
260 ((browser_view_->IsTabStripVisible() && !restored && | 259 ((browser_view_->IsTabStripVisible() && !restored && |
261 window->IsMaximized()) ? kTabstripTopShadowThickness : 0); | 260 frame_->IsMaximized()) ? kTabstripTopShadowThickness : 0); |
262 } | 261 } |
263 | 262 |
264 /////////////////////////////////////////////////////////////////////////////// | 263 /////////////////////////////////////////////////////////////////////////////// |
265 // OpaqueBrowserFrameView, BrowserNonClientFrameView implementation: | 264 // OpaqueBrowserFrameView, BrowserNonClientFrameView implementation: |
266 | 265 |
267 gfx::Rect OpaqueBrowserFrameView::GetBoundsForTabStrip( | 266 gfx::Rect OpaqueBrowserFrameView::GetBoundsForTabStrip( |
268 views::View* tabstrip) const { | 267 views::View* tabstrip) const { |
269 if (!tabstrip) { | 268 if (!tabstrip) { |
270 return gfx::Rect(); | 269 return gfx::Rect(); |
271 } | 270 } |
272 | 271 |
273 if (browser_view_->UseVerticalTabs()) { | 272 if (browser_view_->UseVerticalTabs()) { |
274 gfx::Size ps = tabstrip->GetPreferredSize(); | 273 gfx::Size ps = tabstrip->GetPreferredSize(); |
275 return gfx::Rect(NonClientBorderThickness(), | 274 return gfx::Rect(NonClientBorderThickness(), |
276 NonClientTopBorderHeight(false, false), ps.width(), | 275 NonClientTopBorderHeight(false, false), ps.width(), |
277 browser_view_->height()); | 276 browser_view_->height()); |
278 } | 277 } |
279 | 278 |
280 int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ? | 279 int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ? |
281 (otr_avatar_bounds_.right() + kOTRSideSpacing) : | 280 (otr_avatar_bounds_.right() + kOTRSideSpacing) : |
282 NonClientBorderThickness() + kTabStripIndent; | 281 NonClientBorderThickness() + kTabStripIndent; |
283 | 282 |
284 int maximized_spacing = | 283 int maximized_spacing = |
285 kNewTabCaptionMaximizedSpacing + | 284 kNewTabCaptionMaximizedSpacing + |
286 (show_profile_button() && profile_button_->IsVisible() ? | 285 (show_profile_button() && profile_button_->IsVisible() ? |
287 profile_button_->GetPreferredSize().width() + | 286 profile_button_->GetPreferredSize().width() + |
288 ProfileMenuButton::kProfileTagHorizontalSpacing : 0); | 287 ProfileMenuButton::kProfileTagHorizontalSpacing : 0); |
289 int tabstrip_width = minimize_button_->x() - tabstrip_x - | 288 int tabstrip_width = minimize_button_->x() - tabstrip_x - |
290 (frame_->GetWindow()->IsMaximized() ? | 289 (frame_->IsMaximized() ? |
291 maximized_spacing : kNewTabCaptionRestoredSpacing); | 290 maximized_spacing : kNewTabCaptionRestoredSpacing); |
292 int tabstrip_height = 0; | 291 int tabstrip_height = 0; |
293 if (tabstrip) | 292 if (tabstrip) |
294 tabstrip_height = tabstrip->GetPreferredSize().height(); | 293 tabstrip_height = tabstrip->GetPreferredSize().height(); |
295 return gfx::Rect(tabstrip_x, GetHorizontalTabStripVerticalOffset(false), | 294 return gfx::Rect(tabstrip_x, GetHorizontalTabStripVerticalOffset(false), |
296 std::max(0, tabstrip_width), tabstrip_height); | 295 std::max(0, tabstrip_width), tabstrip_height); |
297 } | 296 } |
298 | 297 |
299 int OpaqueBrowserFrameView::GetHorizontalTabStripVerticalOffset( | 298 int OpaqueBrowserFrameView::GetHorizontalTabStripVerticalOffset( |
300 bool restored) const { | 299 bool restored) const { |
301 return NonClientTopBorderHeight(restored, true) + ((!restored && | 300 return NonClientTopBorderHeight(restored, true) + ((!restored && |
302 (frame_->GetWindow()->IsMaximized() || | 301 (frame_->IsMaximized() || |
303 frame_->GetWindow()->IsFullscreen())) ? | 302 frame_->IsFullscreen())) ? |
304 0 : kNonClientRestoredExtraThickness); | 303 0 : kNonClientRestoredExtraThickness); |
305 } | 304 } |
306 | 305 |
307 void OpaqueBrowserFrameView::UpdateThrobber(bool running) { | 306 void OpaqueBrowserFrameView::UpdateThrobber(bool running) { |
308 if (window_icon_) | 307 if (window_icon_) |
309 window_icon_->Update(); | 308 window_icon_->Update(); |
310 } | 309 } |
311 | 310 |
312 gfx::Size OpaqueBrowserFrameView::GetMinimumSize() { | 311 gfx::Size OpaqueBrowserFrameView::GetMinimumSize() { |
313 gfx::Size min_size(browser_view_->GetMinimumSize()); | 312 gfx::Size min_size(browser_view_->GetMinimumSize()); |
314 int border_thickness = NonClientBorderThickness(); | 313 int border_thickness = NonClientBorderThickness(); |
315 min_size.Enlarge(2 * border_thickness, | 314 min_size.Enlarge(2 * border_thickness, |
316 NonClientTopBorderHeight(false, false) + border_thickness); | 315 NonClientTopBorderHeight(false, false) + border_thickness); |
317 | 316 |
318 views::WindowDelegate* delegate = frame_->GetWindow()->window_delegate(); | 317 views::WindowDelegate* delegate = frame_->window_delegate(); |
319 int min_titlebar_width = (2 * FrameBorderThickness(false)) + | 318 int min_titlebar_width = (2 * FrameBorderThickness(false)) + |
320 kIconLeftSpacing + | 319 kIconLeftSpacing + |
321 (delegate && delegate->ShouldShowWindowIcon() ? | 320 (delegate && delegate->ShouldShowWindowIcon() ? |
322 (IconSize() + kTitleLogoSpacing) : 0); | 321 (IconSize() + kTitleLogoSpacing) : 0); |
323 #if !defined(OS_CHROMEOS) | 322 #if !defined(OS_CHROMEOS) |
324 min_titlebar_width += | 323 min_titlebar_width += |
325 minimize_button_->GetMinimumSize().width() + | 324 minimize_button_->GetMinimumSize().width() + |
326 restore_button_->GetMinimumSize().width() + | 325 restore_button_->GetMinimumSize().width() + |
327 close_button_->GetMinimumSize().width(); | 326 close_button_->GetMinimumSize().width(); |
328 #endif | 327 #endif |
(...skipping 24 matching lines...) Expand all Loading... |
353 std::max(0, client_bounds.y() - top_height), | 352 std::max(0, client_bounds.y() - top_height), |
354 client_bounds.width() + (2 * border_thickness), | 353 client_bounds.width() + (2 * border_thickness), |
355 client_bounds.height() + top_height + border_thickness); | 354 client_bounds.height() + top_height + border_thickness); |
356 } | 355 } |
357 | 356 |
358 int OpaqueBrowserFrameView::NonClientHitTest(const gfx::Point& point) { | 357 int OpaqueBrowserFrameView::NonClientHitTest(const gfx::Point& point) { |
359 if (!bounds().Contains(point)) | 358 if (!bounds().Contains(point)) |
360 return HTNOWHERE; | 359 return HTNOWHERE; |
361 | 360 |
362 int frame_component = | 361 int frame_component = |
363 frame_->GetWindow()->client_view()->NonClientHitTest(point); | 362 frame_->client_view()->NonClientHitTest(point); |
364 | 363 |
365 // See if we're in the sysmenu region. We still have to check the tabstrip | 364 // See if we're in the sysmenu region. We still have to check the tabstrip |
366 // first so that clicks in a tab don't get treated as sysmenu clicks. | 365 // first so that clicks in a tab don't get treated as sysmenu clicks. |
367 gfx::Rect sysmenu_rect(IconBounds()); | 366 gfx::Rect sysmenu_rect(IconBounds()); |
368 // In maximized mode we extend the rect to the screen corner to take advantage | 367 // In maximized mode we extend the rect to the screen corner to take advantage |
369 // of Fitts' Law. | 368 // of Fitts' Law. |
370 if (frame_->GetWindow()->IsMaximized()) | 369 if (frame_->IsMaximized()) |
371 sysmenu_rect.SetRect(0, 0, sysmenu_rect.right(), sysmenu_rect.bottom()); | 370 sysmenu_rect.SetRect(0, 0, sysmenu_rect.right(), sysmenu_rect.bottom()); |
372 sysmenu_rect.set_x(GetMirroredXForRect(sysmenu_rect)); | 371 sysmenu_rect.set_x(GetMirroredXForRect(sysmenu_rect)); |
373 if (sysmenu_rect.Contains(point)) | 372 if (sysmenu_rect.Contains(point)) |
374 return (frame_component == HTCLIENT) ? HTCLIENT : HTSYSMENU; | 373 return (frame_component == HTCLIENT) ? HTCLIENT : HTSYSMENU; |
375 | 374 |
376 if (frame_component != HTNOWHERE) | 375 if (frame_component != HTNOWHERE) |
377 return frame_component; | 376 return frame_component; |
378 | 377 |
379 // Then see if the point is within any of the window controls. | 378 // Then see if the point is within any of the window controls. |
380 if (close_button_->IsVisible() && | 379 if (close_button_->IsVisible() && |
381 close_button_->GetMirroredBounds().Contains(point)) | 380 close_button_->GetMirroredBounds().Contains(point)) |
382 return HTCLOSE; | 381 return HTCLOSE; |
383 if (restore_button_->IsVisible() && | 382 if (restore_button_->IsVisible() && |
384 restore_button_->GetMirroredBounds().Contains(point)) | 383 restore_button_->GetMirroredBounds().Contains(point)) |
385 return HTMAXBUTTON; | 384 return HTMAXBUTTON; |
386 if (maximize_button_->IsVisible() && | 385 if (maximize_button_->IsVisible() && |
387 maximize_button_->GetMirroredBounds().Contains(point)) | 386 maximize_button_->GetMirroredBounds().Contains(point)) |
388 return HTMAXBUTTON; | 387 return HTMAXBUTTON; |
389 if (minimize_button_->IsVisible() && | 388 if (minimize_button_->IsVisible() && |
390 minimize_button_->GetMirroredBounds().Contains(point)) | 389 minimize_button_->GetMirroredBounds().Contains(point)) |
391 return HTMINBUTTON; | 390 return HTMINBUTTON; |
392 | 391 |
393 // See if the point is within the profile menu button. | 392 // See if the point is within the profile menu button. |
394 if (show_profile_button() && profile_button_->IsVisible() && | 393 if (show_profile_button() && profile_button_->IsVisible() && |
395 profile_button_->GetMirroredBounds().Contains(point)) | 394 profile_button_->GetMirroredBounds().Contains(point)) |
396 return HTCLIENT; | 395 return HTCLIENT; |
397 | 396 |
398 views::WindowDelegate* delegate = frame_->GetWindow()->window_delegate(); | 397 views::WindowDelegate* delegate = frame_->window_delegate(); |
399 if (!delegate) { | 398 if (!delegate) { |
400 LOG(WARNING) << "delegate is NULL, returning safe default."; | 399 LOG(WARNING) << "delegate is NULL, returning safe default."; |
401 return HTCAPTION; | 400 return HTCAPTION; |
402 } | 401 } |
403 int window_component = GetHTComponentForFrame(point, TopResizeHeight(), | 402 int window_component = GetHTComponentForFrame(point, TopResizeHeight(), |
404 NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, | 403 NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, |
405 delegate->CanResize()); | 404 delegate->CanResize()); |
406 // Fall back to the caption if no other component matches. | 405 // Fall back to the caption if no other component matches. |
407 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; | 406 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; |
408 } | 407 } |
409 | 408 |
410 void OpaqueBrowserFrameView::GetWindowMask(const gfx::Size& size, | 409 void OpaqueBrowserFrameView::GetWindowMask(const gfx::Size& size, |
411 gfx::Path* window_mask) { | 410 gfx::Path* window_mask) { |
412 DCHECK(window_mask); | 411 DCHECK(window_mask); |
413 | 412 |
414 if (frame_->GetWindow()->IsMaximized() || frame_->GetWindow()->IsFullscreen()) | 413 if (frame_->IsMaximized() || frame_->IsFullscreen()) |
415 return; | 414 return; |
416 | 415 |
417 views::GetDefaultWindowMask(size, window_mask); | 416 views::GetDefaultWindowMask(size, window_mask); |
418 } | 417 } |
419 | 418 |
420 void OpaqueBrowserFrameView::EnableClose(bool enable) { | 419 void OpaqueBrowserFrameView::EnableClose(bool enable) { |
421 close_button_->SetEnabled(enable); | 420 close_button_->SetEnabled(enable); |
422 } | 421 } |
423 | 422 |
424 void OpaqueBrowserFrameView::ResetWindowControls() { | 423 void OpaqueBrowserFrameView::ResetWindowControls() { |
(...skipping 15 matching lines...) Expand all Loading... |
440 profile_menu_model_.reset(new ProfileMenuModel); | 439 profile_menu_model_.reset(new ProfileMenuModel); |
441 gfx::Point menu_point(pt.x(), | 440 gfx::Point menu_point(pt.x(), |
442 pt.y() + kMenuDisplayOffset); | 441 pt.y() + kMenuDisplayOffset); |
443 profile_menu_model_->RunMenuAt(menu_point); | 442 profile_menu_model_->RunMenuAt(menu_point); |
444 } | 443 } |
445 | 444 |
446 /////////////////////////////////////////////////////////////////////////////// | 445 /////////////////////////////////////////////////////////////////////////////// |
447 // OpaqueBrowserFrameView, views::View overrides: | 446 // OpaqueBrowserFrameView, views::View overrides: |
448 | 447 |
449 void OpaqueBrowserFrameView::OnPaint(gfx::Canvas* canvas) { | 448 void OpaqueBrowserFrameView::OnPaint(gfx::Canvas* canvas) { |
450 views::Window* window = frame_->GetWindow(); | 449 if (frame_->IsFullscreen()) |
451 if (window->IsFullscreen()) | |
452 return; // Nothing is visible, so don't bother to paint. | 450 return; // Nothing is visible, so don't bother to paint. |
453 | 451 |
454 if (window->IsMaximized()) | 452 if (frame_->IsMaximized()) |
455 PaintMaximizedFrameBorder(canvas); | 453 PaintMaximizedFrameBorder(canvas); |
456 else | 454 else |
457 PaintRestoredFrameBorder(canvas); | 455 PaintRestoredFrameBorder(canvas); |
458 PaintTitleBar(canvas); | 456 PaintTitleBar(canvas); |
459 if (browser_view_->IsToolbarVisible() || | 457 if (browser_view_->IsToolbarVisible() || |
460 browser_view_->UseCompactNavigationBar()) | 458 browser_view_->UseCompactNavigationBar()) |
461 PaintToolbarBackground(canvas); | 459 PaintToolbarBackground(canvas); |
462 if (browser_view_->ShouldShowOffTheRecordAvatar()) | 460 if (browser_view_->ShouldShowOffTheRecordAvatar()) |
463 PaintOTRAvatar(canvas); | 461 PaintOTRAvatar(canvas); |
464 if (!window->IsMaximized()) | 462 if (!frame_->IsMaximized()) |
465 PaintRestoredClientEdge(canvas); | 463 PaintRestoredClientEdge(canvas); |
466 } | 464 } |
467 | 465 |
468 void OpaqueBrowserFrameView::Layout() { | 466 void OpaqueBrowserFrameView::Layout() { |
469 LayoutWindowControls(); | 467 LayoutWindowControls(); |
470 LayoutTitleBar(); | 468 LayoutTitleBar(); |
471 LayoutOTRAvatar(); | 469 LayoutOTRAvatar(); |
472 LayoutProfileTag(); | 470 LayoutProfileTag(); |
473 client_view_bounds_ = CalculateClientAreaBounds(width(), height()); | 471 client_view_bounds_ = CalculateClientAreaBounds(width(), height()); |
474 } | 472 } |
475 | 473 |
476 bool OpaqueBrowserFrameView::HitTest(const gfx::Point& l) const { | 474 bool OpaqueBrowserFrameView::HitTest(const gfx::Point& l) const { |
477 // If the point is outside the bounds of the client area, claim it. | 475 // If the point is outside the bounds of the client area, claim it. |
478 bool in_nonclient = NonClientFrameView::HitTest(l); | 476 bool in_nonclient = NonClientFrameView::HitTest(l); |
479 if (in_nonclient) | 477 if (in_nonclient) |
480 return in_nonclient; | 478 return in_nonclient; |
481 | 479 |
482 // Otherwise claim it only if it's in a non-tab portion of the tabstrip. | 480 // Otherwise claim it only if it's in a non-tab portion of the tabstrip. |
483 bool vertical_tabs = browser_view_->UseVerticalTabs(); | 481 bool vertical_tabs = browser_view_->UseVerticalTabs(); |
484 gfx::Rect tabstrip_bounds = GetBoundsForTabStrip(browser_view_->tabstrip()); | 482 gfx::Rect tabstrip_bounds = GetBoundsForTabStrip(browser_view_->tabstrip()); |
485 gfx::Point tabstrip_origin(tabstrip_bounds.origin()); | 483 gfx::Point tabstrip_origin(tabstrip_bounds.origin()); |
486 View::ConvertPointToView(frame_->GetWindow()->client_view(), | 484 View::ConvertPointToView(frame_->client_view(), this, &tabstrip_origin); |
487 this, &tabstrip_origin); | |
488 tabstrip_bounds.set_origin(tabstrip_origin); | 485 tabstrip_bounds.set_origin(tabstrip_origin); |
489 if ((!vertical_tabs && l.y() > tabstrip_bounds.bottom()) || | 486 if ((!vertical_tabs && l.y() > tabstrip_bounds.bottom()) || |
490 (vertical_tabs && l.x() > tabstrip_bounds.right())) { | 487 (vertical_tabs && l.x() > tabstrip_bounds.right())) { |
491 return false; | 488 return false; |
492 } | 489 } |
493 | 490 |
494 // Claim it only if we're also not in the compact navigation buttons. | 491 // Claim it only if we're also not in the compact navigation buttons. |
495 if (browser_view_->UseCompactNavigationBar()) { | 492 if (browser_view_->UseCompactNavigationBar()) { |
496 if (ConvertedContainsCheck(browser_view_->GetCompactNavigationBarBounds(), | 493 if (ConvertedContainsCheck(browser_view_->GetCompactNavigationBarBounds(), |
497 frame_->GetWindow()->client_view(), | 494 frame_->client_view(), |
498 static_cast<const View*>(this), | 495 static_cast<const View*>(this), |
499 l)) { | 496 l)) { |
500 return false; | 497 return false; |
501 } | 498 } |
502 if (ConvertedContainsCheck(browser_view_->GetCompactOptionsBarBounds(), | 499 if (ConvertedContainsCheck(browser_view_->GetCompactOptionsBarBounds(), |
503 frame_->GetWindow()->client_view(), | 500 frame_->client_view(), |
504 static_cast<const View*>(this), | 501 static_cast<const View*>(this), |
505 l)) { | 502 l)) { |
506 return false; | 503 return false; |
507 } | 504 } |
508 } | 505 } |
509 | 506 |
510 // We convert from our parent's coordinates since we assume we fill its bounds | 507 // We convert from our parent's coordinates since we assume we fill its bounds |
511 // completely. We need to do this since we're not a parent of the tabstrip, | 508 // completely. We need to do this since we're not a parent of the tabstrip, |
512 // meaning ConvertPointToView would otherwise return something bogus. | 509 // meaning ConvertPointToView would otherwise return something bogus. |
513 gfx::Point browser_view_point(l); | 510 gfx::Point browser_view_point(l); |
514 View::ConvertPointToView(parent(), browser_view_, &browser_view_point); | 511 View::ConvertPointToView(parent(), browser_view_, &browser_view_point); |
515 return browser_view_->IsPositionInWindowCaption(browser_view_point); | 512 return browser_view_->IsPositionInWindowCaption(browser_view_point); |
516 } | 513 } |
517 | 514 |
518 void OpaqueBrowserFrameView::GetAccessibleState( | 515 void OpaqueBrowserFrameView::GetAccessibleState( |
519 ui::AccessibleViewState* state) { | 516 ui::AccessibleViewState* state) { |
520 state->role = ui::AccessibilityTypes::ROLE_TITLEBAR; | 517 state->role = ui::AccessibilityTypes::ROLE_TITLEBAR; |
521 } | 518 } |
522 | 519 |
523 /////////////////////////////////////////////////////////////////////////////// | 520 /////////////////////////////////////////////////////////////////////////////// |
524 // OpaqueBrowserFrameView, views::ButtonListener implementation: | 521 // OpaqueBrowserFrameView, views::ButtonListener implementation: |
525 | 522 |
526 void OpaqueBrowserFrameView::ButtonPressed(views::Button* sender, | 523 void OpaqueBrowserFrameView::ButtonPressed(views::Button* sender, |
527 const views::Event& event) { | 524 const views::Event& event) { |
528 views::Window* window = frame_->GetWindow(); | |
529 if (sender == minimize_button_) | 525 if (sender == minimize_button_) |
530 window->Minimize(); | 526 frame_->Minimize(); |
531 else if (sender == maximize_button_) | 527 else if (sender == maximize_button_) |
532 window->Maximize(); | 528 frame_->Maximize(); |
533 else if (sender == restore_button_) | 529 else if (sender == restore_button_) |
534 window->Restore(); | 530 frame_->Restore(); |
535 else if (sender == close_button_) | 531 else if (sender == close_button_) |
536 window->CloseWindow(); | 532 frame_->Close(); |
537 } | 533 } |
538 | 534 |
539 /////////////////////////////////////////////////////////////////////////////// | 535 /////////////////////////////////////////////////////////////////////////////// |
540 // OpaqueBrowserFrameView, TabIconView::TabContentsProvider implementation: | 536 // OpaqueBrowserFrameView, TabIconView::TabContentsProvider implementation: |
541 | 537 |
542 bool OpaqueBrowserFrameView::ShouldTabIconViewAnimate() const { | 538 bool OpaqueBrowserFrameView::ShouldTabIconViewAnimate() const { |
543 // This function is queried during the creation of the window as the | 539 // This function is queried during the creation of the window as the |
544 // TabIconView we host is initialized, so we need to NULL check the selected | 540 // TabIconView we host is initialized, so we need to NULL check the selected |
545 // TabContents because in this condition there is not yet a selected tab. | 541 // TabContents because in this condition there is not yet a selected tab. |
546 TabContents* current_tab = browser_view_->GetSelectedTabContents(); | 542 TabContents* current_tab = browser_view_->GetSelectedTabContents(); |
547 return current_tab ? current_tab->is_loading() : false; | 543 return current_tab ? current_tab->is_loading() : false; |
548 } | 544 } |
549 | 545 |
550 SkBitmap OpaqueBrowserFrameView::GetFaviconForTabIconView() { | 546 SkBitmap OpaqueBrowserFrameView::GetFaviconForTabIconView() { |
551 views::WindowDelegate* delegate = frame_->GetWindow()->window_delegate(); | 547 views::WindowDelegate* delegate = frame_->window_delegate(); |
552 if (!delegate) { | 548 if (!delegate) { |
553 LOG(WARNING) << "delegate is NULL, returning safe default."; | 549 LOG(WARNING) << "delegate is NULL, returning safe default."; |
554 return SkBitmap(); | 550 return SkBitmap(); |
555 } | 551 } |
556 return delegate->GetWindowIcon(); | 552 return delegate->GetWindowIcon(); |
557 } | 553 } |
558 | 554 |
559 /////////////////////////////////////////////////////////////////////////////// | 555 /////////////////////////////////////////////////////////////////////////////// |
560 // OpaqueBrowserFrameView, protected: | 556 // OpaqueBrowserFrameView, protected: |
561 | 557 |
562 void OpaqueBrowserFrameView::Observe(NotificationType type, | 558 void OpaqueBrowserFrameView::Observe(NotificationType type, |
563 const NotificationSource& source, | 559 const NotificationSource& source, |
564 const NotificationDetails& details) { | 560 const NotificationDetails& details) { |
565 DCHECK_EQ(NotificationType::PREF_CHANGED, type.value); | 561 DCHECK_EQ(NotificationType::PREF_CHANGED, type.value); |
566 std::string* name = Details<std::string>(details).ptr(); | 562 std::string* name = Details<std::string>(details).ptr(); |
567 if (prefs::kGoogleServicesUsername == *name) | 563 if (prefs::kGoogleServicesUsername == *name) |
568 LayoutProfileTag(); | 564 LayoutProfileTag(); |
569 } | 565 } |
570 | 566 |
571 /////////////////////////////////////////////////////////////////////////////// | 567 /////////////////////////////////////////////////////////////////////////////// |
572 // OpaqueBrowserFrameView, private: | 568 // OpaqueBrowserFrameView, private: |
573 | 569 |
574 int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const { | 570 int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const { |
575 views::Window* window = frame_->GetWindow(); | 571 return (!restored && (frame_->IsMaximized() || frame_->IsFullscreen())) ? |
576 return (!restored && (window->IsMaximized() || window->IsFullscreen())) ? | |
577 0 : kFrameBorderThickness; | 572 0 : kFrameBorderThickness; |
578 } | 573 } |
579 | 574 |
580 int OpaqueBrowserFrameView::TopResizeHeight() const { | 575 int OpaqueBrowserFrameView::TopResizeHeight() const { |
581 return FrameBorderThickness(false) - kTopResizeAdjust; | 576 return FrameBorderThickness(false) - kTopResizeAdjust; |
582 } | 577 } |
583 | 578 |
584 int OpaqueBrowserFrameView::NonClientBorderThickness() const { | 579 int OpaqueBrowserFrameView::NonClientBorderThickness() const { |
585 // When we fill the screen, we don't show a client edge. | 580 // When we fill the screen, we don't show a client edge. |
586 views::Window* window = frame_->GetWindow(); | |
587 return FrameBorderThickness(false) + | 581 return FrameBorderThickness(false) + |
588 ((window->IsMaximized() || window->IsFullscreen()) ? | 582 ((frame_->IsMaximized() || frame_->IsFullscreen()) ? |
589 0 : kClientEdgeThickness); | 583 0 : kClientEdgeThickness); |
590 } | 584 } |
591 | 585 |
592 void OpaqueBrowserFrameView::ModifyMaximizedFramePainting( | 586 void OpaqueBrowserFrameView::ModifyMaximizedFramePainting( |
593 int* theme_offset, SkBitmap** left_corner, SkBitmap** right_corner) { | 587 int* theme_offset, SkBitmap** left_corner, SkBitmap** right_corner) { |
594 } | 588 } |
595 | 589 |
596 int OpaqueBrowserFrameView::CaptionButtonY(bool restored) const { | 590 int OpaqueBrowserFrameView::CaptionButtonY(bool restored) const { |
597 // Maximized buttons start at window top so that even if their images aren't | 591 // Maximized buttons start at window top so that even if their images aren't |
598 // drawn flush with the screen edge, they still obey Fitts' Law. | 592 // drawn flush with the screen edge, they still obey Fitts' Law. |
599 return (!restored && frame_->GetWindow()->IsMaximized()) ? | 593 return (!restored && frame_->IsMaximized()) ? |
600 FrameBorderThickness(false) : kFrameShadowThickness; | 594 FrameBorderThickness(false) : kFrameShadowThickness; |
601 } | 595 } |
602 | 596 |
603 int OpaqueBrowserFrameView::TitlebarBottomThickness(bool restored) const { | 597 int OpaqueBrowserFrameView::TitlebarBottomThickness(bool restored) const { |
604 return kTitlebarTopAndBottomEdgeThickness + | 598 return kTitlebarTopAndBottomEdgeThickness + |
605 ((!restored && frame_->GetWindow()->IsMaximized()) ? | 599 ((!restored && frame_->IsMaximized()) ? 0 : kClientEdgeThickness); |
606 0 : kClientEdgeThickness); | |
607 } | 600 } |
608 | 601 |
609 int OpaqueBrowserFrameView::IconSize() const { | 602 int OpaqueBrowserFrameView::IconSize() const { |
610 #if defined(OS_WIN) | 603 #if defined(OS_WIN) |
611 // This metric scales up if either the titlebar height or the titlebar font | 604 // This metric scales up if either the titlebar height or the titlebar font |
612 // size are increased. | 605 // size are increased. |
613 return GetSystemMetrics(SM_CYSMICON); | 606 return GetSystemMetrics(SM_CYSMICON); |
614 #else | 607 #else |
615 return std::max(BrowserFrame::GetTitleFont().GetHeight(), kIconMinimumSize); | 608 return std::max(BrowserFrame::GetTitleFont().GetHeight(), kIconMinimumSize); |
616 #endif | 609 #endif |
617 } | 610 } |
618 | 611 |
619 gfx::Rect OpaqueBrowserFrameView::IconBounds() const { | 612 gfx::Rect OpaqueBrowserFrameView::IconBounds() const { |
620 int size = IconSize(); | 613 int size = IconSize(); |
621 int frame_thickness = FrameBorderThickness(false); | 614 int frame_thickness = FrameBorderThickness(false); |
622 int y; | 615 int y; |
623 views::WindowDelegate* delegate = frame_->GetWindow()->window_delegate(); | 616 views::WindowDelegate* delegate = frame_->window_delegate(); |
624 if (delegate && (delegate->ShouldShowWindowIcon() || | 617 if (delegate && (delegate->ShouldShowWindowIcon() || |
625 delegate->ShouldShowWindowTitle())) { | 618 delegate->ShouldShowWindowTitle())) { |
626 // Our frame border has a different "3D look" than Windows'. Theirs has a | 619 // Our frame border has a different "3D look" than Windows'. Theirs has a |
627 // more complex gradient on the top that they push their icon/title below; | 620 // more complex gradient on the top that they push their icon/title below; |
628 // then the maximized window cuts this off and the icon/title are centered | 621 // then the maximized window cuts this off and the icon/title are centered |
629 // in the remaining space. Because the apparent shape of our border is | 622 // in the remaining space. Because the apparent shape of our border is |
630 // simpler, using the same positioning makes things look slightly uncentered | 623 // simpler, using the same positioning makes things look slightly uncentered |
631 // with restored windows, so when the window is restored, instead of | 624 // with restored windows, so when the window is restored, instead of |
632 // calculating the remaining space from below the frame border, we calculate | 625 // calculating the remaining space from below the frame border, we calculate |
633 // from below the 3D edge. | 626 // from below the 3D edge. |
634 int unavailable_px_at_top = frame_->GetWindow()->IsMaximized() ? | 627 int unavailable_px_at_top = frame_->IsMaximized() ? |
635 frame_thickness : kTitlebarTopAndBottomEdgeThickness; | 628 frame_thickness : kTitlebarTopAndBottomEdgeThickness; |
636 // When the icon is shorter than the minimum space we reserve for the | 629 // When the icon is shorter than the minimum space we reserve for the |
637 // caption button, we vertically center it. We want to bias rounding to put | 630 // caption button, we vertically center it. We want to bias rounding to put |
638 // extra space above the icon, since the 3D edge (+ client edge, for | 631 // extra space above the icon, since the 3D edge (+ client edge, for |
639 // restored windows) below looks (to the eye) more like additional space | 632 // restored windows) below looks (to the eye) more like additional space |
640 // than does the 3D edge (or nothing at all, for maximized windows) above; | 633 // than does the 3D edge (or nothing at all, for maximized windows) above; |
641 // hence the +1. | 634 // hence the +1. |
642 y = unavailable_px_at_top + (NonClientTopBorderHeight(false, false) - | 635 y = unavailable_px_at_top + (NonClientTopBorderHeight(false, false) - |
643 unavailable_px_at_top - size - TitlebarBottomThickness(false) + 1) / 2; | 636 unavailable_px_at_top - size - TitlebarBottomThickness(false) + 1) / 2; |
644 } else { | 637 } else { |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 canvas->DrawBitmapInt(*bottom_left_corner, 0, | 754 canvas->DrawBitmapInt(*bottom_left_corner, 0, |
762 height() - bottom_left_corner->height()); | 755 height() - bottom_left_corner->height()); |
763 | 756 |
764 // Left. | 757 // Left. |
765 canvas->TileImageInt(*left_edge, 0, top_left_height, left_edge->width(), | 758 canvas->TileImageInt(*left_edge, 0, top_left_height, left_edge->width(), |
766 height() - top_left_height - bottom_left_corner->height()); | 759 height() - top_left_height - bottom_left_corner->height()); |
767 } | 760 } |
768 | 761 |
769 void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { | 762 void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { |
770 ui::ThemeProvider* tp = GetThemeProvider(); | 763 ui::ThemeProvider* tp = GetThemeProvider(); |
771 views::Window* window = frame_->GetWindow(); | |
772 | |
773 // Window frame mode and color | 764 // Window frame mode and color |
774 SkBitmap* theme_frame; | 765 SkBitmap* theme_frame; |
775 | 766 |
776 // Allow customization of these attributes. | 767 // Allow customization of these attributes. |
777 SkBitmap* left = NULL; | 768 SkBitmap* left = NULL; |
778 SkBitmap* right = NULL; | 769 SkBitmap* right = NULL; |
779 int top_offset = 0; | 770 int top_offset = 0; |
780 ModifyMaximizedFramePainting(&top_offset, &left, &right); | 771 ModifyMaximizedFramePainting(&top_offset, &left, &right); |
781 | 772 |
782 // Never theme app and popup windows. | 773 // Never theme app and popup windows. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 } | 812 } |
822 | 813 |
823 if (!browser_view_->IsToolbarVisible()) { | 814 if (!browser_view_->IsToolbarVisible()) { |
824 // There's no toolbar to edge the frame border, so we need to draw a bottom | 815 // There's no toolbar to edge the frame border, so we need to draw a bottom |
825 // edge. The graphic we use for this has a built in client edge, so we clip | 816 // edge. The graphic we use for this has a built in client edge, so we clip |
826 // it off the bottom. | 817 // it off the bottom. |
827 SkBitmap* top_center = | 818 SkBitmap* top_center = |
828 tp->GetBitmapNamed(IDR_APP_TOP_CENTER); | 819 tp->GetBitmapNamed(IDR_APP_TOP_CENTER); |
829 int edge_height = top_center->height() - kClientEdgeThickness; | 820 int edge_height = top_center->height() - kClientEdgeThickness; |
830 canvas->TileImageInt(*top_center, 0, | 821 canvas->TileImageInt(*top_center, 0, |
831 window->client_view()->y() - edge_height, width(), edge_height); | 822 frame_->client_view()->y() - edge_height, width(), edge_height); |
832 } | 823 } |
833 } | 824 } |
834 | 825 |
835 void OpaqueBrowserFrameView::PaintTitleBar(gfx::Canvas* canvas) { | 826 void OpaqueBrowserFrameView::PaintTitleBar(gfx::Canvas* canvas) { |
836 // The window icon is painted by the TabIconView. | 827 // The window icon is painted by the TabIconView. |
837 views::WindowDelegate* delegate = frame_->GetWindow()->window_delegate(); | 828 views::WindowDelegate* delegate = frame_->window_delegate(); |
838 if (!delegate) { | 829 if (!delegate) { |
839 LOG(WARNING) << "delegate is NULL"; | 830 LOG(WARNING) << "delegate is NULL"; |
840 return; | 831 return; |
841 } | 832 } |
842 if (delegate->ShouldShowWindowTitle()) { | 833 if (delegate->ShouldShowWindowTitle()) { |
843 canvas->DrawStringInt(WideToUTF16Hack(delegate->GetWindowTitle()), | 834 canvas->DrawStringInt(WideToUTF16Hack(delegate->GetWindowTitle()), |
844 BrowserFrame::GetTitleFont(), | 835 BrowserFrame::GetTitleFont(), |
845 SK_ColorWHITE, GetMirroredXForRect(title_bounds_), | 836 SK_ColorWHITE, GetMirroredXForRect(title_bounds_), |
846 title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); | 837 title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); |
847 /* TODO(pkasting): If this window is active, we should also draw a drop | 838 /* TODO(pkasting): If this window is active, we should also draw a drop |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 // as the shadows at the image top mean the apparent center is below the | 970 // as the shadows at the image top mean the apparent center is below the |
980 // real center. | 971 // real center. |
981 ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h, | 972 ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h, |
982 otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false); | 973 otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false); |
983 | 974 |
984 canvas->Restore(); | 975 canvas->Restore(); |
985 } | 976 } |
986 | 977 |
987 void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { | 978 void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { |
988 ui::ThemeProvider* tp = GetThemeProvider(); | 979 ui::ThemeProvider* tp = GetThemeProvider(); |
989 int client_area_top = frame_->GetWindow()->client_view()->y(); | 980 int client_area_top = frame_->client_view()->y(); |
990 int image_top = client_area_top; | 981 int image_top = client_area_top; |
991 | 982 |
992 gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height()); | 983 gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height()); |
993 SkColor toolbar_color = tp->GetColor(ThemeService::COLOR_TOOLBAR); | 984 SkColor toolbar_color = tp->GetColor(ThemeService::COLOR_TOOLBAR); |
994 | 985 |
995 if (browser_view_->IsToolbarVisible() || | 986 if (browser_view_->IsToolbarVisible() || |
996 browser_view_->UseCompactNavigationBar()) { | 987 browser_view_->UseCompactNavigationBar()) { |
997 // The client edge images always start below the toolbar corner images. The | 988 // The client edge images always start below the toolbar corner images. The |
998 // client edge filled rects start there or at the bottom of the toolbar, | 989 // client edge filled rects start there or at the bottom of the toolbar, |
999 // whichever is shorter. | 990 // whichever is shorter. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 kClientEdgeThickness, | 1056 kClientEdgeThickness, |
1066 client_area_bottom + kClientEdgeThickness - client_area_top); | 1057 client_area_bottom + kClientEdgeThickness - client_area_top); |
1067 canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom, | 1058 canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom, |
1068 client_area_bounds.width(), kClientEdgeThickness); | 1059 client_area_bounds.width(), kClientEdgeThickness); |
1069 canvas->FillRectInt(toolbar_color, client_area_bounds.right(), | 1060 canvas->FillRectInt(toolbar_color, client_area_bounds.right(), |
1070 client_area_top, kClientEdgeThickness, | 1061 client_area_top, kClientEdgeThickness, |
1071 client_area_bottom + kClientEdgeThickness - client_area_top); | 1062 client_area_bottom + kClientEdgeThickness - client_area_top); |
1072 } | 1063 } |
1073 | 1064 |
1074 void OpaqueBrowserFrameView::LayoutWindowControls() { | 1065 void OpaqueBrowserFrameView::LayoutWindowControls() { |
1075 bool is_maximized = frame_->GetWindow()->IsMaximized(); | 1066 bool is_maximized = frame_->IsMaximized(); |
1076 close_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, | 1067 close_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
1077 views::ImageButton::ALIGN_BOTTOM); | 1068 views::ImageButton::ALIGN_BOTTOM); |
1078 int caption_y = CaptionButtonY(false); | 1069 int caption_y = CaptionButtonY(false); |
1079 // There should always be the same number of non-shadow pixels visible to the | 1070 // There should always be the same number of non-shadow pixels visible to the |
1080 // side of the caption buttons. In maximized mode we extend the rightmost | 1071 // side of the caption buttons. In maximized mode we extend the rightmost |
1081 // button to the screen corner to obey Fitts' Law. | 1072 // button to the screen corner to obey Fitts' Law. |
1082 int right_extra_width = is_maximized ? | 1073 int right_extra_width = is_maximized ? |
1083 (kFrameBorderThickness - kFrameShadowThickness) : 0; | 1074 (kFrameBorderThickness - kFrameShadowThickness) : 0; |
1084 gfx::Size close_button_size = close_button_->GetPreferredSize(); | 1075 gfx::Size close_button_size = close_button_->GetPreferredSize(); |
1085 close_button_->SetBounds(width() - FrameBorderThickness(false) - | 1076 close_button_->SetBounds(width() - FrameBorderThickness(false) - |
1086 right_extra_width - close_button_size.width(), caption_y, | 1077 right_extra_width - close_button_size.width(), caption_y, |
1087 close_button_size.width() + right_extra_width, | 1078 close_button_size.width() + right_extra_width, |
1088 close_button_size.height()); | 1079 close_button_size.height()); |
1089 | 1080 |
1090 #if defined(OS_CHROMEOS) | 1081 #if defined(OS_CHROMEOS) |
1091 // LayoutWindowControls could be triggered from WindowGtk::UpdateWindowTitle, | 1082 // LayoutWindowControls could be triggered from WindowGtk::UpdateWindowTitle, |
1092 // which could happen when user navigates in fullscreen mode. And because | 1083 // which could happen when user navigates in fullscreen mode. And because |
1093 // BrowserFrameChromeos::IsMaximized return false for fullscreen mode, we | 1084 // BrowserFrameChromeos::IsMaximized return false for fullscreen mode, we |
1094 // explicitly test fullscreen mode here and make it use the same code path | 1085 // explicitly test fullscreen mode here and make it use the same code path |
1095 // as maximized mode. | 1086 // as maximized mode. |
1096 // TODO(oshima): Optimize the relayout logic to defer the frame view's | 1087 // TODO(oshima): Optimize the relayout logic to defer the frame view's |
1097 // relayout until it is necessary, i.e when it becomes visible. | 1088 // relayout until it is necessary, i.e when it becomes visible. |
1098 if (is_maximized || frame_->GetWindow()->IsFullscreen()) { | 1089 if (is_maximized || frame_->IsFullscreen()) { |
1099 minimize_button_->SetVisible(false); | 1090 minimize_button_->SetVisible(false); |
1100 restore_button_->SetVisible(false); | 1091 restore_button_->SetVisible(false); |
1101 maximize_button_->SetVisible(false); | 1092 maximize_button_->SetVisible(false); |
1102 | 1093 |
1103 if (browser_view_->browser()->is_devtools()) { | 1094 if (browser_view_->browser()->is_devtools()) { |
1104 close_button_->SetVisible(true); | 1095 close_button_->SetVisible(true); |
1105 minimize_button_->SetBounds(close_button_->bounds().x(), 0, 0, 0); | 1096 minimize_button_->SetBounds(close_button_->bounds().x(), 0, 0, 0); |
1106 } else { | 1097 } else { |
1107 close_button_->SetVisible(false); | 1098 close_button_->SetVisible(false); |
1108 // Set the bounds of the minimize button so that we don't have to change | 1099 // Set the bounds of the minimize button so that we don't have to change |
1109 // other places that rely on the bounds. Put it slightly to the right | 1100 // other places that rely on the bounds. Put it slightly to the right |
1110 // of the edge of the view, so that when we remove the spacing it lines | 1101 // of the edge of the view, so that when we remove the spacing it lines |
1111 // up with the edge. | 1102 // up with the edge. |
1112 minimize_button_->SetBounds(width() - FrameBorderThickness(false) + | 1103 minimize_button_->SetBounds(width() - FrameBorderThickness(false) + |
1113 kNewTabCaptionMaximizedSpacing, 0, 0, 0); | 1104 kNewTabCaptionMaximizedSpacing, 0, 0, 0); |
1114 } | 1105 } |
1115 | 1106 |
1116 return; | 1107 return; |
1117 } else { | 1108 } else { |
1118 close_button_->SetVisible(true); | 1109 close_button_->SetVisible(true); |
1119 } | 1110 } |
1120 #endif | 1111 #endif |
1121 | 1112 |
1122 // When the window is restored, we show a maximized button; otherwise, we show | 1113 // When the window is restored, we show a maximized button; otherwise, we show |
1123 // a restore button. | 1114 // a restore button. |
1124 bool is_restored = !is_maximized && !frame_->GetWindow()->IsMinimized(); | 1115 bool is_restored = !is_maximized && !frame_->IsMinimized(); |
1125 views::ImageButton* invisible_button = is_restored ? | 1116 views::ImageButton* invisible_button = is_restored ? |
1126 restore_button_ : maximize_button_; | 1117 restore_button_ : maximize_button_; |
1127 invisible_button->SetVisible(false); | 1118 invisible_button->SetVisible(false); |
1128 | 1119 |
1129 views::ImageButton* visible_button = is_restored ? | 1120 views::ImageButton* visible_button = is_restored ? |
1130 maximize_button_ : restore_button_; | 1121 maximize_button_ : restore_button_; |
1131 visible_button->SetVisible(true); | 1122 visible_button->SetVisible(true); |
1132 visible_button->SetImageAlignment(views::ImageButton::ALIGN_LEFT, | 1123 visible_button->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
1133 views::ImageButton::ALIGN_BOTTOM); | 1124 views::ImageButton::ALIGN_BOTTOM); |
1134 gfx::Size visible_button_size = visible_button->GetPreferredSize(); | 1125 gfx::Size visible_button_size = visible_button->GetPreferredSize(); |
1135 visible_button->SetBounds(close_button_->x() - visible_button_size.width(), | 1126 visible_button->SetBounds(close_button_->x() - visible_button_size.width(), |
1136 caption_y, visible_button_size.width(), | 1127 caption_y, visible_button_size.width(), |
1137 visible_button_size.height()); | 1128 visible_button_size.height()); |
1138 | 1129 |
1139 minimize_button_->SetVisible(true); | 1130 minimize_button_->SetVisible(true); |
1140 minimize_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, | 1131 minimize_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
1141 views::ImageButton::ALIGN_BOTTOM); | 1132 views::ImageButton::ALIGN_BOTTOM); |
1142 gfx::Size minimize_button_size = minimize_button_->GetPreferredSize(); | 1133 gfx::Size minimize_button_size = minimize_button_->GetPreferredSize(); |
1143 minimize_button_->SetBounds( | 1134 minimize_button_->SetBounds( |
1144 visible_button->x() - minimize_button_size.width(), caption_y, | 1135 visible_button->x() - minimize_button_size.width(), caption_y, |
1145 minimize_button_size.width(), | 1136 minimize_button_size.width(), |
1146 minimize_button_size.height()); | 1137 minimize_button_size.height()); |
1147 } | 1138 } |
1148 | 1139 |
1149 void OpaqueBrowserFrameView::LayoutTitleBar() { | 1140 void OpaqueBrowserFrameView::LayoutTitleBar() { |
1150 // The window title is based on the calculated icon position, even when there | 1141 // The window title is based on the calculated icon position, even when there |
1151 // is no icon. | 1142 // is no icon. |
1152 gfx::Rect icon_bounds(IconBounds()); | 1143 gfx::Rect icon_bounds(IconBounds()); |
1153 views::WindowDelegate* delegate = frame_->GetWindow()->window_delegate(); | 1144 views::WindowDelegate* delegate = frame_->window_delegate(); |
1154 if (delegate && delegate->ShouldShowWindowIcon()) | 1145 if (delegate && delegate->ShouldShowWindowIcon()) |
1155 window_icon_->SetBoundsRect(icon_bounds); | 1146 window_icon_->SetBoundsRect(icon_bounds); |
1156 | 1147 |
1157 // Size the title, if visible. | 1148 // Size the title, if visible. |
1158 if (delegate && delegate->ShouldShowWindowTitle()) { | 1149 if (delegate && delegate->ShouldShowWindowTitle()) { |
1159 int title_x = delegate->ShouldShowWindowIcon() ? | 1150 int title_x = delegate->ShouldShowWindowIcon() ? |
1160 icon_bounds.right() + kIconTitleSpacing : icon_bounds.x(); | 1151 icon_bounds.right() + kIconTitleSpacing : icon_bounds.x(); |
1161 int title_height = BrowserFrame::GetTitleFont().GetHeight(); | 1152 int title_height = BrowserFrame::GetTitleFont().GetHeight(); |
1162 // We bias the title position so that when the difference between the icon | 1153 // We bias the title position so that when the difference between the icon |
1163 // and title heights is odd, the extra pixel of the title is above the | 1154 // and title heights is odd, the extra pixel of the title is above the |
(...skipping 11 matching lines...) Expand all Loading... |
1175 SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); | 1166 SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); |
1176 int otr_bottom, otr_restored_y; | 1167 int otr_bottom, otr_restored_y; |
1177 if (browser_view_->UseVerticalTabs()) { | 1168 if (browser_view_->UseVerticalTabs()) { |
1178 otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing; | 1169 otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing; |
1179 otr_restored_y = kFrameShadowThickness; | 1170 otr_restored_y = kFrameShadowThickness; |
1180 } else { | 1171 } else { |
1181 otr_bottom = GetHorizontalTabStripVerticalOffset(false) + | 1172 otr_bottom = GetHorizontalTabStripVerticalOffset(false) + |
1182 browser_view_->GetTabStripHeight() - kOTRBottomSpacing; | 1173 browser_view_->GetTabStripHeight() - kOTRBottomSpacing; |
1183 otr_restored_y = otr_bottom - otr_avatar_icon.height(); | 1174 otr_restored_y = otr_bottom - otr_avatar_icon.height(); |
1184 } | 1175 } |
1185 int otr_y = frame_->GetWindow()->IsMaximized() ? | 1176 int otr_y = frame_->IsMaximized() ? |
1186 (NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) : | 1177 (NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) : |
1187 otr_restored_y; | 1178 otr_restored_y; |
1188 otr_avatar_bounds_.SetRect(NonClientBorderThickness() + kOTRSideSpacing, | 1179 otr_avatar_bounds_.SetRect(NonClientBorderThickness() + kOTRSideSpacing, |
1189 otr_y, otr_avatar_icon.width(), | 1180 otr_y, otr_avatar_icon.width(), |
1190 browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0); | 1181 browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0); |
1191 } | 1182 } |
1192 | 1183 |
1193 void OpaqueBrowserFrameView::LayoutProfileTag() { | 1184 void OpaqueBrowserFrameView::LayoutProfileTag() { |
1194 if (!show_profile_button()) | 1185 if (!show_profile_button()) |
1195 return; | 1186 return; |
(...skipping 12 matching lines...) Expand all Loading... |
1208 profile_button_->SetVisible(true); | 1199 profile_button_->SetVisible(true); |
1209 int x_tag = | 1200 int x_tag = |
1210 // The x position of minimize button in the frame | 1201 // The x position of minimize button in the frame |
1211 minimize_button_->x() - | 1202 minimize_button_->x() - |
1212 // - the space between the minimize button and the profile button | 1203 // - the space between the minimize button and the profile button |
1213 ProfileMenuButton::kProfileTagHorizontalSpacing - | 1204 ProfileMenuButton::kProfileTagHorizontalSpacing - |
1214 // - the width of the profile button | 1205 // - the width of the profile button |
1215 profile_button_->GetPreferredSize().width(); | 1206 profile_button_->GetPreferredSize().width(); |
1216 // Adjust for different default font sizes on different Windows platforms. | 1207 // Adjust for different default font sizes on different Windows platforms. |
1217 int y_tag = profile_button_->font().GetHeight() < 14 ? 2 : 0; | 1208 int y_tag = profile_button_->font().GetHeight() < 14 ? 2 : 0; |
1218 int y_maximized_offset = frame_->GetWindow()->IsMaximized() ? | 1209 int y_maximized_offset = frame_->IsMaximized() ? |
1219 kProfileElementMaximizedYOffset : 0; | 1210 kProfileElementMaximizedYOffset : 0; |
1220 profile_button_->SetBounds( | 1211 profile_button_->SetBounds( |
1221 x_tag, | 1212 x_tag, |
1222 y_tag + y_maximized_offset, | 1213 y_tag + y_maximized_offset, |
1223 profile_button_->GetPreferredSize().width(), | 1214 profile_button_->GetPreferredSize().width(), |
1224 profile_button_->GetPreferredSize().height()); | 1215 profile_button_->GetPreferredSize().height()); |
1225 | 1216 |
1226 if (!profile_name.empty()) { | 1217 if (!profile_name.empty()) { |
1227 profile_tag_->SetVisible(true); | 1218 profile_tag_->SetVisible(true); |
1228 profile_tag_->SetBounds( | 1219 profile_tag_->SetBounds( |
(...skipping 15 matching lines...) Expand all Loading... |
1244 std::max(0, width - (2 * border_thickness)), | 1235 std::max(0, width - (2 * border_thickness)), |
1245 std::max(0, height - GetReservedHeight() - | 1236 std::max(0, height - GetReservedHeight() - |
1246 top_height - border_thickness)); | 1237 top_height - border_thickness)); |
1247 } | 1238 } |
1248 | 1239 |
1249 void OpaqueBrowserFrameView::RegisterLoginNotifications() { | 1240 void OpaqueBrowserFrameView::RegisterLoginNotifications() { |
1250 PrefService* pref_service = browser_view_->browser()->profile()->GetPrefs(); | 1241 PrefService* pref_service = browser_view_->browser()->profile()->GetPrefs(); |
1251 DCHECK(pref_service); | 1242 DCHECK(pref_service); |
1252 username_pref_.Init(prefs::kGoogleServicesUsername, pref_service, this); | 1243 username_pref_.Init(prefs::kGoogleServicesUsername, pref_service, this); |
1253 } | 1244 } |
OLD | NEW |