| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "ui/app_list/app_list_model.h" | 5 #include "ui/app_list/app_list_model.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "ui/app_list/app_list_folder_item.h" | 10 #include "ui/app_list/app_list_folder_item.h" |
| 10 #include "ui/app_list/app_list_item.h" | 11 #include "ui/app_list/app_list_item.h" |
| 11 #include "ui/app_list/app_list_model_observer.h" | 12 #include "ui/app_list/app_list_model_observer.h" |
| 12 #include "ui/app_list/search_box_model.h" | 13 #include "ui/app_list/search_box_model.h" |
| 13 | 14 |
| 14 namespace app_list { | 15 namespace app_list { |
| 15 | 16 |
| 16 AppListModel::AppListModel() | 17 AppListModel::AppListModel() |
| 17 : top_level_item_list_(new AppListItemList), | 18 : top_level_item_list_(new AppListItemList), |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 AppListItem* item = top_level_item_list_->FindItem(id); | 76 AppListItem* item = top_level_item_list_->FindItem(id); |
| 76 if (item && item->GetItemType() == AppListFolderItem::kItemType) | 77 if (item && item->GetItemType() == AppListFolderItem::kItemType) |
| 77 return static_cast<AppListFolderItem*>(item); | 78 return static_cast<AppListFolderItem*>(item); |
| 78 DCHECK(!item); | 79 DCHECK(!item); |
| 79 return NULL; | 80 return NULL; |
| 80 } | 81 } |
| 81 | 82 |
| 82 AppListItem* AppListModel::AddItem(scoped_ptr<AppListItem> item) { | 83 AppListItem* AppListModel::AddItem(scoped_ptr<AppListItem> item) { |
| 83 DCHECK(!item->IsInFolder()); | 84 DCHECK(!item->IsInFolder()); |
| 84 DCHECK(!top_level_item_list()->FindItem(item->id())); | 85 DCHECK(!top_level_item_list()->FindItem(item->id())); |
| 85 return AddItemToItemListAndNotify(item.Pass()); | 86 return AddItemToItemListAndNotify(std::move(item)); |
| 86 } | 87 } |
| 87 | 88 |
| 88 AppListItem* AppListModel::AddItemToFolder(scoped_ptr<AppListItem> item, | 89 AppListItem* AppListModel::AddItemToFolder(scoped_ptr<AppListItem> item, |
| 89 const std::string& folder_id) { | 90 const std::string& folder_id) { |
| 90 if (folder_id.empty()) | 91 if (folder_id.empty()) |
| 91 return AddItem(item.Pass()); | 92 return AddItem(std::move(item)); |
| 92 DVLOG(2) << "AddItemToFolder: " << item->id() << ": " << folder_id; | 93 DVLOG(2) << "AddItemToFolder: " << item->id() << ": " << folder_id; |
| 93 CHECK_NE(folder_id, item->folder_id()); | 94 CHECK_NE(folder_id, item->folder_id()); |
| 94 DCHECK_NE(AppListFolderItem::kItemType, item->GetItemType()); | 95 DCHECK_NE(AppListFolderItem::kItemType, item->GetItemType()); |
| 95 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); | 96 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
| 96 if (!dest_folder) | 97 if (!dest_folder) |
| 97 return NULL; | 98 return NULL; |
| 98 DCHECK(!dest_folder->item_list()->FindItem(item->id())) | 99 DCHECK(!dest_folder->item_list()->FindItem(item->id())) |
| 99 << "Already in folder: " << dest_folder->id(); | 100 << "Already in folder: " << dest_folder->id(); |
| 100 return AddItemToFolderItemAndNotify(dest_folder, item.Pass()); | 101 return AddItemToFolderItemAndNotify(dest_folder, std::move(item)); |
| 101 } | 102 } |
| 102 | 103 |
| 103 const std::string AppListModel::MergeItems(const std::string& target_item_id, | 104 const std::string AppListModel::MergeItems(const std::string& target_item_id, |
| 104 const std::string& source_item_id) { | 105 const std::string& source_item_id) { |
| 105 if (!folders_enabled()) { | 106 if (!folders_enabled()) { |
| 106 LOG(ERROR) << "MergeItems called with folders disabled."; | 107 LOG(ERROR) << "MergeItems called with folders disabled."; |
| 107 return ""; | 108 return ""; |
| 108 } | 109 } |
| 109 DVLOG(2) << "MergeItems: " << source_item_id << " -> " << target_item_id; | 110 DVLOG(2) << "MergeItems: " << source_item_id << " -> " << target_item_id; |
| 110 | 111 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 132 AppListFolderItem* target_folder = | 133 AppListFolderItem* target_folder = |
| 133 static_cast<AppListFolderItem*>(target_item); | 134 static_cast<AppListFolderItem*>(target_item); |
| 134 if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { | 135 if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
| 135 LOG(WARNING) << "MergeItems called with OEM folder as target"; | 136 LOG(WARNING) << "MergeItems called with OEM folder as target"; |
| 136 return ""; | 137 return ""; |
| 137 } | 138 } |
| 138 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); | 139 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
| 139 source_item_ptr->set_position( | 140 source_item_ptr->set_position( |
| 140 target_folder->item_list()->CreatePositionBefore( | 141 target_folder->item_list()->CreatePositionBefore( |
| 141 syncer::StringOrdinal())); | 142 syncer::StringOrdinal())); |
| 142 AddItemToFolderItemAndNotify(target_folder, source_item_ptr.Pass()); | 143 AddItemToFolderItemAndNotify(target_folder, std::move(source_item_ptr)); |
| 143 return target_folder->id(); | 144 return target_folder->id(); |
| 144 } | 145 } |
| 145 | 146 |
| 146 // Otherwise remove the source item and target item from their current | 147 // Otherwise remove the source item and target item from their current |
| 147 // location, they will become owned by the new folder. | 148 // location, they will become owned by the new folder. |
| 148 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); | 149 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
| 149 CHECK(source_item_ptr); | 150 CHECK(source_item_ptr); |
| 150 // Note: This would fail if |target_item_id == source_item_id|, except we | 151 // Note: This would fail if |target_item_id == source_item_id|, except we |
| 151 // checked that they are distinct at the top of this method. | 152 // checked that they are distinct at the top of this method. |
| 152 scoped_ptr<AppListItem> target_item_ptr = | 153 scoped_ptr<AppListItem> target_item_ptr = |
| 153 top_level_item_list_->RemoveItem(target_item_id); | 154 top_level_item_list_->RemoveItem(target_item_id); |
| 154 CHECK(target_item_ptr); | 155 CHECK(target_item_ptr); |
| 155 | 156 |
| 156 // Create a new folder in the same location as the target item. | 157 // Create a new folder in the same location as the target item. |
| 157 std::string new_folder_id = AppListFolderItem::GenerateId(); | 158 std::string new_folder_id = AppListFolderItem::GenerateId(); |
| 158 DVLOG(2) << "Creating folder for merge: " << new_folder_id; | 159 DVLOG(2) << "Creating folder for merge: " << new_folder_id; |
| 159 scoped_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( | 160 scoped_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( |
| 160 new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); | 161 new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
| 161 new_folder_ptr->set_position(target_item_ptr->position()); | 162 new_folder_ptr->set_position(target_item_ptr->position()); |
| 162 AppListFolderItem* new_folder = static_cast<AppListFolderItem*>( | 163 AppListFolderItem* new_folder = static_cast<AppListFolderItem*>( |
| 163 AddItemToItemListAndNotify(new_folder_ptr.Pass())); | 164 AddItemToItemListAndNotify(std::move(new_folder_ptr))); |
| 164 | 165 |
| 165 // Add the items to the new folder. | 166 // Add the items to the new folder. |
| 166 target_item_ptr->set_position( | 167 target_item_ptr->set_position( |
| 167 new_folder->item_list()->CreatePositionBefore( | 168 new_folder->item_list()->CreatePositionBefore( |
| 168 syncer::StringOrdinal())); | 169 syncer::StringOrdinal())); |
| 169 AddItemToFolderItemAndNotify(new_folder, target_item_ptr.Pass()); | 170 AddItemToFolderItemAndNotify(new_folder, std::move(target_item_ptr)); |
| 170 source_item_ptr->set_position( | 171 source_item_ptr->set_position( |
| 171 new_folder->item_list()->CreatePositionBefore( | 172 new_folder->item_list()->CreatePositionBefore( |
| 172 syncer::StringOrdinal())); | 173 syncer::StringOrdinal())); |
| 173 AddItemToFolderItemAndNotify(new_folder, source_item_ptr.Pass()); | 174 AddItemToFolderItemAndNotify(new_folder, std::move(source_item_ptr)); |
| 174 | 175 |
| 175 return new_folder->id(); | 176 return new_folder->id(); |
| 176 } | 177 } |
| 177 | 178 |
| 178 void AppListModel::MoveItemToFolder(AppListItem* item, | 179 void AppListModel::MoveItemToFolder(AppListItem* item, |
| 179 const std::string& folder_id) { | 180 const std::string& folder_id) { |
| 180 DVLOG(2) << "MoveItemToFolder: " << folder_id | 181 DVLOG(2) << "MoveItemToFolder: " << folder_id |
| 181 << " <- " << item->ToDebugString(); | 182 << " <- " << item->ToDebugString(); |
| 182 if (item->folder_id() == folder_id) | 183 if (item->folder_id() == folder_id) |
| 183 return; | 184 return; |
| 184 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); | 185 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
| 185 scoped_ptr<AppListItem> item_ptr = RemoveItem(item); | 186 scoped_ptr<AppListItem> item_ptr = RemoveItem(item); |
| 186 if (dest_folder) { | 187 if (dest_folder) { |
| 187 CHECK(!item->IsInFolder()); | 188 CHECK(!item->IsInFolder()); |
| 188 AddItemToFolderItemAndNotify(dest_folder, item_ptr.Pass()); | 189 AddItemToFolderItemAndNotify(dest_folder, std::move(item_ptr)); |
| 189 } else { | 190 } else { |
| 190 AddItemToItemListAndNotifyUpdate(item_ptr.Pass()); | 191 AddItemToItemListAndNotifyUpdate(std::move(item_ptr)); |
| 191 } | 192 } |
| 192 } | 193 } |
| 193 | 194 |
| 194 bool AppListModel::MoveItemToFolderAt(AppListItem* item, | 195 bool AppListModel::MoveItemToFolderAt(AppListItem* item, |
| 195 const std::string& folder_id, | 196 const std::string& folder_id, |
| 196 syncer::StringOrdinal position) { | 197 syncer::StringOrdinal position) { |
| 197 DVLOG(2) << "MoveItemToFolderAt: " << folder_id | 198 DVLOG(2) << "MoveItemToFolderAt: " << folder_id |
| 198 << "[" << position.ToDebugString() << "]" | 199 << "[" << position.ToDebugString() << "]" |
| 199 << " <- " << item->ToDebugString(); | 200 << " <- " << item->ToDebugString(); |
| 200 if (item->folder_id() == folder_id) | 201 if (item->folder_id() == folder_id) |
| 201 return false; | 202 return false; |
| 202 AppListFolderItem* src_folder = FindOrCreateFolderItem(item->folder_id()); | 203 AppListFolderItem* src_folder = FindOrCreateFolderItem(item->folder_id()); |
| 203 if (src_folder && | 204 if (src_folder && |
| 204 src_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { | 205 src_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
| 205 LOG(WARNING) << "MoveItemToFolderAt called with OEM folder as source"; | 206 LOG(WARNING) << "MoveItemToFolderAt called with OEM folder as source"; |
| 206 return false; | 207 return false; |
| 207 } | 208 } |
| 208 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); | 209 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
| 209 scoped_ptr<AppListItem> item_ptr = RemoveItem(item); | 210 scoped_ptr<AppListItem> item_ptr = RemoveItem(item); |
| 210 if (dest_folder) { | 211 if (dest_folder) { |
| 211 item_ptr->set_position( | 212 item_ptr->set_position( |
| 212 dest_folder->item_list()->CreatePositionBefore(position)); | 213 dest_folder->item_list()->CreatePositionBefore(position)); |
| 213 AddItemToFolderItemAndNotify(dest_folder, item_ptr.Pass()); | 214 AddItemToFolderItemAndNotify(dest_folder, std::move(item_ptr)); |
| 214 } else { | 215 } else { |
| 215 item_ptr->set_position( | 216 item_ptr->set_position( |
| 216 top_level_item_list_->CreatePositionBefore(position)); | 217 top_level_item_list_->CreatePositionBefore(position)); |
| 217 AddItemToItemListAndNotifyUpdate(item_ptr.Pass()); | 218 AddItemToItemListAndNotifyUpdate(std::move(item_ptr)); |
| 218 } | 219 } |
| 219 return true; | 220 return true; |
| 220 } | 221 } |
| 221 | 222 |
| 222 void AppListModel::SetItemPosition(AppListItem* item, | 223 void AppListModel::SetItemPosition(AppListItem* item, |
| 223 const syncer::StringOrdinal& new_position) { | 224 const syncer::StringOrdinal& new_position) { |
| 224 if (!item->IsInFolder()) { | 225 if (!item->IsInFolder()) { |
| 225 top_level_item_list_->SetItemPosition(item, new_position); | 226 top_level_item_list_->SetItemPosition(item, new_position); |
| 226 // Note: this will trigger OnListItemMoved which will signal observers. | 227 // Note: this will trigger OnListItemMoved which will signal observers. |
| 227 // (This is done this way because some View code still moves items within | 228 // (This is done this way because some View code still moves items within |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) { | 311 for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) { |
| 311 AppListItem* item = top_level_item_list_->item_at(i); | 312 AppListItem* item = top_level_item_list_->item_at(i); |
| 312 if (item->GetItemType() != AppListFolderItem::kItemType) | 313 if (item->GetItemType() != AppListFolderItem::kItemType) |
| 313 continue; | 314 continue; |
| 314 AppListFolderItem* folder = static_cast<AppListFolderItem*>(item); | 315 AppListFolderItem* folder = static_cast<AppListFolderItem*>(item); |
| 315 if (folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) | 316 if (folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) |
| 316 continue; // Do not remove OEM folders. | 317 continue; // Do not remove OEM folders. |
| 317 while (folder->item_list()->item_count()) { | 318 while (folder->item_list()->item_count()) { |
| 318 scoped_ptr<AppListItem> child = folder->item_list()->RemoveItemAt(0); | 319 scoped_ptr<AppListItem> child = folder->item_list()->RemoveItemAt(0); |
| 319 child->set_folder_id(""); | 320 child->set_folder_id(""); |
| 320 AddItemToItemListAndNotifyUpdate(child.Pass()); | 321 AddItemToItemListAndNotifyUpdate(std::move(child)); |
| 321 } | 322 } |
| 322 folder_ids.push_back(folder->id()); | 323 folder_ids.push_back(folder->id()); |
| 323 } | 324 } |
| 324 // Delete folders. | 325 // Delete folders. |
| 325 for (size_t i = 0; i < folder_ids.size(); ++i) | 326 for (size_t i = 0; i < folder_ids.size(); ++i) |
| 326 DeleteItem(folder_ids[i]); | 327 DeleteItem(folder_ids[i]); |
| 327 } | 328 } |
| 328 | 329 |
| 329 void AppListModel::SetCustomLauncherPageEnabled(bool enabled) { | 330 void AppListModel::SetCustomLauncherPageEnabled(bool enabled) { |
| 330 custom_launcher_page_enabled_ = enabled; | 331 custom_launcher_page_enabled_ = enabled; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 if (!folders_enabled()) { | 393 if (!folders_enabled()) { |
| 393 LOG(ERROR) << "Attempt to create folder item when disabled: " << folder_id; | 394 LOG(ERROR) << "Attempt to create folder item when disabled: " << folder_id; |
| 394 return NULL; | 395 return NULL; |
| 395 } | 396 } |
| 396 | 397 |
| 397 DVLOG(2) << "Creating new folder: " << folder_id; | 398 DVLOG(2) << "Creating new folder: " << folder_id; |
| 398 scoped_ptr<AppListFolderItem> new_folder( | 399 scoped_ptr<AppListFolderItem> new_folder( |
| 399 new AppListFolderItem(folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); | 400 new AppListFolderItem(folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
| 400 new_folder->set_position( | 401 new_folder->set_position( |
| 401 top_level_item_list_->CreatePositionBefore(syncer::StringOrdinal())); | 402 top_level_item_list_->CreatePositionBefore(syncer::StringOrdinal())); |
| 402 AppListItem* new_folder_item = AddItemToItemListAndNotify(new_folder.Pass()); | 403 AppListItem* new_folder_item = |
| 404 AddItemToItemListAndNotify(std::move(new_folder)); |
| 403 return static_cast<AppListFolderItem*>(new_folder_item); | 405 return static_cast<AppListFolderItem*>(new_folder_item); |
| 404 } | 406 } |
| 405 | 407 |
| 406 AppListItem* AppListModel::AddItemToItemListAndNotify( | 408 AppListItem* AppListModel::AddItemToItemListAndNotify( |
| 407 scoped_ptr<AppListItem> item_ptr) { | 409 scoped_ptr<AppListItem> item_ptr) { |
| 408 DCHECK(!item_ptr->IsInFolder()); | 410 DCHECK(!item_ptr->IsInFolder()); |
| 409 AppListItem* item = top_level_item_list_->AddItem(item_ptr.Pass()); | 411 AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); |
| 410 FOR_EACH_OBSERVER(AppListModelObserver, | 412 FOR_EACH_OBSERVER(AppListModelObserver, |
| 411 observers_, | 413 observers_, |
| 412 OnAppListItemAdded(item)); | 414 OnAppListItemAdded(item)); |
| 413 return item; | 415 return item; |
| 414 } | 416 } |
| 415 | 417 |
| 416 AppListItem* AppListModel::AddItemToItemListAndNotifyUpdate( | 418 AppListItem* AppListModel::AddItemToItemListAndNotifyUpdate( |
| 417 scoped_ptr<AppListItem> item_ptr) { | 419 scoped_ptr<AppListItem> item_ptr) { |
| 418 DCHECK(!item_ptr->IsInFolder()); | 420 DCHECK(!item_ptr->IsInFolder()); |
| 419 AppListItem* item = top_level_item_list_->AddItem(item_ptr.Pass()); | 421 AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); |
| 420 FOR_EACH_OBSERVER(AppListModelObserver, | 422 FOR_EACH_OBSERVER(AppListModelObserver, |
| 421 observers_, | 423 observers_, |
| 422 OnAppListItemUpdated(item)); | 424 OnAppListItemUpdated(item)); |
| 423 return item; | 425 return item; |
| 424 } | 426 } |
| 425 | 427 |
| 426 AppListItem* AppListModel::AddItemToFolderItemAndNotify( | 428 AppListItem* AppListModel::AddItemToFolderItemAndNotify( |
| 427 AppListFolderItem* folder, | 429 AppListFolderItem* folder, |
| 428 scoped_ptr<AppListItem> item_ptr) { | 430 scoped_ptr<AppListItem> item_ptr) { |
| 429 CHECK_NE(folder->id(), item_ptr->folder_id()); | 431 CHECK_NE(folder->id(), item_ptr->folder_id()); |
| 430 AppListItem* item = folder->item_list()->AddItem(item_ptr.Pass()); | 432 AppListItem* item = folder->item_list()->AddItem(std::move(item_ptr)); |
| 431 item->set_folder_id(folder->id()); | 433 item->set_folder_id(folder->id()); |
| 432 FOR_EACH_OBSERVER(AppListModelObserver, | 434 FOR_EACH_OBSERVER(AppListModelObserver, |
| 433 observers_, | 435 observers_, |
| 434 OnAppListItemUpdated(item)); | 436 OnAppListItemUpdated(item)); |
| 435 return item; | 437 return item; |
| 436 } | 438 } |
| 437 | 439 |
| 438 scoped_ptr<AppListItem> AppListModel::RemoveItem(AppListItem* item) { | 440 scoped_ptr<AppListItem> AppListModel::RemoveItem(AppListItem* item) { |
| 439 if (!item->IsInFolder()) | 441 if (!item->IsInFolder()) |
| 440 return top_level_item_list_->RemoveItem(item->id()); | 442 return top_level_item_list_->RemoveItem(item->id()); |
| 441 | 443 |
| 442 AppListFolderItem* folder = FindFolderItem(item->folder_id()); | 444 AppListFolderItem* folder = FindFolderItem(item->folder_id()); |
| 443 return RemoveItemFromFolder(folder, item); | 445 return RemoveItemFromFolder(folder, item); |
| 444 } | 446 } |
| 445 | 447 |
| 446 scoped_ptr<AppListItem> AppListModel::RemoveItemFromFolder( | 448 scoped_ptr<AppListItem> AppListModel::RemoveItemFromFolder( |
| 447 AppListFolderItem* folder, | 449 AppListFolderItem* folder, |
| 448 AppListItem* item) { | 450 AppListItem* item) { |
| 449 std::string folder_id = folder->id(); | 451 std::string folder_id = folder->id(); |
| 450 CHECK_EQ(item->folder_id(), folder_id); | 452 CHECK_EQ(item->folder_id(), folder_id); |
| 451 scoped_ptr<AppListItem> result = folder->item_list()->RemoveItem(item->id()); | 453 scoped_ptr<AppListItem> result = folder->item_list()->RemoveItem(item->id()); |
| 452 result->set_folder_id(""); | 454 result->set_folder_id(""); |
| 453 if (folder->item_list()->item_count() == 0) { | 455 if (folder->item_list()->item_count() == 0) { |
| 454 DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); | 456 DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); |
| 455 DeleteItem(folder_id); | 457 DeleteItem(folder_id); |
| 456 } | 458 } |
| 457 return result.Pass(); | 459 return result; |
| 458 } | 460 } |
| 459 | 461 |
| 460 } // namespace app_list | 462 } // namespace app_list |
| OLD | NEW |