X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=b881f3d78f55f3c383c1ffbaa09bfe24008f2650;hb=ba62665f966508db5a4de6864f4aa7374c5a5356;hp=afa834e130a017db98bb302874d4be81cf5bd2f0;hpb=cd5b51f4a3c72551f986e0a96403e58754d5974c;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index afa834e130..b881f3d78f 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -40,6 +40,7 @@ #include "lyxsocket.h" #include "lyxtextclasslist.h" #include "MenuBackend.h" +#include "messages.h" #include "mover.h" #include "ToolbarBackend.h" @@ -50,20 +51,21 @@ #include "support/environment.h" #include "support/filetools.h" -#include "support/fontutils.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" #include "support/systemcall.h" -#include "support/unicode.h" #include #include #include #include +#include +#include #include @@ -72,6 +74,7 @@ namespace lyx { using support::addName; using support::addPath; using support::bformat; +using support::changeExtension; using support::createDirectory; using support::createLyXTmpDir; using support::destroyDir; @@ -90,9 +93,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; @@ -110,9 +115,6 @@ bool use_gui = true; namespace { -/// Don't try to remove the temporary directory if it has not been created -bool remove_tmpdir = false; - // Filled with the command line arguments "foo" of "-sysdir foo" or // "-userdir foo". string cl_system_support; @@ -147,8 +149,12 @@ void reconfigureUserLyXDir() /// The main application class private implementation. struct LyX::Singletons { - Singletons(): iconv(ucs4_codeset, "UTF-8") + Singletons() { + // 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_; @@ -165,18 +171,30 @@ struct LyX::Singletons /// lyx session, containing lastfiles, lastfilepos, and lastopened boost::scoped_ptr session_; - /// - IconvProcessor iconv; - /// Files to load at start. vector files_to_load_; + + /// The messages translators. + map 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; } @@ -297,9 +315,15 @@ kb_keymap & LyX::topLevelKeymap() } -IconvProcessor & LyX::iconvProcessor() +Converters & LyX::converters() { - return pimpl_->iconv; + return pimpl_->converters_; +} + + +Converters & LyX::systemConverters() +{ + return pimpl_->system_converters_; } @@ -310,6 +334,33 @@ kb_keymap const & LyX::topLevelKeymap() const } +Messages & LyX::getMessages(std::string const & language) +{ + map::iterator it = pimpl_->messages_.find(language); + + if (it != pimpl_->messages_.end()) + return it->second; + + std::pair::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) @@ -335,9 +386,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 @@ -369,7 +428,7 @@ 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)); @@ -398,7 +457,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(); @@ -406,7 +465,7 @@ int LyX::exec(int & argc, char * argv[]) prepareExit(); // Restore original font resources after Application is destroyed. - support::restoreFontResources(); + support::os::restoreFontResources(); return exit_status; } @@ -422,7 +481,7 @@ void LyX::prepareExit() pimpl_->buffer_list_.closeAll(); // do any other cleanup procedures now - if (remove_tmpdir) { + if (package().temp_dir() != package().system_temp_dir()) { lyxerr[Debug::INFO] << "Deleting tmp dir " << package().temp_dir() << endl; @@ -483,7 +542,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 +562,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 +828,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,15 +862,15 @@ 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. if (!readRcFile("preferences")) return false; - if (!readEncodingsFile("encodings")) + if (!readEncodingsFile("encodings", "unicodesymbols")) return false; if (!readLanguagesFile("languages")) return false; @@ -819,6 +881,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()); @@ -857,7 +922,6 @@ bool LyX::init() // trying again but simply exit. return false; } - remove_tmpdir = true; if (lyxerr.debugging(Debug::INIT)) { lyxerr << "LyX tmp dir: `" << package().temp_dir() << '\'' << endl; @@ -1062,7 +1126,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, @@ -1094,13 +1158,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 @@ -1120,7 +1194,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; } @@ -1163,16 +1237,24 @@ bool LyX::readLanguagesFile(string const & name) // Read the encodings file `name' -bool LyX::readEncodingsFile(string const & name) +bool LyX::readEncodingsFile(string const & enc_name, + string const & symbols_name) { - lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; + lyxerr[Debug::INIT] << "About to read " << enc_name << " and " + << symbols_name << "..." << endl; - FileName const enc_path = libFileSearch(string(), name); + FileName const symbols_path = libFileSearch(string(), symbols_name); + if (symbols_path.empty()) { + showFileError(symbols_name); + return false; + } + + FileName const enc_path = libFileSearch(string(), enc_name); if (enc_path.empty()) { - showFileError(name); + showFileError(enc_name); return false; } - encodings.read(enc_path); + encodings.read(enc_path, symbols_path); return true; } @@ -1238,7 +1320,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; @@ -1248,7 +1331,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; @@ -1258,7 +1342,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; @@ -1402,9 +1487,51 @@ kb_keymap & theTopLevelKeymap() } -IconvProcessor & utf8ToUcs4() +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_; +} + + +Messages & getMessages(std::string const & language) +{ + return LyX::ref().getMessages(language); +} + + +Messages & getGuiMessages() { - return LyX::ref().iconvProcessor(); + return LyX::ref().getGuiMessages(); } } // namespace lyx