• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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_AEROPEEK_MANAGER_H_
6 #define CHROME_BROWSER_AEROPEEK_MANAGER_H_
7 #pragma once
8 
9 #include <windows.h>
10 
11 #include <list>
12 
13 #include "chrome/browser/tabs/tab_strip_model_observer.h"
14 #include "ui/gfx/insets.h"
15 
16 namespace gfx {
17 class Size;
18 }
19 class AeroPeekWindow;
20 class SkBitmap;
21 class TabContents;
22 
23 // A class which defines interfaces called from AeroPeekWindow.
24 // This class is used for dispatching an event received by a thumbnail window
25 // and for retrieving information from Chrome.
26 // An AeroPeek window receives the following events:
27 // * A user clicks an AeroPeek thumbnail.
28 //   We need to select a tab associated with this window.
29 // * A user closes an AeroPeek thumbnail.
30 //   We need to close a tab associated with this window.
31 // * A user clicks a toolbar button in an AeroPeek window.
32 //   We may need to dispatch this button event to a tab associated with this
33 //   thumbnail window.
34 //   <http://msdn.microsoft.com/en-us/library/dd378460(VS.85).aspx#thumbbars>.
35 // Also, it needs the following information of the browser:
36 // * The bitmap of a tab associated with this window.
37 //   This bitmap is used for creating thumbnail and preview images.
38 // * The rectangle of a browser frame.
39 //   This rectangle is used for pasting the above bitmap to the right position
40 //   and for marking the tab-content area as opaque.
41 // We assume these functions are called only from a UI thread (i.e.
42 // Chrome_BrowserMain).
43 class AeroPeekWindowDelegate {
44  public:
45   virtual void ActivateTab(int tab_id) = 0;
46   virtual void CloseTab(int tab_id) = 0;
47   virtual void GetContentInsets(gfx::Insets* insets) = 0;
48   virtual bool GetTabThumbnail(int tab_id, SkBitmap* thumbnail) = 0;
49   virtual bool GetTabPreview(int tab_id, SkBitmap* preview) = 0;
50 
51  protected:
~AeroPeekWindowDelegate()52   virtual ~AeroPeekWindowDelegate() {}
53 };
54 
55 // A class that implements AeroPeek of Windows 7:
56 // <http://msdn.microsoft.com/en-us/library/dd378460(VS.85).aspx#thumbnails>.
57 // Windows 7 can dispay a thumbnail image of each tab to its taskbar so that
58 // a user can preview the contents of a tab (AeroPeek), choose a tab, close
59 // a tab, etc.
60 // This class implements the TabStripModelObserver interface to receive the
61 // following events sent from TabStripModel and dispatch them to Windows:
62 // * A tab is added.
63 //   This class adds a thumbnail window for this tab to the thumbnail list
64 //   of Windows.
65 // * A tab is being closed.
66 //   This class deletes the thumbnail window associated with this tab from the
67 //   thumbnail list of Windows.
68 // * A tab has been updated.
69 //   This class updates the image of the thumbnail window associated with this
70 //   tab.
71 // Also, this class receives events sent from Windows via thumbnail windows to
72 // TabStripModel:
73 // * A thumbnail window is closed.
74 //   Ask TabStrip to close the tab associated with this thumbnail window.
75 // * A thumbnail window is selected.
76 //   Ask TabStrip to activate the tab associated with this thumbnail window.
77 //
78 // The simplest usage of this class is:
79 // 1. Create an instance of TabThumbnailManager.
80 // 2. Add this instance to the observer list of a TabStrip object.
81 //
82 //      scoped_ptr<TabThumbnailManager> manager;
83 //      manager.reset(new TabThumbnailManager(
84 //          frame_->GetWindow()->GetNativeWindow(),
85 //          border_left,
86 //          border_top,
87 //          toolbar_top));
88 //      g_browser->tabstrip_model()->AddObserver(manager);
89 //
90 // 3. Remove this instance from the observer list of the TabStrip object when
91 //    we don't need it.
92 //
93 //      g_browser->tabstrip_model()->RemoveObserver(manager);
94 //
95 class AeroPeekManager : public TabStripModelObserver,
96                         public AeroPeekWindowDelegate {
97  public:
98   explicit AeroPeekManager(HWND application_window);
99   virtual ~AeroPeekManager();
100 
101   // Sets the margins of the "user-perceived content area".
102   // (See comments of |content_insets_|).
103   void SetContentInsets(const gfx::Insets& insets);
104 
105   // Returns whether or not we should enable Tab Thumbnailing and Aero Peek
106   // of Windows 7.
107   static bool Enabled();
108 
109   // Overridden from TabStripModelObserver:
110   virtual void TabInsertedAt(TabContentsWrapper* contents,
111                              int index,
112                              bool foreground);
113   virtual void TabDetachedAt(TabContentsWrapper* contents, int index);
114   virtual void TabSelectedAt(TabContentsWrapper* old_contents,
115                              TabContentsWrapper* new_contents,
116                              int index,
117                              bool user_gesture);
118   virtual void TabMoved(TabContentsWrapper* contents,
119                         int from_index,
120                         int to_index,
121                         bool pinned_state_changed);
122   virtual void TabChangedAt(TabContentsWrapper* contents,
123                             int index,
124                             TabChangeType change_type);
125   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
126                              TabContentsWrapper* old_contents,
127                              TabContentsWrapper* new_contents,
128                              int index);
129 
130   // Overriden from TabThumbnailWindowDelegate:
131   virtual void CloseTab(int tab_id);
132   virtual void ActivateTab(int tab_id);
133   virtual void GetContentInsets(gfx::Insets* insets);
134   virtual bool GetTabThumbnail(int tab_id, SkBitmap* thumbnail);
135   virtual bool GetTabPreview(int tab_id, SkBitmap* preview);
136 
137  private:
138   // Deletes the TabThumbnailWindow object associated with the specified
139   // Tab ID.
140   void DeleteAeroPeekWindow(int tab_id);
141 
142   // If there is an AeroPeekWindow associated with |tab| it is removed and
143   // deleted.
144   void DeleteAeroPeekWindowForTab(TabContentsWrapper* tab);
145 
146   // Retrieves the AeroPeekWindow object associated with the specified
147   // Tab ID.
148   AeroPeekWindow* GetAeroPeekWindow(int tab_id) const;
149 
150   // If an AeroPeekWindow hasn't been created for |tab| yet, one is created.
151   // |foreground| is true if the tab is selected.
152   void CreateAeroPeekWindowIfNecessary(TabContentsWrapper* tab,
153                                        bool foreground);
154 
155   // Returns a rectangle that fits into the destination rectangle and keeps
156   // the pixel-aspect ratio of the source one.
157   // (This function currently uses the longer-fit algorithm as IE8 does.)
158   void GetOutputBitmapSize(const gfx::Size& destination,
159                            const gfx::Size& source,
160                            gfx::Size* output) const;
161 
162   // Returns the TabContents object associated with the specified Tab ID only
163   // if it is alive.
164   // Since Windows cannot send AeroPeek events directly to Chrome windows, we
165   // use a place-holder window to receive AeroPeek events. So, when Windows
166   // sends an AeroPeek event, the corresponding tab (and TabContents) may have
167   // been deleted by Chrome. To prevent us from accessing deleted TabContents,
168   // we need to check if the tab is still alive.
169   TabContents* GetTabContents(int tab_id) const;
170 
171   // Returns the tab ID from the specified TabContents.
172   int GetTabID(TabContents* contents) const;
173 
174  private:
175   // The parent window of the place-holder windows used by AeroPeek.
176   // In the case of Chrome, this window becomes a browser frame.
177   HWND application_window_;
178 
179   // The list of the place-holder windows used by AeroPeek.
180   std::list<AeroPeekWindow*> tab_list_;
181 
182   // The left and top borders of the frame window.
183   // When we create a preview bitmap, we use these values for preventing from
184   // over-writing the area of the browser frame.
185   int border_left_;
186   int border_top_;
187 
188   // The top position of the toolbar.
189   // This value is used for setting the alpha values of the frame area so a
190   // preview image can use transparent colors only in the frame area.
191   int toolbar_top_;
192 
193   // The margins of the "user-perceived content area".
194   // This value is used for pasting a tab image onto this "user-perceived
195   // content area" when creating a preview image.
196   gfx::Insets content_insets_;
197 };
198 
199 #endif  // CHROME_BROWSER_AEROPEEK_MANAGER_H_
200