| Index: chrome/browser/ui/panels/panel_manager.h
|
| ===================================================================
|
| --- chrome/browser/ui/panels/panel_manager.h (revision 98834)
|
| +++ chrome/browser/ui/panels/panel_manager.h (working copy)
|
| @@ -8,7 +8,10 @@
|
|
|
| #include <vector>
|
| #include "base/basictypes.h"
|
| +#include "base/memory/ref_counted.h"
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/task.h"
|
| +#include "chrome/browser/ui/panels/auto_hiding_desktop_bar.h"
|
| #include "chrome/browser/ui/panels/panel.h"
|
| #include "ui/gfx/rect.h"
|
|
|
| @@ -16,12 +19,16 @@
|
| class Panel;
|
|
|
| // This class manages a set of panels.
|
| -class PanelManager {
|
| +// Note that the ref count is needed by using PostTask in the implementation.
|
| +class PanelManager : public AutoHidingDesktopBar::Observer,
|
| + public base::RefCounted<PanelManager> {
|
| public:
|
| + typedef std::vector<Panel*> Panels;
|
| +
|
| // Returns a single instance.
|
| static PanelManager* GetInstance();
|
|
|
| - ~PanelManager();
|
| + virtual ~PanelManager();
|
|
|
| // Called when the display is changed, i.e. work area is updated.
|
| void OnDisplayChanged();
|
| @@ -38,32 +45,62 @@
|
| void Drag(int delta_x);
|
| void EndDragging(bool cancelled);
|
|
|
| - // Should we bring up the titlebar, given the current mouse point?
|
| - bool ShouldBringUpTitlebarForAllMinimizedPanels(int mouse_x,
|
| - int mouse_y) const;
|
| + // Returns true if we should bring up the titlebars, given the current mouse
|
| + // point.
|
| + bool ShouldBringUpTitlebars(int mouse_x, int mouse_y) const;
|
|
|
| - // Brings up or down the title-bar for all minimized panels.
|
| - void BringUpOrDownTitlebarForAllMinimizedPanels(bool bring_up);
|
| + // Brings up or down the titlebars for all minimized panels.
|
| + void BringUpOrDownTitlebars(bool bring_up);
|
|
|
| + // Returns the bottom position for the panel per its expansion state. If auto-
|
| + // hide bottom bar is present, we want to move the minimized panel to the
|
| + // bottom of the screen, not the bottom of the work area.
|
| + int GetBottomPositionForExpansionState(
|
| + Panel::ExpansionState expansion_state) const;
|
| +
|
| int num_panels() const { return panels_.size(); }
|
| bool is_dragging_panel() const;
|
|
|
| - private:
|
| - friend class PanelBrowserTest;
|
| +#ifdef UNIT_TEST
|
| + const Panels& panels() const { return panels_; }
|
| + static int horizontal_spacing() { return kPanelsHorizontalSpacing; }
|
|
|
| - typedef std::vector<Panel*> Panels;
|
| + const gfx::Rect& work_area() const {
|
| + return work_area_;
|
| + }
|
|
|
| - PanelManager();
|
| + void set_auto_hiding_desktop_bar(
|
| + AutoHidingDesktopBar* auto_hiding_desktop_bar) {
|
| + auto_hiding_desktop_bar_ = auto_hiding_desktop_bar;
|
| + }
|
|
|
| -#if UNIT_TEST
|
| - const Panels& panels() const { return panels_; }
|
| - static int horizontal_spacing() { return kPanelsHorizontalSpacing; }
|
| + void SetWorkAreaForTesting(const gfx::Rect& work_area) {
|
| + SetWorkArea(work_area);
|
| + }
|
| #endif
|
|
|
| + private:
|
| + enum TitlebarAction {
|
| + NO_ACTION,
|
| + BRING_UP,
|
| + BRING_DOWN
|
| + };
|
| +
|
| + PanelManager();
|
| +
|
| + // Overridden from AutoHidingDesktopBar::Observer:
|
| + virtual void OnAutoHidingDesktopBarThicknessChanged() OVERRIDE;
|
| + virtual void OnAutoHidingDesktopBarVisibilityChanged(
|
| + AutoHidingDesktopBar::Alignment alignment,
|
| + AutoHidingDesktopBar::Visibility visibility) OVERRIDE;
|
| +
|
| // Applies the new work area. This is called by OnDisplayChanged and the test
|
| // code.
|
| void SetWorkArea(const gfx::Rect& work_area);
|
|
|
| + // Adjusts the work area to exclude the influence of auto-hiding desktop bars.
|
| + void AdjustWorkAreaForAutoHidingDesktopBars();
|
| +
|
| // Handles all the panels that're delayed to be removed.
|
| void DelayedRemove();
|
|
|
| @@ -73,14 +110,8 @@
|
| // Rearranges the positions of the panels starting from the given iterator.
|
| // This is called when the display space has been changed, i.e. working
|
| // area being changed or a panel being closed.
|
| - void Rearrange(Panels::iterator iter_to_start);
|
| + void Rearrange(Panels::iterator iter_to_start, int rightmost_position);
|
|
|
| - // Computes the bounds for next panel.
|
| - // |allow_size_change| is used to indicate if the panel size can be changed to
|
| - // fall within the size constraint, e.g., when the panel is created.
|
| - // Returns true if computed bounds are within the displayable area.
|
| - bool ComputeBoundsForNextPanel(gfx::Rect* bounds, bool allow_size_change);
|
| -
|
| // Finds one panel to close so that we may have space for the new panel
|
| // created by |extension|.
|
| void FindAndClosePanelOnOverflow(const Extension* extension);
|
| @@ -89,23 +120,31 @@
|
| void DragLeft();
|
| void DragRight();
|
|
|
| - // Horizontal spacing between panels. Used for unit testing.
|
| + // Checks if the titlebars have been brought up or down. If not, do not wait
|
| + // for the notifications to trigger it any more, and start to bring them up or
|
| + // down immediately.
|
| + void DelayedBringUpOrDownTitlebarsCheck();
|
|
|
| + // Does the real job of bringing up or down the titlebars.
|
| + void DoBringUpOrDownTitlebars(bool bring_up);
|
| +
|
| + int GetRightMostAvaialblePosition() const;
|
| +
|
| Panels panels_;
|
|
|
| // Stores the panels that are pending to remove. We want to delay the removal
|
| // when we're in the process of the dragging.
|
| Panels panels_pending_to_remove_;
|
|
|
| - // Current work area used in computing the panel bounds.
|
| + // The maximum work area avaialble. This area does not include the area taken
|
| + // by the always-visible (non-auto-hiding) desktop bars.
|
| gfx::Rect work_area_;
|
|
|
| - // Used in computing the bounds of the next panel.
|
| - int max_width_;
|
| - int max_height_;
|
| - int min_x_;
|
| - int current_x_;
|
| - int bottom_edge_y_;
|
| + // The useable work area for computing the panel bounds. This area excludes
|
| + // the potential area that could be taken by the auto-hiding desktop
|
| + // bars (we only consider those bars that are aligned to bottom, left, and
|
| + // right of the screen edges) when they become fully visible.
|
| + gfx::Rect adjusted_work_area_;
|
|
|
| // Panel to drag.
|
| size_t dragging_panel_index_;
|
| @@ -119,6 +158,12 @@
|
| // to when the dragging ends.
|
| gfx::Rect dragging_panel_bounds_;
|
|
|
| + scoped_refptr<AutoHidingDesktopBar> auto_hiding_desktop_bar_;
|
| +
|
| + TitlebarAction delayed_titlebar_action_;
|
| +
|
| + ScopedRunnableMethodFactory<PanelManager> method_factory_;
|
| +
|
| static const int kPanelsHorizontalSpacing = 4;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PanelManager);
|
|
|