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_COCOA_OMNIBOX_OMNIBOX_POPUP_VIEW_MAC_H_
      6 #define CHROME_BROWSER_UI_COCOA_OMNIBOX_OMNIBOX_POPUP_VIEW_MAC_H_
      7 
      8 #import <Cocoa/Cocoa.h>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/mac/scoped_nsobject.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "chrome/browser/autocomplete/autocomplete_match.h"
     14 #import "chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.h"
     15 #include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
     16 #include "ui/gfx/font.h"
     17 
     18 class AutocompleteResult;
     19 class OmniboxEditModel;
     20 class OmniboxPopupModel;
     21 class OmniboxView;
     22 
     23 // Implements OmniboxPopupView using a raw NSWindow containing an
     24 // NSTableView.
     25 class OmniboxPopupViewMac : public OmniboxPopupView,
     26                             public OmniboxPopupMatrixDelegate {
     27  public:
     28   OmniboxPopupViewMac(OmniboxView* omnibox_view,
     29                       OmniboxEditModel* edit_model,
     30                       NSTextField* field);
     31   virtual ~OmniboxPopupViewMac();
     32 
     33   // Overridden from OmniboxPopupView:
     34   virtual bool IsOpen() const OVERRIDE;
     35   virtual void InvalidateLine(size_t line) OVERRIDE {}
     36   virtual void UpdatePopupAppearance() OVERRIDE;
     37   virtual gfx::Rect GetTargetBounds() OVERRIDE;
     38   // This is only called by model in SetSelectedLine() after updating
     39   // everything.  Popup should already be visible.
     40   virtual void PaintUpdatesNow() OVERRIDE;
     41   virtual void OnDragCanceled() OVERRIDE {}
     42 
     43   // Overridden from OmniboxPopupMatrixDelegate:
     44   virtual void OnMatrixRowSelected(OmniboxPopupMatrix* matrix,
     45                                    size_t row) OVERRIDE;
     46   virtual void OnMatrixRowClicked(OmniboxPopupMatrix* matrix,
     47                                   size_t row) OVERRIDE;
     48   virtual void OnMatrixRowMiddleClicked(OmniboxPopupMatrix* matrix,
     49                                         size_t row) OVERRIDE;
     50 
     51   OmniboxPopupMatrix* matrix() { return matrix_; }
     52 
     53   // Applies the given font and colors to the match string based on
     54   // classifications.
     55   static NSMutableAttributedString* DecorateMatchedString(
     56       const string16& match_string,
     57       const AutocompleteMatch::ACMatchClassifications& classifications,
     58       NSColor* text_color,
     59       NSColor* dim_text_color,
     60       gfx::Font& font);
     61 
     62  protected:
     63   // Gets the autocomplete results. This is virtual so that it can be overriden
     64   // by tests.
     65   virtual const AutocompleteResult& GetResult() const;
     66 
     67  private:
     68   // Create the popup_ instance if needed.
     69   void CreatePopupIfNeeded();
     70 
     71   // Calculate the appropriate position for the popup based on the
     72   // field's screen position and the given target for the matrix
     73   // height, and makes the popup visible.  Animates to the new frame
     74   // if the popup shrinks, snaps to the new frame if the popup grows,
     75   // allows existing animations to continue if the size doesn't
     76   // change.
     77   void PositionPopup(const CGFloat matrixHeight);
     78 
     79   // Returns the NSImage that should be used as an icon for the given match.
     80   NSImage* ImageForMatch(const AutocompleteMatch& match);
     81 
     82   // Opens the URL at the given row.
     83   void OpenURLForRow(size_t row, WindowOpenDisposition disposition);
     84 
     85   OmniboxView* omnibox_view_;
     86   scoped_ptr<OmniboxPopupModel> model_;
     87   NSTextField* field_;  // owned by tab controller
     88 
     89   // Child window containing a matrix which implements the popup.
     90   base::scoped_nsobject<NSWindow> popup_;
     91   NSRect target_popup_frame_;
     92 
     93   base::scoped_nsobject<OmniboxPopupMatrix> matrix_;
     94   base::scoped_nsobject<NSView> top_separator_view_;
     95   base::scoped_nsobject<NSView> bottom_separator_view_;
     96   base::scoped_nsobject<NSBox> background_view_;
     97 
     98   DISALLOW_COPY_AND_ASSIGN(OmniboxPopupViewMac);
     99 };
    100 
    101 #endif  // CHROME_BROWSER_UI_COCOA_OMNIBOX_OMNIBOX_POPUP_VIEW_MAC_H_
    102