apps_search_results_model_bridge.mm revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright 2013 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#import "ui/app_list/cocoa/apps_search_results_model_bridge.h" 6 7#import <Cocoa/Cocoa.h> 8 9#include "base/strings/sys_string_conversions.h" 10#include "ui/app_list/search_result.h" 11#include "ui/app_list/search_result_observer.h" 12 13namespace app_list { 14 15class AppsSearchResultsModelBridge::ItemObserver : public SearchResultObserver { 16 public: 17 ItemObserver(AppsSearchResultsModelBridge* bridge, size_t index) 18 : bridge_(bridge), row_in_view_(index) { 19 // Cache the result, because the results array is updated before notifying 20 // observers (which happens before deleting the SearchResult). 21 result_ = bridge_->results_->GetItemAt(index); 22 result_->AddObserver(this); 23 } 24 25 virtual ~ItemObserver() { 26 result_->RemoveObserver(this); 27 } 28 29 // SearchResultObserver overrides: 30 virtual void OnIconChanged() OVERRIDE { 31 bridge_->ReloadDataForItems(row_in_view_, 1); 32 } 33 virtual void OnActionsChanged() OVERRIDE {} 34 virtual void OnIsInstallingChanged() OVERRIDE {} 35 virtual void OnPercentDownloadedChanged() OVERRIDE {} 36 37 private: 38 AppsSearchResultsModelBridge* bridge_; // Weak. Owns us. 39 SearchResult* result_; // Weak. Owned by AppListModel::SearchResults. 40 size_t row_in_view_; 41 42 DISALLOW_COPY_AND_ASSIGN(ItemObserver); 43}; 44 45AppsSearchResultsModelBridge::AppsSearchResultsModelBridge( 46 AppListModel::SearchResults* results_model, 47 NSTableView* results_table_view) 48 : results_(results_model), 49 table_view_([results_table_view retain]) { 50 results_->AddObserver(this); 51} 52 53AppsSearchResultsModelBridge::~AppsSearchResultsModelBridge() { 54 results_->RemoveObserver(this); 55} 56 57void AppsSearchResultsModelBridge::UpdateItemObservers() { 58 DCHECK(item_observers_.empty()); 59 const size_t itemCount = results_->item_count(); 60 for (size_t i = 0 ; i < itemCount; ++i) 61 item_observers_.push_back(new ItemObserver(this, i)); 62} 63 64void AppsSearchResultsModelBridge::ReloadDataForItems( 65 size_t start, size_t count) const { 66 NSIndexSet* column = [NSIndexSet indexSetWithIndex:0]; 67 NSIndexSet* rows = 68 [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(start, count)]; 69 [table_view_ reloadDataForRowIndexes:rows 70 columnIndexes:column]; 71} 72 73void AppsSearchResultsModelBridge::ListItemsAdded( 74 size_t start, size_t count) { 75 item_observers_.clear(); 76 if (start == static_cast<size_t>([table_view_ numberOfRows])) 77 [table_view_ noteNumberOfRowsChanged]; 78 else 79 [table_view_ reloadData]; 80 UpdateItemObservers(); 81} 82 83void AppsSearchResultsModelBridge::ListItemsRemoved( 84 size_t start, size_t count) { 85 item_observers_.clear(); 86 if (start == results_->item_count()) 87 [table_view_ noteNumberOfRowsChanged]; 88 else 89 [table_view_ reloadData]; 90 UpdateItemObservers(); 91} 92 93void AppsSearchResultsModelBridge::ListItemMoved( 94 size_t index, size_t target_index) { 95 NOTREACHED(); 96} 97 98void AppsSearchResultsModelBridge::ListItemsChanged( 99 size_t start, size_t count) { 100 item_observers_.clear(); 101 ReloadDataForItems(start, count); 102 UpdateItemObservers(); 103} 104 105} // namespace app_list 106