KDED
vfolder_menu.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef KDED_VFOLDER_MENU_H
00021 #define KDED_VFOLDER_MENU_H
00022
00023 #include <QtCore/QObject>
00024 #include <QtXml/QDomDocument>
00025 #include <QtCore/QStringList>
00026 #include <QtCore/QHash>
00027 #include <QtCore/QSet>
00028 #include <QtCore/QStack>
00029
00030 #include <kservice.h>
00031
00032 class KBuildServiceFactory;
00033
00034 class VFolderMenu : public QObject
00035 {
00036 Q_OBJECT
00037 public:
00038 class AppsInfo;
00039 class SubMenu {
00040 public:
00041 SubMenu() : isDeleted(false),apps_info(0) { items.reserve(43); }
00042 ~SubMenu() { qDeleteAll(subMenus); }
00043
00044 public:
00045 QString name;
00046 QString directoryFile;
00047 QList<SubMenu*> subMenus;
00048 QHash<QString,KService::Ptr> items;
00049 QHash<QString,KService::Ptr> excludeItems;
00050 QDomElement defaultLayoutNode;
00051 QDomElement layoutNode;
00052 bool isDeleted;
00053 QStringList layoutList;
00054 AppsInfo *apps_info;
00055 };
00056
00057 VFolderMenu(KBuildServiceFactory* serviceFactory);
00058 ~VFolderMenu();
00059
00069 SubMenu *parseMenu(const QString &file, bool forceLegacyLoad=false);
00070
00078 QStringList allDirectories();
00079
00084 void setTrackId(const QString &id);
00085
00086 Q_SIGNALS:
00094 void newService(const QString &path, KService::Ptr *entry);
00095
00096 public:
00097 struct MenuItem
00098 {
00099 enum Type { MI_Service, MI_SubMenu, MI_Separator };
00100 Type type;
00101 KService::Ptr service;
00102 SubMenu *submenu;
00103 };
00104
00105 public:
00106 QStringList m_allDirectories;
00107
00108 QStringList m_defaultDataDirs;
00109 QStringList m_defaultAppDirs;
00110 QStringList m_defaultDirectoryDirs;
00111 QStringList m_defaultMergeDirs;
00112 QStringList m_defaultLegacyDirs;
00113
00114 QStringList m_directoryDirs;
00115 QHash<QString, SubMenu*> m_legacyNodes;
00116
00117
00118 class DocInfo {
00119 public:
00120 QString baseDir;
00121 QString baseName;
00122 QString path;
00123 };
00124
00125
00126 DocInfo m_docInfo;
00127 QStack<VFolderMenu::DocInfo> m_docInfoStack;
00128
00129 class AppsInfo {
00130 public:
00131 AppsInfo()
00132 {
00133 dictCategories.reserve(53);
00134 applications.reserve(997);
00135 appRelPaths.reserve(997);
00136 }
00137
00138 ~AppsInfo()
00139 {
00140 }
00141
00142 QHash<QString,KService::List> dictCategories;
00143 QHash<QString,KService::Ptr> applications;
00144 QHash<KService::Ptr,QString> appRelPaths;
00145 };
00146
00147 AppsInfo *m_appsInfo;
00148 QList<AppsInfo*> m_appsInfoStack;
00149 QList<AppsInfo*> m_appsInfoList;
00150 QSet<QString > m_usedAppsDict;
00151
00152 QDomDocument m_doc;
00153 SubMenu *m_rootMenu;
00154 SubMenu *m_currentMenu;
00155 bool m_forcedLegacyLoad;
00156 bool m_legacyLoaded;
00157 bool m_track;
00158 QString m_trackId;
00159
00160 private:
00164 KService::Ptr findApplication(const QString &relPath);
00165
00169 QList<KService::List*> findCategory(const QString &category);
00170
00174 void addApplication(const QString &id, KService::Ptr service);
00175
00179 void buildApplicationIndex(bool unusedOnly);
00180
00184 void createAppsInfo();
00185
00189 void loadAppsInfo();
00190
00194 void unloadAppsInfo();
00195
00196 QDomDocument loadDoc();
00197 void mergeMenus(QDomElement &docElem, QString &name);
00198 void mergeFile(QDomElement &docElem, const QDomNode &mergeHere);
00199 void loadMenu(const QString &filename);
00200
00204 void includeItems(QHash<QString,KService::Ptr>& items1, const QHash<QString,KService::Ptr>& items2);
00205
00209 void matchItems(QHash<QString,KService::Ptr>& items1, const QHash<QString,KService::Ptr>& items2);
00210
00214 void excludeItems(QHash<QString,KService::Ptr>& items1, const QHash<QString,KService::Ptr>& items2);
00215
00223 SubMenu* takeSubMenu(SubMenu *parentMenu, const QString &menuName);
00224
00234 void insertSubMenu(VFolderMenu::SubMenu *parentMenu, const QString &menuName, VFolderMenu::SubMenu *newMenu, bool reversePriority=false);
00235
00241 void mergeMenu(SubMenu *menu1, SubMenu *menu2, bool reversePriority=false);
00242
00247 void insertService(SubMenu *parentMenu, const QString &name, KService::Ptr newService);
00248
00253 void registerFile(const QString &file);
00254
00258 void markUsedApplications(const QHash<QString,KService::Ptr>& items);
00259
00264 void registerDirectory(const QString &directory);
00265
00266 void processKDELegacyDirs();
00267 void processLegacyDir(const QString &dir, const QString &relDir, const QString &prefix);
00268 void processMenu(QDomElement &docElem, int pass);
00269 void layoutMenu(VFolderMenu::SubMenu *menu, QStringList defaultLayout);
00270 void processCondition(QDomElement &docElem, QHash<QString,KService::Ptr>& items);
00271
00272 void initDirs();
00273
00274 void pushDocInfo(const QString &fileName, const QString &baseDir = QString());
00275 void pushDocInfoParent(const QString &basePath, const QString &baseDir);
00276 void popDocInfo();
00277
00278 QString absoluteDir(const QString &_dir, const QString &baseDir, bool keepRelativeToCfg=false);
00279 QString locateMenuFile(const QString &fileName);
00280 QString locateDirectoryFile(const QString &fileName);
00281 void loadApplications(const QString&, const QString&);
00282
00283 private:
00284 KBuildServiceFactory* m_serviceFactory;
00285 };
00286
00287 #endif