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: 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