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 |