Home | History | Annotate | Download | only in panels
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
      6 #define CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
      7 #pragma once
      8 
      9 #include <deque>
     10 #include <vector>
     11 #include "base/basictypes.h"
     12 #include "base/scoped_ptr.h"
     13 #include "ui/gfx/rect.h"
     14 
     15 class Browser;
     16 class Panel;
     17 
     18 // This class manages a set of panels.
     19 class PanelManager {
     20  public:
     21   // Returns a single instance.
     22   static PanelManager* GetInstance();
     23 
     24   ~PanelManager();
     25 
     26   // Called when the display is changed, i.e. work area is updated.
     27   void OnDisplayChanged();
     28 
     29   // Creates a panel and returns it. The panel might be queued for display
     30   // later.
     31   Panel* CreatePanel(Browser* browser);
     32 
     33   // Removes the given panel. Both active and pending panel lists are checked.
     34   // If an active panel is removed, pending panels could put on display if we
     35   // have spaces.
     36   void Remove(Panel* panel);
     37 
     38   // Minimizes all panels. This only applies to active panels since only them
     39   // are visible.
     40   void MinimizeAll();
     41 
     42   // Restores all panels. This only applies to active panels since only them
     43   // are visible.
     44   void RestoreAll();
     45 
     46   // Removes all active panels. Pending panels will be processed for display.
     47   void RemoveAllActive();
     48 
     49   // Returns true if all active panels are in minimized state.
     50   bool AreAllMinimized() const;
     51 
     52   // Drags the given active panel.
     53   void StartDragging(Panel* panel);
     54   void Drag(int delta_x);
     55   void EndDragging(bool cancelled);
     56 
     57   // Returns the number of active panels.
     58   int active_count() const { return active_panels_.size(); }
     59 
     60  private:
     61   typedef std::vector<Panel*> ActivePanels;
     62   typedef std::deque<Panel*> PendingPanels;
     63 
     64   PanelManager();
     65 
     66   // Handles all the panels that're delayed to be removed.
     67   void DelayedRemove();
     68 
     69   // Does the remove. Called from Remove and DelayedRemove.
     70   void DoRemove(Panel* panel);
     71 
     72   // Rearranges the positions of the panels starting from the given iterator.
     73   // This is called when the display space has been changed, i.e. working
     74   // area being changed or a panel being closed.
     75   void Rearrange(ActivePanels::iterator iter_to_start);
     76 
     77   // Checks the pending panels to see if we show them when we have more space.
     78   void ProcessPending();
     79 
     80   // Computes the bounds for next panel.
     81   // |allow_size_change| is used to indicate if the panel size can be changed to
     82   // fall within the size constraint, e.g., when the panel is created.
     83   // Returns true if computed bounds are within the displayable area.
     84   bool ComputeBoundsForNextPanel(gfx::Rect* bounds, bool allow_size_change);
     85 
     86   // Help functions to drag the given panel.
     87   void DragNegative(int delta_x);
     88   void DragPositive(int delta_x);
     89 
     90   // Stores the active panels.
     91   ActivePanels active_panels_;
     92 
     93   // Stores the panels that are pending to show.
     94   PendingPanels pending_panels_;
     95 
     96   // Stores the panels that are pending to remove. We want to delay the removal
     97   // when we're in the process of the dragging.
     98   std::vector<Panel*> panels_pending_to_remove_;
     99 
    100   // Used in computing the bounds of the next panel.
    101   int max_width_;
    102   int max_height_;
    103   int min_x_;
    104   int current_x_;
    105   int bottom_edge_y_;
    106 
    107   // Panel to drag.
    108   size_t dragging_panel_index_;
    109 
    110   // Original x coordinate of the panel to drag. This is used to get back to
    111   // the original position when we cancel the dragging.
    112   int dragging_panel_original_x_;
    113 
    114   // Bounds of the panel to drag. It is first set to the original bounds when
    115   // the dragging happens. Then it is updated to the position that will be set
    116   // to when the dragging ends.
    117   gfx::Rect dragging_panel_bounds_;
    118 
    119   DISALLOW_COPY_AND_ASSIGN(PanelManager);
    120 };
    121 
    122 #endif  // CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
    123