// Copyright (c) 2011 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_TAB_CONTENTS_TAB_CONTENTS_VIEW_GTK_H_ #define CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_GTK_H_ #pragma once #include <gtk/gtk.h> #include <vector> #include "base/memory/scoped_ptr.h" #include "chrome/browser/ui/gtk/focus_store_gtk.h" #include "chrome/browser/ui/gtk/owned_widget_gtk.h" #include "content/browser/tab_contents/tab_contents_view.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "ui/base/gtk/gtk_signal.h" class ConstrainedWindowGtk; class RenderViewContextMenuGtk; class SadTabGtk; class TabContentsDragSource; class WebDragDestGtk; class TabContentsViewGtk : public TabContentsView, public NotificationObserver { public: // The corresponding TabContents is passed in the constructor, and manages our // lifetime. This doesn't need to be the case, but is this way currently // because that's what was easiest when they were split. explicit TabContentsViewGtk(TabContents* tab_contents); virtual ~TabContentsViewGtk(); // Unlike Windows, ConstrainedWindows need to collaborate with the // TabContentsViewGtk to position the dialogs. void AttachConstrainedWindow(ConstrainedWindowGtk* constrained_window); void RemoveConstrainedWindow(ConstrainedWindowGtk* constrained_window); // Override the stored focus widget. This call only makes sense when the // tab contents is not focused. void SetFocusedWidget(GtkWidget* widget); // TabContentsView implementation -------------------------------------------- virtual void CreateView(const gfx::Size& initial_size); virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host); virtual gfx::NativeView GetNativeView() const; virtual gfx::NativeView GetContentNativeView() const; virtual gfx::NativeWindow GetTopLevelNativeWindow() const; virtual void GetContainerBounds(gfx::Rect* out) const; virtual void SetPageTitle(const std::wstring& title); virtual void OnTabCrashed(base::TerminationStatus status, int error_code); virtual void SizeContents(const gfx::Size& size); virtual void Focus(); virtual void SetInitialFocus(); virtual void StoreFocus(); virtual void RestoreFocus(); virtual void GetViewBounds(gfx::Rect* out) const; // Backend implementation of RenderViewHostDelegate::View. virtual void ShowContextMenu(const ContextMenuParams& params); virtual void ShowPopupMenu(const gfx::Rect& bounds, int item_height, double item_font_size, int selected_item, const std::vector<WebMenuItem>& items, bool right_aligned); virtual void StartDragging(const WebDropData& drop_data, WebKit::WebDragOperationsMask allowed_ops, const SkBitmap& image, const gfx::Point& image_offset); virtual void UpdateDragCursor(WebKit::WebDragOperation operation); virtual void GotFocus(); virtual void TakeFocus(bool reverse); // NotificationObserver implementation --------------------------------------- virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: // Insert the given widget into the content area. Should only be used for // web pages and the like (including interstitials and sad tab). Note that // this will be perfectly happy to insert overlapping render views, so care // should be taken that the correct one is hidden/shown. void InsertIntoContentArea(GtkWidget* widget); void CancelDragIfAny(); // Handle focus traversal on the render widget native view. CHROMEGTK_CALLBACK_1(TabContentsViewGtk, gboolean, OnFocus, GtkDirectionType); // Used to adjust the size of its children when the size of |expanded_| is // changed. CHROMEGTK_CALLBACK_2(TabContentsViewGtk, void, OnChildSizeRequest, GtkWidget*, GtkRequisition*); // Used to propagate the size change of |expanded_| to our RWHV to resize the // renderer content. CHROMEGTK_CALLBACK_1(TabContentsViewGtk, void, OnSizeAllocate, GtkAllocation*); CHROMEGTK_CALLBACK_1(TabContentsViewGtk, void, OnSetFloatingPosition, GtkAllocation*); // Contains |expanded_| as its GtkBin member. OwnedWidgetGtk floating_; // This container holds the tab's web page views. It is a GtkExpandedContainer // so that we can control the size of the web pages. GtkWidget* expanded_; // The context menu is reset every time we show it, but we keep a pointer to // between uses so that it won't go out of scope before we're done with it. scoped_ptr<RenderViewContextMenuGtk> context_menu_; // Used to get notifications about renderers coming and going. NotificationRegistrar registrar_; scoped_ptr<SadTabGtk> sad_tab_; FocusStoreGtk focus_store_; // The UI for the constrained dialog currently displayed. This is owned by // TabContents, not the view. ConstrainedWindowGtk* constrained_window_; // The helper object that handles drag destination related interactions with // GTK. scoped_ptr<WebDragDestGtk> drag_dest_; // Object responsible for handling drags from the page for us. scoped_ptr<TabContentsDragSource> drag_source_; // The size we want the tab contents view to be. We keep this in a separate // variable because resizing in GTK+ is async. gfx::Size requested_size_; DISALLOW_COPY_AND_ASSIGN(TabContentsViewGtk); }; #endif // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_GTK_H_