1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/linked_ptr.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_message_listener.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace views {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Widget;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Browser;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RenderWidgetHost;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserListener;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WmOverviewController is responsible for managing a list of objects
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that listen to the browsers (BrowserListeners, defined in the
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// source file for this class) for changes, and keep a list of
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// snapshot images in sync with the browser tab contents.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// As tabs are added/removed from the browsers, the number of snapshot
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// windows changes to match.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// As obtaining and setting snapshots is expensive we delay setting
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the snapshot. The delay is controlled by delay_timer_. Once the
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// timer fires another timer is started (configure_timer_). This timer
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// invokes ConfigureNextUnconfiguredCell on the BrowserListener, which
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// obtains and sets the snapshot of the next uncofigured
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// cell. ConfigureNextUnconfiguredCell only configures one cell at a
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// time until they are all configured.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WmOverviewController : public BrowserList::Observer,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             public WmMessageListener::Observer,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             public NotificationObserver {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These are the possible layout modes that this controller can be
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in.  The layout mode is controlled by the window manager.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum LayoutMode {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ACTIVE_MODE is the mode where chrome takes up the whole screen
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // and the user interacts with it, and this controller hides the
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // snapshots and stops refreshing them.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ACTIVE_MODE,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // OVERVIEW_MODE is the mode where the toplevel windows are hidden
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // and the user interacts with the snapshots.  This is when the
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // snapshot windows are shown and actively updated by this
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // controller.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OVERVIEW_MODE,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This class is a singleton.
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static WmOverviewController* GetInstance();
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BrowserList::Observer methods
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnBrowserAdded(const Browser* browser) {}
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void OnBrowserRemoved(const Browser* browser);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End BrowserList::Observer methods
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // WmMessageListener::Observer methods
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is called immediately after a browser is added to the list.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ProcessWmMessage(const WmIpc::Message& message,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        GdkWindow* window);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End WmMessageListener::Observer methods
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver methods
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Observe(NotificationType type,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const NotificationSource& source,
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const NotificationDetails& details);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End NotificationObserver methods
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the BrowserListeners to configure their snapshots.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const gfx::Rect& monitor_bounds() const { return monitor_bounds_; }
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Start reloading snapshots if in overview mode.
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void UpdateSnapshots();
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts the delay timer, and once the delay is over, configures
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // any unconfigured snapshots one at a time until none are left to
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be configured.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartDelayTimer();
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LayoutMode layout_mode() const { return layout_mode_; }
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend struct DefaultSingletonTraits<WmOverviewController>;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This class is a singleton.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WmOverviewController();
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~WmOverviewController();
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restores tab selections on all browsers to what they were when
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show was last called.  Used when cancelling overview mode.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RestoreTabSelections();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Saves the currently selected tabs in the snapshots so that they
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // can be restored later with RestoreTabSelections.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SaveTabSelections();
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show the snapshot windows, saving current tab selections.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Show();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Hide the snapshot windows.  When |cancelled| is true, then the
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tab selections that were saved when the snapshot windows were
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shown are restored.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Hide(bool cancelled);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add browser listeners for all existing browsers, reusing any that
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // were already there.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddAllBrowsers();
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when the thumbnail generator notifies us that the snapshot
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // image changed.  This determines which TabContents the given
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // renderer is attached to, and reloads that snapshot.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SnapshotImageChanged(RenderWidgetHost* renderer);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is so we can register for notifications.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is a vector of listeners that listen to all the browsers.
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<linked_ptr<BrowserListener> > BrowserListenerVector;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserListenerVector listeners_;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is the bounds of the monitor we're being displayed on. This
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is used to adjust the size of snapshots so they'll fit.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect monitor_bounds_;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See description above class for details.
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::OneShotTimer<WmOverviewController> delay_timer_;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The current layout mode.
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LayoutMode layout_mode_;
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This flag is set whenever there is a pending |AskForSnapshot| to Chrome;
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This is used to prevent |UpdateSnapshots| from being called multiple times.
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool updating_snapshots_;
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // These indices are used to track the last updated browser listener and tab
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // content, They are used to implement update tab contents in a round-robin
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // fashion.
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int browser_listener_index_;  // index of the last updated browser listener.
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int tab_contents_index_;      // index of the last updated tab contents.
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WmOverviewController);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_
163