Home | History | Annotate | Download | only in omnibox
      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_OMNIBOX_OMNIBOX_POPUP_MODEL_H_
      6 #define CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_POPUP_MODEL_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/observer_list.h"
     10 #include "chrome/browser/autocomplete/autocomplete_controller.h"
     11 #include "chrome/browser/autocomplete/autocomplete_result.h"
     12 #include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
     13 
     14 class OmniboxPopupModelObserver;
     15 class OmniboxPopupView;
     16 
     17 namespace gfx {
     18 class Image;
     19 }
     20 
     21 class OmniboxPopupModel {
     22  public:
     23   // See selected_line_state_ for details.
     24   enum LineState {
     25     NORMAL = 0,
     26     KEYWORD
     27   };
     28 
     29   OmniboxPopupModel(OmniboxPopupView* popup_view, OmniboxEditModel* edit_model);
     30   ~OmniboxPopupModel();
     31 
     32   // Returns true if the popup is currently open.
     33   bool IsOpen() const;
     34 
     35   OmniboxPopupView* view() const { return view_; }
     36 
     37   // Returns the AutocompleteController used by this popup.
     38   AutocompleteController* autocomplete_controller() const {
     39     return edit_model_->autocomplete_controller();
     40   }
     41 
     42   const AutocompleteResult& result() const {
     43     return autocomplete_controller()->result();
     44   }
     45 
     46   size_t hovered_line() const { return hovered_line_; }
     47 
     48   // Call to change the hovered line.  |line| should be within the range of
     49   // valid lines (to enable hover) or kNoMatch (to disable hover).
     50   void SetHoveredLine(size_t line);
     51 
     52   size_t selected_line() const { return selected_line_; }
     53 
     54   LineState selected_line_state() const { return selected_line_state_; }
     55 
     56   // Call to change the selected line.  This will update all state and repaint
     57   // the necessary parts of the window, as well as updating the edit with the
     58   // new temporary text.  |line| will be clamped to the range of valid lines.
     59   // |reset_to_default| is true when the selection is being reset back to the
     60   // default match, and thus there is no temporary text (and no
     61   // |manually_selected_match_|). If |force| is true then the selected line will
     62   // be updated forcibly even if the |line| is same as the current selected
     63   // line.
     64   // NOTE: This assumes the popup is open, and thus both old and new values for
     65   // the selected line should not be kNoMatch.
     66   void SetSelectedLine(size_t line, bool reset_to_default, bool force);
     67 
     68   // Called when the user hits escape after arrowing around the popup.  This
     69   // will change the selected line back to the default match and redraw.
     70   void ResetToDefaultMatch();
     71 
     72   // Immediately updates and opens the popup if necessary, then moves the
     73   // current selection down (|count| > 0) or up (|count| < 0), clamping to the
     74   // first or last result if necessary.  If |count| == 0, the selection will be
     75   // unchanged, but the popup will still redraw and modify the text in the
     76   // OmniboxEditModel.
     77   void Move(int count);
     78 
     79   // If the selected line has both a normal match and a keyword match, this can
     80   // be used to choose which to select. It is an error to call this when the
     81   // selected line does not have both matches (or there is no selection).
     82   void SetSelectedLineState(LineState state);
     83 
     84   // Called when the user hits shift-delete.  This should determine if the item
     85   // can be removed from history, and if so, remove it and update the popup.
     86   void TryDeletingCurrentItem();
     87 
     88   // If |match| is from an extension, returns the extension icon; otherwise
     89   // returns an empty Image.
     90   gfx::Image GetIconIfExtensionMatch(const AutocompleteMatch& match) const;
     91 
     92   // The match the user has manually chosen, if any.
     93   const AutocompleteResult::Selection& manually_selected_match() const {
     94     return manually_selected_match_;
     95   }
     96 
     97   // Invoked from the edit model any time the result set of the controller
     98   // changes.
     99   void OnResultChanged();
    100 
    101   // Add and remove observers.
    102   void AddObserver(OmniboxPopupModelObserver* observer);
    103   void RemoveObserver(OmniboxPopupModelObserver* observer);
    104 
    105   // The token value for selected_line_, hover_line_ and functions dealing with
    106   // a "line number" that indicates "no line".
    107   static const size_t kNoMatch;
    108 
    109  private:
    110   OmniboxPopupView* view_;
    111 
    112   OmniboxEditModel* edit_model_;
    113 
    114   // The line that's currently hovered.  If we're not drawing a hover rect,
    115   // this will be kNoMatch, even if the cursor is over the popup contents.
    116   size_t hovered_line_;
    117 
    118   // The currently selected line.  This is kNoMatch when nothing is selected,
    119   // which should only be true when the popup is closed.
    120   size_t selected_line_;
    121 
    122   // If the selected line has both a normal match and a keyword match, this
    123   // determines whether the normal match (if NORMAL) or the keyword match
    124   // (if KEYWORD) is selected.
    125   LineState selected_line_state_;
    126 
    127   // The match the user has manually chosen, if any.
    128   AutocompleteResult::Selection manually_selected_match_;
    129 
    130   // Observers.
    131   ObserverList<OmniboxPopupModelObserver> observers_;
    132 
    133   DISALLOW_COPY_AND_ASSIGN(OmniboxPopupModel);
    134 };
    135 
    136 #endif  // CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_POPUP_MODEL_H_
    137