// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_AEROPEEK_MANAGER_H_ #define CHROME_BROWSER_AEROPEEK_MANAGER_H_ #pragma once #include <windows.h> #include <list> #include "chrome/browser/tabs/tab_strip_model_observer.h" #include "ui/gfx/insets.h" namespace gfx { class Size; } class AeroPeekWindow; class SkBitmap; class TabContents; // A class which defines interfaces called from AeroPeekWindow. // This class is used for dispatching an event received by a thumbnail window // and for retrieving information from Chrome. // An AeroPeek window receives the following events: // * A user clicks an AeroPeek thumbnail. // We need to select a tab associated with this window. // * A user closes an AeroPeek thumbnail. // We need to close a tab associated with this window. // * A user clicks a toolbar button in an AeroPeek window. // We may need to dispatch this button event to a tab associated with this // thumbnail window. // <http://msdn.microsoft.com/en-us/library/dd378460(VS.85).aspx#thumbbars>. // Also, it needs the following information of the browser: // * The bitmap of a tab associated with this window. // This bitmap is used for creating thumbnail and preview images. // * The rectangle of a browser frame. // This rectangle is used for pasting the above bitmap to the right position // and for marking the tab-content area as opaque. // We assume these functions are called only from a UI thread (i.e. // Chrome_BrowserMain). class AeroPeekWindowDelegate { public: virtual void ActivateTab(int tab_id) = 0; virtual void CloseTab(int tab_id) = 0; virtual void GetContentInsets(gfx::Insets* insets) = 0; virtual bool GetTabThumbnail(int tab_id, SkBitmap* thumbnail) = 0; virtual bool GetTabPreview(int tab_id, SkBitmap* preview) = 0; protected: virtual ~AeroPeekWindowDelegate() {} }; // A class that implements AeroPeek of Windows 7: // <http://msdn.microsoft.com/en-us/library/dd378460(VS.85).aspx#thumbnails>. // Windows 7 can dispay a thumbnail image of each tab to its taskbar so that // a user can preview the contents of a tab (AeroPeek), choose a tab, close // a tab, etc. // This class implements the TabStripModelObserver interface to receive the // following events sent from TabStripModel and dispatch them to Windows: // * A tab is added. // This class adds a thumbnail window for this tab to the thumbnail list // of Windows. // * A tab is being closed. // This class deletes the thumbnail window associated with this tab from the // thumbnail list of Windows. // * A tab has been updated. // This class updates the image of the thumbnail window associated with this // tab. // Also, this class receives events sent from Windows via thumbnail windows to // TabStripModel: // * A thumbnail window is closed. // Ask TabStrip to close the tab associated with this thumbnail window. // * A thumbnail window is selected. // Ask TabStrip to activate the tab associated with this thumbnail window. // // The simplest usage of this class is: // 1. Create an instance of TabThumbnailManager. // 2. Add this instance to the observer list of a TabStrip object. // // scoped_ptr<TabThumbnailManager> manager; // manager.reset(new TabThumbnailManager( // frame_->GetWindow()->GetNativeWindow(), // border_left, // border_top, // toolbar_top)); // g_browser->tabstrip_model()->AddObserver(manager); // // 3. Remove this instance from the observer list of the TabStrip object when // we don't need it. // // g_browser->tabstrip_model()->RemoveObserver(manager); // class AeroPeekManager : public TabStripModelObserver, public AeroPeekWindowDelegate { public: explicit AeroPeekManager(HWND application_window); virtual ~AeroPeekManager(); // Sets the margins of the "user-perceived content area". // (See comments of |content_insets_|). void SetContentInsets(const gfx::Insets& insets); // Returns whether or not we should enable Tab Thumbnailing and Aero Peek // of Windows 7. static bool Enabled(); // Overridden from TabStripModelObserver: virtual void TabInsertedAt(TabContentsWrapper* contents, int index, bool foreground); virtual void TabDetachedAt(TabContentsWrapper* contents, int index); virtual void TabSelectedAt(TabContentsWrapper* old_contents, TabContentsWrapper* new_contents, int index, bool user_gesture); virtual void TabMoved(TabContentsWrapper* contents, int from_index, int to_index, bool pinned_state_changed); virtual void TabChangedAt(TabContentsWrapper* contents, int index, TabChangeType change_type); virtual void TabReplacedAt(TabStripModel* tab_strip_model, TabContentsWrapper* old_contents, TabContentsWrapper* new_contents, int index); // Overriden from TabThumbnailWindowDelegate: virtual void CloseTab(int tab_id); virtual void ActivateTab(int tab_id); virtual void GetContentInsets(gfx::Insets* insets); virtual bool GetTabThumbnail(int tab_id, SkBitmap* thumbnail); virtual bool GetTabPreview(int tab_id, SkBitmap* preview); private: // Deletes the TabThumbnailWindow object associated with the specified // Tab ID. void DeleteAeroPeekWindow(int tab_id); // If there is an AeroPeekWindow associated with |tab| it is removed and // deleted. void DeleteAeroPeekWindowForTab(TabContentsWrapper* tab); // Retrieves the AeroPeekWindow object associated with the specified // Tab ID. AeroPeekWindow* GetAeroPeekWindow(int tab_id) const; // If an AeroPeekWindow hasn't been created for |tab| yet, one is created. // |foreground| is true if the tab is selected. void CreateAeroPeekWindowIfNecessary(TabContentsWrapper* tab, bool foreground); // Returns a rectangle that fits into the destination rectangle and keeps // the pixel-aspect ratio of the source one. // (This function currently uses the longer-fit algorithm as IE8 does.) void GetOutputBitmapSize(const gfx::Size& destination, const gfx::Size& source, gfx::Size* output) const; // Returns the TabContents object associated with the specified Tab ID only // if it is alive. // Since Windows cannot send AeroPeek events directly to Chrome windows, we // use a place-holder window to receive AeroPeek events. So, when Windows // sends an AeroPeek event, the corresponding tab (and TabContents) may have // been deleted by Chrome. To prevent us from accessing deleted TabContents, // we need to check if the tab is still alive. TabContents* GetTabContents(int tab_id) const; // Returns the tab ID from the specified TabContents. int GetTabID(TabContents* contents) const; private: // The parent window of the place-holder windows used by AeroPeek. // In the case of Chrome, this window becomes a browser frame. HWND application_window_; // The list of the place-holder windows used by AeroPeek. std::list<AeroPeekWindow*> tab_list_; // The left and top borders of the frame window. // When we create a preview bitmap, we use these values for preventing from // over-writing the area of the browser frame. int border_left_; int border_top_; // The top position of the toolbar. // This value is used for setting the alpha values of the frame area so a // preview image can use transparent colors only in the frame area. int toolbar_top_; // The margins of the "user-perceived content area". // This value is used for pasting a tab image onto this "user-perceived // content area" when creating a preview image. gfx::Insets content_insets_; }; #endif // CHROME_BROWSER_AEROPEEK_MANAGER_H_