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