Chromium Code Reviews| 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/panels/panel_browser_view.h" | 5 #include "chrome/browser/ui/panels/panel_browser_view.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "chrome/browser/ui/panels/panel.h" | 9 #include "chrome/browser/ui/panels/panel.h" |
| 10 #include "chrome/browser/ui/panels/panel_browser_frame_view.h" | 10 #include "chrome/browser/ui/panels/panel_browser_frame_view.h" |
| 11 #include "chrome/browser/ui/panels/panel_manager.h" | 11 #include "chrome/browser/ui/panels/panel_manager.h" |
| 12 #include "chrome/browser/ui/panels/panel_overflow_strip.h" | |
| 13 #include "chrome/browser/ui/panels/panel_strip.h" | |
| 12 #include "chrome/browser/ui/views/frame/browser_frame.h" | 14 #include "chrome/browser/ui/views/frame/browser_frame.h" |
| 13 #include "chrome/browser/ui/webui/task_manager_dialog.h" | 15 #include "chrome/browser/ui/webui/task_manager_dialog.h" |
| 14 #include "chrome/common/chrome_notification_types.h" | 16 #include "chrome/common/chrome_notification_types.h" |
| 15 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
| 16 #include "content/public/browser/notification_service.h" | 18 #include "content/public/browser/notification_service.h" |
| 17 #include "grit/chromium_strings.h" | 19 #include "grit/chromium_strings.h" |
| 18 #include "ui/base/animation/slide_animation.h" | 20 #include "ui/base/animation/slide_animation.h" |
| 19 #include "ui/base/l10n/l10n_util.h" | 21 #include "ui/base/l10n/l10n_util.h" |
| 20 #include "ui/views/controls/label.h" | 22 #include "ui/views/controls/label.h" |
| 21 #include "ui/views/widget/widget.h" | 23 #include "ui/views/widget/widget.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 102 } | 104 } |
| 103 | 105 |
| 104 bool PanelBrowserView::CanMaximize() const { | 106 bool PanelBrowserView::CanMaximize() const { |
| 105 return false; | 107 return false; |
| 106 } | 108 } |
| 107 | 109 |
| 108 void PanelBrowserView::SetBounds(const gfx::Rect& bounds) { | 110 void PanelBrowserView::SetBounds(const gfx::Rect& bounds) { |
| 109 SetBoundsInternal(bounds, true); | 111 SetBoundsInternal(bounds, true); |
| 110 } | 112 } |
| 111 | 113 |
| 112 void PanelBrowserView::SetBoundsInternal(const gfx::Rect& bounds, | 114 void PanelBrowserView::SetBoundsInternal(const gfx::Rect& new_bounds, |
| 113 bool animate) { | 115 bool animate) { |
| 114 if (bounds_ == bounds) | 116 if (bounds_ == new_bounds) |
| 115 return; | 117 return; |
| 116 bounds_ = bounds; | 118 |
| 119 // TODO(jianli): this is just a temporary hack to check if we need to show | |
|
jennb
2011/12/02 21:16:58
Could you create a crbug for this and put # here?
jianli
2011/12/02 23:23:46
Bug created. Yes, I think we need to put it in nat
| |
| 120 // or hide the panel app icon in the taskbar. | |
| 121 int panel_strip_area_left = | |
|
jennb
2011/12/02 21:16:58
Isn't it easier to just do:
ShowOrHidePanelAppIco
jianli
2011/12/02 23:23:46
I rather keep it this way since we're going to cle
| |
| 122 panel()->manager()->panel_strip()->display_area().x(); | |
| 123 bool app_icon_shown = bounds_.x() >= panel_strip_area_left; | |
| 124 bool app_icon_to_show = new_bounds.x() >= panel_strip_area_left; | |
| 125 if (app_icon_shown != app_icon_to_show) | |
| 126 ShowOrHidePanelAppIcon(app_icon_to_show); | |
| 127 | |
| 128 bounds_ = new_bounds; | |
| 117 | 129 |
| 118 // No animation if the panel is being dragged. | 130 // No animation if the panel is being dragged. |
| 119 if (!animate || mouse_dragging_state_ == DRAGGING_STARTED) { | 131 if (!animate || mouse_dragging_state_ == DRAGGING_STARTED) { |
| 120 ::BrowserView::SetBounds(bounds); | 132 ::BrowserView::SetBounds(new_bounds); |
| 121 return; | 133 return; |
| 122 } | 134 } |
| 123 | 135 |
| 124 animation_start_bounds_ = GetBounds(); | 136 animation_start_bounds_ = GetBounds(); |
| 125 | 137 |
| 126 if (!bounds_animator_.get()) { | 138 if (!bounds_animator_.get()) { |
| 127 bounds_animator_.reset(new ui::SlideAnimation(this)); | 139 bounds_animator_.reset(new ui::SlideAnimation(this)); |
| 128 bounds_animator_->SetSlideDuration(kSetBoundsAnimationMs); | 140 bounds_animator_->SetSlideDuration(kSetBoundsAnimationMs); |
| 129 } | 141 } |
| 130 | 142 |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 378 | 390 |
| 379 Browser* PanelBrowserView::GetPanelBrowser() const { | 391 Browser* PanelBrowserView::GetPanelBrowser() const { |
| 380 return browser(); | 392 return browser(); |
| 381 } | 393 } |
| 382 | 394 |
| 383 void PanelBrowserView::DestroyPanelBrowser() { | 395 void PanelBrowserView::DestroyPanelBrowser() { |
| 384 DestroyBrowser(); | 396 DestroyBrowser(); |
| 385 } | 397 } |
| 386 | 398 |
| 387 gfx::Size PanelBrowserView::IconOnlySize() const { | 399 gfx::Size PanelBrowserView::IconOnlySize() const { |
| 388 // TODO(jianli): to be implemented. | 400 return GetFrameView()->IconOnlySize(); |
| 389 return gfx::Size(); | |
| 390 } | 401 } |
| 391 | 402 |
| 392 void PanelBrowserView::EnsurePanelFullyVisible() { | 403 void PanelBrowserView::EnsurePanelFullyVisible() { |
| 393 // TODO(jianli): to be implemented. | 404 #if defined(OS_WIN) && !defined(USE_AURA) |
| 405 ::SetWindowPos(GetNativeHandle(), HWND_TOP, 0, 0, 0, 0, | |
| 406 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); | |
| 407 #else | |
| 408 NOTIMPLEMENTED(); | |
| 409 #endif | |
| 394 } | 410 } |
| 395 | 411 |
| 396 PanelBrowserFrameView* PanelBrowserView::GetFrameView() const { | 412 PanelBrowserFrameView* PanelBrowserView::GetFrameView() const { |
| 397 return static_cast<PanelBrowserFrameView*>(frame()->GetFrameView()); | 413 return static_cast<PanelBrowserFrameView*>(frame()->GetFrameView()); |
| 398 } | 414 } |
| 399 | 415 |
| 400 bool PanelBrowserView::OnTitlebarMousePressed(const gfx::Point& location) { | 416 bool PanelBrowserView::OnTitlebarMousePressed(const gfx::Point& location) { |
| 401 // |location| is in the view's coordinate system. Convert it to the screen | 417 // |location| is in the view's coordinate system. Convert it to the screen |
| 402 // coordinate system. | 418 // coordinate system. |
| 403 mouse_location_ = location; | 419 mouse_location_ = location; |
| 404 views::View::ConvertPointToScreen(this, &mouse_location_); | 420 views::View::ConvertPointToScreen(this, &mouse_location_); |
| 405 | 421 |
| 406 mouse_pressed_ = true; | 422 mouse_pressed_ = true; |
| 407 mouse_pressed_time_ = base::TimeTicks::Now(); | 423 mouse_pressed_time_ = base::TimeTicks::Now(); |
| 408 mouse_dragging_state_ = NO_DRAGGING; | 424 mouse_dragging_state_ = NO_DRAGGING; |
| 409 return true; | 425 return true; |
| 410 } | 426 } |
| 411 | 427 |
| 412 bool PanelBrowserView::OnTitlebarMouseDragged(const gfx::Point& location) { | 428 bool PanelBrowserView::OnTitlebarMouseDragged(const gfx::Point& location) { |
| 413 if (!mouse_pressed_) | 429 if (!mouse_pressed_) |
| 414 return false; | 430 return false; |
| 415 | 431 |
| 432 // Dragging is not supported for overflow panel. | |
| 433 if (panel_->expansion_state() == Panel::IN_OVERFLOW) | |
| 434 return true; | |
| 435 | |
| 416 gfx::Point last_mouse_location = mouse_location_; | 436 gfx::Point last_mouse_location = mouse_location_; |
| 417 | 437 |
| 418 // |location| is in the view's coordinate system. Convert it to the screen | 438 // |location| is in the view's coordinate system. Convert it to the screen |
| 419 // coordinate system. | 439 // coordinate system. |
| 420 mouse_location_ = location; | 440 mouse_location_ = location; |
| 421 views::View::ConvertPointToScreen(this, &mouse_location_); | 441 views::View::ConvertPointToScreen(this, &mouse_location_); |
| 422 | 442 |
| 423 int delta_x = mouse_location_.x() - last_mouse_location.x(); | 443 int delta_x = mouse_location_.x() - last_mouse_location.x(); |
| 424 int delta_y = mouse_location_.y() - last_mouse_location.y(); | 444 int delta_y = mouse_location_.y() - last_mouse_location.y(); |
| 425 if (mouse_dragging_state_ == NO_DRAGGING && | 445 if (mouse_dragging_state_ == NO_DRAGGING && |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 446 } | 466 } |
| 447 | 467 |
| 448 return EndDragging(false); | 468 return EndDragging(false); |
| 449 } | 469 } |
| 450 | 470 |
| 451 // If the panel drag was cancelled before the mouse is released, do not treat | 471 // If the panel drag was cancelled before the mouse is released, do not treat |
| 452 // this as a click. | 472 // this as a click. |
| 453 if (mouse_dragging_state_ != NO_DRAGGING) | 473 if (mouse_dragging_state_ != NO_DRAGGING) |
| 454 return true; | 474 return true; |
| 455 | 475 |
| 476 // If the panel is in overflow, move it to the normal strip. | |
| 477 if (panel_->expansion_state() == Panel::IN_OVERFLOW) { | |
| 478 panel_->manager()->panel_overflow_strip()->Remove(panel_.get()); | |
| 479 panel_->manager()->panel_strip()->AddPanel(panel_.get()); | |
| 480 return true; | |
| 481 } | |
| 482 | |
| 456 // Do not minimize the panel when we just clear the attention state. This is | 483 // Do not minimize the panel when we just clear the attention state. This is |
| 457 // a hack to prevent the panel from being minimized when the user clicks on | 484 // a hack to prevent the panel from being minimized when the user clicks on |
| 458 // the title-bar to clear the attention. | 485 // the title-bar to clear the attention. |
| 459 if (panel_->expansion_state() == Panel::EXPANDED && | 486 if (panel_->expansion_state() == Panel::EXPANDED && |
| 460 base::TimeTicks::Now() - attention_cleared_time_ < | 487 base::TimeTicks::Now() - attention_cleared_time_ < |
| 461 base::TimeDelta::FromMilliseconds(kSuspendMinimizeOnClickIntervalMs)) { | 488 base::TimeDelta::FromMilliseconds(kSuspendMinimizeOnClickIntervalMs)) { |
| 462 return true; | 489 return true; |
| 463 } | 490 } |
| 464 | 491 |
| 465 // Do not minimize the panel if it is long click. | 492 // Do not minimize the panel if it is long click. |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 484 // Only handle clicks that started in our window. | 511 // Only handle clicks that started in our window. |
| 485 if (!mouse_pressed_) | 512 if (!mouse_pressed_) |
| 486 return false; | 513 return false; |
| 487 mouse_pressed_ = false; | 514 mouse_pressed_ = false; |
| 488 | 515 |
| 489 mouse_dragging_state_ = DRAGGING_ENDED; | 516 mouse_dragging_state_ = DRAGGING_ENDED; |
| 490 panel_->manager()->EndDragging(cancelled); | 517 panel_->manager()->EndDragging(cancelled); |
| 491 return true; | 518 return true; |
| 492 } | 519 } |
| 493 | 520 |
| 521 void PanelBrowserView::ShowOrHidePanelAppIcon(bool show) { | |
| 522 #if defined(OS_WIN) && !defined(USE_AURA) | |
| 523 gfx::NativeWindow native_window = GetNativeHandle(); | |
| 524 ::ShowWindow(native_window, SW_HIDE); | |
| 525 int style = ::GetWindowLong(native_window, GWL_EXSTYLE); | |
| 526 if (show) | |
| 527 style &= (~WS_EX_TOOLWINDOW); | |
| 528 else | |
| 529 style |= WS_EX_TOOLWINDOW; | |
| 530 ::SetWindowLong(native_window, GWL_EXSTYLE, style); | |
| 531 ::ShowWindow(native_window, SW_SHOWNA); | |
| 532 #else | |
| 533 NOTIMPLEMENTED(); | |
| 534 #endif | |
| 535 } | |
| 536 | |
| 494 // NativePanelTesting implementation. | 537 // NativePanelTesting implementation. |
| 495 class NativePanelTestingWin : public NativePanelTesting { | 538 class NativePanelTestingWin : public NativePanelTesting { |
| 496 public: | 539 public: |
| 497 explicit NativePanelTestingWin(PanelBrowserView* panel_browser_view); | 540 explicit NativePanelTestingWin(PanelBrowserView* panel_browser_view); |
| 498 | 541 |
| 499 private: | 542 private: |
| 500 virtual void PressLeftMouseButtonTitlebar( | 543 virtual void PressLeftMouseButtonTitlebar( |
| 501 const gfx::Point& point) OVERRIDE; | 544 const gfx::Point& point) OVERRIDE; |
| 502 virtual void ReleaseMouseButtonTitlebar() OVERRIDE; | 545 virtual void ReleaseMouseButtonTitlebar() OVERRIDE; |
| 503 virtual void DragTitlebar(int delta_x, int delta_y) OVERRIDE; | 546 virtual void DragTitlebar(int delta_x, int delta_y) OVERRIDE; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 573 } | 616 } |
| 574 | 617 |
| 575 bool NativePanelTestingWin::IsWindowSizeKnown() const { | 618 bool NativePanelTestingWin::IsWindowSizeKnown() const { |
| 576 return true; | 619 return true; |
| 577 } | 620 } |
| 578 | 621 |
| 579 bool NativePanelTestingWin::IsAnimatingBounds() const { | 622 bool NativePanelTestingWin::IsAnimatingBounds() const { |
| 580 return panel_browser_view_->bounds_animator_.get() && | 623 return panel_browser_view_->bounds_animator_.get() && |
| 581 panel_browser_view_->bounds_animator_->is_animating(); | 624 panel_browser_view_->bounds_animator_->is_animating(); |
| 582 } | 625 } |
| OLD | NEW |