/**
- * \file qt4/GuiApplication.cpp
+ * \file GuiApplication.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
#include "GuiApplication.h"
#include "qt_helpers.h"
-#include "QLImage.h"
+#include "GuiImage.h"
#include "socket_callback.h"
#include "frontends/LyXView.h"
#include "graphics/LoaderQueue.h"
+#include "support/FileName.h"
#include "support/lstrings.h"
#include "support/os.h"
-#include "support/package.h"
+#include "support/Package.h"
+#include "BufferList.h"
#include "BufferView.h"
#include "Color.h"
#include "debug.h"
-#include "funcrequest.h"
-#include "lyx_main.h"
-#include "lyxfunc.h"
-#include "lyxrc.h"
+#include "FuncRequest.h"
+#include "gettext.h"
+#include "LyX.h"
+#include "LyXFunc.h"
+#include "LyXRC.h"
#include <QApplication>
#include <QClipboard>
#include <QFileOpenEvent>
#include <QLocale>
#include <QLibraryInfo>
+#include <QPixmapCache>
+#include <QSessionManager>
#include <QTextCodec>
#include <QTimer>
#include <QTranslator>
namespace lyx {
+using support::FileName;
+
frontend::Application * createApplication(int & argc, char * argv[])
{
return new frontend::GuiApplication(argc, argv);
// install translation file for Qt built-in dialogs
QString language_name = QString("qt_") + QLocale::system().name();
- language_name.truncate(5);
+
+ // 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 (qt_trans_.load(language_name,
QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
{
- qApp->installTranslator(&qt_trans_);
+ installTranslator(&qt_trans_);
// even if the language calls for RtL, don't do that
- qApp->setLayoutDirection(Qt::LeftToRight);
+ setLayoutDirection(Qt::LeftToRight);
LYXERR(Debug::GUI)
<< "Successfully installed Qt translations for locale "
<< fromqstr(language_name) << std::endl;
<< "Could not find Qt translations for locale "
<< fromqstr(language_name) << std::endl;
+#ifdef Q_WS_MACX
+ // This allows to translate the strings that appear in the LyX menu.
+ addMenuTranslator();
+#endif
+
using namespace lyx::graphics;
- Image::newImage = boost::bind(&QLImage::newImage);
- Image::loadableFormats = boost::bind(&QLImage::loadableFormats);
+ Image::newImage = boost::bind(&GuiImage::newImage);
+ Image::loadableFormats = boost::bind(&GuiImage::loadableFormats);
// needs to be done before reading lyxrc
lyxrc.dpi = getDPI();
LoaderQueue::setPriority(10,100);
guiApp = this;
+
+ // Set the cache to 5120 kilobytes which corresponds to screen size of
+ // 1280 by 1024 pixels with a color depth of 32 bits.
+ QPixmapCache::setCacheLimit(5120);
}
case QEvent::FileOpen: {
// Open a file; this happens only on Mac OS X for now
QFileOpenEvent * foe = static_cast<QFileOpenEvent *>(e);
- lyx::dispatch(FuncRequest(LFUN_FILE_OPEN,
- fromqstr(foe->file())));
+
+ if (!currentView() || !currentView()->view())
+ // The application is not properly initialized yet.
+ // So we acknowledge the event and delay the file opening
+ // until LyX is ready.
+ // FIXME UNICODE: FileName accept an utf8 encoded string.
+ LyX::ref().addFileToLoad(FileName(fromqstr(foe->file())));
+ else
+ lyx::dispatch(FuncRequest(LFUN_FILE_OPEN,
+ qstring_to_ucs4(foe->file())));
+
+ e->accept();
return true;
}
default:
}
-bool GuiApplication::getRgbColor(LColor_color col,
+bool GuiApplication::getRgbColor(Color_color col,
RGBColor & rgbcol)
{
QColor const & qcol = color_cache_.get(col);
}
-string const GuiApplication::hexName(LColor_color col)
+string const GuiApplication::hexName(Color_color col)
{
return lyx::support::ltrim(fromqstr(color_cache_.get(col).name()), "#");
}
-void GuiApplication::updateColor(LColor_color)
+void GuiApplication::updateColor(Color_color)
{
// FIXME: Bleh, can't we just clear them all at once ?
color_cache_.clear();
socket_callbacks_.erase(fd);
}
+
+void GuiApplication::commitData(QSessionManager & sm)
+{
+ /// The implementation is required to avoid an application exit
+ /// when session state save is triggered by session manager.
+ /// The default implementation sends a close event to all
+ /// visible top level widgets when session managment allows
+ /// interaction.
+ /// We are changing that to write all unsaved buffers...
+ if (sm.allowsInteraction() && !theBufferList().quitWriteAll())
+ sm.cancel();
+}
+
+
////////////////////////////////////////////////////////////////////////
// X11 specific stuff goes here...
#ifdef Q_WS_X11
#endif
+////////////////////////////////////////////////////////////////////////
+// Mac specific stuff goes here...
+
+class MenuTranslator : public QTranslator {
+public:
+ virtual ~MenuTranslator() {};
+ virtual QString translate(const char * context,
+ const char * sourceText,
+ const char * comment = 0) const;
+};
+
+
+QString MenuTranslator::translate(const char * /*context*/,
+ const char * sourceText,
+ const char *) const
+{
+ string const s = sourceText;
+ if (s == N_("About %1") || s == N_("Preferences")
+ || s == N_("Reconfigure") || s == N_("Quit %1"))
+ return qt_(s);
+ else
+ return QString();
+}
+
+
+void GuiApplication::addMenuTranslator()
+{
+ menu_trans_.reset(new MenuTranslator());
+ installTranslator(menu_trans_.get());
+}
+
+
} // namespace frontend
} // namespace lyx