summaryrefslogtreecommitdiffstats
path: root/chrome/browser/aeropeek_manager.h
diff options
context:
space:
mode:
authorhbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-10 06:23:35 +0000
committerhbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-10 06:23:35 +0000
commitda2566e16fff66dd911994e17d649e478a7beea1 (patch)
treedcc1cc71232331e2d8c4dbe2173da7bc9119a496 /chrome/browser/aeropeek_manager.h
parentf988638e6ea5a3f16e289be9ac7ffd853f7a13e4 (diff)
downloadchromium_src-da2566e16fff66dd911994e17d649e478a7beea1.zip
chromium_src-da2566e16fff66dd911994e17d649e478a7beea1.tar.gz
chromium_src-da2566e16fff66dd911994e17d649e478a7beea1.tar.bz2
Implements AeroPeek of Windows 7.
This change integrates the custom AeroPeek implementation into Chromium, which shows the thumbnail list of all tabs and the preview image of the tab selected from the thumbnail list. It uses the AeroPeekManager object, which is a proxy between TabStripModel and Windows to translate events from TabStripModel for Windows, and vice versa. To listen events from TabStripModel without changing the existing part of Chromium, this AeroPeekManager class implements the TabStripModelObserver interface. Even though this change doesn't include any automated tests for AeroPeek, I would like to send its automated UI test as a separate change. Nevertheless, it just creates/deletes a tab and see this AeroPeekManager can create its thumbnail window correctly. BUG=6337 TEST=base_unittests.exe --gtest_filter=ScopedNativeLibrary.Basic Review URL: http://codereview.chromium.org/303033 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41133 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/aeropeek_manager.h')
-rw-r--r--chrome/browser/aeropeek_manager.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/chrome/browser/aeropeek_manager.h b/chrome/browser/aeropeek_manager.h
new file mode 100644
index 0000000..c68e2ea
--- /dev/null
+++ b/chrome/browser/aeropeek_manager.h
@@ -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_