// Copyright (c) 2011 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_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_GTK_H_ #define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_GTK_H_ #pragma once #include <gtk/gtk.h> #include <map> #include <string> #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/autocomplete/autocomplete_match.h" #include "chrome/browser/autocomplete/autocomplete_popup_view.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "ui/gfx/font.h" #include "webkit/glue/window_open_disposition.h" class AutocompleteEditModel; class AutocompleteEditView; class AutocompletePopupModel; class GtkThemeService; class Profile; class SkBitmap; class AutocompletePopupViewGtk : public AutocompletePopupView, public NotificationObserver { public: AutocompletePopupViewGtk(const gfx::Font& font, AutocompleteEditView* edit_view, AutocompleteEditModel* edit_model, Profile* profile, GtkWidget* location_bar); ~AutocompletePopupViewGtk(); // Overridden from AutocompletePopupView: virtual bool IsOpen() const; virtual void InvalidateLine(size_t line); virtual void UpdatePopupAppearance(); virtual gfx::Rect GetTargetBounds(); virtual void PaintUpdatesNow(); virtual void OnDragCanceled(); // Overridden from NotificationObserver: virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: // Be friendly for unit tests. friend class AutocompletePopupViewGtkTest; static void SetupLayoutForMatch( PangoLayout* layout, const string16& text, const AutocompleteMatch::ACMatchClassifications& classifications, const GdkColor* base_color, const GdkColor* dim_color, const GdkColor* url_color, const std::string& prefix_text); void Show(size_t num_results); void Hide(); // Restack the popup window directly above the browser's toplevel window. void StackWindow(); // Convert a y-coordinate to the closest line / result. size_t LineFromY(int y); // Accept a line of the results, for example, when the user clicks a line. void AcceptLine(size_t line, WindowOpenDisposition disposition); GdkPixbuf* IconForMatch(const AutocompleteMatch& match, bool selected); static gboolean HandleExposeThunk(GtkWidget* widget, GdkEventExpose* event, gpointer userdata) { return reinterpret_cast<AutocompletePopupViewGtk*>(userdata)-> HandleExpose(widget, event); } gboolean HandleExpose(GtkWidget* widget, GdkEventExpose* event); static gboolean HandleMotionThunk(GtkWidget* widget, GdkEventMotion* event, gpointer userdata) { return reinterpret_cast<AutocompletePopupViewGtk*>(userdata)-> HandleMotion(widget, event); } gboolean HandleMotion(GtkWidget* widget, GdkEventMotion* event); static gboolean HandleButtonPressThunk(GtkWidget* widget, GdkEventButton* event, gpointer userdata) { return reinterpret_cast<AutocompletePopupViewGtk*>(userdata)-> HandleButtonPress(widget, event); } gboolean HandleButtonPress(GtkWidget* widget, GdkEventButton* event); static gboolean HandleButtonReleaseThunk(GtkWidget* widget, GdkEventButton* event, gpointer userdata) { return reinterpret_cast<AutocompletePopupViewGtk*>(userdata)-> HandleButtonRelease(widget, event); } gboolean HandleButtonRelease(GtkWidget* widget, GdkEventButton* event); scoped_ptr<AutocompletePopupModel> model_; AutocompleteEditView* edit_view_; GtkWidget* location_bar_; // Our popup window, which is the only widget used, and we paint it on our // own. This widget shouldn't be exposed outside of this class. GtkWidget* window_; // The pango layout object created from the window, cached across exposes. PangoLayout* layout_; GtkThemeService* theme_service_; NotificationRegistrar registrar_; // Font used for suggestions after being derived from the constructor's // |font|. gfx::Font font_; // Used to cache GdkPixbufs and map them from the SkBitmaps they were created // from. typedef std::map<const SkBitmap*, GdkPixbuf*> PixbufMap; PixbufMap pixbufs_; // A list of colors which we should use for drawing the popup. These change // between gtk and normal mode. GdkColor border_color_; GdkColor background_color_; GdkColor selected_background_color_; GdkColor hovered_background_color_; GdkColor content_text_color_; GdkColor selected_content_text_color_; GdkColor content_dim_text_color_; GdkColor selected_content_dim_text_color_; GdkColor url_text_color_; GdkColor url_selected_text_color_; // If the user cancels a dragging action (i.e. by pressing ESC), we don't have // a convenient way to release mouse capture. Instead we use this flag to // simply ignore all remaining drag events, and the eventual mouse release // event. Since OnDragCanceled() can be called when we're not dragging, this // flag is reset to false on a mouse pressed event, to make sure we don't // erroneously ignore the next drag. bool ignore_mouse_drag_; // Whether our popup is currently open / shown, or closed / hidden. bool opened_; DISALLOW_COPY_AND_ASSIGN(AutocompletePopupViewGtk); }; #endif // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_GTK_H_