]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
Real fix from Bernhard Roider
[lyx.git] / src / lyx_main.C
index 56605bf9b042b6c9ebdbdec60f84a886f74764f9..97f71100ff10ece894cf3e99837d70daf1cdbd23 100644 (file)
@@ -40,6 +40,7 @@
 #include "lyxsocket.h"
 #include "lyxtextclasslist.h"
 #include "MenuBackend.h"
+#include "messages.h"
 #include "mover.h"
 #include "ToolbarBackend.h"
 
@@ -52,6 +53,7 @@
 #include "support/filetools.h"
 #include "support/lyxlib.h"
 #include "support/convert.h"
+#include "support/ExceptionMessage.h"
 #include "support/os.h"
 #include "support/package.h"
 #include "support/path.h"
@@ -63,6 +65,8 @@
 
 #include <iostream>
 #include <csignal>
+#include <map>
+#include <string>
 #include <vector>
 
 
@@ -71,6 +75,7 @@ namespace lyx {
 using support::addName;
 using support::addPath;
 using support::bformat;
+using support::changeExtension;
 using support::createDirectory;
 using support::createLyXTmpDir;
 using support::destroyDir;
@@ -89,9 +94,11 @@ namespace os = support::os;
 namespace fs = boost::filesystem;
 
 using std::endl;
+using std::for_each;
+using std::map;
+using std::make_pair;
 using std::string;
 using std::vector;
-using std::for_each;
 
 #ifndef CXX_GLOBAL_CSTD
 using std::exit;
@@ -145,6 +152,10 @@ struct LyX::Singletons
 {
        Singletons(): iconv(ucs4_codeset, "UTF-8")
        {
+               // Set the default User Interface language as soon as possible.
+               // The language used will be derived from the environment
+               // variables.
+               messages_["GUI"] = Messages();
        }
        /// our function handler
        LyXFunc lyxfunc_;
@@ -166,13 +177,28 @@ struct LyX::Singletons
 
        /// Files to load at start.
        vector<FileName> files_to_load_;
+
+       /// The messages translators.
+       map<string, Messages> messages_;
+
+       /// The file converters.
+       Converters converters_;
+
+       // The system converters copy after reading lyxrc.defaults.
+       Converters system_converters_;
+       
+       ///
+       Movers movers_;
+       
+       ///
+       Movers system_movers_;
 };
 
 ///
 frontend::Application * theApp()
 {
        if (singleton_)
-               return &singleton_->application();
+               return singleton_->pimpl_->application_.get();
        else
                return 0;
 }
@@ -293,6 +319,18 @@ kb_keymap & LyX::topLevelKeymap()
 }
 
 
+Converters & LyX::converters()
+{
+       return pimpl_->converters_;
+}
+
+
+Converters & LyX::systemConverters()
+{
+       return pimpl_->system_converters_;
+}
+
+
 IconvProcessor & LyX::iconvProcessor()
 {
        return pimpl_->iconv;
@@ -306,6 +344,33 @@ kb_keymap const & LyX::topLevelKeymap() const
 }
 
 
+Messages & LyX::getMessages(std::string const & language)
+{
+       map<string, Messages>::iterator it = pimpl_->messages_.find(language);
+
+       if (it != pimpl_->messages_.end())
+               return it->second;
+
+       std::pair<map<string, Messages>::iterator, bool> result = 
+                       pimpl_->messages_.insert(std::make_pair(language, Messages(language)));
+
+       BOOST_ASSERT(result.second);
+       return result.first->second;
+}
+
+
+Messages & LyX::getGuiMessages()
+{
+       return pimpl_->messages_["GUI"];
+}
+
+
+void LyX::setGuiLanguage(std::string const & language)
+{
+       pimpl_->messages_["GUI"] = Messages(language);
+}
+
+
 Buffer const * const LyX::updateInset(InsetBase const * inset) const
 {
        if (!inset)
@@ -331,9 +396,17 @@ int LyX::exec(int & argc, char * argv[])
        // we need to parse for "-dbg" and "-help"
        easyParse(argc, argv);
 
-       support::init_package(to_utf8(from_local8bit(argv[0])),
+       try { support::init_package(to_utf8(from_local8bit(argv[0])),
                              cl_system_support, cl_user_support,
                              support::top_build_dir_is_one_level_up);
+       } catch (support::ExceptionMessage const & message) {
+               if (message.type_ == support::ErrorException) {
+                       Alert::error(message.title_, message.details_);
+                       exit(1);
+               } else if (message.type_ == support::WarningException) {
+                       Alert::warning(message.title_, message.details_);
+               }
+       }
 
        if (!use_gui) {
                // FIXME: create a ConsoleApplication
@@ -394,7 +467,7 @@ int LyX::exec(int & argc, char * argv[])
        // such that package().temp_dir() is properly initialized.
        pimpl_->lyx_server_.reset(new LyXServer(&pimpl_->lyxfunc_, lyxrc.lyxpipes));
        pimpl_->lyx_socket_.reset(new LyXServerSocket(&pimpl_->lyxfunc_, 
-               support::os::internal_path(package().temp_dir() + "/lyxsocket")));
+               os::internal_path(package().temp_dir() + "/lyxsocket")));
 
        // Start the real execution loop.
        exit_status = pimpl_->application_->exec();
@@ -765,6 +838,9 @@ bool LyX::init()
        if (!readRcFile("lyxrc.dist"))
                return false;
 
+       // Set the language defined by the distributor.
+       //setGuiLanguage(lyxrc.gui_language);
+
        // Set the PATH correctly.
 #if !defined (USE_POSIX_PACKAGING)
        // Add the directory containing the LyX executable to the path
@@ -796,8 +872,8 @@ bool LyX::init()
 
        system_lyxrc = lyxrc;
        system_formats = formats;
-       system_converters = converters;
-       system_movers = movers;
+       pimpl_->system_converters_ = pimpl_->converters_;
+       pimpl_->system_movers_ = pimpl_->movers_;
        system_lcolor = lcolor;
 
        // This one is edited through the preferences dialog.
@@ -815,6 +891,9 @@ bool LyX::init()
                return false;
 
        if (use_gui) {
+               // Set the language defined by the user.
+               //setGuiLanguage(lyxrc.gui_language);
+
                // Set up bindings
                pimpl_->toplevel_keymap_.reset(new kb_keymap);
                defaultKeyBindings(pimpl_->toplevel_keymap_.get());
@@ -1057,7 +1136,7 @@ bool LyX::readRcFile(string const & name)
 
 
 // Read the ui file `name'
-bool LyX::readUIFile(string const & name)
+bool LyX::readUIFile(string const & name, bool include)
 {
        enum Uitags {
                ui_menuset = 1,
@@ -1089,13 +1168,23 @@ bool LyX::readUIFile(string const & name)
 
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
-       FileName const ui_path = libFileSearch("ui", name, "ui");
-
+       
+       FileName ui_path;
+       if (include) {
+               ui_path = libFileSearch("ui", name, "inc");
+               if (ui_path.empty())
+                       ui_path = libFileSearch("ui",
+                                               changeExtension(name, "inc"));
+       }
+       else
+               ui_path = libFileSearch("ui", name, "ui");
+       
        if (ui_path.empty()) {
                lyxerr[Debug::INIT] << "Could not find " << name << endl;
                showFileError(name);
                return false;
        }
+
        uifiles.push_back(name);
 
        lyxerr[Debug::INIT] << "Found " << name
@@ -1115,7 +1204,7 @@ bool LyX::readUIFile(string const & name)
                case ui_include: {
                        lex.next(true);
                        string const file = lex.getString();
-                       if (!readUIFile(file))
+                       if (!readUIFile(file, true))
                                return false;
                        break;
                }
@@ -1233,7 +1322,8 @@ int parse_version(string const &, string const &)
 int parse_sysdir(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << to_utf8(_("Missing directory for -sysdir switch")) << endl;
+               Alert::error(_("No system directory"),
+                       _("Missing directory for -sysdir switch"));
                exit(1);
        }
        cl_system_support = arg;
@@ -1243,7 +1333,8 @@ int parse_sysdir(string const & arg, string const &)
 int parse_userdir(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << to_utf8(_("Missing directory for -userdir switch")) << endl;
+               Alert::error(_("No user directory"),
+                       _("Missing directory for -userdir switch"));
                exit(1);
        }
        cl_user_support = arg;
@@ -1253,7 +1344,8 @@ int parse_userdir(string const & arg, string const &)
 int parse_execute(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << to_utf8(_("Missing command string after --execute switch")) << endl;
+               Alert::error(_("Incomplete command"),
+                       _("Missing command string after --execute switch"));
                exit(1);
        }
        batch = arg;
@@ -1397,9 +1489,57 @@ kb_keymap & theTopLevelKeymap()
 }
 
 
+Converters & theConverters()
+{
+       return  LyX::ref().converters();
+}
+
+
+Converters & theSystemConverters()
+{
+       return  LyX::ref().systemConverters();
+}
+
+
+Movers & theMovers()
+{
+       return  LyX::ref().pimpl_->movers_;
+}
+
+
+Mover const & getMover(std::string  const & fmt)
+{
+       return  LyX::ref().pimpl_->movers_(fmt);
+}
+
+
+void setMover(std::string const & fmt, std::string const & command)
+{
+       LyX::ref().pimpl_->movers_.set(fmt, command);
+}
+
+
+Movers & theSystemMovers()
+{
+       return  LyX::ref().pimpl_->system_movers_;
+}
+
+
 IconvProcessor & utf8ToUcs4()
 {
        return LyX::ref().iconvProcessor();
 }
 
+
+Messages & getMessages(std::string const & language)
+{
+       return LyX::ref().getMessages(language);
+}
+
+
+Messages & getGuiMessages()
+{
+       return LyX::ref().getGuiMessages();
+}
+
 } // namespace lyx