]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
* src/insets/insetbase.h
[lyx.git] / src / lyx_main.C
index cccd96a80576caeb32349fa4f689e045be57e1e0..95b1a857723c7c8e979af4f2e652596d5f9a3e7e 100644 (file)
@@ -40,6 +40,7 @@
 #include "lyxsocket.h"
 #include "lyxtextclasslist.h"
 #include "MenuBackend.h"
+#include "messages.h"
 #include "mover.h"
 #include "ToolbarBackend.h"
 
@@ -50,7 +51,6 @@
 
 #include "support/environment.h"
 #include "support/filetools.h"
-#include "support/fontutils.h"
 #include "support/lyxlib.h"
 #include "support/convert.h"
 #include "support/os.h"
@@ -64,6 +64,8 @@
 
 #include <iostream>
 #include <csignal>
+#include <map>
+#include <string>
 #include <vector>
 
 
@@ -90,9 +92,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;
@@ -146,6 +150,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_;
@@ -167,6 +175,15 @@ 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_;
 };
 
 ///
@@ -294,6 +311,18 @@ kb_keymap & LyX::topLevelKeymap()
 }
 
 
+Converters & LyX::converters()
+{
+       return pimpl_->converters_;
+}
+
+
+Converters & LyX::systemConverters()
+{
+       return pimpl_->system_converters_;
+}
+
+
 IconvProcessor & LyX::iconvProcessor()
 {
        return pimpl_->iconv;
@@ -307,6 +336,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)
@@ -366,24 +422,13 @@ int LyX::exec(int & argc, char * argv[])
        }
 
        // Force adding of font path _before_ Application is initialized
-       support::addFontResources();
+       support::os::addFontResources();
 
        // Let the frontend parse and remove all arguments that it knows
        pimpl_->application_.reset(createApplication(argc, argv));
 
        initGuiFont();
 
-       // FIXME
-       /* Create a CoreApplication class that will provide the main event loop
-       * and the socket callback registering. With Qt4, only QtCore
-       * library would be needed.
-       * When this is done, a server_mode could be created and the following two
-       * line would be moved out from here.
-       */
-       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")));
-
        // Parse and remove all known arguments in the LyX singleton
        // Give an error for all remaining ones.
        int exit_status = init(argc, argv);
@@ -395,13 +440,26 @@ int LyX::exec(int & argc, char * argv[])
                return exit_status;
        }
 
+       // FIXME
+       /* Create a CoreApplication class that will provide the main event loop
+       * and the socket callback registering. With Qt4, only QtCore
+       * library would be needed.
+       * When this is done, a server_mode could be created and the following two
+       * line would be moved out from here.
+       */
+       // Note: socket callback must be registered after init(argc, 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")));
+
        // Start the real execution loop.
        exit_status = pimpl_->application_->exec();
        
        prepareExit();
 
        // Restore original font resources after Application is destroyed.
-       support::restoreFontResources();
+       support::os::restoreFontResources();
 
        return exit_status;
 }
@@ -417,21 +475,16 @@ void LyX::prepareExit()
        pimpl_->buffer_list_.closeAll();
 
        // do any other cleanup procedures now
-       lyxerr[Debug::INFO] << "Deleting tmp dir " << package().temp_dir() << endl;
-
-       // Prevent the deletion of /tmp if LyX was called with invalid
-       // arguments. Does not work on windows.
-       // FIXME: Fix the real bug instead.
-       if (package().temp_dir() == "/tmp") {
-               lyxerr << "Not deleting /tmp." << endl;
-               return;
-       }
-
-       if (!destroyDir(FileName(package().temp_dir()))) {
-               docstring const msg =
-                       bformat(_("Unable to remove the temporary directory %1$s"),
-                       from_utf8(package().temp_dir()));
-               Alert::warning(_("Unable to remove temporary directory"), msg);
+       if (package().temp_dir() != package().system_temp_dir()) {
+               lyxerr[Debug::INFO] << "Deleting tmp dir "
+                                   << package().temp_dir() << endl;
+
+               if (!destroyDir(FileName(package().temp_dir()))) {
+                       docstring const msg =
+                               bformat(_("Unable to remove the temporary directory %1$s"),
+                               from_utf8(package().temp_dir()));
+                       Alert::warning(_("Unable to remove temporary directory"), msg);
+               }
        }
 
        if (use_gui) {
@@ -483,7 +536,8 @@ int LyX::init(int & argc, char * argv[])
                // get absolute path of file and add ".lyx" to
                // the filename if necessary
                pimpl_->files_to_load_.push_back(fileSearch(string(),
-                       os::internal_path(to_utf8(from_local8bit(argv[argi]))), "lyx"));
+                       os::internal_path(to_utf8(from_local8bit(argv[argi]))),
+                       "lyx", support::allow_unreadable));
        }
 
        if (first_start)
@@ -502,7 +556,6 @@ void LyX::loadFiles()
                if (it->empty())
                        continue;
 
-               Buffer * const b = newFile(it->absFilename(), string(), true);
                Buffer * buf = pimpl_->buffer_list_.newBuffer(it->absFilename(), false);
                if (loadLyXFile(buf, *it)) {
                        ErrorList const & el = buf->errorList("Parse");
@@ -769,6 +822,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
@@ -800,7 +856,7 @@ bool LyX::init()
 
        system_lyxrc = lyxrc;
        system_formats = formats;
-       system_converters = converters;
+       pimpl_->system_converters_ = pimpl_->converters_;
        system_movers = movers;
        system_lcolor = lcolor;
 
@@ -819,6 +875,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());
@@ -1401,9 +1460,33 @@ kb_keymap & theTopLevelKeymap()
 }
 
 
+Converters & theConverters()
+{
+       return  LyX::ref().converters();
+}
+
+
+Converters & theSystemConverters()
+{
+       return  LyX::ref().systemConverters();
+}
+
+
 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