#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"
#endif // Q_WS_WIN
#include <boost/bind.hpp>
+#include <boost/crc.hpp>
#include <exception>
#include <vector>
if (icon.isEmpty())
return QIcon();
- LYXERR(Debug::GUI, "Found icon: " << icon);
+ //LYXERR(Debug::GUI, "Found icon: " << icon);
QPixmap pm;
if (!pm.load(icon)) {
LYXERR0("Cannot load icon " << icon << " please verify resource system!");
#ifdef Q_WS_WIN
/// WMF Mime handler for Windows clipboard.
- // FIXME for Windows Vista and Qt4 (see http://bugzilla.lyx.org/show_bug.cgi?id=4846)
- // But this makes LyX crash on exit when LyX is compiled in release mode and if there
- // is something in the clipboard.
+ /// \warning: see comment in ~GuiApplication and in bug 4846.
QWindowsMimeMetafile wmf_mime_;
#endif
};
#ifdef Q_WS_MACX
closeAllLinkBackLinks();
#endif
+ // FIXME: Work around bug 4846 for Windows Vista and Qt4
+ // (see http://bugzilla.lyx.org/show_bug.cgi?id=4846)
+ // If the clipboard is not cleared, LyX crashes on exit when it is
+ // compiled in release mode and if there is something in the clipboard.
+ // This is related to QWindowsMimeMetafile which is apparently not
+ // properly destroyed.
+ qApp->clipboard()->clear(QClipboard::Clipboard);
delete d;
}
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.
// 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
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;
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;
case LFUN_FILE_OPEN:
if (d->views_.empty()
|| (!lyxrc.open_buffers_in_tabs && current_view_->buffer() != 0)) {
- createView();
- current_view_->openDocument(to_utf8(cmd.argument()));
+ string const fname = to_utf8(cmd.argument());
+ // We want the ui session to be saved per document and not per
+ // window number. The filename crc is a good enough identifier.
+ boost::crc_32_type crc;
+ crc = for_each(fname.begin(), fname.end(), crc);
+ createView(crc.checksum());
+ current_view_->openDocument(fname);
if (!current_view_->buffer())
current_view_->close();
} else
void GuiApplication::resetGui()
{
+ // Set the language defined by the user.
+ 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".
+ 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));
}
-void GuiApplication::createView(QString const & geometry_arg, bool autoShow)
+void GuiApplication::createView(int view_id)
+{
+ createView(QString(), true, view_id);
+}
+
+
+void GuiApplication::createView(QString const & geometry_arg, bool autoShow,
+ int view_id)
{
// release the keyboard which might have been grabed by the global
// menubar on Mac to catch shortcuts even without any GuiView.
d->global_menubar_->releaseKeyboard();
// create new view
- int id = 0;
- while (d->views_.find(id) != d->views_.end())
- id++;
+ int id = view_id;
+ if (id == 0) {
+ while (d->views_.find(id) != d->views_.end())
+ id++;
+ }
+ LYXERR(Debug::GUI, "About to create new window with ID " << id);
GuiView * view = new GuiView(id);
-
- // copy the icon size from old view
- if (current_view_)
- view->setIconSize(current_view_->iconSize());
-
// register view
d->views_[id] = view;
}
+void GuiApplication::setGuiLanguage()
+{
+ // Set the language defined by the user.
+ 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)))
// Gives some error box here.
if (d->global_menubar_)
d->menus_.fillMenuBar(d->global_menubar_, 0, true);
- LyX::ref().execBatchCommands();
+ lyx::execBatchCommands();
}
QAbstractItemModel * GuiApplication::languageModel()
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
catch (ExceptionMessage const & e) {
switch(e.type_) {
case ErrorException:
- LyX::cref().emergencyCleanup();
+ emergencyCleanup();
setQuitOnLastWindowClosed(false);
closeAllViews();
Alert::error(e.title_, e.details_);
"\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;
// Ensure that a file is read only once (prevents include loops)
static QStringList uifiles;
if (uifiles.contains(name)) {
- LYXERR(Debug::INIT, "UI file '" << name << "' has been read already. "
- << "Is this an include loop?");
- return false;
+ if (!include) {
+ // We are reading again the top uifile so reset the safeguard:
+ uifiles.clear();
+ d->menus_.reset();
+ d->toolbars_.reset();
+ } else {
+ LYXERR(Debug::INIT, "UI file '" << name << "' has been read already. "
+ << "Is this an include loop?");
+ return false;
+ }
}
LYXERR(Debug::INIT, "About to read " << name << "...");
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();
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();