| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/panels/docked_panel_strip.h" | 5 #include "chrome/browser/ui/panels/docked_panel_strip.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 #if defined(TOOLKIT_GTK) | 43 #if defined(TOOLKIT_GTK) |
| 44 const int kDelayBeforeCollapsingFromTitleOnlyStateMs = 2000; | 44 const int kDelayBeforeCollapsingFromTitleOnlyStateMs = 2000; |
| 45 #else | 45 #else |
| 46 const int kDelayBeforeCollapsingFromTitleOnlyStateMs = 0; | 46 const int kDelayBeforeCollapsingFromTitleOnlyStateMs = 0; |
| 47 #endif | 47 #endif |
| 48 | 48 |
| 49 // After focus changed, one panel lost active status, another got it, | 49 // After focus changed, one panel lost active status, another got it, |
| 50 // we refresh layout with a delay. | 50 // we refresh layout with a delay. |
| 51 const int kRefreshLayoutAfterActivePanelChangeDelayMs = 200; // arbitrary | 51 const int kRefreshLayoutAfterActivePanelChangeDelayMs = 200; // arbitrary |
| 52 | 52 |
| 53 // The minimum panel width when it is "squeezed" in the docked strip | |
| 54 // due to lack of space. | |
| 55 const int kMinPanelWidthForDisplay = 26; | |
| 56 } // namespace | 53 } // namespace |
| 57 | 54 |
| 58 // static | 55 // static |
| 59 const int DockedPanelStrip::kPanelMinWidth = 100; | 56 // These numbers are semi-arbitrary. |
| 57 // Motivation for 'width' is to make main buttons on the titlebar functional. |
| 58 // Motivation for height is to allow autosized tightly-wrapped panel with a |
| 59 // single line of text - so the height is set to be likely less then a titlebar, |
| 60 // to make sure even small content is tightly wrapped. |
| 61 const int DockedPanelStrip::kPanelMinWidth = 80; |
| 60 const int DockedPanelStrip::kPanelMinHeight = 20; | 62 const int DockedPanelStrip::kPanelMinHeight = 20; |
| 61 | 63 |
| 62 DockedPanelStrip::DockedPanelStrip(PanelManager* panel_manager) | 64 DockedPanelStrip::DockedPanelStrip(PanelManager* panel_manager) |
| 63 : PanelStrip(PanelStrip::DOCKED), | 65 : PanelStrip(PanelStrip::DOCKED), |
| 64 panel_manager_(panel_manager), | 66 panel_manager_(panel_manager), |
| 65 minimized_panel_count_(0), | 67 minimized_panel_count_(0), |
| 66 are_titlebars_up_(false), | 68 are_titlebars_up_(false), |
| 67 minimizing_all_(false), | 69 minimizing_all_(false), |
| 68 delayed_titlebar_action_(NO_ACTION), | 70 delayed_titlebar_action_(NO_ACTION), |
| 69 titlebar_action_factory_(this), | 71 titlebar_action_factory_(this), |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 height = kPanelMinHeight; | 156 height = kPanelMinHeight; |
| 155 else if (height > max_panel_height) | 157 else if (height > max_panel_height) |
| 156 height = max_panel_height; | 158 height = max_panel_height; |
| 157 | 159 |
| 158 full_size = gfx::Size(width, height); | 160 full_size = gfx::Size(width, height); |
| 159 panel->set_full_size(full_size); | 161 panel->set_full_size(full_size); |
| 160 gfx::Point pt = GetDefaultPositionForPanel(full_size); | 162 gfx::Point pt = GetDefaultPositionForPanel(full_size); |
| 161 | 163 |
| 162 panel->Initialize(gfx::Rect(pt.x(), pt.y(), width, height)); | 164 panel->Initialize(gfx::Rect(pt.x(), pt.y(), width, height)); |
| 163 | 165 |
| 166 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), |
| 167 gfx::Size(max_panel_width, max_panel_height)); |
| 168 |
| 164 InsertExistingPanelAtDefaultPosition(panel, true /*update_bounds*/); | 169 InsertExistingPanelAtDefaultPosition(panel, true /*update_bounds*/); |
| 165 } | 170 } |
| 166 | 171 |
| 167 void DockedPanelStrip::InsertExistingPanelAtKnownPosition(Panel* panel) { | 172 void DockedPanelStrip::InsertExistingPanelAtKnownPosition(Panel* panel) { |
| 168 DCHECK(panel->initialized()); | 173 DCHECK(panel->initialized()); |
| 169 | 174 |
| 170 int x = panel->GetBounds().x(); | 175 int x = panel->GetBounds().x(); |
| 171 Panels::iterator iter = panels_.begin(); | 176 Panels::iterator iter = panels_.begin(); |
| 172 for (; iter != panels_.end(); ++iter) | 177 for (; iter != panels_.end(); ++iter) |
| 173 if (x > (*iter)->GetBounds().x()) | 178 if (x > (*iter)->GetBounds().x()) |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 DCHECK_LE(minimized_panel_count_, num_panels()); | 570 DCHECK_LE(minimized_panel_count_, num_panels()); |
| 566 } | 571 } |
| 567 | 572 |
| 568 void DockedPanelStrip::ResizePanelWindow( | 573 void DockedPanelStrip::ResizePanelWindow( |
| 569 Panel* panel, | 574 Panel* panel, |
| 570 const gfx::Size& preferred_window_size) { | 575 const gfx::Size& preferred_window_size) { |
| 571 DCHECK_EQ(this, panel->panel_strip()); | 576 DCHECK_EQ(this, panel->panel_strip()); |
| 572 // Make sure the new size does not violate panel's size restrictions. | 577 // Make sure the new size does not violate panel's size restrictions. |
| 573 gfx::Size new_size(preferred_window_size.width(), | 578 gfx::Size new_size(preferred_window_size.width(), |
| 574 preferred_window_size.height()); | 579 preferred_window_size.height()); |
| 575 panel->ClampSize(&new_size); | 580 new_size = panel->ClampSize(new_size); |
| 576 | 581 |
| 577 if (new_size == panel->full_size()) | 582 if (new_size == panel->full_size()) |
| 578 return; | 583 return; |
| 579 | 584 |
| 580 panel->set_full_size(new_size); | 585 panel->set_full_size(new_size); |
| 581 | 586 |
| 582 RefreshLayout(); | 587 RefreshLayout(); |
| 583 } | 588 } |
| 584 | 589 |
| 585 bool DockedPanelStrip::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const { | 590 bool DockedPanelStrip::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const { |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 | 849 |
| 845 ++num_processed; | 850 ++num_processed; |
| 846 } | 851 } |
| 847 } | 852 } |
| 848 | 853 |
| 849 int DockedPanelStrip::WidthToDisplayPanelInStrip(bool is_for_active_panel, | 854 int DockedPanelStrip::WidthToDisplayPanelInStrip(bool is_for_active_panel, |
| 850 double squeeze_factor, | 855 double squeeze_factor, |
| 851 int full_width) const { | 856 int full_width) const { |
| 852 if (is_for_active_panel) | 857 if (is_for_active_panel) |
| 853 return full_width; | 858 return full_width; |
| 854 return std::max(kMinPanelWidthForDisplay, | 859 return std::max(kPanelMinWidth, |
| 855 static_cast<int>(floor(full_width * squeeze_factor))); | 860 static_cast<int>(floor(full_width * squeeze_factor))); |
| 856 } | 861 } |
| 857 | 862 |
| 858 void DockedPanelStrip::CloseAll() { | 863 void DockedPanelStrip::CloseAll() { |
| 859 // This should only be called at the end of tests to clean up. | 864 // This should only be called at the end of tests to clean up. |
| 860 | 865 |
| 861 // Make a copy of the iterator as closing panels can modify the vector. | 866 // Make a copy of the iterator as closing panels can modify the vector. |
| 862 Panels panels_copy = panels_; | 867 Panels panels_copy = panels_; |
| 863 | 868 |
| 864 // Start from the bottom to avoid reshuffling. | 869 // Start from the bottom to avoid reshuffling. |
| 865 for (Panels::reverse_iterator iter = panels_copy.rbegin(); | 870 for (Panels::reverse_iterator iter = panels_copy.rbegin(); |
| 866 iter != panels_copy.rend(); ++iter) | 871 iter != panels_copy.rend(); ++iter) |
| 867 (*iter)->Close(); | 872 (*iter)->Close(); |
| 868 } | 873 } |
| 869 | 874 |
| 870 void DockedPanelStrip::UpdatePanelOnStripChange(Panel* panel) { | 875 void DockedPanelStrip::UpdatePanelOnStripChange(Panel* panel) { |
| 871 // Always update limits, even on existing panels, in case the limits changed | 876 // Update limits if the panel is still autosizable, in case the limit has |
| 872 // while panel was out of the strip. | 877 // changed. If the panel is not autoresizable, then it was resized |
| 873 int max_panel_width = GetMaxPanelWidth(); | 878 // by the user or by the app via API. |
| 874 int max_panel_height = GetMaxPanelHeight(); | 879 if (panel->auto_resizable()) { |
| 875 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), | 880 int max_panel_width = GetMaxPanelWidth(); |
| 876 gfx::Size(max_panel_width, max_panel_height)); | 881 int max_panel_height = GetMaxPanelHeight(); |
| 877 | 882 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), |
| 883 gfx::Size(max_panel_width, max_panel_height)); |
| 884 } |
| 878 panel->set_attention_mode(Panel::USE_PANEL_ATTENTION); | 885 panel->set_attention_mode(Panel::USE_PANEL_ATTENTION); |
| 879 panel->SetAppIconVisibility(true); | 886 panel->SetAppIconVisibility(true); |
| 880 panel->SetAlwaysOnTop(true); | 887 panel->SetAlwaysOnTop(true); |
| 881 panel->EnableResizeByMouse(true); | 888 panel->EnableResizeByMouse(true); |
| 882 } | 889 } |
| 883 | 890 |
| 884 void DockedPanelStrip::OnPanelActiveStateChanged(Panel* panel) { | 891 void DockedPanelStrip::OnPanelActiveStateChanged(Panel* panel) { |
| 885 // Refresh layout, but wait till active states settle. | 892 // Refresh layout, but wait till active states settle. |
| 886 // This lets us avoid refreshing too many times when one panel loses | 893 // This lets us avoid refreshing too many times when one panel loses |
| 887 // focus and another gains it. | 894 // focus and another gains it. |
| 888 refresh_action_factory_.InvalidateWeakPtrs(); | 895 refresh_action_factory_.InvalidateWeakPtrs(); |
| 889 MessageLoop::current()->PostDelayedTask( | 896 MessageLoop::current()->PostDelayedTask( |
| 890 FROM_HERE, | 897 FROM_HERE, |
| 891 base::Bind(&DockedPanelStrip::RefreshLayout, | 898 base::Bind(&DockedPanelStrip::RefreshLayout, |
| 892 refresh_action_factory_.GetWeakPtr()), | 899 refresh_action_factory_.GetWeakPtr()), |
| 893 base::TimeDelta::FromMilliseconds(PanelManager::AdjustTimeInterval( | 900 base::TimeDelta::FromMilliseconds(PanelManager::AdjustTimeInterval( |
| 894 kRefreshLayoutAfterActivePanelChangeDelayMs))); | 901 kRefreshLayoutAfterActivePanelChangeDelayMs))); |
| 895 } | 902 } |
| 896 | 903 |
| 897 bool DockedPanelStrip::HasPanel(Panel* panel) const { | 904 bool DockedPanelStrip::HasPanel(Panel* panel) const { |
| 898 return find(panels_.begin(), panels_.end(), panel) != panels_.end(); | 905 return find(panels_.begin(), panels_.end(), panel) != panels_.end(); |
| 899 } | 906 } |
| OLD | NEW |