Index: chrome/browser/aeropeek_manager.h |
=================================================================== |
--- chrome/browser/aeropeek_manager.h (revision 0) |
+++ chrome/browser/aeropeek_manager.h (revision 0) |
@@ -0,0 +1,182 @@ |
+// 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_ |
+ |
+#include <list> |
+ |
+#include "app/gfx/insets.h" |
+#include "base/waitable_event.h" |
+#include "chrome/browser/tabs/tab_strip_model.h" |
+ |
+namespace gfx { |
+class Size; |
+} |
+class TabContents; |
+class AeroPeekWindow; |
+class SkBitmap; |
+ |
+// 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; |
+}; |
+ |
+// 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); |
+ ~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(TabContents* contents, |
+ int index, |
+ bool foreground); |
+ virtual void TabClosingAt(TabContents* contents, int index); |
+ virtual void TabDetachedAt(TabContents* contents, int index); |
+ virtual void TabSelectedAt(TabContents* old_contents, |
+ TabContents* new_contents, |
+ int index, |
+ bool user_gesture); |
+ virtual void TabMoved(TabContents* contents, |
+ int from_index, |
+ int to_index, |
+ bool pinned_state_changed); |
+ virtual void TabChangedAt(TabContents* contents, |
+ int index, |
+ TabChangeType change_type); |
+ |
+ // 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); |
+ |
+ // Retrieves the AeroPeekWindow object associated with the specified |
+ // Tab ID. |
+ AeroPeekWindow* GetAeroPeekWindow(int tab_id) const; |
+ |
+ // 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_ |
Property changes on: chrome\browser\aeropeek_manager.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |