#include "be_entry.h" #include #include #include namespace be { std::vector entry_t::kNoChildren(1, entry_ptr()); struct file_entry_t : entry_t { file_entry_t (std::string const& name, std::string const& path) : entry_t(name, path) { } }; struct bundle_item_entry_t : entry_t { bundle_item_entry_t (bundles::item_ptr item) : entry_t(item) { } }; struct directory_entry_t : file_entry_t { directory_entry_t (std::string const& name, std::string const& path) : file_entry_t(name, path) { } std::vector entries () const { std::multimap directories, files; citerate(entry, path::entries(_path)) { std::string const path = path::join(_path, (*entry)->d_name); std::string const displayName = path::display_name(path); if((*entry)->d_type == DT_DIR) directories.insert(std::make_pair(displayName, entry_ptr(new directory_entry_t(displayName, path)))); else if((*entry)->d_type == DT_REG || (*entry)->d_type == DT_LNK) files.insert(std::make_pair(displayName, entry_ptr(new file_entry_t(displayName, path)))); } std::vector res; std::transform(directories.begin(), directories.end(), back_inserter(res), [](std::pair const& p){ return p.second; }); std::transform(files.begin(), files.end(), back_inserter(res), [](std::pair const& p){ return p.second; }); return res; } }; struct menu_entry_t : entry_t { menu_entry_t (std::string const& name, bundles::item_ptr menuItem) : entry_t(menuItem, name) { } std::string identifier () const { return _name; } std::vector entries () const { std::vector res; citerate(item, _item->menu(true)) { if((*item)->kind() == bundles::kItemTypeMenu) res.push_back(entry_ptr(new menu_entry_t((*item)->name(), *item))); else res.push_back(entry_ptr(new bundle_item_entry_t(*item))); } return res; } }; struct group_entry_t : entry_t { group_entry_t (std::string const& name, bundles::item_ptr bundle, bundles::kind_t kind) : entry_t(name), _bundle(bundle), _kind(kind) { } std::vector entries () const { std::multimap ordered; citerate(item, bundles::query(bundles::kFieldAny, NULL_STR, scope::wildcard, _kind, _bundle->uuid(), false, true)) ordered.insert(std::make_pair((*item)->name(), *item)); std::vector res; iterate(pair, ordered) res.push_back(entry_ptr(new bundle_item_entry_t(pair->second))); return res; } private: bundles::item_ptr _bundle; bundles::kind_t _kind; }; struct other_entry_t : entry_t { other_entry_t (std::string const& name, bundles::item_ptr bundle) : entry_t(name), _bundle(bundle) { } std::vector entries () const { std::multimap ordered; citerate(item, bundles::query(bundles::kFieldAny, NULL_STR, scope::wildcard, bundles::kItemTypeMenuTypes, _bundle->uuid(), false, true)) { if((*item)->hidden_from_user()) ordered.insert(std::make_pair((*item)->name(), *item)); } std::vector res; iterate(pair, ordered) res.push_back(entry_ptr(new bundle_item_entry_t(pair->second))); return res; } private: bundles::item_ptr _bundle; bundles::kind_t _kind; }; struct bundle_entry_t : entry_t { bundle_entry_t (bundles::item_ptr item) : entry_t(item) { } std::vector entries () const { std::vector res; res.push_back(entry_ptr(new menu_entry_t("Menu Actions", _item))); res.push_back(entry_ptr(new other_entry_t("Other Actions", _item))); res.push_back(entry_ptr(new group_entry_t("File Drop Actions", _item, bundles::kItemTypeDragCommand))); res.push_back(entry_ptr(new group_entry_t("Language Grammars", _item, bundles::kItemTypeGrammar))); res.push_back(entry_ptr(new group_entry_t("Settings", _item, bundles::kItemTypeSettings))); res.push_back(entry_ptr(new directory_entry_t("Support", _item->support_path()))); // res.push_back(entry_ptr(new group_entry_t("Templates", _item, bundles::kItemTypeTemplates))); res.push_back(entry_ptr(new group_entry_t("Themes", _item, bundles::kItemTypeTheme))); return res; } }; struct bundles_entry_t : entry_t { bundles_entry_t () : entry_t("Bundles") { } std::vector entries () const { std::multimap ordered; citerate(item, bundles::query(bundles::kFieldAny, NULL_STR, scope::wildcard, bundles::kItemTypeBundle, oak::uuid_t(), false, true)) ordered.insert(std::make_pair((*item)->name(), *item)); std::vector res; iterate(pair, ordered) res.push_back(entry_ptr(new bundle_entry_t(pair->second))); return res; } }; entry_ptr bundle_entries () { return entry_ptr(new bundles_entry_t); } } /* be */