// Copyright (c) 2012 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_UI_GTK_ZOOM_BUBBLE_GTK_H_ #define CHROME_BROWSER_UI_GTK_ZOOM_BUBBLE_GTK_H_ #include #include "base/basictypes.h" #include "base/timer/timer.h" #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "ui/base/gtk/gtk_signal.h" typedef struct _GtkWidget GtkWidget; class FullscreenController; namespace content { class NotificationDetails; class NotificationSource; class WebContents; } class ZoomBubbleGtk : public content::NotificationObserver { public: // Shows the zoom bubble below |anchor_widget| with an arrow pointing at // |anchor_widget|. If |anchor_widget| is a toplevel window, the bubble will // fixed positioned in the top right of corner of the widget with no arrow. static void ShowBubble(content::WebContents* web_contents, bool auto_close); // Whether the zoom bubble is currently showing. static bool IsShowing(); // Closes the zoom bubble (if there is one). static void CloseBubble(); private: ZoomBubbleGtk(GtkWidget* anchor, content::WebContents* web_contents, bool auto_close, FullscreenController* fullscreen_controller); virtual ~ZoomBubbleGtk(); // content::NotificationObserver: virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; // Convenience method to start |timer_| if |auto_close_| is true. void StartTimerIfNecessary(); // Stops any close timer if |timer_| is currently running. void StopTimerIfNecessary(); // Refreshes the bubble by changing the zoom percentage appropriately and // resetting the timer if necessary. void Refresh(); // Closes the zoom bubble. void Close(); // Notified when the bubble is destroyed so this instance can be deleted. CHROMEGTK_CALLBACK_0(ZoomBubbleGtk, void, OnDestroy); // Fired when the reset link is clicked. CHROMEGTK_CALLBACK_0(ZoomBubbleGtk, void, OnSetDefaultLinkClick); // Fired when the mouse enters or leaves the widget. CHROMEGTK_CALLBACK_1(ZoomBubbleGtk, gboolean, OnMouseEnter, GdkEventCrossing*); CHROMEGTK_CALLBACK_1(ZoomBubbleGtk, gboolean, OnMouseLeave, GdkEventCrossing*); // Whether the currently displayed bubble will automatically close. bool auto_close_; // Whether the mouse is currently inside the bubble. bool mouse_inside_; // Timer used to close the bubble when |auto_close_| is true. base::OneShotTimer timer_; // The WebContents for the page whose zoom has changed. content::WebContents* web_contents_; // An event box that wraps the content of the bubble. GtkWidget* event_box_; // Label showing zoom percentage. GtkWidget* label_; // The BubbleGtk object containing the zoom bubble's content. BubbleGtk* bubble_; // Used to register for fullscreen change notifications. content::NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(ZoomBubbleGtk); }; #endif // CHROME_BROWSER_UI_GTK_ZOOM_BUBBLE_GTK_H_