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

Unified Diff: chrome/browser/ui/panels/panel_strip.cc

Issue 8744005: Refactor PanelManager to create PanelStrip. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address nits Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/panels/panel_strip.h ('k') | chrome/browser/ui/panels/test_panel_mouse_watcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/panels/panel_strip.cc
diff --git a/chrome/browser/ui/panels/panel_manager.cc b/chrome/browser/ui/panels/panel_strip.cc
similarity index 69%
copy from chrome/browser/ui/panels/panel_manager.cc
copy to chrome/browser/ui/panels/panel_strip.cc
index 7e2fefdbb4373ca3532e2acbc32a02ad43a3792a..e62e34bb5383011e9bebd6f733f7be8853f810f3 100644
--- a/chrome/browser/ui/panels/panel_manager.cc
+++ b/chrome/browser/ui/panels/panel_strip.cc
@@ -2,18 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/ui/panels/panel_manager.h"
+#include "chrome/browser/ui/panels/panel_strip.h"
#include <algorithm>
#include "base/bind.h"
#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/panels/panel_manager.h"
#include "chrome/browser/ui/panels/panel_mouse_watcher.h"
-#include "chrome/browser/ui/window_sizer.h"
#include "chrome/common/chrome_notification_types.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
@@ -22,19 +20,12 @@ namespace {
// Invalid panel index.
const size_t kInvalidPanelIndex = static_cast<size_t>(-1);
-// Width of spacing between first panel and the right edge of the screen.
-// Leaving a larger gap at the edge of the screen allows access to UI
-// elements located on the bottom right of windows.
-const int kRightScreenEdgeSpacingWidth = 24;
-
// Width to height ratio is used to compute the default width or height
// when only one value is provided.
const double kPanelDefaultWidthToHeightRatio = 1.62; // golden ratio
-// Maxmium width and height of a panel based on the factor of the working
-// area.
+// Maxmium width of a panel is based on a factor of the entire panel strip.
const double kPanelMaxWidthFactor = 0.35;
-const double kPanelMaxHeightFactor = 0.5;
// Occasionally some system, like Windows, might not bring up or down the bottom
// bar when the mouse enters or leaves the bottom screen area. This is the
@@ -51,83 +42,65 @@ const int kMillisecondsBeforeCollapsingFromTitleOnlyState = 0;
} // namespace
// static
-const int PanelManager::kPanelMinWidth = 100;
-const int PanelManager::kPanelMinHeight = 20;
-
-// static
-PanelManager* PanelManager::GetInstance() {
- static base::LazyInstance<PanelManager> instance = LAZY_INSTANCE_INITIALIZER;
- return instance.Pointer();
-}
+const int PanelStrip::kPanelMinWidth = 100;
+const int PanelStrip::kPanelMinHeight = 20;
-PanelManager::PanelManager()
- : minimized_panel_count_(0),
+PanelStrip::PanelStrip(PanelManager* panel_manager)
+ : panel_manager_(panel_manager),
+ minimized_panel_count_(0),
are_titlebars_up_(false),
dragging_panel_index_(kInvalidPanelIndex),
dragging_panel_original_x_(0),
delayed_titlebar_action_(NO_ACTION),
remove_delays_for_testing_(false),
- titlebar_action_factory_(this),
- auto_sizing_enabled_(true),
- mouse_watching_disabled_(false) {
- panel_mouse_watcher_.reset(PanelMouseWatcher::Create());
- auto_hiding_desktop_bar_ = AutoHidingDesktopBar::Create(this);
- OnDisplayChanged();
+ titlebar_action_factory_(this) {
}
-PanelManager::~PanelManager() {
+PanelStrip::~PanelStrip() {
DCHECK(panels_.empty());
DCHECK(panels_pending_to_remove_.empty());
DCHECK_EQ(0, minimized_panel_count_);
}
-void PanelManager::OnDisplayChanged() {
- scoped_ptr<WindowSizer::MonitorInfoProvider> info_provider(
- WindowSizer::CreateDefaultMonitorInfoProvider());
-#if defined(OS_MACOSX)
- // On OSX, panels should be dropped all the way to the bottom edge of the
- // screen (and overlap Dock).
- gfx::Rect work_area = info_provider->GetPrimaryMonitorBounds();
-#else
- gfx::Rect work_area = info_provider->GetPrimaryMonitorWorkArea();
-#endif
- SetWorkArea(work_area);
-}
-
-void PanelManager::SetWorkArea(const gfx::Rect& work_area) {
- if (work_area == work_area_)
+void PanelStrip::SetBounds(const gfx::Rect bounds) {
+ if (strip_bounds_ == bounds)
return;
- work_area_ = work_area;
-
- auto_hiding_desktop_bar_->UpdateWorkArea(work_area_);
- AdjustWorkAreaForAutoHidingDesktopBars();
+ strip_bounds_ = bounds;
Rearrange(panels_.begin(), StartingRightPosition());
}
-Panel* PanelManager::CreatePanel(Browser* browser) {
- int width = browser->override_bounds().width();
- int height = browser->override_bounds().height();
+void PanelStrip::AddPanel(Panel* panel) {
+ if (panel->initialized())
+ AddExistingPanel(panel);
+ else
+ AddNewPanel(panel);
+ panels_.push_back(panel);
+}
- Panel* panel = new Panel(browser, gfx::Size(width, height));
+void PanelStrip::AddNewPanel(Panel* panel) {
+ DCHECK(!panel->initialized());
int max_panel_width = GetMaxPanelWidth();
int max_panel_height = GetMaxPanelHeight();
panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight),
gfx::Size(max_panel_width, max_panel_height));
- // Auto resizable is enabled only if no initial size is provided.
- bool auto_resize = (width == 0 && height == 0);
- panel->SetAutoResizable(auto_resize);
+ gfx::Size restored_size = panel->restored_size();
+ int height = restored_size.height();
+ int width = restored_size.width();
- // Adjust the width and height to fit into our constraint.
- if (!auto_resize) {
+ if (height == 0 && width == 0) {
+ // Auto resizable is enabled only if no initial size is provided.
+ panel->SetAutoResizable(true);
+ } else {
if (height == 0)
height = width / kPanelDefaultWidthToHeightRatio;
if (width == 0)
width = height * kPanelDefaultWidthToHeightRatio;
}
+ // Constrain sizes to limits.
if (width < kPanelMinWidth)
width = kPanelMinWidth;
else if (width > max_panel_width)
@@ -137,58 +110,61 @@ Panel* PanelManager::CreatePanel(Browser* browser) {
height = kPanelMinHeight;
else if (height > max_panel_height)
height = max_panel_height;
-
panel->set_restored_size(gfx::Size(width, height));
// Layout the new panel.
- int y = adjusted_work_area_.bottom() - height;
+ int y = strip_bounds_.bottom() - height;
int x = GetRightMostAvailablePosition() - width;
panel->Initialize(gfx::Rect(x, y, width, height));
+}
- panels_.push_back(panel);
-
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_PANEL_ADDED,
- content::Source<Panel>(panel),
- content::NotificationService::NoDetails());
-
- return panel;
+void PanelStrip::AddExistingPanel(Panel* panel) {
+ gfx::Size restored_size = panel->restored_size();
+ int height = restored_size.height();
+ int width = restored_size.width();
+ int x = GetRightMostAvailablePosition() - width;
+ int y = strip_bounds_.bottom() - height;
+ panel->SetPanelBounds(gfx::Rect(x, y, width, height));
}
-int PanelManager::GetMaxPanelWidth() const {
- return static_cast<int>(adjusted_work_area_.width() * kPanelMaxWidthFactor);
+int PanelStrip::GetMaxPanelWidth() const {
+ return static_cast<int>(strip_bounds_.width() * kPanelMaxWidthFactor);
}
-int PanelManager::GetMaxPanelHeight() const {
- return static_cast<int>(adjusted_work_area_.height() * kPanelMaxHeightFactor);
+int PanelStrip::GetMaxPanelHeight() const {
+ return strip_bounds_.height();
}
-int PanelManager::StartingRightPosition() const {
- return adjusted_work_area_.right() - kRightScreenEdgeSpacingWidth;
+int PanelStrip::StartingRightPosition() const {
+ return strip_bounds_.right();
}
-int PanelManager::GetRightMostAvailablePosition() const {
+int PanelStrip::GetRightMostAvailablePosition() const {
return panels_.empty() ? StartingRightPosition() :
(panels_.back()->GetBounds().x() - kPanelsHorizontalSpacing);
}
-void PanelManager::Remove(Panel* panel) {
+bool PanelStrip::Remove(Panel* panel) {
+ if (find(panels_.begin(), panels_.end(), panel) == panels_.end())
+ return false;
+
// If we're in the process of dragging, delay the removal.
if (dragging_panel_index_ != kInvalidPanelIndex) {
panels_pending_to_remove_.push_back(panel);
- return;
+ return true;
}
DoRemove(panel);
+ return true;
}
-void PanelManager::DelayedRemove() {
+void PanelStrip::DelayedRemove() {
for (size_t i = 0; i < panels_pending_to_remove_.size(); ++i)
DoRemove(panels_pending_to_remove_[i]);
panels_pending_to_remove_.clear();
}
-void PanelManager::DoRemove(Panel* panel) {
+void PanelStrip::DoRemove(Panel* panel) {
Panels::iterator iter = find(panels_.begin(), panels_.end(), panel);
if (iter == panels_.end())
return;
@@ -198,14 +174,10 @@ void PanelManager::DoRemove(Panel* panel) {
gfx::Rect bounds = (*iter)->GetBounds();
Rearrange(panels_.erase(iter), bounds.right());
-
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_PANEL_REMOVED,
- content::Source<Panel>(panel),
- content::NotificationService::NoDetails());
+ panel_manager_->OnPanelRemoved(panel);
}
-void PanelManager::StartDragging(Panel* panel) {
+void PanelStrip::StartDragging(Panel* panel) {
for (size_t i = 0; i < panels_.size(); ++i) {
if (panels_[i] == panel) {
dragging_panel_index_ = i;
@@ -216,7 +188,7 @@ void PanelManager::StartDragging(Panel* panel) {
}
}
-void PanelManager::Drag(int delta_x) {
+void PanelStrip::Drag(int delta_x) {
DCHECK(dragging_panel_index_ != kInvalidPanelIndex);
if (!delta_x)
@@ -235,7 +207,7 @@ void PanelManager::Drag(int delta_x) {
DragLeft();
}
-void PanelManager::DragLeft() {
+void PanelStrip::DragLeft() {
Panel* dragging_panel = panels_[dragging_panel_index_];
// This is the left corner of the dragging panel. We use it to check against
@@ -278,7 +250,7 @@ void PanelManager::DragLeft() {
}
}
-void PanelManager::DragRight() {
+void PanelStrip::DragRight() {
Panel* dragging_panel = panels_[dragging_panel_index_];
// This is the right corner of the dragging panel. We use it to check against
@@ -320,7 +292,7 @@ void PanelManager::DragRight() {
}
}
-void PanelManager::EndDragging(bool cancelled) {
+void PanelStrip::EndDragging(bool cancelled) {
DCHECK(dragging_panel_index_ != kInvalidPanelIndex);
if (cancelled) {
@@ -336,7 +308,7 @@ void PanelManager::EndDragging(bool cancelled) {
DelayedRemove();
}
-void PanelManager::OnPanelExpansionStateChanged(
+void PanelStrip::OnPanelExpansionStateChanged(
Panel::ExpansionState old_state, Panel::ExpansionState new_state) {
DCHECK_NE(new_state, old_state);
switch (new_state) {
@@ -353,25 +325,22 @@ void PanelManager::OnPanelExpansionStateChanged(
}
}
-void PanelManager::IncrementMinimizedPanels() {
- if (!mouse_watching_disabled_ && !minimized_panel_count_)
- panel_mouse_watcher_->AddObserver(this);
+void PanelStrip::IncrementMinimizedPanels() {
minimized_panel_count_++;
+ if (minimized_panel_count_ == 1)
+ panel_manager_->mouse_watcher()->AddObserver(this);
DCHECK_LE(minimized_panel_count_, num_panels());
}
-void PanelManager::DecrementMinimizedPanels() {
+void PanelStrip::DecrementMinimizedPanels() {
minimized_panel_count_--;
DCHECK_GE(minimized_panel_count_, 0);
- if (!mouse_watching_disabled_ && !minimized_panel_count_)
- panel_mouse_watcher_->RemoveObserver(this);
+ if (minimized_panel_count_ == 0)
+ panel_manager_->mouse_watcher()->RemoveObserver(this);
}
-void PanelManager::OnPreferredWindowSizeChanged(
+void PanelStrip::OnPreferredWindowSizeChanged(
Panel* panel, const gfx::Size& preferred_window_size) {
- if (!auto_sizing_enabled_)
- return;
-
gfx::Rect bounds = panel->GetBounds();
// The panel width:
@@ -427,14 +396,14 @@ void PanelManager::OnPreferredWindowSizeChanged(
panel->SetPanelBounds(bounds);
}
-bool PanelManager::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const {
+bool PanelStrip::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const {
// We should always bring up the titlebar if the mouse is over the
// visible auto-hiding bottom bar.
- if (auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM) &&
- auto_hiding_desktop_bar_->GetVisibility(
- AutoHidingDesktopBar::ALIGN_BOTTOM) ==
+ AutoHidingDesktopBar* desktop_bar = panel_manager_->auto_hiding_desktop_bar();
+ if (desktop_bar->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM) &&
+ desktop_bar->GetVisibility(AutoHidingDesktopBar::ALIGN_BOTTOM) ==
AutoHidingDesktopBar::VISIBLE &&
- mouse_y >= adjusted_work_area_.bottom())
+ mouse_y >= strip_bounds_.bottom())
return true;
for (Panels::const_iterator iter = panels_.begin();
@@ -445,7 +414,7 @@ bool PanelManager::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const {
return false;
}
-void PanelManager::BringUpOrDownTitlebars(bool bring_up) {
+void PanelStrip::BringUpOrDownTitlebars(bool bring_up) {
if (are_titlebars_up_ == bring_up)
return;
are_titlebars_up_ = bring_up;
@@ -455,9 +424,10 @@ void PanelManager::BringUpOrDownTitlebars(bool bring_up) {
// If the auto-hiding bottom bar exists, delay the action until the bottom
// bar is fully visible or hidden. We do not want both bottom bar and panel
// titlebar to move at the same time but with different speeds.
- if (auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM)) {
- AutoHidingDesktopBar::Visibility visibility = auto_hiding_desktop_bar_->
- GetVisibility(AutoHidingDesktopBar::ALIGN_BOTTOM);
+ AutoHidingDesktopBar* desktop_bar = panel_manager_->auto_hiding_desktop_bar();
+ if (desktop_bar->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM)) {
+ AutoHidingDesktopBar::Visibility visibility =
+ desktop_bar->GetVisibility(AutoHidingDesktopBar::ALIGN_BOTTOM);
if (visibility != (bring_up ? AutoHidingDesktopBar::VISIBLE
: AutoHidingDesktopBar::HIDDEN)) {
// Occasionally some system, like Windows, might not bring up or down the
@@ -497,12 +467,12 @@ void PanelManager::BringUpOrDownTitlebars(bool bring_up) {
titlebar_action_factory_.InvalidateWeakPtrs();
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
- base::Bind(&PanelManager::DelayedBringUpOrDownTitlebarsCheck,
+ base::Bind(&PanelStrip::DelayedBringUpOrDownTitlebarsCheck,
titlebar_action_factory_.GetWeakPtr()),
task_delay_milliseconds);
}
-void PanelManager::DelayedBringUpOrDownTitlebarsCheck() {
+void PanelStrip::DelayedBringUpOrDownTitlebarsCheck() {
// Task was already processed or cancelled - bail out.
if (delayed_titlebar_action_ == NO_ACTION)
return;
@@ -520,7 +490,7 @@ void PanelManager::DelayedBringUpOrDownTitlebarsCheck() {
DoBringUpOrDownTitlebars(need_to_bring_up_titlebars);
}
-void PanelManager::DoBringUpOrDownTitlebars(bool bring_up) {
+void PanelStrip::DoBringUpOrDownTitlebars(bool bring_up) {
for (Panels::const_iterator iter = panels_.begin();
iter != panels_.end(); ++iter) {
Panel* panel = *iter;
@@ -539,71 +509,27 @@ void PanelManager::DoBringUpOrDownTitlebars(bool bring_up) {
}
}
-void PanelManager::AdjustWorkAreaForAutoHidingDesktopBars() {
- // Note that we do not care about the desktop bar aligned to the top edge
- // since panels could not reach so high due to size constraint.
- adjusted_work_area_ = work_area_;
- if (auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_LEFT)) {
- int space = auto_hiding_desktop_bar_->GetThickness(
- AutoHidingDesktopBar::ALIGN_LEFT);
- adjusted_work_area_.set_x(adjusted_work_area_.x() + space);
- adjusted_work_area_.set_width(adjusted_work_area_.width() - space);
- }
- if (auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_RIGHT)) {
- int space = auto_hiding_desktop_bar_->GetThickness(
- AutoHidingDesktopBar::ALIGN_RIGHT);
- adjusted_work_area_.set_width(adjusted_work_area_.width() - space);
- }
-}
-
-int PanelManager::GetBottomPositionForExpansionState(
+int PanelStrip::GetBottomPositionForExpansionState(
Panel::ExpansionState expansion_state) const {
- int bottom = adjusted_work_area_.bottom();
+ int bottom = strip_bounds_.bottom();
// If there is an auto-hiding desktop bar aligned to the bottom edge, we need
// to move the title-only panel above the auto-hiding desktop bar.
+ AutoHidingDesktopBar* desktop_bar = panel_manager_->auto_hiding_desktop_bar();
if (expansion_state == Panel::TITLE_ONLY &&
- auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM)) {
- bottom -= auto_hiding_desktop_bar_->GetThickness(
- AutoHidingDesktopBar::ALIGN_BOTTOM);
+ desktop_bar->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM)) {
+ bottom -= desktop_bar->GetThickness(AutoHidingDesktopBar::ALIGN_BOTTOM);
}
return bottom;
}
-BrowserWindow* PanelManager::GetNextBrowserWindowToActivate(
- Panel* panel) const {
- // Find the last active browser window that is not minimized.
- BrowserList::const_reverse_iterator iter = BrowserList::begin_last_active();
- BrowserList::const_reverse_iterator end = BrowserList::end_last_active();
- for (; (iter != end); ++iter) {
- Browser* browser = *iter;
- if (panel->browser() != browser && !browser->window()->IsMinimized())
- return browser->window();
- }
-
- return NULL;
-}
-
-void PanelManager::MoveToPanelStrip(Panel* panel) {
- // TODO(jennb) - implement.
-}
-
-void PanelManager::MoveToOverflowStrip(Panel* panel, bool is_new) {
- // TODO(jianli) - implement.
-}
-
-void PanelManager::OnMouseMove(const gfx::Point& mouse_position) {
+void PanelStrip::OnMouseMove(const gfx::Point& mouse_position) {
bool bring_up_titlebars = ShouldBringUpTitlebars(mouse_position.x(),
mouse_position.y());
BringUpOrDownTitlebars(bring_up_titlebars);
}
-void PanelManager::OnAutoHidingDesktopBarThicknessChanged() {
- AdjustWorkAreaForAutoHidingDesktopBars();
- Rearrange(panels_.begin(), StartingRightPosition());
-}
-
-void PanelManager::OnAutoHidingDesktopBarVisibilityChanged(
+void PanelStrip::OnAutoHidingDesktopBarVisibilityChanged(
AutoHidingDesktopBar::Alignment alignment,
AutoHidingDesktopBar::Visibility visibility) {
if (delayed_titlebar_action_ == NO_ACTION)
@@ -619,8 +545,8 @@ void PanelManager::OnAutoHidingDesktopBarVisibilityChanged(
delayed_titlebar_action_ = NO_ACTION;
}
-void PanelManager::Rearrange(Panels::iterator iter_to_start,
- int rightmost_position) {
+void PanelStrip::Rearrange(Panels::iterator iter_to_start,
+ int rightmost_position) {
for (Panels::iterator iter = iter_to_start; iter != panels_.end(); ++iter) {
Panel* panel = *iter;
gfx::Rect new_bounds(panel->GetBounds());
@@ -628,14 +554,13 @@ void PanelManager::Rearrange(Panels::iterator iter_to_start,
new_bounds.set_y(
GetBottomPositionForExpansionState(panel->expansion_state()) -
new_bounds.height());
- if (new_bounds != panel->GetBounds())
- panel->SetPanelBounds(new_bounds);
+ panel->SetPanelBounds(new_bounds);
rightmost_position = new_bounds.x() - kPanelsHorizontalSpacing;
}
}
-void PanelManager::RemoveAll() {
+void PanelStrip::RemoveAll() {
// This should not be called when we're in the process of dragging.
DCHECK(dragging_panel_index_ == kInvalidPanelIndex);
@@ -648,6 +573,6 @@ void PanelManager::RemoveAll() {
(*iter)->Close();
}
-bool PanelManager::is_dragging_panel() const {
+bool PanelStrip::is_dragging_panel() const {
return dragging_panel_index_ != kInvalidPanelIndex;
}
« no previous file with comments | « chrome/browser/ui/panels/panel_strip.h ('k') | chrome/browser/ui/panels/test_panel_mouse_watcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698