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