| // 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_ |