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 | 8 |
9 #include "ui/app_list/app_list_folder_item.h" | 9 #include "ui/app_list/app_list_folder_item.h" |
10 #include "ui/app_list/app_list_item.h" | 10 #include "ui/app_list/app_list_item.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 return AddItemToFolderItemAndNotify(dest_folder, item.Pass()); | 84 return AddItemToFolderItemAndNotify(dest_folder, item.Pass()); |
85 } | 85 } |
86 | 86 |
87 const std::string AppListModel::MergeItems(const std::string& target_item_id, | 87 const std::string AppListModel::MergeItems(const std::string& target_item_id, |
88 const std::string& source_item_id) { | 88 const std::string& source_item_id) { |
89 if (!folders_enabled()) { | 89 if (!folders_enabled()) { |
90 LOG(ERROR) << "MergeItems called with folders disabled."; | 90 LOG(ERROR) << "MergeItems called with folders disabled."; |
91 return ""; | 91 return ""; |
92 } | 92 } |
93 DVLOG(2) << "MergeItems: " << source_item_id << " -> " << target_item_id; | 93 DVLOG(2) << "MergeItems: " << source_item_id << " -> " << target_item_id; |
| 94 |
| 95 if (target_item_id == source_item_id) { |
| 96 LOG(WARNING) << "MergeItems tried to drop item onto itself (" |
| 97 << source_item_id << " -> " << target_item_id << ")."; |
| 98 return ""; |
| 99 } |
| 100 |
94 // Find the target item. | 101 // Find the target item. |
95 AppListItem* target_item = FindItem(target_item_id); | 102 AppListItem* target_item = top_level_item_list_->FindItem(target_item_id); |
96 if (!target_item) { | 103 if (!target_item) { |
97 LOG(ERROR) << "MergeItems: Target no longer exists."; | 104 LOG(ERROR) << "MergeItems: Target no longer exists."; |
98 return ""; | 105 return ""; |
99 } | 106 } |
100 CHECK(target_item->folder_id().empty()); | |
101 | 107 |
102 AppListItem* source_item = FindItem(source_item_id); | 108 AppListItem* source_item = FindItem(source_item_id); |
103 if (!source_item) { | 109 if (!source_item) { |
104 LOG(ERROR) << "MergeItems: Source no longer exists."; | 110 LOG(ERROR) << "MergeItems: Source no longer exists."; |
105 return ""; | 111 return ""; |
106 } | 112 } |
107 | 113 |
108 // If the target item is a folder, just add the source item to it. | 114 // If the target item is a folder, just add the source item to it. |
109 if (target_item->GetItemType() == AppListFolderItem::kItemType) { | 115 if (target_item->GetItemType() == AppListFolderItem::kItemType) { |
110 AppListFolderItem* target_folder = | 116 AppListFolderItem* target_folder = |
111 static_cast<AppListFolderItem*>(target_item); | 117 static_cast<AppListFolderItem*>(target_item); |
112 if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { | 118 if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
113 LOG(WARNING) << "MergeItems called with OEM folder as target"; | 119 LOG(WARNING) << "MergeItems called with OEM folder as target"; |
114 return ""; | 120 return ""; |
115 } | 121 } |
116 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); | 122 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
117 source_item_ptr->set_position( | 123 source_item_ptr->set_position( |
118 target_folder->item_list()->CreatePositionBefore( | 124 target_folder->item_list()->CreatePositionBefore( |
119 syncer::StringOrdinal())); | 125 syncer::StringOrdinal())); |
120 AddItemToFolderItemAndNotify(target_folder, source_item_ptr.Pass()); | 126 AddItemToFolderItemAndNotify(target_folder, source_item_ptr.Pass()); |
121 return target_folder->id(); | 127 return target_folder->id(); |
122 } | 128 } |
123 | 129 |
124 // Otherwise remove the source item and target item from their current | 130 // Otherwise remove the source item and target item from their current |
125 // location, they will become owned by the new folder. | 131 // location, they will become owned by the new folder. |
126 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); | 132 scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
127 CHECK(source_item_ptr); | 133 CHECK(source_item_ptr); |
| 134 // Note: This would fail if |target_item_id == source_item_id|, except we |
| 135 // checked that they are distinct at the top of this method. |
128 scoped_ptr<AppListItem> target_item_ptr = | 136 scoped_ptr<AppListItem> target_item_ptr = |
129 top_level_item_list_->RemoveItem(target_item_id); | 137 top_level_item_list_->RemoveItem(target_item_id); |
130 CHECK(target_item_ptr); | 138 CHECK(target_item_ptr); |
131 | 139 |
132 // Create a new folder in the same location as the target item. | 140 // Create a new folder in the same location as the target item. |
133 std::string new_folder_id = AppListFolderItem::GenerateId(); | 141 std::string new_folder_id = AppListFolderItem::GenerateId(); |
134 DVLOG(2) << "Creating folder for merge: " << new_folder_id; | 142 DVLOG(2) << "Creating folder for merge: " << new_folder_id; |
135 scoped_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( | 143 scoped_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( |
136 new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); | 144 new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
137 new_folder_ptr->set_position(target_item_ptr->position()); | 145 new_folder_ptr->set_position(target_item_ptr->position()); |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 scoped_ptr<AppListItem> result = folder->item_list()->RemoveItem(item->id()); | 392 scoped_ptr<AppListItem> result = folder->item_list()->RemoveItem(item->id()); |
385 result->set_folder_id(""); | 393 result->set_folder_id(""); |
386 if (folder->item_list()->item_count() == 0) { | 394 if (folder->item_list()->item_count() == 0) { |
387 DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); | 395 DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); |
388 DeleteItem(folder_id); | 396 DeleteItem(folder_id); |
389 } | 397 } |
390 return result.Pass(); | 398 return result.Pass(); |
391 } | 399 } |
392 | 400 |
393 } // namespace app_list | 401 } // namespace app_list |
OLD | NEW |