]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiApplication.cpp
Simplify image creation with a new factory function: newImage().
[lyx.git] / src / frontends / qt4 / GuiApplication.cpp
index f1bbad25e3faea2b7d0db574701852f81eeab16b..13475a28cb8b42f8215e59ae41d054733d15793b 100644 (file)
@@ -54,6 +54,7 @@
 #include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/lyxalgo.h" // sorted
+#include "support/Messages.h"
 #include "support/os.h"
 #include "support/Package.h"
 
@@ -661,6 +662,9 @@ GuiApplication::GuiApplication(int & argc, char ** argv)
        QCoreApplication::setOrganizationDomain("lyx.org");
        QCoreApplication::setApplicationName(app_name + "-" + lyx_version);
 
+       // Install translator for GUI elements.
+       installTranslator(&d->qt_trans_);
+
        // FIXME: quitOnLastWindowClosed is true by default. We should have a
        // lyxrc setting for this in order to let the application stay resident.
        // But then we need some kind of dock icon, at least on Windows.
@@ -672,6 +676,11 @@ GuiApplication::GuiApplication(int & argc, char ** argv)
        // FIXME: Do we need a lyxrc setting for this on Mac? This behaviour
        // seems to be the default case for applications like LyX.
        setQuitOnLastWindowClosed(false);
+
+       // This allows to translate the strings that appear in the LyX menu.
+       /// A translator suitable for the entries in the LyX menu.
+       /// Only needed with Qt/Mac.
+       installTranslator(new MenuTranslator(this));
 #endif
        
 #ifdef Q_WS_X11
@@ -682,37 +691,8 @@ GuiApplication::GuiApplication(int & argc, char ** argv)
        QApplication::setDoubleClickInterval(300);
 #endif
 
-       // install translation file for Qt built-in dialogs
-       QString language_name = QString("qt_") + QLocale::system().name();
-       
-       // language_name can be short (e.g. qt_zh) or long (e.g. qt_zh_CN). 
-       // Short-named translator can be loaded from a long name, but not the
-       // opposite. Therefore, long name should be used without truncation.
-       // c.f. http://doc.trolltech.com/4.1/qtranslator.html#load
-       if (d->qt_trans_.load(language_name,
-               QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
-       {
-               installTranslator(&d->qt_trans_);
-               // even if the language calls for RtL, don't do that
-               setLayoutDirection(Qt::LeftToRight);
-               LYXERR(Debug::GUI, "Successfully installed Qt translations for locale "
-                       << language_name);
-       } else
-               LYXERR(Debug::GUI, "Could not find  Qt translations for locale "
-                       << language_name);
-
-#ifdef Q_WS_MACX
-       // This allows to translate the strings that appear in the LyX menu.
-       /// A translator suitable for the entries in the LyX menu.
-       /// Only needed with Qt/Mac.
-       installTranslator(new MenuTranslator(this));
-#endif
        connect(this, SIGNAL(lastWindowClosed()), this, SLOT(onLastWindowClosed()));
 
-       using namespace lyx::graphics;
-
-       Image::newImage = boost::bind(&GuiImage::newImage);
-
        // needs to be done before reading lyxrc
        QWidget w;
        lyxrc.dpi = (w.logicalDpiX() + w.logicalDpiY()) / 2;
@@ -788,7 +768,7 @@ bool GuiApplication::dispatch(FuncRequest const & cmd)
 
        case LFUN_WINDOW_CLOSE:
                // update bookmark pit of the current buffer before window close
-               for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
+               for (size_t i = 0; i < theSession().bookmarks().size(); ++i)
                        theLyXFunc().gotoBookmark(i+1, false, false);
                current_view_->close();
                break;
@@ -904,21 +884,31 @@ bool GuiApplication::dispatch(FuncRequest const & cmd)
 void GuiApplication::resetGui()
 {
        // Set the language defined by the user.
-       LyX::ref().setRcGuiLanguage();
+       setGuiLanguage();
 
        // Read menus
        if (!readUIFile(toqstr(lyxrc.ui_file)))
                // Gives some error box here.
                return;
 
+#ifdef Q_WS_MACX
+       d->global_menubar_->clear();
+       delete d->global_menubar_;
+       // Create the global default menubar which is shown for the dialogs
+       // and if no GuiView is visible.
+       d->global_menubar_ = new GlobalMenuBar();
+
        // init the global menubar on Mac. This must be done after the session
        // was recovered to know the "last files".
-       if (d->global_menubar_)
-               d->menus_.fillMenuBar(d->global_menubar_, 0, true);
+       d->menus_.fillMenuBar(d->global_menubar_, 0, true);
+#endif
 
        QHash<int, GuiView *>::iterator it;
-       for (it = d->views_.begin(); it != d->views_.end(); ++it)
-               (*it)->resetDialogs();
+       for (it = d->views_.begin(); it != d->views_.end(); ++it) {
+               GuiView * gv = *it;
+               gv->setLayoutDirection(layoutDirection());
+               gv->resetDialogs();
+       }
 
        dispatch(FuncRequest(LFUN_SCREEN_FONT_UPDATE));
 }
@@ -1039,10 +1029,48 @@ void GuiApplication::exit(int status)
 }
 
 
-void GuiApplication::execBatchCommands()
+void GuiApplication::setGuiLanguage()
 {
        // Set the language defined by the user.
-       LyX::ref().setRcGuiLanguage();
+       setRcGuiLanguage();
+
+       QString const default_language = toqstr(Messages::defaultLanguage());
+       LYXERR(Debug::LOCALE, "Tring to set default locale to: " << default_language);
+       QLocale const default_locale(default_language);
+       QLocale::setDefault(default_locale);
+
+       // install translation file for Qt built-in dialogs
+       QString const language_name = QString("qt_") + default_locale.name();
+
+       // language_name can be short (e.g. qt_zh) or long (e.g. qt_zh_CN). 
+       // Short-named translator can be loaded from a long name, but not the
+       // opposite. Therefore, long name should be used without truncation.
+       // c.f. http://doc.trolltech.com/4.1/qtranslator.html#load
+       if (!d->qt_trans_.load(language_name,
+                       QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
+               LYXERR(Debug::LOCALE, "Could not find  Qt translations for locale "
+                       << language_name);
+       } else {
+               LYXERR(Debug::LOCALE, "Successfully installed Qt translations for locale "
+                       << language_name);
+       }
+
+       switch (default_locale.language()) {
+       case QLocale::Arabic :
+       case QLocale::Hebrew :
+       case QLocale::Persian :
+       case QLocale::Urdu :
+        setLayoutDirection(Qt::RightToLeft);
+               break;
+       default:
+        setLayoutDirection(Qt::LeftToRight);
+       }
+}
+
+
+void GuiApplication::execBatchCommands()
+{
+       setGuiLanguage();
 
        // Read menus
        if (!readUIFile(toqstr(lyxrc.ui_file)))
@@ -1054,7 +1082,7 @@ void GuiApplication::execBatchCommands()
        if (d->global_menubar_)
                d->menus_.fillMenuBar(d->global_menubar_, 0, true);
 
-       LyX::ref().execBatchCommands();
+       lyx::execBatchCommands();
 }
 
 QAbstractItemModel * GuiApplication::languageModel()
@@ -1088,7 +1116,7 @@ void GuiApplication::restoreGuiSession()
        if (!lyxrc.load_session)
                return;
 
-       Session & session = LyX::ref().session();
+       Session & session = theSession();
        vector<FileName> const & lastopened = session.lastOpened().getfiles();
        // do not add to the lastfile list since these files are restored from
        // last session, and should be already there (regular files), or should
@@ -1165,7 +1193,7 @@ bool GuiApplication::notify(QObject * receiver, QEvent * event)
        catch (ExceptionMessage const & e) {
                switch(e.type_) { 
                case ErrorException:
-                       LyX::cref().emergencyCleanup();
+                       emergencyCleanup();
                        setQuitOnLastWindowClosed(false);
                        closeAllViews();
                        Alert::error(e.title_, e.details_);
@@ -1196,13 +1224,13 @@ bool GuiApplication::notify(QObject * receiver, QEvent * event)
                        "\n\nException: ");
                s += from_ascii(e.what());
                Alert::error(_("Software exception Detected"), s);
-               LyX::cref().exit(1);
+               lyx_exit(1);
        }
        catch (...) {
                docstring s = _("LyX has caught some really weird exception, it will "
                        "now attempt to save all unsaved documents and exit.");
                Alert::error(_("Software exception Detected"), s);
-               LyX::cref().exit(1);
+               lyx_exit(1);
        }
 
        return false;
@@ -1443,7 +1471,7 @@ bool GuiApplication::x11EventFilter(XEvent * xev)
        case SelectionRequest: {
                if (xev->xselectionrequest.selection != XA_PRIMARY)
                        break;
-               LYXERR(Debug::GUI, "X requested selection.");
+               LYXERR(Debug::SELECTION, "X requested selection.");
                BufferView * bv = current_view_->view();
                if (bv) {
                        docstring const sel = bv->requestSelection();
@@ -1455,7 +1483,7 @@ bool GuiApplication::x11EventFilter(XEvent * xev)
        case SelectionClear: {
                if (xev->xselectionclear.selection != XA_PRIMARY)
                        break;
-               LYXERR(Debug::GUI, "Lost selection.");
+               LYXERR(Debug::SELECTION, "Lost selection.");
                BufferView * bv = current_view_->view();
                if (bv)
                        bv->clearSelection();