Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Unified Diff: chrome/browser/aeropeek_manager.h

Issue 303033: Implements AeroPeek of Windows 7.. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/scoped_native_library_unittest.cc ('k') | chrome/browser/aeropeek_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « base/scoped_native_library_unittest.cc ('k') | chrome/browser/aeropeek_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698