/** * \file qt4/alert_pimpl.cpp * 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 #include "alert.h" #include "frontends/Application.h" #include "qt_helpers.h" #include "debug.h" #include "LyX.h" // for lyx::use_gui #include "ui_AskForTextUi.h" #include "gettext.h" #include "support/docstring.h" #include "support/lstrings.h" #include #include #include #include #include #include using std::endl; using std::string; namespace lyx { using support::bformat; static docstring const formatted(docstring const & text) { const int w = 80; docstring sout; if (text.empty()) return sout; size_t curpos = 0; docstring line; while (true) { size_t const nxtpos1 = text.find(' ', curpos); size_t const nxtpos2 = text.find('\n', curpos); size_t const nxtpos = std::min(nxtpos1, nxtpos2); docstring const word = nxtpos == docstring::npos ? text.substr(curpos) : text.substr(curpos, nxtpos - curpos); bool const newline = (nxtpos2 != docstring::npos && nxtpos2 < nxtpos1); docstring const line_plus_word = line.empty() ? word : line + char_type(' ') + word; // FIXME: make w be size_t if (int(line_plus_word.length()) >= w) { sout += line + char_type('\n'); if (newline) { sout += word + char_type('\n'); line.erase(); } else { line = word; } } else if (newline) { sout += line_plus_word + char_type('\n'); line.erase(); } else { if (!line.empty()) line += char_type(' '); line += word; } if (nxtpos == docstring::npos) { if (!line.empty()) sout += line; break; } curpos = nxtpos + 1; } return sout; } 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); QMessageBox 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 = QMessageBox::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; } QMessageBox::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; } QMessageBox::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); QMessageBox::information(qApp->focusWidget(), toqstr(title), toqstr(formatted(message))); } bool askForText_pimpl(docstring & response, 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(char_type('&') + msg), QLineEdit::Normal, toqstr(dflt), &ok); if (ok && !text.isEmpty()) { response = qstring_to_ucs4(text); return true; } response.clear(); return false; } namespace Alert { int prompt(docstring const & title, docstring const & question, int default_button, int escape_button, docstring const & b1, docstring const & b2, docstring const & b3) { if (!use_gui || lyxerr.debugging()) { lyxerr << to_utf8(title) << '\n' << "----------------------------------------\n" << to_utf8(question) << endl; lyxerr << "Assuming answer is "; switch (default_button) { case 0: lyxerr << to_utf8(b1) << endl; case 1: lyxerr << to_utf8(b2) << endl; case 2: lyxerr << to_utf8(b3) << endl; } if (!use_gui) return default_button; } return prompt_pimpl(title, question, default_button, escape_button, b1, b2, b3); } void warning(docstring const & title, docstring const & message) { lyxerr << "Warning: " << to_utf8(title) << '\n' << "----------------------------------------\n" << to_utf8(message) << endl; if (use_gui) warning_pimpl(title, message); } void error(docstring const & title, docstring const & message) { lyxerr << "Error: " << to_utf8(title) << '\n' << "----------------------------------------\n" << to_utf8(message) << endl; if (use_gui) error_pimpl(title, message); } void information(docstring const & title, docstring const & message) { if (!use_gui || lyxerr.debugging()) lyxerr << to_utf8(title) << '\n' << "----------------------------------------\n" << to_utf8(message) << endl; if (use_gui) information_pimpl(title, message); } bool askForText(docstring & response, docstring const & msg, docstring const & dflt) { if (!use_gui || lyxerr.debugging()) { lyxerr << "----------------------------------------\n" << to_utf8(msg) << '\n' << "Assuming answer is " << to_utf8(dflt) << '\n' << "----------------------------------------" << endl; if (!use_gui) { response = dflt; return true; } } return askForText_pimpl(response, msg, dflt); } } // namespace Alert } // namespace lyx