- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / gtk / omnibox / omnibox_popup_view_gtk.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_UI_GTK_OMNIBOX_OMNIBOX_POPUP_VIEW_GTK_H_
6 #define CHROME_BROWSER_UI_GTK_OMNIBOX_OMNIBOX_POPUP_VIEW_GTK_H_
7
8 #include <gtk/gtk.h>
9
10 #include <map>
11 #include <string>
12
13 #include "base/basictypes.h"
14 #include "base/compiler_specific.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "chrome/browser/autocomplete/autocomplete_match.h"
17 #include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
18 #include "content/public/browser/notification_observer.h"
19 #include "content/public/browser/notification_registrar.h"
20 #include "ui/base/gtk/gtk_signal.h"
21 #include "ui/base/window_open_disposition.h"
22 #include "ui/gfx/font.h"
23
24 class AutocompleteResult;
25 class GtkThemeService;
26 class OmniboxEditModel;
27 class OmniboxPopupModel;
28 class OmniboxView;
29 class SkBitmap;
30
31 namespace gfx {
32 class Image;
33 }
34
35 class OmniboxPopupViewGtk : public OmniboxPopupView,
36                             public content::NotificationObserver {
37  public:
38   OmniboxPopupViewGtk(const gfx::Font& font,
39                       OmniboxView* omnibox_view,
40                       OmniboxEditModel* edit_model,
41                       GtkWidget* location_bar);
42   virtual ~OmniboxPopupViewGtk();
43
44   // Initializes the view.
45   virtual void Init();
46
47   // Overridden from OmniboxPopupView:
48   virtual bool IsOpen() const OVERRIDE;
49   virtual void InvalidateLine(size_t line) OVERRIDE;
50   virtual void UpdatePopupAppearance() OVERRIDE;
51   virtual gfx::Rect GetTargetBounds() OVERRIDE;
52   virtual void PaintUpdatesNow() OVERRIDE;
53   virtual void OnDragCanceled() OVERRIDE;
54
55   // Overridden from content::NotificationObserver:
56   virtual void Observe(int type,
57                        const content::NotificationSource& source,
58                        const content::NotificationDetails& details) OVERRIDE;
59
60  protected:
61   // Convert a y-coordinate to the closest line / result.
62   size_t LineFromY(int y) const;
63
64   // Return a Rect for the space for a result line.  This excludes the border,
65   // but includes the padding.  This is the area that is colored for a
66   // selection.
67   gfx::Rect GetRectForLine(size_t line, int width) const;
68
69   // Returns the number of hidden matches at the top of the popup. This is
70   // non-zero when a verbatim match like search-what-you-typed is present but
71   // should not be shown.
72   size_t GetHiddenMatchCount() const;
73
74   // Returns the current autocomplete result.
75   virtual const AutocompleteResult& GetResult() const;
76
77  private:
78   // Be friendly for unit tests.
79   friend class OmniboxPopupViewGtkTest;
80
81   static void SetupLayoutForMatch(
82       PangoLayout* layout,
83       const string16& text,
84       const AutocompleteMatch::ACMatchClassifications& classifications,
85       const GdkColor* base_color,
86       const GdkColor* dim_color,
87       const GdkColor* url_color,
88       const std::string& prefix_text);
89
90   virtual void Show(size_t num_results);
91   virtual void Hide();
92
93   // Restack the popup window directly above the browser's toplevel window.
94   void StackWindow();
95
96   // Accept a line of the results, for example, when the user clicks a line.
97   void AcceptLine(size_t line, WindowOpenDisposition disposition);
98
99   // Returns the appropriate icon to display beside |match|.
100   gfx::Image IconForMatch(const AutocompleteMatch& match,
101                           bool selected,
102                           bool is_selected_keyword);
103
104   // Returns the |index|th element of match, unless we're selected and showing
105   // the associated keyword match.
106   void GetVisibleMatchForInput(size_t index,
107                                const AutocompleteMatch** match,
108                                bool* is_selected_keyword);
109
110   CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleMotion,
111                        GdkEventMotion*);
112
113   CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleButtonPress,
114                        GdkEventButton*);
115
116   CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleButtonRelease,
117                        GdkEventButton*);
118
119   CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleExpose,
120                        GdkEventExpose*);
121
122   scoped_ptr<OmniboxPopupModel> model_;
123   OmniboxView* omnibox_view_;
124   GtkWidget* location_bar_;
125
126   // Our popup window, which is the only widget used, and we paint it on our
127   // own.  This widget shouldn't be exposed outside of this class.
128   GtkWidget* window_;
129   // The pango layout object created from the window, cached across exposes.
130   PangoLayout* layout_;
131
132   GtkThemeService* theme_service_;
133   content::NotificationRegistrar registrar_;
134
135   // Font used for suggestions after being derived from the constructor's
136   // |font|.
137   gfx::Font font_;
138
139   // A list of colors which we should use for drawing the popup. These change
140   // between gtk and normal mode.
141   GdkColor border_color_;
142   GdkColor background_color_;
143   GdkColor selected_background_color_;
144   GdkColor hovered_background_color_;
145   GdkColor content_text_color_;
146   GdkColor selected_content_text_color_;
147   GdkColor content_dim_text_color_;
148   GdkColor selected_content_dim_text_color_;
149   GdkColor url_text_color_;
150   GdkColor url_selected_text_color_;
151
152   // If the user cancels a dragging action (i.e. by pressing ESC), we don't have
153   // a convenient way to release mouse capture. Instead we use this flag to
154   // simply ignore all remaining drag events, and the eventual mouse release
155   // event. Since OnDragCanceled() can be called when we're not dragging, this
156   // flag is reset to false on a mouse pressed event, to make sure we don't
157   // erroneously ignore the next drag.
158   bool ignore_mouse_drag_;
159
160   // Whether our popup is currently open / shown, or closed / hidden.
161   bool opened_;
162
163   DISALLOW_COPY_AND_ASSIGN(OmniboxPopupViewGtk);
164 };
165
166 #endif  // CHROME_BROWSER_UI_GTK_OMNIBOX_OMNIBOX_POPUP_VIEW_GTK_H_