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 #include <utility> |
9 | 9 |
10 #include "ui/app_list/app_list_folder_item.h" | 10 #include "ui/app_list/app_list_folder_item.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 } | 73 } |
74 | 74 |
75 AppListFolderItem* AppListModel::FindFolderItem(const std::string& id) { | 75 AppListFolderItem* AppListModel::FindFolderItem(const std::string& id) { |
76 AppListItem* item = top_level_item_list_->FindItem(id); | 76 AppListItem* item = top_level_item_list_->FindItem(id); |
77 if (item && item->GetItemType() == AppListFolderItem::kItemType) | 77 if (item && item->GetItemType() == AppListFolderItem::kItemType) |
78 return static_cast<AppListFolderItem*>(item); | 78 return static_cast<AppListFolderItem*>(item); |
79 DCHECK(!item); | 79 DCHECK(!item); |
80 return NULL; | 80 return NULL; |
81 } | 81 } |
82 | 82 |
83 AppListItem* AppListModel::AddItem(scoped_ptr<AppListItem> item) { | 83 AppListItem* AppListModel::AddItem(std::unique_ptr<AppListItem> item) { |
84 DCHECK(!item->IsInFolder()); | 84 DCHECK(!item->IsInFolder()); |
85 DCHECK(!top_level_item_list()->FindItem(item->id())); | 85 DCHECK(!top_level_item_list()->FindItem(item->id())); |
86 return AddItemToItemListAndNotify(std::move(item)); | 86 return AddItemToItemListAndNotify(std::move(item)); |
87 } | 87 } |
88 | 88 |
89 AppListItem* AppListModel::AddItemToFolder(scoped_ptr<AppListItem> item, | 89 AppListItem* AppListModel::AddItemToFolder(std::unique_ptr<AppListItem> item, |
90 const std::string& folder_id) { | 90 const std::string& folder_id) { |
91 if (folder_id.empty()) | 91 if (folder_id.empty()) |
92 return AddItem(std::move(item)); | 92 return AddItem(std::move(item)); |
93 DVLOG(2) << "AddItemToFolder: " << item->id() << ": " << folder_id; | 93 DVLOG(2) << "AddItemToFolder: " << item->id() << ": " << folder_id; |
94 CHECK_NE(folder_id, item->folder_id()); | 94 CHECK_NE(folder_id, item->folder_id()); |
95 DCHECK_NE(AppListFolderItem::kItemType, item->GetItemType()); | 95 DCHECK_NE(AppListFolderItem::kItemType, item->GetItemType()); |
96 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); | 96 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
97 if (!dest_folder) | 97 if (!dest_folder) |
98 return NULL; | 98 return NULL; |
99 DCHECK(!dest_folder->item_list()->FindItem(item->id())) | 99 DCHECK(!dest_folder->item_list()->FindItem(item->id())) |
(...skipping 29 matching lines...) Expand all Loading... |
129 } | 129 } |
130 | 130 |
131 // If the target item is a folder, just add the source item to it. | 131 // If the target item is a folder, just add the source item to it. |
132 if (target_item->GetItemType() == AppListFolderItem::kItemType) { | 132 if (target_item->GetItemType() == AppListFolderItem::kItemType) { |
133 AppListFolderItem* target_folder = | 133 AppListFolderItem* target_folder = |
134 static_cast<AppListFolderItem*>(target_item); | 134 static_cast<AppListFolderItem*>(target_item); |
135 if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { | 135 if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
136 LOG(WARNING) << "MergeItems called with OEM folder as target"; | 136 LOG(WARNING) << "MergeItems called with OEM folder as target"; |
137 return ""; | 137 return ""; |
138 } | 138 } |
139 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); | 139 std::unique_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
140 source_item_ptr->set_position( | 140 source_item_ptr->set_position( |
141 target_folder->item_list()->CreatePositionBefore( | 141 target_folder->item_list()->CreatePositionBefore( |
142 syncer::StringOrdinal())); | 142 syncer::StringOrdinal())); |
143 AddItemToFolderItemAndNotify(target_folder, std::move(source_item_ptr)); | 143 AddItemToFolderItemAndNotify(target_folder, std::move(source_item_ptr)); |
144 return target_folder->id(); | 144 return target_folder->id(); |
145 } | 145 } |
146 | 146 |
147 // Otherwise remove the source item and target item from their current | 147 // Otherwise remove the source item and target item from their current |
148 // location, they will become owned by the new folder. | 148 // location, they will become owned by the new folder. |
149 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); | 149 std::unique_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
150 CHECK(source_item_ptr); | 150 CHECK(source_item_ptr); |
151 // 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 |
152 // checked that they are distinct at the top of this method. | 152 // checked that they are distinct at the top of this method. |
153 scoped_ptr<AppListItem> target_item_ptr = | 153 std::unique_ptr<AppListItem> target_item_ptr = |
154 top_level_item_list_->RemoveItem(target_item_id); | 154 top_level_item_list_->RemoveItem(target_item_id); |
155 CHECK(target_item_ptr); | 155 CHECK(target_item_ptr); |
156 | 156 |
157 // 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. |
158 std::string new_folder_id = AppListFolderItem::GenerateId(); | 158 std::string new_folder_id = AppListFolderItem::GenerateId(); |
159 DVLOG(2) << "Creating folder for merge: " << new_folder_id; | 159 DVLOG(2) << "Creating folder for merge: " << new_folder_id; |
160 scoped_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( | 160 std::unique_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( |
161 new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); | 161 new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
162 new_folder_ptr->set_position(target_item_ptr->position()); | 162 new_folder_ptr->set_position(target_item_ptr->position()); |
163 AppListFolderItem* new_folder = static_cast<AppListFolderItem*>( | 163 AppListFolderItem* new_folder = static_cast<AppListFolderItem*>( |
164 AddItemToItemListAndNotify(std::move(new_folder_ptr))); | 164 AddItemToItemListAndNotify(std::move(new_folder_ptr))); |
165 | 165 |
166 // Add the items to the new folder. | 166 // Add the items to the new folder. |
167 target_item_ptr->set_position( | 167 target_item_ptr->set_position( |
168 new_folder->item_list()->CreatePositionBefore( | 168 new_folder->item_list()->CreatePositionBefore( |
169 syncer::StringOrdinal())); | 169 syncer::StringOrdinal())); |
170 AddItemToFolderItemAndNotify(new_folder, std::move(target_item_ptr)); | 170 AddItemToFolderItemAndNotify(new_folder, std::move(target_item_ptr)); |
171 source_item_ptr->set_position( | 171 source_item_ptr->set_position( |
172 new_folder->item_list()->CreatePositionBefore( | 172 new_folder->item_list()->CreatePositionBefore( |
173 syncer::StringOrdinal())); | 173 syncer::StringOrdinal())); |
174 AddItemToFolderItemAndNotify(new_folder, std::move(source_item_ptr)); | 174 AddItemToFolderItemAndNotify(new_folder, std::move(source_item_ptr)); |
175 | 175 |
176 return new_folder->id(); | 176 return new_folder->id(); |
177 } | 177 } |
178 | 178 |
179 void AppListModel::MoveItemToFolder(AppListItem* item, | 179 void AppListModel::MoveItemToFolder(AppListItem* item, |
180 const std::string& folder_id) { | 180 const std::string& folder_id) { |
181 DVLOG(2) << "MoveItemToFolder: " << folder_id | 181 DVLOG(2) << "MoveItemToFolder: " << folder_id |
182 << " <- " << item->ToDebugString(); | 182 << " <- " << item->ToDebugString(); |
183 if (item->folder_id() == folder_id) | 183 if (item->folder_id() == folder_id) |
184 return; | 184 return; |
185 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); | 185 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
186 scoped_ptr<AppListItem> item_ptr = RemoveItem(item); | 186 std::unique_ptr<AppListItem> item_ptr = RemoveItem(item); |
187 if (dest_folder) { | 187 if (dest_folder) { |
188 CHECK(!item->IsInFolder()); | 188 CHECK(!item->IsInFolder()); |
189 AddItemToFolderItemAndNotify(dest_folder, std::move(item_ptr)); | 189 AddItemToFolderItemAndNotify(dest_folder, std::move(item_ptr)); |
190 } else { | 190 } else { |
191 AddItemToItemListAndNotifyUpdate(std::move(item_ptr)); | 191 AddItemToItemListAndNotifyUpdate(std::move(item_ptr)); |
192 } | 192 } |
193 } | 193 } |
194 | 194 |
195 bool AppListModel::MoveItemToFolderAt(AppListItem* item, | 195 bool AppListModel::MoveItemToFolderAt(AppListItem* item, |
196 const std::string& folder_id, | 196 const std::string& folder_id, |
197 syncer::StringOrdinal position) { | 197 syncer::StringOrdinal position) { |
198 DVLOG(2) << "MoveItemToFolderAt: " << folder_id | 198 DVLOG(2) << "MoveItemToFolderAt: " << folder_id |
199 << "[" << position.ToDebugString() << "]" | 199 << "[" << position.ToDebugString() << "]" |
200 << " <- " << item->ToDebugString(); | 200 << " <- " << item->ToDebugString(); |
201 if (item->folder_id() == folder_id) | 201 if (item->folder_id() == folder_id) |
202 return false; | 202 return false; |
203 AppListFolderItem* src_folder = FindOrCreateFolderItem(item->folder_id()); | 203 AppListFolderItem* src_folder = FindOrCreateFolderItem(item->folder_id()); |
204 if (src_folder && | 204 if (src_folder && |
205 src_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { | 205 src_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
206 LOG(WARNING) << "MoveItemToFolderAt called with OEM folder as source"; | 206 LOG(WARNING) << "MoveItemToFolderAt called with OEM folder as source"; |
207 return false; | 207 return false; |
208 } | 208 } |
209 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); | 209 AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
210 scoped_ptr<AppListItem> item_ptr = RemoveItem(item); | 210 std::unique_ptr<AppListItem> item_ptr = RemoveItem(item); |
211 if (dest_folder) { | 211 if (dest_folder) { |
212 item_ptr->set_position( | 212 item_ptr->set_position( |
213 dest_folder->item_list()->CreatePositionBefore(position)); | 213 dest_folder->item_list()->CreatePositionBefore(position)); |
214 AddItemToFolderItemAndNotify(dest_folder, std::move(item_ptr)); | 214 AddItemToFolderItemAndNotify(dest_folder, std::move(item_ptr)); |
215 } else { | 215 } else { |
216 item_ptr->set_position( | 216 item_ptr->set_position( |
217 top_level_item_list_->CreatePositionBefore(position)); | 217 top_level_item_list_->CreatePositionBefore(position)); |
218 AddItemToItemListAndNotifyUpdate(std::move(item_ptr)); | 218 AddItemToItemListAndNotifyUpdate(std::move(item_ptr)); |
219 } | 219 } |
220 return true; | 220 return true; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 << "Invalid call to DeleteItem for item with children: " << id; | 265 << "Invalid call to DeleteItem for item with children: " << id; |
266 FOR_EACH_OBSERVER(AppListModelObserver, | 266 FOR_EACH_OBSERVER(AppListModelObserver, |
267 observers_, | 267 observers_, |
268 OnAppListItemWillBeDeleted(item)); | 268 OnAppListItemWillBeDeleted(item)); |
269 top_level_item_list_->DeleteItem(id); | 269 top_level_item_list_->DeleteItem(id); |
270 FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); | 270 FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); |
271 return; | 271 return; |
272 } | 272 } |
273 AppListFolderItem* folder = FindFolderItem(item->folder_id()); | 273 AppListFolderItem* folder = FindFolderItem(item->folder_id()); |
274 DCHECK(folder) << "Folder not found for item: " << item->ToDebugString(); | 274 DCHECK(folder) << "Folder not found for item: " << item->ToDebugString(); |
275 scoped_ptr<AppListItem> child_item = RemoveItemFromFolder(folder, item); | 275 std::unique_ptr<AppListItem> child_item = RemoveItemFromFolder(folder, item); |
276 DCHECK_EQ(item, child_item.get()); | 276 DCHECK_EQ(item, child_item.get()); |
277 FOR_EACH_OBSERVER(AppListModelObserver, | 277 FOR_EACH_OBSERVER(AppListModelObserver, |
278 observers_, | 278 observers_, |
279 OnAppListItemWillBeDeleted(item)); | 279 OnAppListItemWillBeDeleted(item)); |
280 child_item.reset(); // Deletes item. | 280 child_item.reset(); // Deletes item. |
281 FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); | 281 FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); |
282 } | 282 } |
283 | 283 |
284 void AppListModel::DeleteUninstalledItem(const std::string& id) { | 284 void AppListModel::DeleteUninstalledItem(const std::string& id) { |
285 AppListItem* item = FindItem(id); | 285 AppListItem* item = FindItem(id); |
(...skipping 23 matching lines...) Expand all Loading... |
309 // Remove child items from folders. | 309 // Remove child items from folders. |
310 std::vector<std::string> folder_ids; | 310 std::vector<std::string> folder_ids; |
311 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) { |
312 AppListItem* item = top_level_item_list_->item_at(i); | 312 AppListItem* item = top_level_item_list_->item_at(i); |
313 if (item->GetItemType() != AppListFolderItem::kItemType) | 313 if (item->GetItemType() != AppListFolderItem::kItemType) |
314 continue; | 314 continue; |
315 AppListFolderItem* folder = static_cast<AppListFolderItem*>(item); | 315 AppListFolderItem* folder = static_cast<AppListFolderItem*>(item); |
316 if (folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) | 316 if (folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) |
317 continue; // Do not remove OEM folders. | 317 continue; // Do not remove OEM folders. |
318 while (folder->item_list()->item_count()) { | 318 while (folder->item_list()->item_count()) { |
319 scoped_ptr<AppListItem> child = folder->item_list()->RemoveItemAt(0); | 319 std::unique_ptr<AppListItem> child = folder->item_list()->RemoveItemAt(0); |
320 child->set_folder_id(""); | 320 child->set_folder_id(""); |
321 AddItemToItemListAndNotifyUpdate(std::move(child)); | 321 AddItemToItemListAndNotifyUpdate(std::move(child)); |
322 } | 322 } |
323 folder_ids.push_back(folder->id()); | 323 folder_ids.push_back(folder->id()); |
324 } | 324 } |
325 // Delete folders. | 325 // Delete folders. |
326 for (size_t i = 0; i < folder_ids.size(); ++i) | 326 for (size_t i = 0; i < folder_ids.size(); ++i) |
327 DeleteItem(folder_ids[i]); | 327 DeleteItem(folder_ids[i]); |
328 } | 328 } |
329 | 329 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 AppListFolderItem* dest_folder = FindFolderItem(folder_id); | 389 AppListFolderItem* dest_folder = FindFolderItem(folder_id); |
390 if (dest_folder) | 390 if (dest_folder) |
391 return dest_folder; | 391 return dest_folder; |
392 | 392 |
393 if (!folders_enabled()) { | 393 if (!folders_enabled()) { |
394 LOG(ERROR) << "Attempt to create folder item when disabled: " << folder_id; | 394 LOG(ERROR) << "Attempt to create folder item when disabled: " << folder_id; |
395 return NULL; | 395 return NULL; |
396 } | 396 } |
397 | 397 |
398 DVLOG(2) << "Creating new folder: " << folder_id; | 398 DVLOG(2) << "Creating new folder: " << folder_id; |
399 scoped_ptr<AppListFolderItem> new_folder( | 399 std::unique_ptr<AppListFolderItem> new_folder( |
400 new AppListFolderItem(folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); | 400 new AppListFolderItem(folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
401 new_folder->set_position( | 401 new_folder->set_position( |
402 top_level_item_list_->CreatePositionBefore(syncer::StringOrdinal())); | 402 top_level_item_list_->CreatePositionBefore(syncer::StringOrdinal())); |
403 AppListItem* new_folder_item = | 403 AppListItem* new_folder_item = |
404 AddItemToItemListAndNotify(std::move(new_folder)); | 404 AddItemToItemListAndNotify(std::move(new_folder)); |
405 return static_cast<AppListFolderItem*>(new_folder_item); | 405 return static_cast<AppListFolderItem*>(new_folder_item); |
406 } | 406 } |
407 | 407 |
408 AppListItem* AppListModel::AddItemToItemListAndNotify( | 408 AppListItem* AppListModel::AddItemToItemListAndNotify( |
409 scoped_ptr<AppListItem> item_ptr) { | 409 std::unique_ptr<AppListItem> item_ptr) { |
410 DCHECK(!item_ptr->IsInFolder()); | 410 DCHECK(!item_ptr->IsInFolder()); |
411 AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); | 411 AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); |
412 FOR_EACH_OBSERVER(AppListModelObserver, | 412 FOR_EACH_OBSERVER(AppListModelObserver, |
413 observers_, | 413 observers_, |
414 OnAppListItemAdded(item)); | 414 OnAppListItemAdded(item)); |
415 return item; | 415 return item; |
416 } | 416 } |
417 | 417 |
418 AppListItem* AppListModel::AddItemToItemListAndNotifyUpdate( | 418 AppListItem* AppListModel::AddItemToItemListAndNotifyUpdate( |
419 scoped_ptr<AppListItem> item_ptr) { | 419 std::unique_ptr<AppListItem> item_ptr) { |
420 DCHECK(!item_ptr->IsInFolder()); | 420 DCHECK(!item_ptr->IsInFolder()); |
421 AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); | 421 AppListItem* item = top_level_item_list_->AddItem(std::move(item_ptr)); |
422 FOR_EACH_OBSERVER(AppListModelObserver, | 422 FOR_EACH_OBSERVER(AppListModelObserver, |
423 observers_, | 423 observers_, |
424 OnAppListItemUpdated(item)); | 424 OnAppListItemUpdated(item)); |
425 return item; | 425 return item; |
426 } | 426 } |
427 | 427 |
428 AppListItem* AppListModel::AddItemToFolderItemAndNotify( | 428 AppListItem* AppListModel::AddItemToFolderItemAndNotify( |
429 AppListFolderItem* folder, | 429 AppListFolderItem* folder, |
430 scoped_ptr<AppListItem> item_ptr) { | 430 std::unique_ptr<AppListItem> item_ptr) { |
431 CHECK_NE(folder->id(), item_ptr->folder_id()); | 431 CHECK_NE(folder->id(), item_ptr->folder_id()); |
432 AppListItem* item = folder->item_list()->AddItem(std::move(item_ptr)); | 432 AppListItem* item = folder->item_list()->AddItem(std::move(item_ptr)); |
433 item->set_folder_id(folder->id()); | 433 item->set_folder_id(folder->id()); |
434 FOR_EACH_OBSERVER(AppListModelObserver, | 434 FOR_EACH_OBSERVER(AppListModelObserver, |
435 observers_, | 435 observers_, |
436 OnAppListItemUpdated(item)); | 436 OnAppListItemUpdated(item)); |
437 return item; | 437 return item; |
438 } | 438 } |
439 | 439 |
440 scoped_ptr<AppListItem> AppListModel::RemoveItem(AppListItem* item) { | 440 std::unique_ptr<AppListItem> AppListModel::RemoveItem(AppListItem* item) { |
441 if (!item->IsInFolder()) | 441 if (!item->IsInFolder()) |
442 return top_level_item_list_->RemoveItem(item->id()); | 442 return top_level_item_list_->RemoveItem(item->id()); |
443 | 443 |
444 AppListFolderItem* folder = FindFolderItem(item->folder_id()); | 444 AppListFolderItem* folder = FindFolderItem(item->folder_id()); |
445 return RemoveItemFromFolder(folder, item); | 445 return RemoveItemFromFolder(folder, item); |
446 } | 446 } |
447 | 447 |
448 scoped_ptr<AppListItem> AppListModel::RemoveItemFromFolder( | 448 std::unique_ptr<AppListItem> AppListModel::RemoveItemFromFolder( |
449 AppListFolderItem* folder, | 449 AppListFolderItem* folder, |
450 AppListItem* item) { | 450 AppListItem* item) { |
451 std::string folder_id = folder->id(); | 451 std::string folder_id = folder->id(); |
452 CHECK_EQ(item->folder_id(), folder_id); | 452 CHECK_EQ(item->folder_id(), folder_id); |
453 scoped_ptr<AppListItem> result = folder->item_list()->RemoveItem(item->id()); | 453 std::unique_ptr<AppListItem> result = |
| 454 folder->item_list()->RemoveItem(item->id()); |
454 result->set_folder_id(""); | 455 result->set_folder_id(""); |
455 if (folder->item_list()->item_count() == 0) { | 456 if (folder->item_list()->item_count() == 0) { |
456 DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); | 457 DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); |
457 DeleteItem(folder_id); | 458 DeleteItem(folder_id); |
458 } | 459 } |
459 return result; | 460 return result; |
460 } | 461 } |
461 | 462 |
462 } // namespace app_list | 463 } // namespace app_list |
OLD | NEW |