15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_GTK_OMNIBOX_OMNIBOX_POPUP_VIEW_GTK_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_GTK_OMNIBOX_OMNIBOX_POPUP_VIEW_GTK_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_signal.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GtkThemeService;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxEditModel;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxPopupModel;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxView;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Image;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GtkSignalRegistrar;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxPopupViewGtk : public OmniboxPopupView,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            public content::NotificationObserver {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OmniboxPopupViewGtk(const gfx::Font& font,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      OmniboxView* omnibox_view,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      OmniboxEditModel* edit_model,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      GtkWidget* location_bar);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~OmniboxPopupViewGtk();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from OmniboxPopupView:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsOpen() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InvalidateLine(size_t line) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdatePopupAppearance() OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Rect GetTargetBounds() OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PaintUpdatesNow() OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDragCanceled() OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from content::NotificationObserver:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Be friendly for unit tests.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class OmniboxPopupViewGtkTest;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetupLayoutForMatch(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PangoLayout* layout,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& text,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AutocompleteMatch::ACMatchClassifications& classifications,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GdkColor* base_color,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GdkColor* dim_color,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GdkColor* url_color,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& prefix_text);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Show(size_t num_results);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Hide();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restack the popup window directly above the browser's toplevel window.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StackWindow();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert a y-coordinate to the closest line / result.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t LineFromY(int y);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept a line of the results, for example, when the user clicks a line.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AcceptLine(size_t line, WindowOpenDisposition disposition);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image IconForMatch(const AutocompleteMatch& match,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool selected,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool is_selected_keyword);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the |index|th element of match, unless we're selected and showing
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the associated keyword match.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetVisibleMatchForInput(size_t index,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const AutocompleteMatch** match,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool* is_selected_keyword);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleMotion,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GdkEventMotion*);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleButtonPress,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GdkEventButton*);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleButtonRelease,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GdkEventButton*);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(OmniboxPopupViewGtk, gboolean, HandleExpose,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GdkEventExpose*);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::GtkSignalRegistrar> signal_registrar_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<OmniboxPopupModel> model_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OmniboxView* omnibox_view_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* location_bar_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our popup window, which is the only widget used, and we paint it on our
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // own.  This widget shouldn't be exposed outside of this class.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* window_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pango layout object created from the window, cached across exposes.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PangoLayout* layout_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkThemeService* theme_service_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Font used for suggestions after being derived from the constructor's
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |font|.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Font font_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A list of colors which we should use for drawing the popup. These change
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between gtk and normal mode.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor border_color_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor background_color_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor selected_background_color_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor hovered_background_color_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor content_text_color_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor selected_content_text_color_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor content_dim_text_color_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor selected_content_dim_text_color_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor url_text_color_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor url_selected_text_color_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user cancels a dragging action (i.e. by pressing ESC), we don't have
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a convenient way to release mouse capture. Instead we use this flag to
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // simply ignore all remaining drag events, and the eventual mouse release
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event. Since OnDragCanceled() can be called when we're not dragging, this
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flag is reset to false on a mouse pressed event, to make sure we don't
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // erroneously ignore the next drag.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_mouse_drag_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether our popup is currently open / shown, or closed / hidden.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool opened_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OmniboxPopupViewGtk);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_GTK_OMNIBOX_OMNIBOX_POPUP_VIEW_GTK_H_
153