]> git.lyx.org Git - lyx.git/blobdiff - src/MenuBackend.C
fix "make dist" target
[lyx.git] / src / MenuBackend.C
index 2c82cde44ab99565b4383a67b22ee86e7a462f1b..f7aaa81e460be287a830d3db861ba7a1d1872da2 100644 (file)
@@ -4,18 +4,17 @@
  *           LyX, The Document Processor
  *
  *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2000 The LyX Team.
+ *           Copyright 1995-2001 The LyX Team.
  *
  *
  * ====================================================== */
 
+#include <config.h>
+
 #ifdef __GNUG__
 #pragma implementation
 #endif
 
-#include <config.h>
-#include <memory>
-#include "support/LAssert.h"
 #include "MenuBackend.h"
 #include "lyxlex.h"
 #include "LyXAction.h"
@@ -25,6 +24,9 @@
 #include "bufferlist.h"
 #include "converter.h"
 #include "exporter.h"
+#include "importer.h"
+#include "FloatList.h"
+#include "support/LAssert.h"
 #include "support/filetools.h"
 #include "support/lyxfunctional.h"
 
@@ -46,15 +48,17 @@ MenuItem::MenuItem(Kind kind, string const & label,
                   string const & command, bool optional) 
        : kind_(kind), label_(label), optional_(optional)
 {
-       switch(kind) {
+       switch (kind) {
        case Separator:
        case Documents:
        case Lastfiles:
        case Toc:
-       case References:
        case ViewFormats:
        case UpdateFormats:
        case ExportFormats:
+       case ImportFormats:
+       case FloatListInsert:
+       case FloatInsert:
                break;
        case Command:
                action_ = lyxaction.LookupFunc(command);
@@ -88,14 +92,16 @@ Menu & Menu::read(LyXLex & lex)
                md_documents,
                md_endmenu,
                md_exportformats,
+               md_importformats,
                md_lastfiles,
                md_optitem,
-               md_references,
                md_separator,
                md_submenu,
                md_toc,
                md_updateformats,
                md_viewformats,
+               md_floatlistinsert,
+               md_floatinsert,
                md_last
        };
 
@@ -103,10 +109,12 @@ Menu & Menu::read(LyXLex & lex)
                { "documents", md_documents },
                { "end", md_endmenu },
                { "exportformats", md_exportformats },
+               { "floatinsert", md_floatinsert },
+               { "floatlistinsert", md_floatlistinsert },
+               { "importformats", md_importformats },
                { "item", md_item },
                { "lastfiles", md_lastfiles },
                { "optitem", md_optitem }, 
-               { "references", md_references },
                { "separator", md_separator },
                { "submenu", md_submenu },
                { "toc", md_toc },
@@ -122,13 +130,13 @@ Menu & Menu::read(LyXLex & lex)
        bool optional = false;
 
        while (lex.IsOK() && !quit) {
-               switch(lex.lex()) {
+               switch (lex.lex()) {
                case md_optitem:
                        optional = true;
                        // fallback to md_item
                case md_item: {
                        lex.next();
-                       string name = _(lex.GetString());
+                       string const name = _(lex.GetString());
                        lex.next();
                        string const command = lex.GetString();
                        add(MenuItem(MenuItem::Command, name, 
@@ -153,10 +161,6 @@ Menu & Menu::read(LyXLex & lex)
                        add(MenuItem(MenuItem::Toc));
                        break;
 
-               case md_references:
-                       add(MenuItem(MenuItem::References));
-                       break;
-
                case md_viewformats:
                        add(MenuItem(MenuItem::ViewFormats));
                        break;
@@ -169,6 +173,18 @@ Menu & Menu::read(LyXLex & lex)
                        add(MenuItem(MenuItem::ExportFormats));
                        break;
 
+               case md_importformats:
+                       add(MenuItem(MenuItem::ImportFormats));
+                       break;
+
+               case md_floatlistinsert:
+                       add(MenuItem(MenuItem::FloatListInsert));
+                       break;
+
+               case md_floatinsert:
+                       add(MenuItem(MenuItem::FloatInsert));
+                       break;
+                       
                case md_submenu: {
                        lex.next();
                        string mlabel = _(lex.GetString());
@@ -192,12 +208,45 @@ Menu & Menu::read(LyXLex & lex)
        return *this;
 }
 
-struct compare_formatpair {
-       bool operator()(FormatPair const & a, FormatPair const & b) {
-               return a.format->prettyname < b.format->prettyname; 
+
+void Menu::checkShortcuts() const
+{
+       // This is a quadratic algorithm, but we do not care because
+       // it is used for debugging only.
+       for (const_iterator it1 = begin(); it1 != end(); ++it1) {
+               string shortcut = it1->shortcut();
+               if (shortcut.empty())
+                       continue;
+               if (!contains(it1->label(), shortcut))
+                       lyxerr << "Menu warning: menu entry \""
+                              << it1->label()
+                              << "\" does not contain shortcut `"
+                              << shortcut << '\'' << endl;
+               for (const_iterator it2 = begin(); it2 != it1 ; ++it2) {
+                       if (!compare_no_case(it2->shortcut(), shortcut)) {
+                               lyxerr << "Menu warning: menu entries "
+                                      << '"' << it1->fulllabel()
+                                      << "\" and \"" << it2->fulllabel()
+                                      << "\" share the same shortcut."
+                                      << endl;
+                       }
+               }
+       }
+}
+
+
+namespace {
+
+class compare_format {
+public:
+       bool operator()(Format const * p1, Format const * p2) {
+               return *p1 < *p2;       
        }
 };
 
+} // namespace anon
+
+
 void Menu::expand(Menu & tomenu, Buffer * buf) const
 {
        for (const_iterator cit = begin();
@@ -205,13 +254,14 @@ void Menu::expand(Menu & tomenu, Buffer * buf) const
                switch ((*cit).kind()) {
                case MenuItem::Lastfiles: {
                        int ii = 1;
-                       for (LastFiles::const_iterator lfit = lastfiles->begin();
-                            lfit != lastfiles->end() && ii < 10;
-                            ++lfit, ++ii) {
-                               string label = tostr(ii) + ". "
+                       LastFiles::const_iterator lfit = lastfiles->begin();
+                       LastFiles::const_iterator end = lastfiles->end();
+                       
+                       for (; lfit != end && ii < 10; ++lfit, ++ii) {
+                               string const label = tostr(ii) + ". "
                                        + MakeDisplayPath((*lfit), 30)
                                        + '|' + tostr(ii);
-                               int action = lyxaction.
+                               int const action = lyxaction.
                                        getPseudoAction(LFUN_FILE_OPEN,
                                                        (*lfit));
                                tomenu.add(MenuItem(MenuItem::Command,
@@ -221,7 +271,9 @@ void Menu::expand(Menu & tomenu, Buffer * buf) const
                break;
                
                case MenuItem::Documents: {
-                       vector<string> names = bufferlist.getFileNames();
+                       typedef vector<string> Strings;
+                       
+                       Strings const names = bufferlist.getFileNames();
                        
                        if (names.empty()) {
                                tomenu.add(MenuItem(MenuItem::Command,
@@ -230,60 +282,117 @@ void Menu::expand(Menu & tomenu, Buffer * buf) const
                                break;
                        }
 
-                       for (vector<string>::const_iterator docit = names.begin();
-                            docit != names.end() ; ++docit) {
-                               int action =
-                                       lyxaction.getPseudoAction(LFUN_SWITCHBUFFER, *docit);
-                               string label = MakeDisplayPath(*docit, 30);
+                       Strings::const_iterator docit = names.begin();
+                       Strings::const_iterator end = names.end();
+                       for (; docit != end ; ++docit) {
+                               int const action = lyxaction
+                                       .getPseudoAction(LFUN_SWITCHBUFFER,
+                                                        *docit);
+                               string const label =
+                                       MakeDisplayPath(*docit, 30);
                                tomenu.add(MenuItem(MenuItem::Command,
                                                    label, action));
                        }
                }
                break;
 
+               case MenuItem::ImportFormats:
                case MenuItem::ViewFormats:
                case MenuItem::UpdateFormats:
                case MenuItem::ExportFormats: {
-                       vector<FormatPair> names;
+                       typedef vector<Format const *> Formats;
+                       
+                       Formats formats;
+                       
                        kb_action action;
-                       if ((*cit).kind() == MenuItem::ViewFormats) {
-                               names = Exporter::GetViewableFormats(buf);
+                       switch ((*cit).kind()) {
+                       case MenuItem::ImportFormats:
+                               formats = Importer::GetImportableFormats();
+                               action = LFUN_IMPORT;
+                               break;
+                       case MenuItem::ViewFormats:
+                               formats = Exporter::GetExportableFormats(buf, true); 
                                action = LFUN_PREVIEW;
-                       } else if ((*cit).kind() == MenuItem::UpdateFormats) {
-                               names = Exporter::GetViewableFormats(buf);
+                               break;
+                       case MenuItem::UpdateFormats:
+                               formats = Exporter::GetExportableFormats(buf, true); 
                                action = LFUN_UPDATE;
-                       } else {
-                               names = Exporter::GetExportableFormats(buf);
+                               break;
+                       default:
+                               formats = Exporter::GetExportableFormats(buf, false); 
                                action = LFUN_EXPORT;
                        }
-                       sort(names.begin(), names.end(), compare_formatpair());
-
-                       for (vector<FormatPair>::const_iterator fit = names.begin();
-                            fit != names.end() ; ++fit) {
-                               string fmt = (*fit).format->name;
-                               string label = (*fit).format->prettyname;
-                               if ((*fit).from &&
-                                   ( (fit != names.begin() &&
-                                      (*fit).format == (*(fit-1)).format) ||
-                                     (fit+1 != names.end() &&
-                                      (*fit).format == (*(fit+1)).format) )) {
-                                       fmt += ":" + (*fit).from->name;
-                                       string head;
-                                       split((*fit).command, head, ' ');
-                                       label += _(" (using ") + head + ")";
-                               }
-                               int action2 = lyxaction.getPseudoAction(action, fmt);
+                       sort(formats.begin(), formats.end(), compare_format());
+
+                       Formats::const_iterator fit = formats.begin();
+                       Formats::const_iterator end = formats.end();
+                       
+                       for (; fit != end ; ++fit) {
+                               if ((*fit)->dummy())
+                                       continue;
+                               string label = (*fit)->prettyname();
+                               if ((*cit).kind() == MenuItem::ImportFormats)
+                                       if ((*fit)->name() == "text")
+                                               label = _("Ascii text as lines");
+                                       else if ((*fit)->name() == "textparagraph")
+                                               label = _("Ascii text as paragraphs");
+                               if (!(*fit)->shortcut().empty())
+                                       label += "|" + (*fit)->shortcut();
+                               int const action2 = lyxaction.
+                                       getPseudoAction(action,
+                                                       (*fit)->name());
                                tomenu.add(MenuItem(MenuItem::Command,
                                                    label, action2));
                        }
                }
                break;
 
-                       
+               case MenuItem::FloatListInsert:
+               {
+                       FloatList::const_iterator cit = floatList.begin();
+                       FloatList::const_iterator end = floatList.end();
+                       for (; cit != end; ++cit) {
+                               int const action =  lyxaction
+                                       .getPseudoAction(LFUN_FLOAT_LIST,
+                                                        cit->second.type());
+                               string label = "List of ";
+                               label += cit->second.name();
+                               tomenu.add(MenuItem(MenuItem::Command,
+                                                   label, action));
+                       }
+               }
+               break;
+
+               case MenuItem::FloatInsert:
+               {
+                       FloatList::const_iterator cit = floatList.begin();
+                       FloatList::const_iterator end = floatList.end();
+                       for (; cit != end; ++cit) {
+                               int const action = lyxaction
+                                       .getPseudoAction(LFUN_INSET_FLOAT,
+                                                        cit->second.type());
+                               string const label = cit->second.name();
+                               tomenu.add(MenuItem(MenuItem::Command,
+                                                   label, action));
+                       }
+               }
+               break;
+               
                default:
                        tomenu.add(*cit);
                }
        }
+
+       // Check whether the shortcuts are unique
+       if (lyxerr.debugging(Debug::GUI))
+               checkShortcuts();
+}
+
+
+bool Menu::hasSubmenu(string const & name) const
+{
+       return find_if(begin(), end(),
+                      lyx::compare_memfun(&MenuItem::submenu, name)) != end();
 }
 
 
@@ -315,7 +424,7 @@ void MenuBackend::read(LyXLex & lex)
        bool menubar = false;
 
        while (lex.IsOK() && !quit) {
-               switch(lex.lex()) {
+               switch (lex.lex()) {
                case md_menubar: 
                        menubar = true;
                        // fallback to md_menu
@@ -400,7 +509,7 @@ void MenuBackend::defaults()
        add(main_nobuffer);
 
        if (lyxerr.debugging(Debug::GUI)) {
-               for(const_iterator cit = begin();
+               for (const_iterator cit = begin();
                    cit != end() ; ++cit)
                        lyxerr << "Menu name: " << cit->name() 
                               << ", Menubar: " << cit->menubar() 
@@ -418,23 +527,24 @@ void MenuBackend::add(Menu const & menu)
 bool MenuBackend::hasMenu(string const & name) const
 {
        return find_if(begin(), end(),
-                      compare_memfun(&Menu::name, name)) != end();
+                      lyx::compare_memfun(&Menu::name, name)) != end();
 }
 
 
 Menu const & MenuBackend::getMenu(string const & name) const
 {
        const_iterator cit = find_if(begin(), end(),
-                                    compare_memfun(&Menu::name, name));
-       Assert(cit != end());
+                                    lyx::compare_memfun(&Menu::name, name));
+       lyx::Assert(cit != end());
        return (*cit);
 }
 
 
 Menu & MenuBackend::getMenu(string const & name)
 {
-       MenuList::iterator it = find_if(menulist_.begin(), menulist_.end(),
-                                       compare_memfun(&Menu::name, name));
-       Assert(it != menulist_.end());
+       MenuList::iterator it =
+               find_if(menulist_.begin(), menulist_.end(),
+                       lyx::compare_memfun(&Menu::name, name));
+       lyx::Assert(it != menulist_.end());
        return (*it);
 }