merge MenuBackend into frontend/Menus

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23527 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2008-03-07 00:21:23 +00:00
parent 6f1cb456cf
commit 4b12782854
11 changed files with 1317 additions and 1393 deletions

View File

@ -63,8 +63,6 @@ lyx_SOURCES = \
$(ASPELL) $(PSPELL) $(ISPELL) SpellBase.cpp \ $(ASPELL) $(PSPELL) $(ISPELL) SpellBase.cpp \
Box.cpp \ Box.cpp \
Box.h \ Box.h \
MenuBackend.cpp \
MenuBackend.h \
Dimension.cpp \ Dimension.cpp \
Dimension.h \ Dimension.h \
PrinterParams.cpp \ PrinterParams.cpp \

File diff suppressed because it is too large Load Diff

View File

@ -1,261 +0,0 @@
// -*- C++ -*-
/**
* \file MenuBackend.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Jean-Marc Lasgouttes
*
* Full author contact details are available in file CREDITS.
*/
#ifndef MENUBACKEND_H
#define MENUBACKEND_H
#include "FuncStatus.h"
#include "FuncRequest.h"
#include <boost/shared_ptr.hpp>
#include <vector>
namespace lyx {
class Lexer;
class Buffer;
class Menu;
///
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,
docstring const & label,
docstring const & submenu = docstring(),
bool optional = false);
MenuItem(Kind kind,
docstring const & label,
FuncRequest const & func,
bool optional = false);
/// This one is just to please boost::shared_ptr<>
~MenuItem();
/// The label of a given menuitem
docstring const label() const;
/// The keyboard shortcut (usually underlined in the entry)
docstring const shortcut() const;
/// The complete label, with label and shortcut separated by a '|'
docstring const 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.
docstring const binding() const;
/// the description of the submenu (if relevant)
docstring const & submenuname() const { return submenuname_; }
/// set the description of the submenu
void submenuname(docstring const & name) { submenuname_ = name; }
///
Menu * submenu() const { return submenu_.get(); }
///
void submenu(Menu * menu);
private:
//friend class MenuBackend;
///
Kind kind_;
///
docstring label_;
///
FuncRequest func_;
///
docstring submenuname_;
///
bool optional_;
///
FuncStatus status_;
///
boost::shared_ptr<Menu> submenu_;
};
///
class Menu {
public:
///
typedef std::vector<MenuItem> ItemList;
///
typedef ItemList::const_iterator const_iterator;
///
typedef ItemList::size_type size_type;
///
explicit Menu(docstring const & name = docstring()) : 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 &);
///
docstring const & name() const { return name_; }
///
bool empty() const { return items_.empty(); }
/// Clear the menu content.
void clear() { items_.clear(); }
///
ItemList::size_type size() const { return items_.size(); }
///
MenuItem const & operator[](size_type) 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;
// 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:
friend class MenuBackend;
///
ItemList items_;
///
docstring name_;
};
///
class MenuBackend {
public:
///
typedef std::vector<Menu> MenuList;
///
typedef MenuList::const_iterator const_iterator;
///
typedef MenuList::iterator iterator;
///
MenuBackend() {}
///
void read(Lexer &);
///
void add(Menu const &);
///
bool hasMenu(docstring const &) const;
///
Menu & getMenu(docstring const &);
///
Menu const & getMenu(docstring 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(); }
private:
///
MenuList menulist_;
///
Menu menubar_;
///
Menu specialmenu_;
};
} // namespace lyx
#endif // MENUBACKEND_H

View File

@ -29,7 +29,6 @@ class FuncRequest;
class FuncStatus; class FuncStatus;
class Inset; class Inset;
class Lexer; class Lexer;
class MenuBackend;
struct RGBColor; struct RGBColor;
namespace frontend { namespace frontend {
@ -233,10 +232,6 @@ public:
*/ */
virtual void unregisterSocketCallback(int fd) = 0; virtual void unregisterSocketCallback(int fd) = 0;
///
virtual MenuBackend const & menuBackend() const = 0;
virtual MenuBackend & menuBackend() = 0;
virtual bool searchMenu(FuncRequest const & func, virtual bool searchMenu(FuncRequest const & func,
std::vector<docstring> & names) const = 0; std::vector<docstring> & names) const = 0;
}; };

View File

@ -651,14 +651,14 @@ Buffer const * GuiApplication::updateInset(Inset const * inset) const
void GuiApplication::readMenus(Lexer & lex) void GuiApplication::readMenus(Lexer & lex)
{ {
menuBackend().read(lex); menus().read(lex);
} }
bool GuiApplication::searchMenu(FuncRequest const & func, bool GuiApplication::searchMenu(FuncRequest const & func,
vector<docstring> & names) const vector<docstring> & names) const
{ {
return menuBackend().getMenubar().searchMenu(func, names); return menus().getMenubar().searchMenu(func, names);
} }

View File

@ -65,8 +65,6 @@ public:
virtual Clipboard & clipboard(); virtual Clipboard & clipboard();
virtual Selection & selection(); virtual Selection & selection();
virtual FontLoader & fontLoader() { return font_loader_; } virtual FontLoader & fontLoader() { return font_loader_; }
MenuBackend const & menuBackend() const { return menus_; }
MenuBackend & menuBackend() { return menus_; }
virtual int exec(); virtual int exec();
virtual void exit(int status); virtual void exit(int status);
virtual bool event(QEvent * e); virtual bool event(QEvent * e);

View File

@ -11,18 +11,16 @@
#include <config.h> #include <config.h>
#include "GuiView.h" #include "GuiPopupMenu.h"
#include "Action.h" #include "Action.h"
#include "GuiApplication.h" #include "GuiApplication.h"
#include "GuiPopupMenu.h" #include "GuiView.h"
#include "qt_helpers.h" #include "qt_helpers.h"
#include "LyXFunc.h" #include "LyXFunc.h"
#include "MenuBackend.h"
#include "support/debug.h" #include "support/debug.h"
#include "support/lstrings.h"
namespace lyx { namespace lyx {
namespace frontend { namespace frontend {
@ -31,7 +29,7 @@ GuiPopupMenu::GuiPopupMenu(GuiView * owner, MenuItem const & mi,
bool topLevelMenu) bool topLevelMenu)
: QMenu(owner), owner_(owner) : QMenu(owner), owner_(owner)
{ {
name_ = toqstr(mi.submenuname()); name_ = mi.submenuname();
setTitle(label(mi)); setTitle(label(mi));
@ -53,13 +51,13 @@ void GuiPopupMenu::updateView()
// Here, We make sure that theLyXFunc points to the correct LyXView. // Here, We make sure that theLyXFunc points to the correct LyXView.
theLyXFunc().setLyXView(owner_); theLyXFunc().setLyXView(owner_);
MenuBackend const & menubackend = guiApp->menuBackend(); Menus const & menus = guiApp->menus();
Menu const & fromLyxMenu = menubackend.getMenu(qstring_to_ucs4(name_)); Menu const & fromLyxMenu = menus.getMenu(name_);
menubackend.expand(fromLyxMenu, topLevelMenu_, owner_->buffer()); menus.expand(fromLyxMenu, topLevelMenu_, owner_->buffer());
if (!menubackend.hasMenu(topLevelMenu_.name())) { if (!menus.hasMenu(topLevelMenu_.name())) {
LYXERR(Debug::GUI, "\tWARNING: menu seems empty" LYXERR(Debug::GUI, "\tWARNING: menu seems empty"
<< to_utf8(topLevelMenu_.name())); << fromqstr(topLevelMenu_.name()));
} }
populate(this, &topLevelMenu_); populate(this, &topLevelMenu_);
} }
@ -67,9 +65,9 @@ void GuiPopupMenu::updateView()
void GuiPopupMenu::populate(QMenu * qMenu, Menu * menu) void GuiPopupMenu::populate(QMenu * qMenu, Menu * menu)
{ {
LYXERR(Debug::GUI, "populating menu " << to_utf8(menu->name())); LYXERR(Debug::GUI, "populating menu " << fromqstr(menu->name()));
if (menu->size() == 0) { if (menu->size() == 0) {
LYXERR(Debug::GUI, "\tERROR: empty menu " << to_utf8(menu->name())); LYXERR(Debug::GUI, "\tERROR: empty menu " << fromqstr(menu->name()));
return; return;
} }
LYXERR(Debug::GUI, " ***** menu entries " << menu->size()); LYXERR(Debug::GUI, " ***** menu entries " << menu->size());
@ -94,9 +92,9 @@ void GuiPopupMenu::populate(QMenu * qMenu, Menu * menu)
} else { // we have a MenuItem::Command } else { // we have a MenuItem::Command
LYXERR(Debug::GUI, "creating Menu Item " LYXERR(Debug::GUI, "creating Menu Item "
<< to_utf8(m->label())); << fromqstr(m->label()));
Action * action = new Action(*(owner_), Action * action = new Action(*owner_,
QIcon(), label(*m), m->func(), QString()); QIcon(), label(*m), m->func(), QString());
qMenu->addAction(action); qMenu->addAction(action);
} }
@ -106,21 +104,22 @@ void GuiPopupMenu::populate(QMenu * qMenu, Menu * menu)
QString GuiPopupMenu::label(MenuItem const & mi) const QString GuiPopupMenu::label(MenuItem const & mi) const
{ {
docstring label = support::subst(mi.label(), QString label = mi.label();
from_ascii("&"), from_ascii("&&")); label.replace("&", "&&");
docstring const shortcut = mi.shortcut(); QString shortcut = mi.shortcut();
if (!shortcut.empty()) { if (!shortcut.isEmpty()) {
size_t pos = label.find(shortcut); int pos = label.indexOf(shortcut);
if (pos != docstring::npos) if (pos != -1)
label.insert(pos, 1, char_type('&')); //label.insert(pos, 1, char_type('&'));
label.replace(pos, 0, "&");
} }
docstring const binding = mi.binding(); QString const binding = mi.binding();
if (!binding.empty()) if (!binding.isEmpty())
label += '\t' + binding; label += '\t' + binding;
return toqstr(label); return label;
} }

View File

@ -12,7 +12,7 @@
#ifndef GUIPOPUPMENU_H #ifndef GUIPOPUPMENU_H
#define GUIPOPUPMENU_H #define GUIPOPUPMENU_H
#include "MenuBackend.h" #include "Menus.h"
#include <QMenu> #include <QMenu>

View File

@ -23,7 +23,6 @@
#include "GuiApplication.h" #include "GuiApplication.h"
#include "GuiKeySymbol.h" #include "GuiKeySymbol.h"
#include "GuiPainter.h" #include "GuiPainter.h"
#include "GuiPopupMenu.h"
#include "GuiView.h" #include "GuiView.h"
#include "KeySymbol.h" #include "KeySymbol.h"
#include "Language.h" #include "Language.h"
@ -51,6 +50,7 @@
#include <QMacStyle> #include <QMacStyle>
#endif #endif
#include <QMainWindow> #include <QMainWindow>
#include <QMenu>
#include <QPainter> #include <QPainter>
#include <QPalette> #include <QPalette>
#include <QScrollBar> #include <QScrollBar>

File diff suppressed because it is too large Load Diff

View File

@ -13,25 +13,211 @@
#ifndef MENUS_H #ifndef MENUS_H
#define MENUS_H #define MENUS_H
#include "MenuBackend.h" #include "FuncStatus.h"
#include "FuncRequest.h"
#include <QObject> #include <QObject>
#include <QHash> #include <QHash>
#include <boost/shared_ptr.hpp>
#include <vector>
class QMenu; class QMenu;
namespace lyx { namespace lyx {
class Lexer;
class Buffer;
namespace frontend { namespace frontend {
class Menu;
class GuiView; class GuiView;
class GuiPopupMenu; class GuiPopupMenu;
class GuiView; class GuiView;
class Menus : public QObject, public MenuBackend ///
{ class MenuItem {
Q_OBJECT
public: 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 {
public:
///
typedef std::vector<MenuItem> ItemList;
///
typedef ItemList::const_iterator const_iterator;
///
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;
// 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:
friend class Menus;
///
ItemList items_;
///
QString name_;
};
class Menus
{
public:
///
typedef std::vector<Menu> MenuList;
///
typedef MenuList::const_iterator const_iterator;
///
typedef MenuList::iterator iterator;
Menus() {} Menus() {}
/// ///
@ -42,6 +228,51 @@ public:
/// update the state of the menuitems - not needed /// update the state of the menuitems - not needed
void updateView(); 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(); }
private:
///
MenuList menulist_;
///
Menu menubar_;
///
Menu specialmenu_;
private: private:
/// Initialize specific MACOS X menubar /// Initialize specific MACOS X menubar