File indexing completed on 2024-10-06 07:58:41

0001 /*
0002  *   SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only
0005  *
0006  */
0007 
0008 #ifndef menufile_h
0009 #define menufile_h
0010 
0011 #include <qdom.h>
0012 
0013 #include <QList>
0014 #include <QStringList>
0015 
0016 class MenuFile
0017 {
0018 public:
0019     static const QString MF_MENU, MF_PUBLIC_ID, MF_SYSTEM_ID, MF_NAME, MF_INCLUDE, MF_EXCLUDE, MF_FILENAME, MF_DELETED, MF_NOTDELETED, MF_MOVE, MF_OLD, MF_NEW,
0020         MF_DIRECTORY, MF_LAYOUT, MF_MENUNAME, MF_SEPARATOR, MF_MERGE;
0021 
0022     explicit MenuFile(const QString &file);
0023     ~MenuFile();
0024 
0025     bool load();
0026     bool save();
0027     void create();
0028     QString error() const
0029     {
0030         return m_error;
0031     } // Returns the last error message
0032 
0033     void restoreMenuSystem(const QString &);
0034 
0035     enum ActionType {
0036         ADD_ENTRY = 0,
0037         REMOVE_ENTRY,
0038         ADD_MENU,
0039         REMOVE_MENU,
0040         MOVE_MENU,
0041     };
0042 
0043     struct ActionAtom {
0044         ActionType action;
0045         QString arg1;
0046         QString arg2;
0047     };
0048 
0049     /**
0050      * Create action atom and push it on the stack
0051      */
0052     ActionAtom *pushAction(ActionType action, const QString &arg1, const QString &arg2);
0053 
0054     /**
0055      * Pop @p atom from the stack.
0056      * @p atom must be last item on the stack
0057      */
0058     void popAction(ActionAtom *atom);
0059 
0060     /**
0061      * Perform the specified action
0062      */
0063     void performAction(const ActionAtom *);
0064 
0065     /**
0066      * Perform all actions currently on the stack, remove them from the stack and
0067      * save result
0068      * @return whether save was successful
0069      */
0070     bool performAllActions();
0071 
0072     /**
0073      * Returns whether the stack contains any actions
0074      */
0075     bool dirty() const;
0076 
0077     void addEntry(const QString &menuName, const QString &menuId);
0078     void removeEntry(const QString &menuName, const QString &menuId);
0079 
0080     void addMenu(const QString &menuName, const QString &menuFile);
0081     void moveMenu(const QString &oldMenu, const QString &newMenu);
0082     void removeMenu(const QString &menuName);
0083 
0084     void setLayout(const QString &menuName, const QStringList &layout);
0085 
0086     /**
0087      * Returns a unique menu-name for a new menu under @p menuName
0088      * inspired by @p newMenu and not part of @p excludeList
0089      */
0090     QString uniqueMenuName(const QString &menuName, const QString &newMenu, const QStringList &excludeList);
0091 
0092 protected:
0093     /**
0094      * Finds menu @p menuName in @p elem.
0095      * If @p create is true, the menu is created if it doesn't exist yet.
0096      * @return The menu dom-node of @p menuName
0097      */
0098     QDomElement findMenu(QDomElement elem, const QString &menuName, bool create);
0099 
0100 private:
0101     QString m_error;
0102     QString m_fileName;
0103 
0104     QDomDocument m_doc;
0105     bool m_bDirty;
0106 
0107     QList<ActionAtom *> m_actionList;
0108     QStringList m_removedEntries;
0109 };
0110 
0111 #endif