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_GTK_TAB_CONTENTS_CONTAINER_GTK_H_ 6 #define CHROME_BROWSER_UI_GTK_TAB_CONTENTS_CONTAINER_GTK_H_ 7 #pragma once 8 9 #include <gtk/gtk.h> 10 11 #include "base/basictypes.h" 12 #include "chrome/browser/ui/gtk/owned_widget_gtk.h" 13 #include "chrome/browser/ui/gtk/view_id_util.h" 14 #include "content/common/notification_observer.h" 15 #include "content/common/notification_registrar.h" 16 #include "ui/base/gtk/gtk_signal.h" 17 18 class RenderViewHost; 19 class StatusBubbleGtk; 20 class TabContents; 21 class TabContentsWrapper; 22 23 typedef struct _GtkFloatingContainer GtkFloatingContainer; 24 25 class TabContentsContainerGtk : public NotificationObserver, 26 public ViewIDUtil::Delegate { 27 public: 28 explicit TabContentsContainerGtk(StatusBubbleGtk* status_bubble); 29 ~TabContentsContainerGtk(); 30 31 void Init(); 32 33 // Make the specified tab visible. 34 void SetTab(TabContentsWrapper* tab); tab()35 TabContentsWrapper* tab() const { return tab_; } 36 37 // Gets the tab contents currently being displayed (either |tab_contents_| or 38 // |preview_contents_|). 39 TabContents* GetVisibleTabContents(); 40 41 void SetPreview(TabContentsWrapper* preview); 42 void PopPreview(); 43 44 // Remove the tab from the hierarchy. 45 void DetachTab(TabContentsWrapper* tab); 46 47 // NotificationObserver implementation. 48 virtual void Observe(NotificationType type, 49 const NotificationSource& source, 50 const NotificationDetails& details); 51 widget()52 GtkWidget* widget() { return floating_.get(); } 53 54 // ViewIDUtil::Delegate implementation --------------------------------------- 55 virtual GtkWidget* GetWidgetForViewID(ViewID id); 56 57 private: 58 // Called when a TabContents is destroyed. This gives us a chance to clean 59 // up our internal state if the TabContents is somehow destroyed before we 60 // get notified. 61 void TabContentsDestroyed(TabContents* contents); 62 63 // Handler for |floating_|'s "set-floating-position" signal. During this 64 // callback, we manually set the position of the status bubble. 65 static void OnSetFloatingPosition( 66 GtkFloatingContainer* container, GtkAllocation* allocation, 67 TabContentsContainerGtk* tab_contents_container); 68 69 // Adds |tab| to the container and starts showing it. 70 void PackTab(TabContentsWrapper* ); 71 72 // Stops showing |tab|. 73 void HideTab(TabContentsWrapper* tab); 74 75 // Removes |preview_|. 76 void RemovePreview(); 77 78 // Handle focus traversal on the tab contents container. Focus should not 79 // traverse to the preview contents. 80 CHROMEGTK_CALLBACK_1(TabContentsContainerGtk, gboolean, OnFocus, 81 GtkDirectionType); 82 83 NotificationRegistrar registrar_; 84 85 // The TabContentsWrapper for the currently selected tab. This will be showing 86 // unless there is a preview contents. 87 TabContentsWrapper* tab_; 88 89 // The current preview contents (for instant). If non-NULL, it will be 90 // visible. 91 TabContentsWrapper* preview_; 92 93 // The status bubble manager. Always non-NULL. 94 StatusBubbleGtk* status_bubble_; 95 96 // Top of the TabContentsContainerGtk widget hierarchy. A cross between a 97 // GtkBin and a GtkFixed, |floating_| has |expanded_| as its one "real" child, 98 // and the various things that hang off the bottom (status bubble, etc) have 99 // their positions manually set in OnSetFloatingPosition. 100 OwnedWidgetGtk floating_; 101 102 // We insert and remove TabContents GtkWidgets into this expanded_. This 103 // should not be a GtkVBox since there were errors with timing where the vbox 104 // was horizontally split with the top half displaying the current TabContents 105 // and bottom half displaying the loading page. 106 GtkWidget* expanded_; 107 108 DISALLOW_COPY_AND_ASSIGN(TabContentsContainerGtk); 109 }; 110 111 #endif // CHROME_BROWSER_UI_GTK_TAB_CONTENTS_CONTAINER_GTK_H_ 112