| Index: ui/app_list/cocoa/app_list_view_controller.mm
|
| diff --git a/ui/app_list/cocoa/app_list_view_controller.mm b/ui/app_list/cocoa/app_list_view_controller.mm
|
| deleted file mode 100644
|
| index f4de6a16e4113d25609a782eecd538bb7386d988..0000000000000000000000000000000000000000
|
| --- a/ui/app_list/cocoa/app_list_view_controller.mm
|
| +++ /dev/null
|
| @@ -1,372 +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/app_list_view_controller.h"
|
| -
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/mac/mac_util.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "skia/ext/skia_utils_mac.h"
|
| -#include "ui/app_list/app_list_constants.h"
|
| -#include "ui/app_list/app_list_model.h"
|
| -#include "ui/app_list/app_list_view_delegate.h"
|
| -#include "ui/app_list/app_list_view_delegate_observer.h"
|
| -#import "ui/app_list/cocoa/app_list_pager_view.h"
|
| -#import "ui/app_list/cocoa/apps_grid_controller.h"
|
| -#import "ui/base/cocoa/flipped_view.h"
|
| -#include "ui/app_list/search_box_model.h"
|
| -#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
|
| -
|
| -namespace {
|
| -
|
| -// The roundedness of the corners of the bubble.
|
| -const CGFloat kBubbleCornerRadius = 3;
|
| -
|
| -// Height of the pager.
|
| -const CGFloat kPagerPreferredHeight = 57;
|
| -
|
| -// Height of separator line drawn between the searchbox and grid view.
|
| -const CGFloat kTopSeparatorSize = 1;
|
| -
|
| -// Height of the search input.
|
| -const CGFloat kSearchInputHeight = 48;
|
| -
|
| -// Minimum margin on either side of the pager. If the pager grows beyond this,
|
| -// the segment size is reduced.
|
| -const CGFloat kMinPagerMargin = 40;
|
| -// Maximum width of a single segment.
|
| -const CGFloat kMaxSegmentWidth = 80;
|
| -
|
| -// Duration of the animation for sliding in and out search results.
|
| -const NSTimeInterval kResultsAnimationDuration = 0.2;
|
| -
|
| -} // namespace
|
| -
|
| -@interface BackgroundView : FlippedView;
|
| -@end
|
| -
|
| -@implementation BackgroundView
|
| -
|
| -- (void)drawRect:(NSRect)dirtyRect {
|
| - gfx::ScopedNSGraphicsContextSaveGState context;
|
| - NSRect boundsRect = [self bounds];
|
| - NSRect searchAreaRect = NSMakeRect(0, 0,
|
| - NSWidth(boundsRect), kSearchInputHeight);
|
| - NSRect separatorRect = NSMakeRect(0, NSMaxY(searchAreaRect),
|
| - NSWidth(boundsRect), kTopSeparatorSize);
|
| -
|
| - [[NSBezierPath bezierPathWithRoundedRect:boundsRect
|
| - xRadius:kBubbleCornerRadius
|
| - yRadius:kBubbleCornerRadius] addClip];
|
| -
|
| - [gfx::SkColorToSRGBNSColor(app_list::kContentsBackgroundColor) set];
|
| - NSRectFill(boundsRect);
|
| - [gfx::SkColorToSRGBNSColor(app_list::kSearchBoxBackground) set];
|
| - NSRectFill(searchAreaRect);
|
| - [gfx::SkColorToSRGBNSColor(app_list::kTopSeparatorColor) set];
|
| - NSRectFill(separatorRect);
|
| -}
|
| -
|
| -@end
|
| -
|
| -@interface AppListViewController ()
|
| -
|
| -- (void)loadAndSetView;
|
| -- (void)revealSearchResults:(BOOL)show;
|
| -
|
| -@end
|
| -
|
| -namespace app_list {
|
| -
|
| -class AppListModelObserverBridge : public AppListViewDelegateObserver {
|
| - public:
|
| - AppListModelObserverBridge(AppListViewController* parent);
|
| - ~AppListModelObserverBridge() override;
|
| -
|
| - private:
|
| - // Overridden from app_list::AppListViewDelegateObserver:
|
| - void OnProfilesChanged() override;
|
| - void OnShutdown() override;
|
| -
|
| - AppListViewController* parent_; // Weak. Owns us.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AppListModelObserverBridge);
|
| -};
|
| -
|
| -AppListModelObserverBridge::AppListModelObserverBridge(
|
| - AppListViewController* parent)
|
| - : parent_(parent) {
|
| - [parent_ delegate]->AddObserver(this);
|
| -}
|
| -
|
| -AppListModelObserverBridge::~AppListModelObserverBridge() {
|
| - [parent_ delegate]->RemoveObserver(this);
|
| -}
|
| -
|
| -void AppListModelObserverBridge::OnProfilesChanged() {
|
| - [parent_ onProfilesChanged];
|
| -}
|
| -
|
| -void AppListModelObserverBridge::OnShutdown() {
|
| - [parent_ setDelegate:nil];
|
| -}
|
| -
|
| -} // namespace app_list
|
| -
|
| -@implementation AppListViewController
|
| -
|
| -- (id)init {
|
| - if ((self = [super init])) {
|
| - appsGridController_.reset([[AppsGridController alloc] init]);
|
| - [self loadAndSetView];
|
| -
|
| - [self totalPagesChanged];
|
| - [self selectedPageChanged:0];
|
| - [appsGridController_ setPaginationObserver:self];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)dealloc {
|
| - // Ensure that setDelegate(NULL) has been called before destruction, because
|
| - // dealloc can be called at odd times, and Objective C destruction order does
|
| - // not properly tear down these dependencies.
|
| - DCHECK(delegate_ == NULL);
|
| - [appsGridController_ setPaginationObserver:nil];
|
| - [super dealloc];
|
| -}
|
| -
|
| -- (AppsSearchBoxController*)searchBoxController {
|
| - return appsSearchBoxController_;
|
| -}
|
| -
|
| -- (BOOL)showingSearchResults {
|
| - return showingSearchResults_;
|
| -}
|
| -
|
| -- (AppsGridController*)appsGridController {
|
| - return appsGridController_;
|
| -}
|
| -
|
| -- (NSSegmentedControl*)pagerControl {
|
| - return pagerControl_;
|
| -}
|
| -
|
| -- (NSView*)backgroundView {
|
| - return backgroundView_;
|
| -}
|
| -
|
| -- (app_list::AppListViewDelegate*)delegate {
|
| - return delegate_;
|
| -}
|
| -
|
| -- (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate {
|
| - if (delegate_) {
|
| - // Ensure the search box is cleared when switching profiles.
|
| - if ([self searchBoxModel])
|
| - [self searchBoxModel]->SetText(base::string16());
|
| -
|
| - // First clean up, in reverse order.
|
| - app_list_model_observer_bridge_.reset();
|
| - [appsSearchResultsController_ setDelegate:nil];
|
| - [appsSearchBoxController_ setDelegate:nil];
|
| - [appsGridController_ setDelegate:nil];
|
| - }
|
| - delegate_ = newDelegate;
|
| - if (delegate_) {
|
| - [loadingIndicator_ stopAnimation:self];
|
| - } else {
|
| - [loadingIndicator_ startAnimation:self];
|
| - return;
|
| - }
|
| -
|
| - [appsGridController_ setDelegate:delegate_];
|
| - [appsSearchBoxController_ setDelegate:self];
|
| - [appsSearchResultsController_ setDelegate:self];
|
| - app_list_model_observer_bridge_.reset(
|
| - new app_list::AppListModelObserverBridge(self));
|
| - [self onProfilesChanged];
|
| -}
|
| -
|
| --(void)loadAndSetView {
|
| - pagerControl_.reset([[AppListPagerView alloc] init]);
|
| - [pagerControl_ setTarget:appsGridController_];
|
| - [pagerControl_ setAction:@selector(onPagerClicked:)];
|
| -
|
| - NSRect gridFrame = [[appsGridController_ view] frame];
|
| - NSRect contentsRect = NSMakeRect(0, kSearchInputHeight + kTopSeparatorSize,
|
| - NSWidth(gridFrame), NSHeight(gridFrame) + kPagerPreferredHeight -
|
| - [AppsGridController scrollerPadding]);
|
| -
|
| - contentsView_.reset([[FlippedView alloc] initWithFrame:contentsRect]);
|
| -
|
| - // The contents view contains animations both from an NSCollectionView and the
|
| - // app list's own transitive drag layers. On Mavericks, the subviews need to
|
| - // have access to a compositing layer they can share. Otherwise the compositor
|
| - // makes tearing artifacts. However, doing this on Mountain Lion or earler
|
| - // results in flickering whilst an item is installing.
|
| - if (base::mac::IsOSMavericksOrLater())
|
| - [contentsView_ setWantsLayer:YES];
|
| -
|
| - backgroundView_.reset(
|
| - [[BackgroundView alloc] initWithFrame:
|
| - NSMakeRect(0, 0, NSMaxX(contentsRect), NSMaxY(contentsRect))]);
|
| - appsSearchBoxController_.reset(
|
| - [[AppsSearchBoxController alloc] initWithFrame:
|
| - NSMakeRect(0, 0, NSWidth(contentsRect), kSearchInputHeight)]);
|
| - appsSearchResultsController_.reset(
|
| - [[AppsSearchResultsController alloc] initWithAppsSearchResultsFrameSize:
|
| - [contentsView_ bounds].size]);
|
| - base::scoped_nsobject<NSView> containerView(
|
| - [[NSView alloc] initWithFrame:[backgroundView_ frame]]);
|
| -
|
| - loadingIndicator_.reset(
|
| - [[NSProgressIndicator alloc] initWithFrame:NSZeroRect]);
|
| - [loadingIndicator_ setStyle:NSProgressIndicatorSpinningStyle];
|
| - [loadingIndicator_ sizeToFit];
|
| - NSRect indicatorRect = [loadingIndicator_ frame];
|
| - indicatorRect.origin.x = NSWidth(contentsRect) / 2 - NSMidX(indicatorRect);
|
| - indicatorRect.origin.y = NSHeight(contentsRect) / 2 - NSMidY(indicatorRect);
|
| - [loadingIndicator_ setFrame:indicatorRect];
|
| - [loadingIndicator_ setDisplayedWhenStopped:NO];
|
| - [loadingIndicator_ startAnimation:self];
|
| -
|
| - [contentsView_ addSubview:[appsGridController_ view]];
|
| - [contentsView_ addSubview:pagerControl_];
|
| - [contentsView_ addSubview:loadingIndicator_];
|
| - [backgroundView_ addSubview:contentsView_];
|
| - [backgroundView_ addSubview:[appsSearchResultsController_ view]];
|
| - [backgroundView_ addSubview:[appsSearchBoxController_ view]];
|
| - [containerView addSubview:backgroundView_];
|
| - [self setView:containerView];
|
| -}
|
| -
|
| -- (void)revealSearchResults:(BOOL)show {
|
| - if (show == showingSearchResults_)
|
| - return;
|
| -
|
| - showingSearchResults_ = show;
|
| - NSSize contentsSize = [contentsView_ frame].size;
|
| - NSRect resultsTargetRect = NSMakeRect(
|
| - 0, kSearchInputHeight + kTopSeparatorSize,
|
| - contentsSize.width, contentsSize.height);
|
| - NSRect contentsTargetRect = resultsTargetRect;
|
| -
|
| - // Shows results by sliding the grid and pager down to the bottom of the view.
|
| - // Hides results by collapsing the search results container to a height of 0.
|
| - if (show)
|
| - contentsTargetRect.origin.y += NSHeight(contentsTargetRect);
|
| - else
|
| - resultsTargetRect.size.height = 0;
|
| -
|
| - [[NSAnimationContext currentContext] setDuration:kResultsAnimationDuration];
|
| - [[contentsView_ animator] setFrame:contentsTargetRect];
|
| - [[[appsSearchResultsController_ view] animator] setFrame:resultsTargetRect];
|
| -}
|
| -
|
| -- (void)totalPagesChanged {
|
| - size_t pageCount = [appsGridController_ pageCount];
|
| - [pagerControl_ setSegmentCount:pageCount];
|
| -
|
| - NSRect viewFrame = [[pagerControl_ superview] bounds];
|
| - CGFloat segmentWidth = std::min(
|
| - kMaxSegmentWidth,
|
| - (viewFrame.size.width - 2 * kMinPagerMargin) / pageCount);
|
| -
|
| - for (size_t i = 0; i < pageCount; ++i) {
|
| - [pagerControl_ setWidth:segmentWidth
|
| - forSegment:i];
|
| - [[pagerControl_ cell] setTag:i
|
| - forSegment:i];
|
| - }
|
| -
|
| - // Center in view.
|
| - [pagerControl_ sizeToFit];
|
| - [pagerControl_ setFrame:
|
| - NSMakeRect(NSMidX(viewFrame) - NSMidX([pagerControl_ bounds]),
|
| - viewFrame.size.height - kPagerPreferredHeight,
|
| - [pagerControl_ bounds].size.width,
|
| - kPagerPreferredHeight)];
|
| -}
|
| -
|
| -- (void)selectedPageChanged:(int)newSelected {
|
| - [pagerControl_ selectSegmentWithTag:newSelected];
|
| -}
|
| -
|
| -- (void)pageVisibilityChanged {
|
| - [pagerControl_ setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (NSInteger)pagerSegmentAtLocation:(NSPoint)locationInWindow {
|
| - return [pagerControl_ findAndHighlightSegmentAtLocation:locationInWindow];
|
| -}
|
| -
|
| -- (app_list::SearchBoxModel*)searchBoxModel {
|
| - app_list::AppListModel* appListModel = [appsGridController_ model];
|
| - return appListModel ? appListModel->search_box() : NULL;
|
| -}
|
| -
|
| -- (app_list::AppListViewDelegate*)appListDelegate {
|
| - return [self delegate];
|
| -}
|
| -
|
| -- (BOOL)control:(NSControl*)control
|
| - textView:(NSTextView*)textView
|
| - doCommandBySelector:(SEL)command {
|
| - if (showingSearchResults_)
|
| - return [appsSearchResultsController_ handleCommandBySelector:command];
|
| -
|
| - // If anything has been written, let the search view handle it.
|
| - if ([[control stringValue] length] > 0)
|
| - return NO;
|
| -
|
| - // Handle escape.
|
| - if (command == @selector(complete:) ||
|
| - command == @selector(cancel:) ||
|
| - command == @selector(cancelOperation:)) {
|
| - if (delegate_)
|
| - delegate_->Dismiss();
|
| - return YES;
|
| - }
|
| -
|
| - // Possibly handle grid navigation.
|
| - return [appsGridController_ handleCommandBySelector:command];
|
| -}
|
| -
|
| -- (void)modelTextDidChange {
|
| - app_list::SearchBoxModel* searchBoxModel = [self searchBoxModel];
|
| - if (!searchBoxModel || !delegate_)
|
| - return;
|
| -
|
| - base::string16 query;
|
| - base::TrimWhitespace(searchBoxModel->text(), base::TRIM_ALL, &query);
|
| - BOOL shouldShowSearch = !query.empty();
|
| - [self revealSearchResults:shouldShowSearch];
|
| - if (shouldShowSearch)
|
| - delegate_->StartSearch();
|
| - else
|
| - delegate_->StopSearch();
|
| -}
|
| -
|
| -- (app_list::AppListModel*)appListModel {
|
| - return [appsGridController_ model];
|
| -}
|
| -
|
| -- (void)openResult:(app_list::SearchResult*)result {
|
| - if (delegate_) {
|
| - delegate_->OpenSearchResult(
|
| - result, false /* auto_launch */, 0 /* event flags */);
|
| - }
|
| -}
|
| -
|
| -- (void)redoSearch {
|
| - [self modelTextDidChange];
|
| -}
|
| -
|
| -- (void)onProfilesChanged {
|
| - [appsSearchBoxController_ rebuildMenu];
|
| -}
|
| -
|
| -@end
|
|
|