2 * \file qt4/GuiAlert.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Jürgen Spitzmüller
8 * \author Abdelrazak Younes
10 * Full author contact details are available in file CREDITS.
18 #include "frontends/Application.h"
20 #include "qt_helpers.h"
21 #include "LyX.h" // for lyx::use_gui
22 #include "support/gettext.h"
24 #include "support/debug.h"
25 #include "support/docstring.h"
26 #include "support/lstrings.h"
27 #include "support/ProgressInterface.h"
29 #include <QApplication>
31 #include <QMessageBox>
33 #include <QInputDialog>
40 using namespace lyx::support;
48 static docstring const formatted(docstring const & text)
60 size_t const nxtpos1 = text.find(' ', curpos);
61 size_t const nxtpos2 = text.find('\n', curpos);
62 size_t const nxtpos = min(nxtpos1, nxtpos2);
64 docstring const word =
65 nxtpos == docstring::npos ?
67 text.substr(curpos, nxtpos - curpos);
69 bool const newline = (nxtpos2 != docstring::npos &&
72 docstring const line_plus_word =
73 line.empty() ? word : line + char_type(' ') + word;
75 // FIXME: make w be size_t
76 if (int(line_plus_word.length()) >= w) {
77 sout += line + char_type('\n');
79 sout += word + char_type('\n');
86 sout += line_plus_word + char_type('\n');
91 line += char_type(' ');
95 if (nxtpos == docstring::npos) {
108 void noAppDialog(QString const & title, QString const & msg, QMessageBox::Icon mode)
111 const char *argv[] = { "lyx", 0 };
113 QApplication app(argc, (char**)argv);
116 case QMessageBox::Information: QMessageBox::information(0, title, msg); break;
117 case QMessageBox::Warning: QMessageBox::warning(0, title, msg); break;
118 case QMessageBox::Critical: QMessageBox::critical(0, title, msg); break;
126 int prompt(docstring const & title0, docstring const & question,
127 int default_button, int cancel_button,
128 docstring const & b1, docstring const & b2, docstring const & b3)
130 //lyxerr << "PROMPT" << title0 << "FOCUS: " << qApp->focusWidget() << endl;
131 if (!use_gui || lyxerr.debugging()) {
132 lyxerr << title0 << '\n'
133 << "----------------------------------------\n"
136 lyxerr << "Assuming answer is ";
137 switch (default_button) {
138 case 0: lyxerr << b1 << endl;
139 case 1: lyxerr << b2 << endl;
140 case 2: lyxerr << b3 << endl;
143 return default_button;
146 docstring const title = bformat(_("LyX: %1$s"), title0);
148 // For some reason, sometimes Qt uses a hourglass or watch cursor when
149 // displaying the alert. Hence, we ask for the standard cursor shape.
150 qApp->setOverrideCursor(Qt::ArrowCursor);
152 // FIXME replace that with guiApp->currentView()
153 //LYXERR0("FOCUS: " << qApp->focusWidget());
154 int res = QMessageBox::information(qApp->focusWidget(),
156 toqstr(formatted(question)),
159 b3.empty() ? QString::null : toqstr(b3),
160 default_button, cancel_button);
162 qApp->restoreOverrideCursor();
164 // Qt bug: can return -1 on cancel or WM close, despite the docs.
171 void warning(docstring const & title0, docstring const & message,
172 bool const & askshowagain)
174 lyxerr << "Warning: " << title0 << '\n'
175 << "----------------------------------------\n"
181 docstring const title = bformat(_("LyX: %1$s"), title0);
184 noAppDialog(toqstr(title), toqstr(formatted(message)), QMessageBox::Warning);
188 // Don't use a hourglass cursor while displaying the alert
189 qApp->setOverrideCursor(Qt::ArrowCursor);
192 ProgressInterface::instance()->warning(
194 toqstr(formatted(message)));
196 ProgressInterface::instance()->toggleWarning(
199 toqstr(formatted(message)));
202 qApp->restoreOverrideCursor();
206 void error(docstring const & title0, docstring const & message)
208 lyxerr << "Error: " << title0 << '\n'
209 << "----------------------------------------\n"
215 docstring const title = bformat(_("LyX: %1$s"), title0);
218 noAppDialog(toqstr(title), toqstr(formatted(message)), QMessageBox::Critical);
222 // Don't use a hourglass cursor while displaying the alert
223 qApp->setOverrideCursor(Qt::ArrowCursor);
225 ProgressInterface::instance()->error(
227 toqstr(formatted(message)));
229 qApp->restoreOverrideCursor();
233 void information(docstring const & title0, docstring const & message)
235 if (!use_gui || lyxerr.debugging())
236 lyxerr << title0 << '\n'
237 << "----------------------------------------\n"
243 docstring const title = bformat(_("LyX: %1$s"), title0);
246 noAppDialog(toqstr(title), toqstr(formatted(message)), QMessageBox::Information);
250 // Don't use a hourglass cursor while displaying the alert
251 qApp->setOverrideCursor(Qt::ArrowCursor);
253 ProgressInterface::instance()->information(
255 toqstr(formatted(message)));
257 qApp->restoreOverrideCursor();
261 bool askForText(docstring & response, docstring const & msg,
262 docstring const & dflt)
264 if (!use_gui || lyxerr.debugging()) {
265 lyxerr << "----------------------------------------\n"
267 << "Assuming answer is " << dflt << '\n'
268 << "----------------------------------------" << endl;
275 docstring const title = bformat(_("LyX: %1$s"), msg);
278 QString text = QInputDialog::getText(qApp->focusWidget(),
280 toqstr(char_type('&') + msg),
285 response = qstring_to_ucs4(text);
294 } // namespace frontend