]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/Menus.h
* fix spelling in comments to please John.
[lyx.git] / src / frontends / qt4 / Menus.h
index c20eccbd821487d75441678b56fdd7998160bc89..1ab407a5e100c077f7193f1c28b98f777cabc3bb 100644 (file)
@@ -4,7 +4,7 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author John Levon
  *
  * Full author contact details are available in file CREDITS.
 #ifndef MENUS_H
 #define MENUS_H
 
-#include "FuncStatus.h"
-#include "FuncRequest.h"
-
-#include <QObject>
-#include <QHash>
-
-#include <boost/shared_ptr.hpp>
+#include <QMenu>
 
 #include <vector>
 
-class QMenu;
+class QString;
+class QMenuBar;
 
 namespace lyx {
 
+class docstring_list;
 class Lexer;
-class Buffer;
+class FuncRequest;
 
 namespace frontend {
 
-class Menu;
 class GuiView;
-class GuiPopupMenu;
-class GuiView;
-
-///
-class MenuItem {
-public:
-       /// The type of elements that can be in a menu
-       enum Kind {
-               ///
-               Command,
-               ///
-               Submenu,
-               ///
-               Separator,
-               /** This is the list of last opened file,
-                   typically for the File menu. */
-               Lastfiles,
-               /** This is the list of opened Documents,
-                   typically for the Documents menu. */
-               Documents,
-               /** This is the bookmarks */
-               Bookmarks,
-               ///
-               Toc,
-               /** This is a list of viewable formats
-                   typically for the File->View menu. */
-               ViewFormats,
-               /** This is a list of updatable formats
-                   typically for the File->Update menu. */
-               UpdateFormats,
-               /** This is a list of exportable formats
-                   typically for the File->Export menu. */
-               ExportFormats,
-               /** This is a list of importable formats
-                   typically for the File->Export menu. */
-               ImportFormats,
-               /** This is the list of elements available
-                * for insertion into document. */
-               CharStyles,
-               /** This is the list of user-configurable
-               insets to insert into document */
-               Custom,
-               /** This is the list of XML elements to
-               insert into the document */
-               Elements,
-               /** This is the list of floats that we can
-                   insert a list for. */
-               FloatListInsert,
-               /** This is the list of floats that we can
-                   insert. */
-               FloatInsert,
-               /** This is the list of selections that can
-                   be pasted. */
-               PasteRecent,
-               /** toolbars */
-               Toolbars,
-               /** Available branches in document */
-               Branches
-       };
-
-       explicit MenuItem(Kind kind);
-
-       MenuItem(Kind kind,
-                QString const & label,
-                QString const & submenu = QString(),
-                bool optional = false);
-
-       MenuItem(Kind kind,
-                QString const & label,
-                FuncRequest const & func,
-                bool optional = false);
 
-       /// This one is just to please boost::shared_ptr<>
-       ~MenuItem();
-       /// The label of a given menuitem
-       QString label() const;
-       /// The keyboard shortcut (usually underlined in the entry)
-       QString shortcut() const;
-       /// The complete label, with label and shortcut separated by a '|'
-       QString fulllabel() const { return label_;}
-       /// The kind of entry
-       Kind kind() const { return kind_; }
-       /// the action (if relevant)
-       FuncRequest const & func() const { return func_; }
-       /// returns true if the entry should be ommited when disabled
-       bool optional() const { return optional_; }
-       /// returns the status of the lfun associated with this entry
-       FuncStatus const & status() const { return status_; }
-       /// returns the status of the lfun associated with this entry
-       FuncStatus & status() { return status_; }
-       /// returns the status of the lfun associated with this entry
-       void status(FuncStatus const & status) { status_ = status; }
-       ///returns the binding associated to this action.
-       QString binding() const;
-       /// the description of the  submenu (if relevant)
-       QString const & submenuname() const { return submenuname_; }
-       /// set the description of the  submenu
-       void submenuname(QString const & name) { submenuname_ = name; }
-       ///
-       Menu * submenu() const { return submenu_.get(); }
-       ///
-       void submenu(Menu * menu);
-
-private:
-       ///
-       Kind kind_;
-       ///
-       QString label_;
-       ///
-       FuncRequest func_;
-       ///
-       QString submenuname_;
-       ///
-       bool optional_;
-       ///
-       FuncStatus status_;
-       ///
-       boost::shared_ptr<Menu> submenu_;
-};
-
-
-///
-class Menu {
+class Menu : public QMenu
+{
+       Q_OBJECT
 public:
        ///
-       typedef std::vector<MenuItem> ItemList;
-       ///
-       typedef ItemList::const_iterator const_iterator;
+       Menu(GuiView * gv, QString const & name, bool top_level);
 
        ///
-       explicit Menu(QString const & name = QString()) : name_(name) {}
-
-       /// Add the menu item unconditionally
-       Menu & add(MenuItem const &);
-       /// Checks the associated FuncRequest status before adding the
-       /// menu item.
-       Menu & addWithStatusCheck(MenuItem const &);
-       ///
-       Menu & read(Lexer &);
-       ///
-       QString const & name() const { return name_; }
-       ///
-       bool empty() const { return items_.empty(); }
-       /// Clear the menu content.
-       void clear() { items_.clear(); }
-       ///
-       size_t size() const { return items_.size(); }
-       ///
-       MenuItem const & operator[](size_t) const;
-       ///
-       bool hasFunc(FuncRequest const &) const;
-       ///
-       const_iterator begin() const { return items_.begin(); }
-       ///
-       const_iterator end() const { return items_.end(); }
-
-       // Check whether the menu shortcuts are unique
-       void checkShortcuts() const;
+       ~Menu();
        
-       // search for func in this menu iteratively, and put menu
-       // names in a stack.
-       bool searchMenu(FuncRequest const & func, std::vector<docstring> & names)
-               const;
+private Q_SLOTS:
+       ///
+       void updateView();
 
 private:
        friend class Menus;
-       ///
-       ItemList items_;
-       ///
-       QString name_;
+
+       /// Use the Pimpl idiom to hide the internals.
+       struct Impl;
+       /// The pointer never changes although *d's contents may.
+       Impl * const d;
 };
 
 
 class Menus
 {
 public:
+       Menus();
+       ~Menus();
+
        ///
-       typedef std::vector<Menu> MenuList;
-       ///
-       typedef MenuList::const_iterator const_iterator;
+       void reset();
+       
        ///
-       typedef MenuList::iterator iterator;
-
-
-       Menus() {}
-
+       bool searchMenu(FuncRequest const & func,
+               docstring_list & names) const;
        ///
-       void fillMenuBar(GuiView * view);
+       void fillMenuBar(QMenuBar * qmb, GuiView * view, bool initial = false);
 
        /// \return a top-level submenu given its name.
-       QMenu * menu(QString const & name);
+       Menu * menu(QString const & name, GuiView & view);
 
-       /// update the state of the menuitems - not needed
-       void updateView();
        ///
        void read(Lexer &);
-       ///
-       void add(Menu const &);
-       ///
-       bool hasMenu(QString const &) const;
-       ///
-       Menu & getMenu(QString const &);
-       ///
-       Menu const & getMenu(QString const &) const;
-       ///
-       Menu const & getMenubar() const;
-       ///
-       bool empty() const { return menulist_.empty(); }
-       /** This defines a menu whose entries list the FuncRequests
-           that will be removed by expand() in other menus. This is
-           used by the Qt/Mac code
-       */
-       void specialMenu(Menu const &);
-       ///
-       Menu const & specialMenu() { return specialmenu_; }
 
-       /// Expands some special entries of the menu
-       /** The entries with the following kind are expanded to a
-           sequence of Command MenuItems: Lastfiles, Documents,
-           ViewFormats, ExportFormats, UpdateFormats, Branches
-       */
-       void expand(Menu const & frommenu, Menu & tomenu,
-                   Buffer const *) const;
-       ///
-       const_iterator begin() const { return menulist_.begin(); }
-       ///
-       iterator begin() { return menulist_.begin(); }
        ///
-       const_iterator end() const { return menulist_.end(); }
-       ///
-       iterator end() { return menulist_.end(); }
+       void updateMenu(Menu * qmenu);
 
 private:
+       /// Use the Pimpl idiom to hide the internals.
+       struct Impl;
        ///
-       MenuList menulist_;
-       ///
-       Menu menubar_;
-       ///
-       Menu specialmenu_;
-
-private:
-       /// Initialize specific MACOS X menubar
-       void macxMenuBarInit(GuiView * view);
-
-       typedef QHash<QString, GuiPopupMenu *> NameMap;
-
-       /// name to menu for \c menu() method.
-       NameMap name_map_;
+       Impl * d;
 };
 
 } // namespace frontend