lyx_mirror/src/frontends/qt4/Alert_pimpl.C
Abdelrazak Younes 6d7cd27910 With this commit, errors and warnings can use message box even before LyX is properly initialized. This is especially useful for missing sysdir and/or userdir directory.
* Alert.C:
  - error(): calls error_pimpl() in any case.
  - warning(): calls warning_pimpl() in any case.

* Alert_pimpl.C:
  - error_pimpl(): construct a QApplication if LyX is not initialized yet.
  - warning_pimpl(): ditto.

* lyx_main.C:
  - parse_sysdir(): replace lyxerr with Alert::error().
  - parse_userdir(): ditto.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16823 a592a061-630c-0410-9148-cb99ea01b6c8
2007-01-23 12:38:20 +00:00

154 lines
3.4 KiB
C

/**
* \file qt4/Alert_pimpl.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author John Levon
* \author Abdelrazak Younes
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "Alert_pimpl.h"
#include "Alert.h"
#include "ui/QAskForTextUi.h"
#include "qt_helpers.h"
#include "frontends/Application.h"
#include "gettext.h"
#include <QApplication>
#include <QMessageBox>
#include <QLabel>
#include <QLineEdit>
#include <QDialog>
#include <QInputDialog>
#include <algorithm>
using std::pair;
using std::make_pair;
namespace lyx {
using lyx::support::bformat;
using lyx::docstring;
namespace {
class MessageBox: public QMessageBox
{
public:
MessageBox(QWidget * parent = 0): QMessageBox(parent)
{
setAttribute(Qt::WA_DeleteOnClose, true);
setAttribute(Qt::WA_QuitOnClose, false);
}
};
} // anonymous namespace
int prompt_pimpl(docstring const & tit, docstring const & question,
int default_button, int cancel_button,
docstring const & b1, docstring const & b2, docstring const & b3)
{
docstring const title = bformat(_("LyX: %1$s"), tit);
MessageBox mb;
// For some reason, sometimes Qt uses an hourglass or watch cursor when
// displaying the alert. Hence, we ask for the standard cursor shape.
// This call has no effect if the cursor has not been overridden.
qApp->changeOverrideCursor(Qt::ArrowCursor);
// FIXME replace that with theApp->gui()->currentView()
int res = mb.information(qApp->focusWidget(),
toqstr(title),
toqstr(formatted(question)),
toqstr(b1),
toqstr(b2),
b3.empty() ? QString::null : toqstr(b3),
default_button, cancel_button);
// Qt bug: can return -1 on cancel or WM close, despite the docs.
if (res == -1)
res = cancel_button;
return res;
}
void warning_pimpl(docstring const & tit, docstring const & message)
{
docstring const title = bformat(_("LyX: %1$s"), tit);
if (theApp() == 0) {
int argc = 1;
char * argv[1];
QApplication app(argc, argv);
QMessageBox::warning(0,
toqstr(title),
toqstr(formatted(message)));
return;
}
MessageBox mb;
mb.warning(qApp->focusWidget(),
toqstr(title),
toqstr(formatted(message)));
}
void error_pimpl(docstring const & tit, docstring const & message)
{
docstring const title = bformat(_("LyX: %1$s"), tit);
if (theApp() == 0) {
int argc = 1;
char * argv[1];
QApplication app(argc, argv);
QMessageBox::critical(0,
toqstr(title),
toqstr(formatted(message)));
return;
}
MessageBox mb;
mb.critical(qApp->focusWidget(),
toqstr(title),
toqstr(formatted(message)));
}
void information_pimpl(docstring const & tit, docstring const & message)
{
docstring const title = bformat(_("LyX: %1$s"), tit);
MessageBox mb;
mb.information(qApp->focusWidget(),
toqstr(title),
toqstr(formatted(message)));
}
pair<bool, docstring> const
askForText_pimpl(docstring const & msg, docstring const & dflt)
{
docstring const title = bformat(_("LyX: %1$s"), msg);
bool ok;
QString text = QInputDialog::getText(qApp->focusWidget(),
toqstr(title),
toqstr(lyx::char_type('&') + msg),
QLineEdit::Normal,
toqstr(dflt), &ok);
if (ok && !text.isEmpty())
return make_pair<bool, docstring>(true, qstring_to_ucs4(text));
else
return make_pair<bool, docstring>(false, docstring());
}
} // namespace lyx