blob: 1ece0db8483315af1fb9787c9f641d778402a380 [file] [log] [blame]
// Copyright (c) 2009 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/gtk_signal.h"
#include "app/menus/simple_menu_model.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/app_menu_model.h"
#include "chrome/browser/bubble_positioner.h"
#include "chrome/browser/command_updater.h"
#include "chrome/browser/gtk/menu_bar_helper.h"
#include "chrome/browser/gtk/menu_gtk.h"
#include "chrome/browser/page_menu_model.h"
#include "chrome/browser/pref_member.h"
#include "chrome/browser/sync/profile_sync_service.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 GoButtonGtk;
class LocationBar;
class LocationBarViewGtk;
class Profile;
class TabContents;
class ToolbarModel;
class ToolbarStarToggleGtk;
// View class that displays the GTK version of the toolbar and routes gtk
// events back to the Browser.
class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
public ProfileSyncServiceObserver,
public menus::SimpleMenuModel::Delegate,
public MenuGtk::Delegate,
public NotificationObserver,
public BubblePositioner,
public MenuBarHelper::Delegate {
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;
GoButtonGtk* GetGoButton() { return go_.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 ShowPageMenu();
void ShowAppMenu();
// Overridden from CommandUpdater::CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled);
// Overridden from MenuGtk::Delegate:
virtual void StoppedShowing();
// 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);
ToolbarStarToggleGtk* star() { return star_.get(); }
// BubblePositioner:
virtual gfx::Rect GetLocationStackBounds() const;
// MenuBarHelper::Delegate implementation ------------------------------------
virtual void PopupForButton(GtkWidget* button);
virtual void PopupForButtonNextTo(GtkWidget* button,
GtkMenuDirectionType dir);
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);
// Create the star button given the tooltip. Returns the widget created.
ToolbarStarToggleGtk* BuildStarButton(const std::string& localized_tooltip);
// 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 signals for dragging a url onto the home button.
void SetUpDragForHomeButton();
// Helper for the PageAppMenu event handlers. Pops down the currently active
// meun and pops up the other menu.
void ChangeActiveMenu(GtkWidget* active_menu, guint timestamp);
// 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);
// ProfileSyncServiceObserver method.
virtual void OnStateChanged();
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_;
// The location bar view.
scoped_ptr<LocationBarViewGtk> location_bar_;
// All the buttons in the toolbar.
scoped_ptr<BackForwardButtonGtk> back_, forward_;
scoped_ptr<CustomDrawButton> reload_;
scoped_ptr<CustomDrawButton> home_;
scoped_ptr<ToolbarStarToggleGtk> star_;
scoped_ptr<GoButtonGtk> go_;
scoped_ptr<BrowserActionsToolbarGtk> actions_toolbar_;
OwnedWidgetGtk page_menu_button_, app_menu_button_;
// Keep a pointer to the menu button images because we change them when
// the theme changes.
GtkWidget* page_menu_image_;
GtkWidget* app_menu_image_;
// The model that contains the security level, text, icon to display...
ToolbarModel* model_;
GtkThemeProvider* theme_provider_;
scoped_ptr<MenuGtk> page_menu_;
scoped_ptr<MenuGtk> app_menu_;
PageMenuModel page_menu_model_;
AppMenuModel app_menu_model_;
Browser* browser_;
BrowserWindowGtk* window_;
Profile* profile_;
// A pointer to the ProfileSyncService instance if one exists.
ProfileSyncService* sync_service_;
// Controls whether or not a home button should be shown on the toolbar.
BooleanPrefMember show_home_button_;
NotificationRegistrar registrar_;
// A GtkEntry that isn't part of the hierarchy. We keep this for native
// rendering.
OwnedWidgetGtk offscreen_entry_;
MenuBarHelper menu_bar_helper_;
DISALLOW_COPY_AND_ASSIGN(BrowserToolbarGtk);
};
#endif // CHROME_BROWSER_GTK_BROWSER_TOOLBAR_GTK_H_