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_COCOA_OMNIBOX_OMNIBOX_POPUP_VIEW_MAC_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_COCOA_OMNIBOX_OMNIBOX_POPUP_VIEW_MAC_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/mac/scoped_nsobject.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#import "chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_view.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass AutocompleteResult; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxEditModel; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxPopupModel; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxView; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implements OmniboxPopupView using a raw NSWindow containing an 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NSTableView. 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass OmniboxPopupViewMac : public OmniboxPopupView, 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public OmniboxPopupMatrixDelegate { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxPopupViewMac(OmniboxView* omnibox_view, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxEditModel* edit_model, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSTextField* field); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OmniboxPopupViewMac(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from OmniboxPopupView: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsOpen() const OVERRIDE; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void InvalidateLine(size_t line) OVERRIDE {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdatePopupAppearance() OVERRIDE; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Rect GetTargetBounds() OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is only called by model in SetSelectedLine() after updating 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // everything. Popup should already be visible. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PaintUpdatesNow() OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDragCanceled() OVERRIDE {} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Overridden from OmniboxPopupMatrixDelegate: 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnMatrixRowSelected(OmniboxPopupMatrix* matrix, 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t row) OVERRIDE; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnMatrixRowClicked(OmniboxPopupMatrix* matrix, 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t row) OVERRIDE; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnMatrixRowMiddleClicked(OmniboxPopupMatrix* matrix, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t row) OVERRIDE; 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OmniboxPopupMatrix* matrix() { return matrix_; } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Gets the autocomplete results. This is virtual so that it can be overriden 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // by tests. 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual const AutocompleteResult& GetResult() const; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the popup_ instance if needed. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreatePopupIfNeeded(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the appropriate position for the popup based on the 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // field's screen position and the given target for the matrix 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // height, and makes the popup visible. Animates to the new frame 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the popup shrinks, snaps to the new frame if the popup grows, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allows existing animations to continue if the size doesn't 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PositionPopup(const CGFloat matrixHeight); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the NSImage that should be used as an icon for the given match. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSImage* ImageForMatch(const AutocompleteMatch& match); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Opens the URL at the given row. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OpenURLForRow(size_t row, WindowOpenDisposition disposition); 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxView* omnibox_view_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<OmniboxPopupModel> model_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSTextField* field_; // owned by tab controller 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Child window containing a matrix which implements the popup. 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSWindow> popup_; 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NSRect target_popup_frame_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<OmniboxPopupMatrix> matrix_; 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSView> top_separator_view_; 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSView> bottom_separator_view_; 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSBox> background_view_; 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OmniboxPopupViewMac); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_COCOA_OMNIBOX_OMNIBOX_POPUP_VIEW_MAC_H_ 93