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_BROWSER_TOOLBAR_GTK_H_ 6 #define CHROME_BROWSER_UI_GTK_BROWSER_TOOLBAR_GTK_H_ 7 #pragma once 8 9 #include <gtk/gtk.h> 10 #include <string> 11 12 #include "base/memory/scoped_ptr.h" 13 #include "chrome/browser/command_updater.h" 14 #include "chrome/browser/prefs/pref_member.h" 15 #include "chrome/browser/ui/gtk/custom_button.h" 16 #include "chrome/browser/ui/gtk/menu_gtk.h" 17 #include "chrome/browser/ui/gtk/owned_widget_gtk.h" 18 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" 19 #include "content/common/notification_observer.h" 20 #include "content/common/notification_registrar.h" 21 #include "ui/base/gtk/gtk_signal.h" 22 #include "ui/base/gtk/gtk_signal_registrar.h" 23 #include "ui/base/models/accelerator.h" 24 #include "ui/base/models/simple_menu_model.h" 25 26 class BackForwardButtonGtk; 27 class Browser; 28 class BrowserActionsToolbarGtk; 29 class BrowserWindowGtk; 30 class CustomDrawButton; 31 class GtkThemeService; 32 class LocationBar; 33 class LocationBarViewGtk; 34 class Profile; 35 class ReloadButtonGtk; 36 class TabContents; 37 class ToolbarModel; 38 39 // View class that displays the GTK version of the toolbar and routes gtk 40 // events back to the Browser. 41 class BrowserToolbarGtk : public CommandUpdater::CommandObserver, 42 public ui::AcceleratorProvider, 43 public MenuGtk::Delegate, 44 public NotificationObserver { 45 public: 46 explicit BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window); 47 virtual ~BrowserToolbarGtk(); 48 49 // Create the contents of the toolbar. |top_level_window| is the GtkWindow 50 // to which we attach our accelerators. 51 void Init(Profile* profile, GtkWindow* top_level_window); 52 53 // Set the various widgets' ViewIDs. 54 void SetViewIDs(); 55 56 void Show(); 57 void Hide(); 58 59 // Getter for the containing widget. widget()60 GtkWidget* widget() { 61 return event_box_; 62 } 63 64 // Getter for associated browser object. browser()65 Browser* browser() { 66 return browser_; 67 } 68 69 virtual LocationBar* GetLocationBar() const; 70 GetReloadButton()71 ReloadButtonGtk* GetReloadButton() { return reload_.get(); } 72 GetAppMenuButton()73 GtkWidget* GetAppMenuButton() { return wrench_menu_button_->widget(); } 74 GetBrowserActionsToolbar()75 BrowserActionsToolbarGtk* GetBrowserActionsToolbar() { 76 return actions_toolbar_.get(); 77 } 78 GetLocationBarView()79 LocationBarViewGtk* GetLocationBarView() { return location_bar_.get(); } 80 81 // We have to show padding on the bottom of the toolbar when the bookmark 82 // is in floating mode. Otherwise the bookmark bar will paint it for us. 83 void UpdateForBookmarkBarVisibility(bool show_bottom_padding); 84 85 void ShowAppMenu(); 86 87 // Overridden from CommandUpdater::CommandObserver: 88 virtual void EnabledStateChangedForCommand(int id, bool enabled); 89 90 // Overridden from MenuGtk::Delegate: 91 virtual void StoppedShowing(); 92 virtual GtkIconSet* GetIconSetForId(int idr); 93 virtual bool AlwaysShowIconForCmd(int command_id) const; 94 95 // Overridden from ui::AcceleratorProvider: 96 virtual bool GetAcceleratorForCommandId(int id, 97 ui::Accelerator* accelerator); 98 99 // NotificationObserver implementation. 100 virtual void Observe(NotificationType type, 101 const NotificationSource& source, 102 const NotificationDetails& details); 103 profile()104 Profile* profile() { return profile_; } 105 void SetProfile(Profile* profile); 106 107 // Message that we should react to a state change. 108 void UpdateTabContents(TabContents* contents, bool should_restore_state); 109 110 private: 111 // Connect/Disconnect signals for dragging a url onto the home button. 112 void SetUpDragForHomeButton(bool enable); 113 114 // Sets the top corners of the toolbar to rounded, or sets them to normal, 115 // depending on the state of the browser window. Returns false if no action 116 // was taken (the roundedness was already correct), true otherwise. 117 bool UpdateRoundedness(); 118 119 // Gtk callback for the "expose-event" signal. 120 // The alignment contains the toolbar. 121 CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnAlignmentExpose, 122 GdkEventExpose*); 123 CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnLocationHboxExpose, 124 GdkEventExpose*); 125 126 // Gtk callback for the "clicked" signal. 127 CHROMEGTK_CALLBACK_0(BrowserToolbarGtk, void, OnButtonClick); 128 129 // Gtk callback to intercept mouse clicks to the menu buttons. 130 CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnMenuButtonPressEvent, 131 GdkEventButton*); 132 133 // Used for drags onto home button. 134 CHROMEGTK_CALLBACK_6(BrowserToolbarGtk, void, OnDragDataReceived, 135 GdkDragContext*, gint, gint, GtkSelectionData*, 136 guint, guint); 137 138 // Used to draw the upgrade notification badge. 139 CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnWrenchMenuButtonExpose, 140 GdkEventExpose*); 141 142 // Updates preference-dependent state. 143 void NotifyPrefChanged(const std::string* pref); 144 145 static void SetSyncMenuLabel(GtkWidget* widget, gpointer userdata); 146 147 // Sometimes we only want to show the location w/o the toolbar buttons (e.g., 148 // in a popup window). 149 bool ShouldOnlyShowLocation() const; 150 151 // An event box that holds |toolbar_|. We need the toolbar to have its own 152 // GdkWindow when we use the GTK drawing because otherwise the color from our 153 // parent GdkWindow will leak through with some theme engines (such as 154 // Clearlooks). 155 GtkWidget* event_box_; 156 157 // This widget handles padding around the outside of the toolbar. 158 GtkWidget* alignment_; 159 160 // Gtk widgets. The toolbar is an hbox with each of the other pieces of the 161 // toolbar placed side by side. 162 GtkWidget* toolbar_; 163 164 // All widgets to the left or right of the |location_hbox_|. We put the 165 // widgets on either side of location_hbox_ in their own toolbar so we can 166 // set their minimum sizes independently of |location_hbox_| which needs to 167 // grow/shrink in GTK+ mode. 168 GtkWidget* toolbar_left_; 169 170 // Contains all the widgets of the location bar. 171 GtkWidget* location_hbox_; 172 173 // The location bar view. 174 scoped_ptr<LocationBarViewGtk> location_bar_; 175 176 // All the buttons in the toolbar. 177 scoped_ptr<BackForwardButtonGtk> back_, forward_; 178 scoped_ptr<CustomDrawButton> home_; 179 scoped_ptr<ReloadButtonGtk> reload_; 180 scoped_ptr<BrowserActionsToolbarGtk> actions_toolbar_; 181 scoped_ptr<CustomDrawButton> wrench_menu_button_; 182 183 // The image shown in GTK+ mode in the wrench button. 184 GtkWidget* wrench_menu_image_; 185 186 // The model that contains the security level, text, icon to display... 187 ToolbarModel* model_; 188 189 GtkThemeService* theme_service_; 190 191 scoped_ptr<MenuGtk> wrench_menu_; 192 193 WrenchMenuModel wrench_menu_model_; 194 195 Browser* browser_; 196 BrowserWindowGtk* window_; 197 Profile* profile_; 198 199 // Controls whether or not a home button should be shown on the toolbar. 200 BooleanPrefMember show_home_button_; 201 202 // Preferences controlling the configured home page. 203 StringPrefMember home_page_; 204 BooleanPrefMember home_page_is_new_tab_page_; 205 206 NotificationRegistrar registrar_; 207 208 // A GtkEntry that isn't part of the hierarchy. We keep this for native 209 // rendering. 210 OwnedWidgetGtk offscreen_entry_; 211 212 // Manages the home button drop signal handler. 213 scoped_ptr<ui::GtkSignalRegistrar> drop_handler_; 214 215 DISALLOW_COPY_AND_ASSIGN(BrowserToolbarGtk); 216 }; 217 218 #endif // CHROME_BROWSER_UI_GTK_BROWSER_TOOLBAR_GTK_H_ 219