// 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_LOCATION_BAR_VIEW_GTK_H_ #define CHROME_BROWSER_GTK_LOCATION_BAR_VIEW_GTK_H_ #pragma once #include #include #include #include "app/gtk_signal.h" #include "base/basictypes.h" #include "base/scoped_ptr.h" #include "base/scoped_vector.h" #include "chrome/browser/autocomplete/autocomplete_edit.h" #include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" #include "chrome/browser/extensions/extension_context_menu_model.h" #include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/first_run/first_run.h" #include "chrome/browser/gtk/info_bubble_gtk.h" #include "chrome/browser/gtk/menu_gtk.h" #include "chrome/browser/gtk/owned_widget_gtk.h" #include "chrome/browser/ui/omnibox/location_bar.h" #include "chrome/common/content_settings_types.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" #include "chrome/common/page_transition_types.h" #include "third_party/skia/include/core/SkBitmap.h" #include "webkit/glue/window_open_disposition.h" class AutocompleteEditViewGtk; class Browser; class CommandUpdater; class ContentSettingImageModel; class ContentSettingBubbleGtk; class ExtensionAction; class GtkThemeProvider; class Profile; class SkBitmap; class TabContents; class ToolbarModel; class LocationBarViewGtk : public AutocompleteEditController, public LocationBar, public LocationBarTesting, public NotificationObserver { public: explicit LocationBarViewGtk(Browser* browser); virtual ~LocationBarViewGtk(); void Init(bool popup_window_mode); void SetProfile(Profile* profile); // Returns the widget the caller should host. You must call Init() first. GtkWidget* widget() { return hbox_.get(); } // Returns the widget the page info bubble should point to. GtkWidget* location_icon_widget() const { return location_icon_image_; } // Returns the widget the extension installed bubble should point to. GtkWidget* location_entry_widget() const { return entry_box_; } // Returns the current TabContents. TabContents* GetTabContents() const; // Sets |preview_enabled| for the PageActionViewGtk associated with this // |page_action|. If |preview_enabled| is true, the view will display the // page action's icon even though it has not been activated by the extension. // This is used by the ExtensionInstalledBubbleGtk to preview what the icon // will look like for the user upon installation of the extension. void SetPreviewEnabledPageAction(ExtensionAction *page_action, bool preview_enabled); // Retrieves the GtkWidget which is associated with PageActionView // corresponding to |page_action|. GtkWidget* GetPageActionWidget(ExtensionAction* page_action); // Updates the location bar. We also reset the bar's permanent text and // security style, and, if |tab_for_state_restoring| is non-NULL, also // restore saved state that the tab holds. void Update(const TabContents* tab_for_state_restoring); // Show the bookmark bubble. void ShowStarBubble(const GURL& url, bool newly_boomkarked); // Set the starred state of the bookmark star. void SetStarred(bool starred); // Implement the AutocompleteEditController interface. virtual void OnAutocompleteWillClosePopup(); virtual void OnAutocompleteLosingFocus(gfx::NativeView view_gaining_focus); virtual void OnAutocompleteWillAccept(); // For this implementation, the parameter is ignored. virtual bool OnCommitSuggestedText(const std::wstring& typed_text); virtual bool AcceptCurrentInstantPreview(); virtual void OnSetSuggestedSearchText(const string16& suggested_text); virtual void OnPopupBoundsChanged(const gfx::Rect& bounds); virtual void OnAutocompleteAccept(const GURL& url, WindowOpenDisposition disposition, PageTransition::Type transition, const GURL& alternate_nav_url); virtual void OnChanged(); virtual void OnSelectionBoundsChanged(); virtual void OnKillFocus(); virtual void OnSetFocus(); virtual void OnInputInProgress(bool in_progress); virtual SkBitmap GetFavIcon() const; virtual std::wstring GetTitle() const; // Implement the LocationBar interface. virtual void ShowFirstRunBubble(FirstRun::BubbleType bubble_type); virtual void SetSuggestedText(const string16& text); virtual std::wstring GetInputString() const; virtual WindowOpenDisposition GetWindowOpenDisposition() const; virtual PageTransition::Type GetPageTransition() const; virtual void AcceptInput(); virtual void FocusLocation(bool select_all); virtual void FocusSearch(); virtual void UpdateContentSettingsIcons(); virtual void UpdatePageActions(); virtual void InvalidatePageActions(); virtual void SaveStateToContents(TabContents* contents); virtual void Revert(); virtual const AutocompleteEditView* location_entry() const; virtual AutocompleteEditView* location_entry(); virtual LocationBarTesting* GetLocationBarForTesting(); // Implement the LocationBarTesting interface. virtual int PageActionCount(); virtual int PageActionVisibleCount(); virtual ExtensionAction* GetPageAction(size_t index); virtual ExtensionAction* GetVisiblePageAction(size_t index); virtual void TestPageActionPressed(size_t index); // Implement the NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Edit background color. static const GdkColor kBackgroundColor; private: class ContentSettingImageViewGtk : public InfoBubbleGtkDelegate { public: ContentSettingImageViewGtk(ContentSettingsType content_type, const LocationBarViewGtk* parent, Profile* profile); virtual ~ContentSettingImageViewGtk(); GtkWidget* widget() { return event_box_.get(); } void set_profile(Profile* profile) { profile_ = profile; } bool IsVisible() { return GTK_WIDGET_VISIBLE(widget()); } void UpdateFromTabContents(TabContents* tab_contents); private: CHROMEGTK_CALLBACK_1(ContentSettingImageViewGtk, gboolean, OnButtonPressed, GdkEvent*); // InfoBubbleDelegate overrides: virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble, bool closed_by_escape); scoped_ptr content_setting_image_model_; // The widgets for this content settings view. OwnedWidgetGtk event_box_; OwnedWidgetGtk image_; // The owning LocationBarViewGtk. const LocationBarViewGtk* parent_; // The currently active profile. Profile* profile_; // The currently shown info bubble if any. ContentSettingBubbleGtk* info_bubble_; DISALLOW_COPY_AND_ASSIGN(ContentSettingImageViewGtk); }; class PageActionViewGtk : public ImageLoadingTracker::Observer, public ExtensionContextMenuModel::PopupDelegate { public: PageActionViewGtk( LocationBarViewGtk* owner, Profile* profile, ExtensionAction* page_action); virtual ~PageActionViewGtk(); GtkWidget* widget() { return event_box_.get(); } ExtensionAction* page_action() { return page_action_; } void set_preview_enabled(bool preview_enabled) { preview_enabled_ = preview_enabled; } bool IsVisible() { return GTK_WIDGET_VISIBLE(widget()); } // Called to notify the PageAction that it should determine whether to be // visible or hidden. |contents| is the TabContents that is active, |url| // is the current page URL. void UpdateVisibility(TabContents* contents, GURL url); // A callback from ImageLoadingTracker for when the image has loaded. virtual void OnImageLoaded( SkBitmap* image, ExtensionResource resource, int index); // Simulate left mouse click on the page action button. void TestActivatePageAction(); // Overridden from ExtensionContextMenuModel::PopupDelegate: virtual void InspectPopup(ExtensionAction* action); private: // Show the popup for this page action. If |devtools| is true, show it // with a debugger window attached. Returns true if a popup was shown. bool ShowPopup(bool devtools); CHROMEGTK_CALLBACK_1(PageActionViewGtk, gboolean, OnButtonPressed, GdkEvent*); CHROMEGTK_CALLBACK_1(PageActionViewGtk, gboolean, OnExposeEvent, GdkEventExpose*); // The location bar view that owns us. LocationBarViewGtk* owner_; // The current profile (not owned by us). Profile* profile_; // The PageAction that this view represents. The PageAction is not owned by // us, it resides in the extension of this particular profile. ExtensionAction* page_action_; // A cache of all the different icon paths associated with this page action. typedef std::map PixbufMap; PixbufMap pixbufs_; // A cache of the last dynamically generated bitmap and the pixbuf that // corresponds to it. We keep track of both so we can free old pixbufs as // their icons are replaced. SkBitmap last_icon_skbitmap_; GdkPixbuf* last_icon_pixbuf_; // The object that is waiting for the image loading to complete // asynchronously. ImageLoadingTracker tracker_; // The widgets for this page action. OwnedWidgetGtk event_box_; OwnedWidgetGtk image_; // The tab id we are currently showing the icon for. int current_tab_id_; // The URL we are currently showing the icon for. GURL current_url_; // This is used for post-install visual feedback. The page_action icon // is briefly shown even if it hasn't been enabled by its extension. bool preview_enabled_; // The context menu view and model for this extension action. scoped_ptr context_menu_; scoped_refptr context_menu_model_; DISALLOW_COPY_AND_ASSIGN(PageActionViewGtk); }; friend class PageActionViewGtk; // Creates, initializes, and packs the location icon, EV certificate name, // and optional border. void BuildSiteTypeArea(); // Enable or disable the location icon/EV certificate as a drag source for // the URL. void SetSiteTypeDragSource(); GtkWidget* site_type_area() { return site_type_alignment_; } CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, HandleExpose, GdkEventExpose*); CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnIconReleased, GdkEventButton*); CHROMEGTK_CALLBACK_4(LocationBarViewGtk, void, OnIconDragData, GdkDragContext*, GtkSelectionData*, guint, guint); CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragBegin, GdkDragContext*); CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragEnd, GdkDragContext*); CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnHboxSizeAllocate, GtkAllocation*); CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnEntryBoxSizeAllocate, GtkAllocation*); CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnStarButtonPress, GdkEventButton*); // Updates the site type area: changes the icon and shows/hides the EV // certificate information. void UpdateSiteTypeArea(); // Updates the maximum size of the EV certificate label. void UpdateEVCertificateLabelSize(); // Sets the text that should be displayed in the info label and its associated // tooltip text. Call with an empty string if the info label should be // hidden. void SetInfoText(); // Set the keyword text for the Search BLAH: keyword box. void SetKeywordLabel(const std::wstring& keyword); // Set the keyword text for the "Press tab to search BLAH" hint box. void SetKeywordHintLabel(const std::wstring& keyword); void ShowFirstRunBubbleInternal(FirstRun::BubbleType bubble_type); // Show or hide |tab_to_search_box_| and |tab_to_search_hint_| according to // the value of |show_selected_keyword_|, |show_keyword_hint_|, and the // available horizontal space in the location bar. void AdjustChildrenVisibility(); // Build the star icon. void CreateStarButton(); // Update the star icon after it is toggled or the theme changes. void UpdateStarIcon(); // Returns true if we should only show the URL and none of the extras like // the star button or page actions. bool ShouldOnlyShowLocation(); // The outermost widget we want to be hosted. OwnedWidgetGtk hbox_; // Star button. OwnedWidgetGtk star_; GtkWidget* star_image_; bool starred_; // An icon to the left of the address bar. GtkWidget* site_type_alignment_; GtkWidget* site_type_event_box_; GtkWidget* location_icon_image_; GtkWidget* drag_icon_; bool enable_location_drag_; // TODO(pkasting): Split this label off and move the rest of the items to the // left of the address bar. GtkWidget* security_info_label_; // Content setting icons. OwnedWidgetGtk content_setting_hbox_; ScopedVector content_setting_views_; // Extension page action icons. OwnedWidgetGtk page_action_hbox_; ScopedVector page_action_views_; // The widget that contains our tab hints and the location bar. GtkWidget* entry_box_; // Area on the left shown when in tab to search mode. GtkWidget* tab_to_search_box_; GtkWidget* tab_to_search_magnifier_; GtkWidget* tab_to_search_full_label_; GtkWidget* tab_to_search_partial_label_; // Hint to user that they can tab-to-search by hitting tab. GtkWidget* tab_to_search_hint_; GtkWidget* tab_to_search_hint_leading_label_; GtkWidget* tab_to_search_hint_icon_; GtkWidget* tab_to_search_hint_trailing_label_; scoped_ptr location_entry_; // Alignment used to wrap |location_entry_|. GtkWidget* location_entry_alignment_; Profile* profile_; CommandUpdater* command_updater_; ToolbarModel* toolbar_model_; Browser* browser_; // When we get an OnAutocompleteAccept notification from the autocomplete // edit, we save the input string so we can give it back to the browser on // the LocationBar interface via GetInputString(). std::wstring location_input_; // The user's desired disposition for how their input should be opened. WindowOpenDisposition disposition_; // The transition type to use for the navigation. PageTransition::Type transition_; // Used to schedule a task for the first run info bubble. ScopedRunnableMethodFactory first_run_bubble_; // When true, the location bar view is read only and also is has a slightly // different presentation (font size / color). This is used for popups. bool popup_window_mode_; // Provides colors and rendering mode. GtkThemeProvider* theme_provider_; NotificationRegistrar registrar_; // Width of the main |hbox_|. Used to properly elide the EV certificate. int hbox_width_; // Width of the hbox that holds |tab_to_search_box_|, |location_entry_| and // |tab_to_search_hint_|. int entry_box_width_; // Indicate if |tab_to_search_box_| should be shown. bool show_selected_keyword_; // Indicate if |tab_to_search_hint_| should be shown. bool show_keyword_hint_; // The last search keyword that was shown via the |tab_to_search_box_|. std::wstring last_keyword_; // True if we should update the instant controller when the edit text changes. bool update_instant_; DISALLOW_COPY_AND_ASSIGN(LocationBarViewGtk); }; #endif // CHROME_BROWSER_GTK_LOCATION_BAR_VIEW_GTK_H_