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 \
Box.cpp \
Box.h \
MenuBackend.cpp \
MenuBackend.h \
Dimension.cpp \
Dimension.h \
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 Inset;
class Lexer;
class MenuBackend;
struct RGBColor;
namespace frontend {
@ -233,10 +232,6 @@ public:
*/
virtual void unregisterSocketCallback(int fd) = 0;
///
virtual MenuBackend const & menuBackend() const = 0;
virtual MenuBackend & menuBackend() = 0;
virtual bool searchMenu(FuncRequest const & func,
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)
{
menuBackend().read(lex);
menus().read(lex);
}
bool GuiApplication::searchMenu(FuncRequest const & func,
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 Selection & selection();
virtual FontLoader & fontLoader() { return font_loader_; }
MenuBackend const & menuBackend() const { return menus_; }
MenuBackend & menuBackend() { return menus_; }
virtual int exec();
virtual void exit(int status);
virtual bool event(QEvent * e);

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -13,25 +13,211 @@
#ifndef MENUS_H
#define MENUS_H
#include "MenuBackend.h"
#include "FuncStatus.h"
#include "FuncRequest.h"
#include <QObject>
#include <QHash>
#include <boost/shared_ptr.hpp>
#include <vector>
class QMenu;
namespace lyx {
class Lexer;
class Buffer;
namespace frontend {
class Menu;
class GuiView;
class GuiPopupMenu;
class GuiView;
class Menus : public QObject, public MenuBackend
{
Q_OBJECT
///
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 {
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() {}
///
@ -42,6 +228,51 @@ public:
/// 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(); }
private:
///
MenuList menulist_;
///
Menu menubar_;
///
Menu specialmenu_;
private:
/// Initialize specific MACOS X menubar