| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ui/app_list/cocoa/apps_grid_controller.h" | 5 #import "ui/app_list/cocoa/apps_grid_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/foundation_util.h" | 7 #include "base/mac/foundation_util.h" |
| 8 #include "ui/app_list/app_list_item_model.h" | 8 #include "ui/app_list/app_list_item_model.h" |
| 9 #include "ui/app_list/app_list_model.h" | 9 #include "ui/app_list/app_list_model.h" |
| 10 #include "ui/app_list/app_list_model_observer.h" | 10 #include "ui/app_list/app_list_model_observer.h" |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 - (void)listItemMovedFromIndex:(size_t)fromIndex | 86 - (void)listItemMovedFromIndex:(size_t)fromIndex |
| 87 toModelIndex:(size_t)toIndex; | 87 toModelIndex:(size_t)toIndex; |
| 88 | 88 |
| 89 // Moves the selection by |indexDelta| items. | 89 // Moves the selection by |indexDelta| items. |
| 90 - (BOOL)moveSelectionByDelta:(int)indexDelta; | 90 - (BOOL)moveSelectionByDelta:(int)indexDelta; |
| 91 | 91 |
| 92 @end | 92 @end |
| 93 | 93 |
| 94 namespace app_list { | 94 namespace app_list { |
| 95 | 95 |
| 96 class AppsGridDelegateBridge : public ui::ListModelObserver { | 96 class AppsGridDelegateBridge : public AppListModelObserver { |
| 97 public: | 97 public: |
| 98 AppsGridDelegateBridge(AppsGridController* parent) : parent_(parent) {} | 98 AppsGridDelegateBridge(AppsGridController* parent) : parent_(parent) {} |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 // Overridden from ui::ListModelObserver: | 101 // Overridden from ui::ListModelObserver: |
| 102 virtual void ListItemsAdded(size_t start, size_t count) OVERRIDE { | 102 virtual void OnListItemsAdded(size_t page_index, |
| 103 [parent_ listItemsAdded:start | 103 size_t start, size_t count) OVERRIDE { |
| 104 size_t start_index = page_index * kItemsPerPage + start; |
| 105 [parent_ listItemsAdded:start_index |
| 104 count:count]; | 106 count:count]; |
| 105 } | 107 } |
| 106 virtual void ListItemsRemoved(size_t start, size_t count) OVERRIDE { | 108 virtual void OnListItemsRemoved(size_t page_index, |
| 107 [parent_ listItemsRemoved:start | 109 size_t start, size_t count) OVERRIDE { |
| 110 size_t start_index = page_index * kItemsPerPage + start; |
| 111 [parent_ listItemsRemoved:start_index |
| 108 count:count]; | 112 count:count]; |
| 109 } | 113 } |
| 110 virtual void ListItemMoved(size_t index, size_t target_index) OVERRIDE { | 114 virtual void OnListItemMoved(size_t page_index, |
| 111 [parent_ listItemMovedFromIndex:index | 115 size_t index, size_t target_index) OVERRIDE { |
| 112 toModelIndex:target_index]; | 116 size_t from_index = page_index * kItemsPerPage + index; |
| 113 } | 117 size_t to_index = page_index * kItemsPerPage + target_index; |
| 114 virtual void ListItemsChanged(size_t start, size_t count) OVERRIDE { | 118 [parent_ listItemMovedFromIndex:from_index |
| 115 NOTREACHED(); | 119 toModelIndex:to_index]; |
| 116 } | 120 } |
| 117 | 121 |
| 118 AppsGridController* parent_; // Weak, owns us. | 122 AppsGridController* parent_; // Weak, owns us. |
| 119 | 123 |
| 120 DISALLOW_COPY_AND_ASSIGN(AppsGridDelegateBridge); | 124 DISALLOW_COPY_AND_ASSIGN(AppsGridDelegateBridge); |
| 121 }; | 125 }; |
| 122 | 126 |
| 123 } // namespace app_list | 127 } // namespace app_list |
| 124 | 128 |
| 125 @interface PageContainerView : NSView; | 129 @interface PageContainerView : NSView; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 } | 185 } |
| 182 return NSNotFound; | 186 return NSNotFound; |
| 183 } | 187 } |
| 184 | 188 |
| 185 - (app_list::AppListModel*)model { | 189 - (app_list::AppListModel*)model { |
| 186 return model_.get(); | 190 return model_.get(); |
| 187 } | 191 } |
| 188 | 192 |
| 189 - (void)setModel:(scoped_ptr<app_list::AppListModel>)newModel { | 193 - (void)setModel:(scoped_ptr<app_list::AppListModel>)newModel { |
| 190 if (model_) { | 194 if (model_) { |
| 191 model_->apps()->RemoveObserver(bridge_.get()); | 195 model_->RemoveObserver(bridge_.get()); |
| 192 | 196 |
| 193 // Since the model is about to be deleted, and the AppKit objects might be | 197 // Since the model is about to be deleted, and the AppKit objects might be |
| 194 // sitting in an NSAutoreleasePool, ensure there are no references to the | 198 // sitting in an NSAutoreleasePool, ensure there are no references to the |
| 195 // model. | 199 // model. |
| 196 for (size_t i = 0; i < [items_ count]; ++i) | 200 for (size_t i = 0; i < [items_ count]; ++i) |
| 197 [[self itemAtIndex:i] setModel:NULL]; | 201 [[self itemAtIndex:i] setModel:NULL]; |
| 198 | 202 |
| 199 [items_ removeAllObjects]; | 203 [items_ removeAllObjects]; |
| 200 [self updatePages:0]; | 204 [self updatePages:0]; |
| 201 [self scrollToPage:0]; | 205 [self scrollToPage:0]; |
| 202 } | 206 } |
| 203 | 207 |
| 204 model_.reset(newModel.release()); | 208 model_.reset(newModel.release()); |
| 205 if (!model_) | 209 if (!model_) |
| 206 return; | 210 return; |
| 207 | 211 |
| 208 model_->apps()->AddObserver(bridge_.get()); | 212 model_->AddObserver(bridge_.get()); |
| 209 [self listItemsAdded:0 | 213 for (size_t p = 0; p < model_->GetNumAppPages(); ++p) { |
| 210 count:model_->apps()->item_count()]; | 214 size_t start_index = p * kItemsPerPage; |
| 215 [self listItemsAdded:start_index |
| 216 count:model_->GetAppItems(p).item_count()]; |
| 217 } |
| 211 } | 218 } |
| 212 | 219 |
| 213 - (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate { | 220 - (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate { |
| 214 scoped_ptr<app_list::AppListModel> newModel(new app_list::AppListModel); | 221 scoped_ptr<app_list::AppListModel> newModel(new app_list::AppListModel); |
| 215 delegate_ = newDelegate; | 222 delegate_ = newDelegate; |
| 216 if (delegate_) | 223 if (delegate_) |
| 217 delegate_->InitModel(newModel.get()); // Populates items. | 224 delegate_->InitModel(newModel.get()); // Populates items. |
| 218 [self setModel:newModel.Pass()]; | 225 [self setModel:newModel.Pass()]; |
| 219 } | 226 } |
| 220 | 227 |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 } | 522 } |
| 516 } | 523 } |
| 517 | 524 |
| 518 // Compare with views implementation in AppsGridView::MoveItemInModel(). | 525 // Compare with views implementation in AppsGridView::MoveItemInModel(). |
| 519 - (void)moveItemWithIndex:(size_t)itemIndex | 526 - (void)moveItemWithIndex:(size_t)itemIndex |
| 520 toModelIndex:(size_t)modelIndex { | 527 toModelIndex:(size_t)modelIndex { |
| 521 // Ingore no-op moves. Note that this is always the case when canceled. | 528 // Ingore no-op moves. Note that this is always the case when canceled. |
| 522 if (itemIndex == modelIndex) | 529 if (itemIndex == modelIndex) |
| 523 return; | 530 return; |
| 524 | 531 |
| 525 model_->apps()->RemoveObserver(bridge_.get()); | 532 size_t itemPageIndex = itemIndex / kItemsPerPage; |
| 526 model_->apps()->Move(itemIndex, modelIndex); | 533 itemIndex -= itemPageIndex * kItemsPerPage; |
| 527 model_->apps()->AddObserver(bridge_.get()); | 534 size_t modelPageIndex = modelIndex / kItemsPerPage; |
| 535 modelIndex -= modelPageIndex * kItemsPerPage; |
| 536 model_->RemoveObserver(bridge_.get()); |
| 537 model_->MoveItem(itemPageIndex, itemIndex, modelPageIndex, modelIndex); |
| 538 model_->AddObserver(bridge_.get()); |
| 528 } | 539 } |
| 529 | 540 |
| 530 - (AppsCollectionViewDragManager*)dragManager { | 541 - (AppsCollectionViewDragManager*)dragManager { |
| 531 return dragManager_; | 542 return dragManager_; |
| 532 } | 543 } |
| 533 | 544 |
| 534 - (size_t)scheduledScrollPage { | 545 - (size_t)scheduledScrollPage { |
| 535 return scheduledScrollPage_; | 546 return scheduledScrollPage_; |
| 536 } | 547 } |
| 537 | 548 |
| 538 - (void)listItemsAdded:(size_t)start | 549 - (void)listItemsAdded:(size_t)start |
| 539 count:(size_t)count { | 550 count:(size_t)count { |
| 540 // Cancel any drag, to ensure the model stays consistent. | 551 // Cancel any drag, to ensure the model stays consistent. |
| 541 [dragManager_ cancelDrag]; | 552 [dragManager_ cancelDrag]; |
| 542 | 553 |
| 543 for (size_t i = start; i < start + count; ++i) { | 554 for (size_t i = start; i < start + count; ++i) { |
| 544 app_list::AppListItemModel* itemModel = model_->apps()->GetItemAt(i); | 555 size_t page = i / kItemsPerPage; |
| 556 size_t index = i - page * kItemsPerPage; |
| 557 app_list::AppListItemModel* itemModel = model_->GetItemAt(page, index); |
| 545 [items_ insertObject:[NSValue valueWithPointer:itemModel] | 558 [items_ insertObject:[NSValue valueWithPointer:itemModel] |
| 546 atIndex:i]; | 559 atIndex:i]; |
| 547 } | 560 } |
| 548 | 561 |
| 549 [self updatePages:start]; | 562 [self updatePages:start]; |
| 550 } | 563 } |
| 551 | 564 |
| 552 - (void)listItemsRemoved:(size_t)start | 565 - (void)listItemsRemoved:(size_t)start |
| 553 count:(size_t)count { | 566 count:(size_t)count { |
| 554 [dragManager_ cancelDrag]; | 567 [dragManager_ cancelDrag]; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 return [self moveSelectionByDelta:-kItemsPerPage]; | 684 return [self moveSelectionByDelta:-kItemsPerPage]; |
| 672 | 685 |
| 673 if (command == @selector(pageDown:) || | 686 if (command == @selector(pageDown:) || |
| 674 command == @selector(scrollPageDown:)) | 687 command == @selector(scrollPageDown:)) |
| 675 return [self moveSelectionByDelta:kItemsPerPage]; | 688 return [self moveSelectionByDelta:kItemsPerPage]; |
| 676 | 689 |
| 677 return NO; | 690 return NO; |
| 678 } | 691 } |
| 679 | 692 |
| 680 @end | 693 @end |
| OLD | NEW |