| Index: ui/app_list/cocoa/apps_search_box_controller.mm
|
| diff --git a/ui/app_list/cocoa/apps_search_box_controller.mm b/ui/app_list/cocoa/apps_search_box_controller.mm
|
| deleted file mode 100644
|
| index 00a3fa6fd29a5d3a899a1477f97a4c7678fd76d3..0000000000000000000000000000000000000000
|
| --- a/ui/app_list/cocoa/apps_search_box_controller.mm
|
| +++ /dev/null
|
| @@ -1,396 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#import "ui/app_list/cocoa/apps_search_box_controller.h"
|
| -
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/mac/mac_util.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#import "third_party/google_toolbox_for_mac/src/AppKit/GTMNSBezierPath+RoundRect.h"
|
| -#include "ui/app_list/app_list_menu.h"
|
| -#include "ui/app_list/app_list_model.h"
|
| -#include "ui/app_list/search_box_model.h"
|
| -#include "ui/app_list/search_box_model_observer.h"
|
| -#import "ui/base/cocoa/controls/hover_image_menu_button.h"
|
| -#import "ui/base/cocoa/controls/hover_image_menu_button_cell.h"
|
| -#import "ui/base/cocoa/menu_controller.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/image/image_skia_util_mac.h"
|
| -#include "ui/resources/grit/ui_resources.h"
|
| -
|
| -namespace {
|
| -
|
| -// Padding either side of the search icon and menu button.
|
| -const CGFloat kPadding = 14;
|
| -
|
| -// Size of the search icon.
|
| -const CGFloat kSearchIconDimension = 32;
|
| -
|
| -// Size of the menu button on the right.
|
| -const CGFloat kMenuButtonDimension = 29;
|
| -
|
| -// Menu offset relative to the bottom-right corner of the menu button.
|
| -const CGFloat kMenuYOffsetFromButton = -4;
|
| -const CGFloat kMenuXOffsetFromButton = -7;
|
| -
|
| -}
|
| -
|
| -@interface AppsSearchBoxController ()
|
| -
|
| -- (NSImageView*)searchImageView;
|
| -- (void)addSubviews;
|
| -
|
| -@end
|
| -
|
| -namespace app_list {
|
| -
|
| -class SearchBoxModelObserverBridge : public SearchBoxModelObserver {
|
| - public:
|
| - SearchBoxModelObserverBridge(AppsSearchBoxController* parent);
|
| - ~SearchBoxModelObserverBridge() override;
|
| -
|
| - void SetSearchText(const base::string16& text);
|
| -
|
| - void IconChanged() override;
|
| - void SpeechRecognitionButtonPropChanged() override;
|
| - void HintTextChanged() override;
|
| - void SelectionModelChanged() override;
|
| - void TextChanged() override;
|
| -
|
| - private:
|
| - SearchBoxModel* GetModel();
|
| -
|
| - AppsSearchBoxController* parent_; // Weak. Owns us.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SearchBoxModelObserverBridge);
|
| -};
|
| -
|
| -SearchBoxModelObserverBridge::SearchBoxModelObserverBridge(
|
| - AppsSearchBoxController* parent)
|
| - : parent_(parent) {
|
| - IconChanged();
|
| - HintTextChanged();
|
| - GetModel()->AddObserver(this);
|
| -}
|
| -
|
| -SearchBoxModelObserverBridge::~SearchBoxModelObserverBridge() {
|
| - GetModel()->RemoveObserver(this);
|
| -}
|
| -
|
| -SearchBoxModel* SearchBoxModelObserverBridge::GetModel() {
|
| - SearchBoxModel* searchBoxModel = [[parent_ delegate] searchBoxModel];
|
| - DCHECK(searchBoxModel);
|
| - return searchBoxModel;
|
| -}
|
| -
|
| -void SearchBoxModelObserverBridge::SetSearchText(const base::string16& text) {
|
| - SearchBoxModel* model = GetModel();
|
| - model->RemoveObserver(this);
|
| - model->SetText(text);
|
| - // TODO(tapted): See if this should call SetSelectionModel here.
|
| - model->AddObserver(this);
|
| -}
|
| -
|
| -void SearchBoxModelObserverBridge::IconChanged() {
|
| - [[parent_ searchImageView] setImage:gfx::NSImageFromImageSkiaWithColorSpace(
|
| - GetModel()->icon(), base::mac::GetSRGBColorSpace())];
|
| -}
|
| -
|
| -void SearchBoxModelObserverBridge::SpeechRecognitionButtonPropChanged() {
|
| - // TODO(mukai): implement.
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void SearchBoxModelObserverBridge::HintTextChanged() {
|
| - [[[parent_ searchTextField] cell] setPlaceholderString:
|
| - base::SysUTF16ToNSString(GetModel()->hint_text())];
|
| -}
|
| -
|
| -void SearchBoxModelObserverBridge::SelectionModelChanged() {
|
| - // TODO(tapted): See if anything needs to be done here for RTL.
|
| -}
|
| -
|
| -void SearchBoxModelObserverBridge::TextChanged() {
|
| - // Currently the model text is only changed when we are not observing it, or
|
| - // it is changed in tests to establish a particular state.
|
| - [[parent_ searchTextField]
|
| - setStringValue:base::SysUTF16ToNSString(GetModel()->text())];
|
| - [[parent_ delegate] modelTextDidChange];
|
| -}
|
| -
|
| -} // namespace app_list
|
| -
|
| -@interface SearchTextField : NSTextField {
|
| - @private
|
| - NSRect textFrameInset_;
|
| -}
|
| -
|
| -@property(readonly, nonatomic) NSRect textFrameInset;
|
| -
|
| -- (void)setMarginsWithLeftMargin:(CGFloat)leftMargin
|
| - rightMargin:(CGFloat)rightMargin;
|
| -
|
| -@end
|
| -
|
| -@interface AppListMenuController : MenuController {
|
| - @private
|
| - AppsSearchBoxController* searchBoxController_; // Weak. Owns us.
|
| -}
|
| -
|
| -- (id)initWithSearchBoxController:(AppsSearchBoxController*)parent;
|
| -
|
| -@end
|
| -
|
| -@implementation AppsSearchBoxController
|
| -
|
| -@synthesize delegate = delegate_;
|
| -
|
| -- (id)initWithFrame:(NSRect)frame {
|
| - if ((self = [super init])) {
|
| - base::scoped_nsobject<NSView> containerView(
|
| - [[NSView alloc] initWithFrame:frame]);
|
| - [self setView:containerView];
|
| - [self addSubviews];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)clearSearch {
|
| - [searchTextField_ setStringValue:@""];
|
| - [self controlTextDidChange:nil];
|
| -}
|
| -
|
| -- (void)rebuildMenu {
|
| - if (![delegate_ appListDelegate])
|
| - return;
|
| -
|
| - menuController_.reset();
|
| - appListMenu_.reset(
|
| - new app_list::AppListMenu([delegate_ appListDelegate]));
|
| - menuController_.reset([[AppListMenuController alloc]
|
| - initWithSearchBoxController:self]);
|
| - [menuButton_ setMenu:[menuController_ menu]]; // Menu will populate here.
|
| -}
|
| -
|
| -- (void)setDelegate:(id<AppsSearchBoxDelegate>)delegate {
|
| - [[menuButton_ menu] removeAllItems];
|
| - menuController_.reset();
|
| - appListMenu_.reset();
|
| - bridge_.reset(); // Ensure observers are cleared before updating |delegate_|.
|
| - delegate_ = delegate;
|
| - if (!delegate_)
|
| - return;
|
| -
|
| - bridge_.reset(new app_list::SearchBoxModelObserverBridge(self));
|
| - [self rebuildMenu];
|
| -}
|
| -
|
| -- (NSTextField*)searchTextField {
|
| - return searchTextField_;
|
| -}
|
| -
|
| -- (NSPopUpButton*)menuControl {
|
| - return menuButton_;
|
| -}
|
| -
|
| -- (app_list::AppListMenu*)appListMenu {
|
| - return appListMenu_.get();
|
| -}
|
| -
|
| -- (NSImageView*)searchImageView {
|
| - return searchImageView_;
|
| -}
|
| -
|
| -- (void)addSubviews {
|
| - NSRect viewBounds = [[self view] bounds];
|
| - searchImageView_.reset([[NSImageView alloc] initWithFrame:NSMakeRect(
|
| - kPadding, 0, kSearchIconDimension, NSHeight(viewBounds))]);
|
| -
|
| - searchTextField_.reset([[SearchTextField alloc] initWithFrame:viewBounds]);
|
| - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
|
| - [searchTextField_ setDelegate:self];
|
| - [searchTextField_ setFont:rb.GetFont(
|
| - ui::ResourceBundle::MediumFont).GetNativeFont()];
|
| - [searchTextField_
|
| - setMarginsWithLeftMargin:NSMaxX([searchImageView_ frame]) + kPadding
|
| - rightMargin:kMenuButtonDimension + 2 * kPadding];
|
| -
|
| - // Add the drop-down menu, with a custom button.
|
| - NSRect buttonFrame = NSMakeRect(
|
| - NSWidth(viewBounds) - kMenuButtonDimension - kPadding,
|
| - floor(NSMidY(viewBounds) - kMenuButtonDimension / 2),
|
| - kMenuButtonDimension,
|
| - kMenuButtonDimension);
|
| - menuButton_.reset([[HoverImageMenuButton alloc] initWithFrame:buttonFrame
|
| - pullsDown:YES]);
|
| - [[menuButton_ hoverImageMenuButtonCell] setDefaultImage:
|
| - rb.GetNativeImageNamed(IDR_APP_LIST_TOOLS_NORMAL).AsNSImage()];
|
| - [[menuButton_ hoverImageMenuButtonCell] setAlternateImage:
|
| - rb.GetNativeImageNamed(IDR_APP_LIST_TOOLS_PRESSED).AsNSImage()];
|
| - [[menuButton_ hoverImageMenuButtonCell] setHoverImage:
|
| - rb.GetNativeImageNamed(IDR_APP_LIST_TOOLS_HOVER).AsNSImage()];
|
| -
|
| - [[self view] addSubview:searchImageView_];
|
| - [[self view] addSubview:searchTextField_];
|
| - [[self view] addSubview:menuButton_];
|
| -}
|
| -
|
| -- (BOOL)control:(NSControl*)control
|
| - textView:(NSTextView*)textView
|
| - doCommandBySelector:(SEL)command {
|
| - // Forward the message first, to handle grid or search results navigation.
|
| - BOOL handled = [delegate_ control:control
|
| - textView:textView
|
| - doCommandBySelector:command];
|
| - if (handled)
|
| - return YES;
|
| -
|
| - // If the delegate did not handle the escape key, it means the window was not
|
| - // dismissed because there were search results. Clear them.
|
| - if (command == @selector(complete:)) {
|
| - [self clearSearch];
|
| - return YES;
|
| - }
|
| -
|
| - return NO;
|
| -}
|
| -
|
| -- (void)controlTextDidChange:(NSNotification*)notification {
|
| - if (bridge_) {
|
| - bridge_->SetSearchText(
|
| - base::SysNSStringToUTF16([searchTextField_ stringValue]));
|
| - }
|
| -
|
| - [delegate_ modelTextDidChange];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@interface SearchTextFieldCell : NSTextFieldCell;
|
| -
|
| -- (NSRect)textFrameForFrameInternal:(NSRect)cellFrame;
|
| -
|
| -@end
|
| -
|
| -@implementation SearchTextField
|
| -
|
| -@synthesize textFrameInset = textFrameInset_;
|
| -
|
| -+ (Class)cellClass {
|
| - return [SearchTextFieldCell class];
|
| -}
|
| -
|
| -- (id)initWithFrame:(NSRect)theFrame {
|
| - if ((self = [super initWithFrame:theFrame])) {
|
| - [self setFocusRingType:NSFocusRingTypeNone];
|
| - [self setDrawsBackground:NO];
|
| - [self setBordered:NO];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)setMarginsWithLeftMargin:(CGFloat)leftMargin
|
| - rightMargin:(CGFloat)rightMargin {
|
| - // Find the preferred height for the current text properties, and center.
|
| - NSRect viewBounds = [self bounds];
|
| - [self sizeToFit];
|
| - NSRect textBounds = [self bounds];
|
| - textFrameInset_.origin.x = leftMargin;
|
| - textFrameInset_.origin.y = floor(NSMidY(viewBounds) - NSMidY(textBounds));
|
| - textFrameInset_.size.width = leftMargin + rightMargin;
|
| - textFrameInset_.size.height = NSHeight(viewBounds) - NSHeight(textBounds);
|
| - [self setFrame:viewBounds];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation SearchTextFieldCell
|
| -
|
| -- (NSRect)textFrameForFrameInternal:(NSRect)cellFrame {
|
| - SearchTextField* searchTextField =
|
| - base::mac::ObjCCastStrict<SearchTextField>([self controlView]);
|
| - NSRect insetRect = [searchTextField textFrameInset];
|
| - cellFrame.origin.x += insetRect.origin.x;
|
| - cellFrame.origin.y += insetRect.origin.y;
|
| - cellFrame.size.width -= insetRect.size.width;
|
| - cellFrame.size.height -= insetRect.size.height;
|
| - return cellFrame;
|
| -}
|
| -
|
| -- (NSRect)textFrameForFrame:(NSRect)cellFrame {
|
| - return [self textFrameForFrameInternal:cellFrame];
|
| -}
|
| -
|
| -- (NSRect)textCursorFrameForFrame:(NSRect)cellFrame {
|
| - return [self textFrameForFrameInternal:cellFrame];
|
| -}
|
| -
|
| -- (void)resetCursorRect:(NSRect)cellFrame
|
| - inView:(NSView*)controlView {
|
| - [super resetCursorRect:[self textCursorFrameForFrame:cellFrame]
|
| - inView:controlView];
|
| -}
|
| -
|
| -- (NSRect)drawingRectForBounds:(NSRect)theRect {
|
| - return [super drawingRectForBounds:[self textFrameForFrame:theRect]];
|
| -}
|
| -
|
| -- (void)editWithFrame:(NSRect)cellFrame
|
| - inView:(NSView*)controlView
|
| - editor:(NSText*)editor
|
| - delegate:(id)delegate
|
| - event:(NSEvent*)event {
|
| - [super editWithFrame:[self textFrameForFrame:cellFrame]
|
| - inView:controlView
|
| - editor:editor
|
| - delegate:delegate
|
| - event:event];
|
| -}
|
| -
|
| -- (void)selectWithFrame:(NSRect)cellFrame
|
| - inView:(NSView*)controlView
|
| - editor:(NSText*)editor
|
| - delegate:(id)delegate
|
| - start:(NSInteger)start
|
| - length:(NSInteger)length {
|
| - [super selectWithFrame:[self textFrameForFrame:cellFrame]
|
| - inView:controlView
|
| - editor:editor
|
| - delegate:delegate
|
| - start:start
|
| - length:length];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation AppListMenuController
|
| -
|
| -- (id)initWithSearchBoxController:(AppsSearchBoxController*)parent {
|
| - // Need to initialze super with a NULL model, otherwise it will immediately
|
| - // try to populate, which can't be done until setting the parent.
|
| - if ((self = [super initWithModel:NULL
|
| - useWithPopUpButtonCell:YES])) {
|
| - searchBoxController_ = parent;
|
| - [super setModel:[parent appListMenu]->menu_model()];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (NSRect)confinementRectForMenu:(NSMenu*)menu
|
| - onScreen:(NSScreen*)screen {
|
| - NSPopUpButton* menuButton = [searchBoxController_ menuControl];
|
| - // Ensure the menu comes up below the menu button by trimming the window frame
|
| - // to a point anchored below the bottom right of the button.
|
| - NSRect anchorRect = [menuButton convertRect:[menuButton bounds]
|
| - toView:nil];
|
| - NSPoint anchorPoint = [[menuButton window] convertBaseToScreen:NSMakePoint(
|
| - NSMaxX(anchorRect) + kMenuXOffsetFromButton,
|
| - NSMinY(anchorRect) - kMenuYOffsetFromButton)];
|
| - NSRect confinementRect = [[menuButton window] frame];
|
| - confinementRect.size = NSMakeSize(anchorPoint.x - NSMinX(confinementRect),
|
| - anchorPoint.y - NSMinY(confinementRect));
|
| - return confinementRect;
|
| -}
|
| -
|
| -@end
|
|
|