diff options
Diffstat (limited to 'chrome/browser/gtk/browser_toolbar_gtk.h')
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.h | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.h b/chrome/browser/gtk/browser_toolbar_gtk.h new file mode 100644 index 0000000..511ac49 --- /dev/null +++ b/chrome/browser/gtk/browser_toolbar_gtk.h @@ -0,0 +1,265 @@ +// 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_GTK_BROWSER_TOOLBAR_GTK_H_ +#define CHROME_BROWSER_GTK_BROWSER_TOOLBAR_GTK_H_ + +#include <gtk/gtk.h> +#include <string> + +#include "app/active_window_watcher_x.h" +#include "app/gtk_signal.h" +#include "app/gtk_signal_registrar.h" +#include "app/menus/simple_menu_model.h" +#include "app/throb_animation.h" +#include "base/scoped_ptr.h" +#include "chrome/browser/command_updater.h" +#include "chrome/browser/gtk/custom_button.h" +#include "chrome/browser/gtk/menu_gtk.h" +#include "chrome/browser/pref_member.h" +#include "chrome/browser/wrench_menu_model.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_registrar.h" +#include "chrome/common/owned_widget_gtk.h" + +class BackForwardButtonGtk; +class Browser; +class BrowserActionsToolbarGtk; +class BrowserWindowGtk; +class CustomDrawButton; +class GtkThemeProvider; +class LocationBar; +class LocationBarViewGtk; +class Profile; +class ReloadButtonGtk; +class TabContents; +class ToolbarModel; + +// View class that displays the GTK version of the toolbar and routes gtk +// events back to the Browser. +class BrowserToolbarGtk : public CommandUpdater::CommandObserver, + public menus::SimpleMenuModel::Delegate, + public MenuGtk::Delegate, + public NotificationObserver, + public AnimationDelegate, + public ActiveWindowWatcherX::Observer { + public: + explicit BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window); + virtual ~BrowserToolbarGtk(); + + // Create the contents of the toolbar. |top_level_window| is the GtkWindow + // to which we attach our accelerators. + void Init(Profile* profile, GtkWindow* top_level_window); + + // Set the various widgets' ViewIDs. + void SetViewIDs(); + + void Show(); + void Hide(); + + // Getter for the containing widget. + GtkWidget* widget() { + return event_box_; + } + + // Getter for associated browser object. + Browser* browser() { + return browser_; + } + + virtual LocationBar* GetLocationBar() const; + + ReloadButtonGtk* GetReloadButton() { return reload_.get(); } + + GtkWidget* GetAppMenuButton() { return app_menu_button_.get(); } + + BrowserActionsToolbarGtk* GetBrowserActionsToolbar() { + return actions_toolbar_.get(); + } + + LocationBarViewGtk* GetLocationBarView() { return location_bar_.get(); } + + // We have to show padding on the bottom of the toolbar when the bookmark + // is in floating mode. Otherwise the bookmark bar will paint it for us. + void UpdateForBookmarkBarVisibility(bool show_bottom_padding); + + void ShowAppMenu(); + + // Overridden from CommandUpdater::CommandObserver: + virtual void EnabledStateChangedForCommand(int id, bool enabled); + + // Overridden from MenuGtk::Delegate: + virtual void StoppedShowing(); + virtual GtkIconSet* GetIconSetForId(int idr); + + // Overridden from menus::SimpleMenuModel::Delegate: + virtual bool IsCommandIdEnabled(int id) const; + virtual bool IsCommandIdChecked(int id) const; + virtual void ExecuteCommand(int id); + virtual bool GetAcceleratorForCommandId(int id, + menus::Accelerator* accelerator); + + // NotificationObserver implementation. + void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + Profile* profile() { return profile_; } + void SetProfile(Profile* profile); + + // Message that we should react to a state change. + void UpdateTabContents(TabContents* contents, bool should_restore_state); + + // AnimationDelegate implementation ------------------------------------------ + virtual void AnimationEnded(const Animation* animation); + virtual void AnimationProgressed(const Animation* animation); + virtual void AnimationCanceled(const Animation* animation); + + // ActiveWindowWatcher::Observer implementation ------------------------------ + virtual void ActiveWindowChanged(GdkWindow* active_window); + + private: + // Builds a toolbar button with all the properties set. + // |spacing| is the width of padding (in pixels) on the left and right of the + // button. + CustomDrawButton* BuildToolbarButton(int normal_id, + int active_id, + int highlight_id, + int depressed_id, + int background_id, + const std::string& localized_tooltip, + const char* stock_id, + int spacing); + + // Create a menu for the toolbar given the icon id and tooltip. Returns the + // widget created. + GtkWidget* BuildToolbarMenuButton(const std::string& localized_tooltip, + OwnedWidgetGtk* owner); + + // Connect/Disconnect signals for dragging a url onto the home button. + void SetUpDragForHomeButton(bool enable); + + // Sets the top corners of the toolbar to rounded, or sets them to normal, + // depending on the state of the browser window. Returns false if no action + // was taken (the roundedness was already correct), true otherwise. + bool UpdateRoundedness(); + + // Calculates whether the upgrade notification dot should be faded at all + // (as opposed to solid). + bool UpgradeAnimationIsFaded(); + + // Gtk callback for the "expose-event" signal. + // The alignment contains the toolbar. + CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnAlignmentExpose, + GdkEventExpose*); + CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnLocationHboxExpose, + GdkEventExpose*); + + // Gtk callback for the "clicked" signal. + CHROMEGTK_CALLBACK_0(BrowserToolbarGtk, void, OnButtonClick); + + // Gtk callback to intercept mouse clicks to the menu buttons. + CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnMenuButtonPressEvent, + GdkEventButton*); + + // Used for drags onto home button. + CHROMEGTK_CALLBACK_6(BrowserToolbarGtk, void, OnDragDataReceived, + GdkDragContext*, gint, gint, GtkSelectionData*, + guint, guint); + + // Used to stop the upgrade notification animation. + CHROMEGTK_CALLBACK_0(BrowserToolbarGtk, void, OnAppMenuShow); + + // Used to draw the upgrade notification badge. + CHROMEGTK_CALLBACK_1(BrowserToolbarGtk, gboolean, OnAppMenuImageExpose, + GdkEventExpose*); + + // Updates preference-dependent state. + void NotifyPrefChanged(const std::wstring* pref); + + // Start the upgrade notification animation if we have detected an upgrade + // and the current toolbar is focused. + void MaybeShowUpgradeReminder(); + + static void SetSyncMenuLabel(GtkWidget* widget, gpointer userdata); + + // Sometimes we only want to show the location w/o the toolbar buttons (e.g., + // in a popup window). + bool ShouldOnlyShowLocation() const; + + // An event box that holds |toolbar_|. We need the toolbar to have its own + // GdkWindow when we use the GTK drawing because otherwise the color from our + // parent GdkWindow will leak through with some theme engines (such as + // Clearlooks). + GtkWidget* event_box_; + + // This widget handles padding around the outside of the toolbar. + GtkWidget* alignment_; + + // Gtk widgets. The toolbar is an hbox with each of the other pieces of the + // toolbar placed side by side. + GtkWidget* toolbar_; + + // All widgets to the left or right of the |location_hbox_|. We put the + // widgets on either side of location_hbox_ in their own toolbar so we can + // set their minimum sizes independently of |location_hbox_| which needs to + // grow/shrink in GTK+ mode. + GtkWidget* toolbar_left_; + GtkWidget* toolbar_right_; + + // Contains all the widgets of the location bar. + GtkWidget* location_hbox_; + + // The location bar view. + scoped_ptr<LocationBarViewGtk> location_bar_; + + // All the buttons in the toolbar. + scoped_ptr<BackForwardButtonGtk> back_, forward_; + scoped_ptr<CustomDrawButton> home_; + scoped_ptr<ReloadButtonGtk> reload_; + scoped_ptr<BrowserActionsToolbarGtk> actions_toolbar_; + OwnedWidgetGtk app_menu_button_; + + // Keep a pointer to the menu button image because we change it when the theme + // changes. + OwnedWidgetGtk app_menu_image_; + + // The model that contains the security level, text, icon to display... + ToolbarModel* model_; + + GtkThemeProvider* theme_provider_; + + scoped_ptr<MenuGtk> app_menu_; + + WrenchMenuModel wrench_menu_model_; + + Browser* browser_; + BrowserWindowGtk* window_; + Profile* profile_; + + // Controls whether or not a home button should be shown on the toolbar. + BooleanPrefMember show_home_button_; + + // Preferences controlling the configured home page. + StringPrefMember home_page_; + BooleanPrefMember home_page_is_new_tab_page_; + + NotificationRegistrar registrar_; + + // A GtkEntry that isn't part of the hierarchy. We keep this for native + // rendering. + OwnedWidgetGtk offscreen_entry_; + + // Manages the home button drop signal handler. + scoped_ptr<GtkSignalRegistrar> drop_handler_; + + ThrobAnimation upgrade_reminder_animation_; + + // We have already shown and dismissed the upgrade reminder animation. + bool upgrade_reminder_canceled_; + + DISALLOW_COPY_AND_ASSIGN(BrowserToolbarGtk); +}; + +#endif // CHROME_BROWSER_GTK_BROWSER_TOOLBAR_GTK_H_ |