1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_GTK_H_ 6#define CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_GTK_H_ 7#pragma once 8 9#include <vector> 10 11#include "base/memory/scoped_ptr.h" 12#include "content/browser/tab_contents/tab_contents_view.h" 13#include "ui/gfx/size.h" 14#include "views/widget/widget_gtk.h" 15 16class ConstrainedWindowGtk; 17typedef struct _GtkFloatingContainer GtkFloatingContainer; 18class RenderViewContextMenuViews; 19class SadTabView; 20class SkBitmap; 21class TabContentsDragSource; 22class WebDragDestGtk; 23namespace gfx { 24class Point; 25} 26namespace views { 27class NativeViewHost; 28} 29 30// Gtk-specific implementation of the TabContentsView for the views-based front 31// end. It is a WidgetGtk that contains all of the contents of the tab and 32// associated child views. 33class TabContentsViewGtk : public TabContentsView, 34 public views::WidgetGtk { 35 public: 36 // The corresponding TabContents is passed in the constructor, and manages our 37 // lifetime. This doesn't need to be the case, but is this way currently 38 // because that's what was easiest when they were split. 39 explicit TabContentsViewGtk(TabContents* tab_contents); 40 virtual ~TabContentsViewGtk(); 41 42 // Unlike Windows, ConstrainedWindows need to collaborate with the 43 // TabContentsViewGtk to position the dialogs. 44 void AttachConstrainedWindow(ConstrainedWindowGtk* constrained_window); 45 void RemoveConstrainedWindow(ConstrainedWindowGtk* constrained_window); 46 47 gboolean OnMouseMove(GtkWidget* widget, GdkEventMotion* event); 48 49 // TabContentsView implementation -------------------------------------------- 50 51 virtual void CreateView(const gfx::Size& initial_size); 52 virtual RenderWidgetHostView* CreateViewForWidget( 53 RenderWidgetHost* render_widget_host); 54 virtual gfx::NativeView GetNativeView() const; 55 virtual gfx::NativeView GetContentNativeView() const; 56 virtual gfx::NativeWindow GetTopLevelNativeWindow() const; 57 virtual void GetContainerBounds(gfx::Rect* out) const; 58 virtual void SetPageTitle(const std::wstring& title); 59 virtual void OnTabCrashed(base::TerminationStatus status, 60 int error_code); 61 virtual void SizeContents(const gfx::Size& size); 62 virtual void Focus(); 63 virtual void SetInitialFocus(); 64 virtual void StoreFocus(); 65 virtual void RestoreFocus(); 66 virtual void GetViewBounds(gfx::Rect* out) const; 67 68 // Backend implementation of RenderViewHostDelegate::View. 69 virtual void ShowContextMenu(const ContextMenuParams& params); 70 virtual void ShowPopupMenu(const gfx::Rect& bounds, 71 int item_height, 72 double item_font_size, 73 int selected_item, 74 const std::vector<WebMenuItem>& items, 75 bool right_aligned); 76 virtual void StartDragging(const WebDropData& drop_data, 77 WebKit::WebDragOperationsMask ops_allowed, 78 const SkBitmap& image, 79 const gfx::Point& image_offset); 80 virtual void UpdateDragCursor(WebKit::WebDragOperation operation); 81 virtual void GotFocus(); 82 virtual void TakeFocus(bool reverse); 83 84 private: 85 // Signal handlers ----------------------------------------------------------- 86 87 // Overridden from views::WidgetGtk: 88 virtual gboolean OnButtonPress(GtkWidget* widget, GdkEventButton* event); 89 virtual void OnSizeAllocate(GtkWidget* widget, GtkAllocation* allocation); 90 virtual gboolean OnPaint(GtkWidget* widget, GdkEventExpose* event); 91 virtual void OnShow(GtkWidget* widget); 92 virtual void OnHide(GtkWidget* widget); 93 94 // Handles notifying the TabContents and other operations when the window was 95 // shown or hidden. 96 void WasHidden(); 97 void WasShown(); 98 99 // Handles resizing of the contents. This will notify the RenderWidgetHostView 100 // of the change, reposition popups, and the find in page bar. 101 void WasSized(const gfx::Size& size); 102 103 // For any floating views (ConstrainedDialogs) this function centers them 104 // within this view. It's called whem a ConstrainedDialog is attached and 105 // when this view is resized. 106 void SetFloatingPosition(const gfx::Size& size); 107 108 // --------------------------------------------------------------------------- 109 110 // Used to render the sad tab. This will be non-NULL only when the sad tab is 111 // visible. 112 SadTabView* sad_tab_; 113 114 // Whether to ignore the next CHAR keyboard event. 115 bool ignore_next_char_event_; 116 117 // The id used in the ViewStorage to store the last focused view. 118 int last_focused_view_storage_id_; 119 120 // The context menu. Callbacks are asynchronous so we need to keep it around. 121 scoped_ptr<RenderViewContextMenuViews> context_menu_; 122 123 // Handles drags from this TabContentsView. 124 scoped_ptr<TabContentsDragSource> drag_source_; 125 126 // The event for the last mouse down we handled. We need this for drags. 127 GdkEventButton last_mouse_down_; 128 129 // The helper object that handles drag destination related interactions with 130 // GTK. 131 scoped_ptr<WebDragDestGtk> drag_dest_; 132 133 // Current size. See comment in WidgetGtk as to why this is cached. 134 gfx::Size size_; 135 136 // Each individual UI for constrained dialogs currently displayed. The 137 // objects in this vector are owned by the TabContents, not the view. 138 std::vector<ConstrainedWindowGtk*> constrained_windows_; 139 140 DISALLOW_COPY_AND_ASSIGN(TabContentsViewGtk); 141}; 142 143#endif // CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_GTK_H_ 144