Index: ui/app_list/app_list_model.cc |
diff --git a/ui/app_list/app_list_model.cc b/ui/app_list/app_list_model.cc |
deleted file mode 100644 |
index 0425f4c7912f9f0991a20398ea7bd63efb692719..0000000000000000000000000000000000000000 |
--- a/ui/app_list/app_list_model.cc |
+++ /dev/null |
@@ -1,400 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/app_list/app_list_model.h" |
- |
-#include <string> |
- |
-#include "ui/app_list/app_list_folder_item.h" |
-#include "ui/app_list/app_list_item.h" |
-#include "ui/app_list/app_list_model_observer.h" |
-#include "ui/app_list/search_box_model.h" |
- |
-namespace app_list { |
- |
-AppListModel::AppListModel() |
- : top_level_item_list_(new AppListItemList), |
- search_box_(new SearchBoxModel), |
- results_(new SearchResults), |
- status_(STATUS_NORMAL), |
- folders_enabled_(false) { |
- top_level_item_list_->AddObserver(this); |
-} |
- |
-AppListModel::~AppListModel() { top_level_item_list_->RemoveObserver(this); } |
- |
-void AppListModel::AddObserver(AppListModelObserver* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void AppListModel::RemoveObserver(AppListModelObserver* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-void AppListModel::SetStatus(Status status) { |
- if (status_ == status) |
- return; |
- |
- status_ = status; |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListModelStatusChanged()); |
-} |
- |
-AppListItem* AppListModel::FindItem(const std::string& id) { |
- AppListItem* item = top_level_item_list_->FindItem(id); |
- if (item) |
- return item; |
- for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) { |
- AppListItem* child_item = |
- top_level_item_list_->item_at(i)->FindChildItem(id); |
- if (child_item) |
- return child_item; |
- } |
- return NULL; |
-} |
- |
-AppListFolderItem* AppListModel::FindFolderItem(const std::string& id) { |
- AppListItem* item = top_level_item_list_->FindItem(id); |
- if (item && item->GetItemType() == AppListFolderItem::kItemType) |
- return static_cast<AppListFolderItem*>(item); |
- DCHECK(!item); |
- return NULL; |
-} |
- |
-AppListItem* AppListModel::AddItem(scoped_ptr<AppListItem> item) { |
- DCHECK(!item->IsInFolder()); |
- DCHECK(!top_level_item_list()->FindItem(item->id())); |
- return AddItemToItemListAndNotify(item.Pass()); |
-} |
- |
-AppListItem* AppListModel::AddItemToFolder(scoped_ptr<AppListItem> item, |
- const std::string& folder_id) { |
- if (folder_id.empty()) |
- return AddItem(item.Pass()); |
- DVLOG(2) << "AddItemToFolder: " << item->id() << ": " << folder_id; |
- CHECK_NE(folder_id, item->folder_id()); |
- DCHECK_NE(AppListFolderItem::kItemType, item->GetItemType()); |
- AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
- if (!dest_folder) |
- return NULL; |
- DCHECK(!dest_folder->item_list()->FindItem(item->id())) |
- << "Already in folder: " << dest_folder->id(); |
- return AddItemToFolderItemAndNotify(dest_folder, item.Pass()); |
-} |
- |
-const std::string AppListModel::MergeItems(const std::string& target_item_id, |
- const std::string& source_item_id) { |
- if (!folders_enabled()) { |
- LOG(ERROR) << "MergeItems called with folders disabled."; |
- return ""; |
- } |
- DVLOG(2) << "MergeItems: " << source_item_id << " -> " << target_item_id; |
- |
- if (target_item_id == source_item_id) { |
- LOG(WARNING) << "MergeItems tried to drop item onto itself (" |
- << source_item_id << " -> " << target_item_id << ")."; |
- return ""; |
- } |
- |
- // Find the target item. |
- AppListItem* target_item = top_level_item_list_->FindItem(target_item_id); |
- if (!target_item) { |
- LOG(ERROR) << "MergeItems: Target no longer exists."; |
- return ""; |
- } |
- |
- AppListItem* source_item = FindItem(source_item_id); |
- if (!source_item) { |
- LOG(ERROR) << "MergeItems: Source no longer exists."; |
- return ""; |
- } |
- |
- // If the target item is a folder, just add the source item to it. |
- if (target_item->GetItemType() == AppListFolderItem::kItemType) { |
- AppListFolderItem* target_folder = |
- static_cast<AppListFolderItem*>(target_item); |
- if (target_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
- LOG(WARNING) << "MergeItems called with OEM folder as target"; |
- return ""; |
- } |
- scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
- source_item_ptr->set_position( |
- target_folder->item_list()->CreatePositionBefore( |
- syncer::StringOrdinal())); |
- AddItemToFolderItemAndNotify(target_folder, source_item_ptr.Pass()); |
- return target_folder->id(); |
- } |
- |
- // Otherwise remove the source item and target item from their current |
- // location, they will become owned by the new folder. |
- scoped_ptr<AppListItem> source_item_ptr = RemoveItem(source_item); |
- CHECK(source_item_ptr); |
- // Note: This would fail if |target_item_id == source_item_id|, except we |
- // checked that they are distinct at the top of this method. |
- scoped_ptr<AppListItem> target_item_ptr = |
- top_level_item_list_->RemoveItem(target_item_id); |
- CHECK(target_item_ptr); |
- |
- // Create a new folder in the same location as the target item. |
- std::string new_folder_id = AppListFolderItem::GenerateId(); |
- DVLOG(2) << "Creating folder for merge: " << new_folder_id; |
- scoped_ptr<AppListItem> new_folder_ptr(new AppListFolderItem( |
- new_folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
- new_folder_ptr->set_position(target_item_ptr->position()); |
- AppListFolderItem* new_folder = static_cast<AppListFolderItem*>( |
- AddItemToItemListAndNotify(new_folder_ptr.Pass())); |
- |
- // Add the items to the new folder. |
- target_item_ptr->set_position( |
- new_folder->item_list()->CreatePositionBefore( |
- syncer::StringOrdinal())); |
- AddItemToFolderItemAndNotify(new_folder, target_item_ptr.Pass()); |
- source_item_ptr->set_position( |
- new_folder->item_list()->CreatePositionBefore( |
- syncer::StringOrdinal())); |
- AddItemToFolderItemAndNotify(new_folder, source_item_ptr.Pass()); |
- |
- return new_folder->id(); |
-} |
- |
-void AppListModel::MoveItemToFolder(AppListItem* item, |
- const std::string& folder_id) { |
- DVLOG(2) << "MoveItemToFolder: " << folder_id |
- << " <- " << item->ToDebugString(); |
- if (item->folder_id() == folder_id) |
- return; |
- AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
- scoped_ptr<AppListItem> item_ptr = RemoveItem(item); |
- if (dest_folder) { |
- CHECK(!item->IsInFolder()); |
- AddItemToFolderItemAndNotify(dest_folder, item_ptr.Pass()); |
- } else { |
- AddItemToItemListAndNotifyUpdate(item_ptr.Pass()); |
- } |
-} |
- |
-bool AppListModel::MoveItemToFolderAt(AppListItem* item, |
- const std::string& folder_id, |
- syncer::StringOrdinal position) { |
- DVLOG(2) << "MoveItemToFolderAt: " << folder_id |
- << "[" << position.ToDebugString() << "]" |
- << " <- " << item->ToDebugString(); |
- if (item->folder_id() == folder_id) |
- return false; |
- AppListFolderItem* src_folder = FindOrCreateFolderItem(item->folder_id()); |
- if (src_folder && |
- src_folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) { |
- LOG(WARNING) << "MoveItemToFolderAt called with OEM folder as source"; |
- return false; |
- } |
- AppListFolderItem* dest_folder = FindOrCreateFolderItem(folder_id); |
- scoped_ptr<AppListItem> item_ptr = RemoveItem(item); |
- if (dest_folder) { |
- item_ptr->set_position( |
- dest_folder->item_list()->CreatePositionBefore(position)); |
- AddItemToFolderItemAndNotify(dest_folder, item_ptr.Pass()); |
- } else { |
- item_ptr->set_position( |
- top_level_item_list_->CreatePositionBefore(position)); |
- AddItemToItemListAndNotifyUpdate(item_ptr.Pass()); |
- } |
- return true; |
-} |
- |
-void AppListModel::SetItemPosition(AppListItem* item, |
- const syncer::StringOrdinal& new_position) { |
- if (!item->IsInFolder()) { |
- top_level_item_list_->SetItemPosition(item, new_position); |
- // Note: this will trigger OnListItemMoved which will signal observers. |
- // (This is done this way because some View code still moves items within |
- // the item list directly). |
- return; |
- } |
- AppListFolderItem* folder = FindFolderItem(item->folder_id()); |
- DCHECK(folder); |
- folder->item_list()->SetItemPosition(item, new_position); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemUpdated(item)); |
-} |
- |
-void AppListModel::SetItemName(AppListItem* item, const std::string& name) { |
- item->SetName(name); |
- DVLOG(2) << "AppListModel::SetItemName: " << item->ToDebugString(); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemUpdated(item)); |
-} |
- |
-void AppListModel::SetItemNameAndShortName(AppListItem* item, |
- const std::string& name, |
- const std::string& short_name) { |
- item->SetNameAndShortName(name, short_name); |
- DVLOG(2) << "AppListModel::SetItemNameAndShortName: " |
- << item->ToDebugString(); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemUpdated(item)); |
-} |
- |
-void AppListModel::DeleteItem(const std::string& id) { |
- AppListItem* item = FindItem(id); |
- if (!item) |
- return; |
- if (!item->IsInFolder()) { |
- DCHECK_EQ(0u, item->ChildItemCount()) |
- << "Invalid call to DeleteItem for item with children: " << id; |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemWillBeDeleted(item)); |
- top_level_item_list_->DeleteItem(id); |
- FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); |
- return; |
- } |
- AppListFolderItem* folder = FindFolderItem(item->folder_id()); |
- DCHECK(folder) << "Folder not found for item: " << item->ToDebugString(); |
- scoped_ptr<AppListItem> child_item = RemoveItemFromFolder(folder, item); |
- DCHECK_EQ(item, child_item.get()); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemWillBeDeleted(item)); |
- child_item.reset(); // Deletes item. |
- FOR_EACH_OBSERVER(AppListModelObserver, observers_, OnAppListItemDeleted()); |
-} |
- |
-void AppListModel::NotifyExtensionPreferenceChanged() { |
- for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) |
- top_level_item_list_->item_at(i)->OnExtensionPreferenceChanged(); |
-} |
- |
-void AppListModel::SetFoldersEnabled(bool folders_enabled) { |
- folders_enabled_ = folders_enabled; |
- if (folders_enabled) |
- return; |
- // Remove child items from folders. |
- std::vector<std::string> folder_ids; |
- for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) { |
- AppListItem* item = top_level_item_list_->item_at(i); |
- if (item->GetItemType() != AppListFolderItem::kItemType) |
- continue; |
- AppListFolderItem* folder = static_cast<AppListFolderItem*>(item); |
- if (folder->folder_type() == AppListFolderItem::FOLDER_TYPE_OEM) |
- continue; // Do not remove OEM folders. |
- while (folder->item_list()->item_count()) { |
- scoped_ptr<AppListItem> child = folder->item_list()->RemoveItemAt(0); |
- child->set_folder_id(""); |
- AddItemToItemListAndNotifyUpdate(child.Pass()); |
- } |
- folder_ids.push_back(folder->id()); |
- } |
- // Delete folders. |
- for (size_t i = 0; i < folder_ids.size(); ++i) |
- DeleteItem(folder_ids[i]); |
-} |
- |
-std::vector<SearchResult*> AppListModel::FilterSearchResultsByDisplayType( |
- SearchResults* results, |
- SearchResult::DisplayType display_type, |
- size_t max_results) { |
- std::vector<SearchResult*> matches; |
- for (size_t i = 0; i < results->item_count(); ++i) { |
- SearchResult* item = results->GetItemAt(i); |
- if (item->display_type() == display_type) { |
- matches.push_back(item); |
- if (matches.size() == max_results) |
- break; |
- } |
- } |
- return matches; |
-} |
- |
-// Private methods |
- |
-void AppListModel::OnListItemMoved(size_t from_index, |
- size_t to_index, |
- AppListItem* item) { |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemUpdated(item)); |
-} |
- |
-AppListFolderItem* AppListModel::FindOrCreateFolderItem( |
- const std::string& folder_id) { |
- if (folder_id.empty()) |
- return NULL; |
- |
- AppListFolderItem* dest_folder = FindFolderItem(folder_id); |
- if (dest_folder) |
- return dest_folder; |
- |
- if (!folders_enabled()) { |
- LOG(ERROR) << "Attempt to create folder item when disabled: " << folder_id; |
- return NULL; |
- } |
- |
- DVLOG(2) << "Creating new folder: " << folder_id; |
- scoped_ptr<AppListFolderItem> new_folder( |
- new AppListFolderItem(folder_id, AppListFolderItem::FOLDER_TYPE_NORMAL)); |
- new_folder->set_position( |
- top_level_item_list_->CreatePositionBefore(syncer::StringOrdinal())); |
- AppListItem* new_folder_item = AddItemToItemListAndNotify(new_folder.Pass()); |
- return static_cast<AppListFolderItem*>(new_folder_item); |
-} |
- |
-AppListItem* AppListModel::AddItemToItemListAndNotify( |
- scoped_ptr<AppListItem> item_ptr) { |
- DCHECK(!item_ptr->IsInFolder()); |
- AppListItem* item = top_level_item_list_->AddItem(item_ptr.Pass()); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemAdded(item)); |
- return item; |
-} |
- |
-AppListItem* AppListModel::AddItemToItemListAndNotifyUpdate( |
- scoped_ptr<AppListItem> item_ptr) { |
- DCHECK(!item_ptr->IsInFolder()); |
- AppListItem* item = top_level_item_list_->AddItem(item_ptr.Pass()); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemUpdated(item)); |
- return item; |
-} |
- |
-AppListItem* AppListModel::AddItemToFolderItemAndNotify( |
- AppListFolderItem* folder, |
- scoped_ptr<AppListItem> item_ptr) { |
- CHECK_NE(folder->id(), item_ptr->folder_id()); |
- AppListItem* item = folder->item_list()->AddItem(item_ptr.Pass()); |
- item->set_folder_id(folder->id()); |
- FOR_EACH_OBSERVER(AppListModelObserver, |
- observers_, |
- OnAppListItemUpdated(item)); |
- return item; |
-} |
- |
-scoped_ptr<AppListItem> AppListModel::RemoveItem(AppListItem* item) { |
- if (!item->IsInFolder()) |
- return top_level_item_list_->RemoveItem(item->id()); |
- |
- AppListFolderItem* folder = FindFolderItem(item->folder_id()); |
- return RemoveItemFromFolder(folder, item); |
-} |
- |
-scoped_ptr<AppListItem> AppListModel::RemoveItemFromFolder( |
- AppListFolderItem* folder, |
- AppListItem* item) { |
- std::string folder_id = folder->id(); |
- CHECK_EQ(item->folder_id(), folder_id); |
- scoped_ptr<AppListItem> result = folder->item_list()->RemoveItem(item->id()); |
- result->set_folder_id(""); |
- if (folder->item_list()->item_count() == 0) { |
- DVLOG(2) << "Deleting empty folder: " << folder->ToDebugString(); |
- DeleteItem(folder_id); |
- } |
- return result.Pass(); |
-} |
- |
-} // namespace app_list |