X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FFindAndReplace.cpp;h=50f3641b5700fa6ad0442a08c84dd0dea7f3bd49;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=53a19b56b0dc39ec17bdf2be2e3276913db69ffb;hpb=33e123a5cd7fadd3e507d165867b5e52132f72eb;p=lyx.git diff --git a/src/frontends/qt4/FindAndReplace.cpp b/src/frontends/qt4/FindAndReplace.cpp index 53a19b56b0..50f3641b57 100644 --- a/src/frontends/qt4/FindAndReplace.cpp +++ b/src/frontends/qt4/FindAndReplace.cpp @@ -13,9 +13,9 @@ #include "FindAndReplace.h" #include "GuiApplication.h" -#include "qt_helpers.h" #include "GuiView.h" #include "GuiWorkArea.h" +#include "qt_helpers.h" #include "buffer_funcs.h" #include "BufferParams.h" @@ -23,19 +23,22 @@ #include "Cursor.h" #include "FuncRequest.h" #include "lyxfind.h" -#include "OutputParams.h" #include "output_latex.h" +#include "OutputParams.h" #include "TexRow.h" -#include "alert.h" + +#include "frontends/alert.h" #include "support/debug.h" +#include "support/filetools.h" #include "support/FileName.h" #include "support/gettext.h" #include "support/lassert.h" -#include "support/filetools.h" +#include "support/lstrings.h" #include #include +#include #include @@ -60,53 +63,83 @@ FindAndReplaceWidget::FindAndReplaceWidget(GuiView & view) replace_work_area_->init(); // We don't want two cursors blinking. replace_work_area_->stopBlinkingCursor(); + + QMenu * menu = new QMenu(); + QAction * regAny = menu->addAction(qt_("&Anything")); + regAny->setData(".*"); + QAction * regAnyNonEmpty = menu->addAction(qt_("Any non-&empty")); + regAnyNonEmpty->setData(".+"); + QAction * regAnyWord = menu->addAction(qt_("Any &word")); + regAnyWord->setData("[a-z]+"); + QAction * regAnyNumber = menu->addAction(qt_("Any &number")); + regAnyNumber->setData("[0-9]+"); + QAction * regCustom = menu->addAction(qt_("&User-defined")); + regCustom->setData(""); + regexpInsertPB->setMenu(menu); + + connect(menu, SIGNAL(triggered(QAction *)), + this, SLOT(insertRegexp(QAction *))); } -bool FindAndReplaceWidget::eventFilter(QObject *obj, QEvent *event) +bool FindAndReplaceWidget::eventFilter(QObject * obj, QEvent * event) { - if (obj == find_work_area_ && event->type() == QEvent::KeyPress) { - QKeyEvent *e = static_cast (event); - if (e->key() == Qt::Key_Escape && e->modifiers() == Qt::NoModifier) { - on_closePB_clicked(); + if (event->type() != QEvent::KeyPress + || (obj != find_work_area_ && obj != replace_work_area_)) + return QWidget::eventFilter(obj, event); + + QKeyEvent * e = static_cast (event); + switch (e->key()) { + case Qt::Key_Escape: + if (e->modifiers() == Qt::NoModifier) { + hideDialog(); return true; - } else if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { - if (e->modifiers() == Qt::ShiftModifier) { + } + break; + + case Qt::Key_Enter: + case Qt::Key_Return: + if (e->modifiers() == Qt::ShiftModifier) { + if (obj == find_work_area_) on_findPrevPB_clicked(); - return true; - } else if (e->modifiers() == Qt::NoModifier) { + else + on_replacePrevPB_clicked(); + return true; + } else if (e->modifiers() == Qt::NoModifier) { + if (obj == find_work_area_) on_findNextPB_clicked(); - return true; - } - } else if (e->key() == Qt::Key_Tab && e->modifiers() == Qt::NoModifier) { - LYXERR(Debug::FIND, "Focusing replace WA"); - replace_work_area_->setFocus(); + else + on_replaceNextPB_clicked(); return true; } - } - if (obj == replace_work_area_ && event->type() == QEvent::KeyPress) { - QKeyEvent *e = static_cast (event); - if (e->key() == Qt::Key_Escape && e->modifiers() == Qt::NoModifier) { - on_closePB_clicked(); - return true; - } else if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { - if (e->modifiers() == Qt::ShiftModifier) { - on_replacePrevPB_clicked(); - return true; - } else if (e->modifiers() == Qt::NoModifier) { - on_replaceNextPB_clicked(); + break; + + case Qt::Key_Tab: + if (e->modifiers() == Qt::NoModifier) { + if (obj == find_work_area_){ + LYXERR(Debug::FIND, "Focusing replace WA"); + replace_work_area_->setFocus(); return true; } - } else if (e->key() == Qt::Key_Backtab) { + } + break; + + case Qt::Key_Backtab: + if (obj == replace_work_area_) { LYXERR(Debug::FIND, "Focusing find WA"); find_work_area_->setFocus(); return true; } + break; + + default: + break; } // standard event processing return QWidget::eventFilter(obj, event); } + static docstring buffer_to_latex(Buffer & buffer) { OutputParams runparams(&buffer.params().encoding()); odocstringstream os; @@ -119,8 +152,10 @@ static docstring buffer_to_latex(Buffer & buffer) { ParagraphList::const_iterator pit = buffer.paragraphs().begin(); ParagraphList::const_iterator const end = buffer.paragraphs().end(); for (; pit != end; ++pit) { - TeXOnePar(buffer, buffer.text(), pit, os, buffer.texrow(), runparams); - LYXERR(Debug::FIND, "searchString up to here: " << os.str()); + TeXOnePar(buffer, buffer.text(), + pit, os, buffer.texrow(), runparams); + LYXERR(Debug::FIND, "searchString up to here: " + << os.str()); } return os.str(); } @@ -129,8 +164,9 @@ static docstring buffer_to_latex(Buffer & buffer) { static vector const & allManualsFiles() { static vector v; static const char * files[] = { - "Intro", "UserGuide", "Tutorial", "Additional", "EmbeddedObjects", - "Math", "Customization", "Shortcuts", "LFUNs", "LaTeXConfig" + "Intro", "UserGuide", "Tutorial", "Additional", + "EmbeddedObjects", "Math", "Customization", "Shortcuts", + "LFUNs", "LaTeXConfig" }; if (v.empty()) { FileName fname; @@ -157,7 +193,10 @@ static bool next_document_buffer(Buffer * & p_buf) { do { p_old = p_master; p_master = const_cast(p_master->masterBuffer()); - LYXERR(Debug::FIND, "p_old=" << p_old << ", p_master=" << p_master); + LYXERR(Debug::FIND, "p_old=" + << p_old + << ", p_master=" + << p_master); } while (p_master != p_old); LASSERT(p_master != NULL, /**/); vector v_children; @@ -165,7 +204,8 @@ static bool next_document_buffer(Buffer * & p_buf) { v_children.push_back(p_master); p_master->getChildren(v_children, true); LYXERR(Debug::FIND, "v_children.size()=" << v_children.size()); - vector::const_iterator it = find(v_children.begin(), v_children.end(), p_buf); + vector::const_iterator it = + find(v_children.begin(), v_children.end(), p_buf); LASSERT(it != v_children.end(), /**/) ++it; if (it == v_children.end()) { @@ -191,7 +231,9 @@ static bool prev_document_buffer(Buffer * & p_buf) { do { p_old = p_master; p_master = const_cast(p_master->masterBuffer()); - LYXERR(Debug::FIND, "p_old=" << p_old << ", p_master=" << p_master); + LYXERR(Debug::FIND, + "p_old=" << p_old + << ", p_master=" << p_master); } while (p_master != p_old); LASSERT(p_master != NULL, /**/); vector v_children; @@ -199,7 +241,8 @@ static bool prev_document_buffer(Buffer * & p_buf) { v_children.push_back(p_master); p_master->getChildren(v_children, true); LYXERR(Debug::FIND, "v_children.size()=" << v_children.size()); - vector::const_iterator it = find(v_children.begin(), v_children.end(), p_buf); + vector::const_iterator it = + find(v_children.begin(), v_children.end(), p_buf); LASSERT(it != v_children.end(), /**/) if (it == v_children.begin()) { it = v_children.end(); @@ -217,7 +260,9 @@ static bool prev_document_buffer(Buffer * & p_buf) { ** ** Return true if restarted from scratch. **/ -static bool next_prev_buffer(Buffer * & buf, FindAndReplaceOptions const & opt) { +static bool next_prev_buffer(Buffer * & buf, + FindAndReplaceOptions const & opt) +{ bool restarted = false; switch (opt.scope) { case FindAndReplaceOptions::S_BUFFER: @@ -240,7 +285,8 @@ static bool next_prev_buffer(Buffer * & buf, FindAndReplaceOptions const & opt) break; case FindAndReplaceOptions::S_ALL_MANUALS: vector const & v = allManualsFiles(); - vector::const_iterator it = find(v.begin(), v.end(), buf->absFileName()); + vector::const_iterator it = + find(v.begin(), v.end(), buf->absFileName()); if (it == v.end()) { it = v.begin(); } else if (opt.forward) { @@ -257,8 +303,11 @@ static bool next_prev_buffer(Buffer * & buf, FindAndReplaceOptions const & opt) --it; } FileName const & fname = FileName(*it); - if (!theBufferList().exists(fname)) + if (!theBufferList().exists(fname)) { + guiApp->currentView()->setBusy(false); guiApp->currentView()->loadDocument(fname, false); + guiApp->currentView()->setBusy(true); + } buf = theBufferList().getBuffer(fname); break; } @@ -269,32 +318,35 @@ static bool next_prev_buffer(Buffer * & buf, FindAndReplaceOptions const & opt) /** Find the finest question message to post to the user */ docstring question_string(FindAndReplaceOptions const & opt) { - docstring cur_pos = opt.forward ? _("End") : _("Begin"); - docstring new_pos = opt.forward ? _("begin") : _("end"); docstring scope; switch (opt.scope) { case FindAndReplaceOptions::S_BUFFER: - scope = _("file"); + scope = _("file[[scope]]"); break; case FindAndReplaceOptions::S_DOCUMENT: - scope = _("master document"); + scope = _("master document[[scope]]"); break; case FindAndReplaceOptions::S_OPEN_BUFFERS: - scope = _("open files"); + scope = _("open files[[scope]]"); break; case FindAndReplaceOptions::S_ALL_MANUALS: - scope = _("manuals"); + scope = _("manuals[[scope]]"); break; } - docstring dir = opt.forward ? _("forward") : _("backwards"); - return cur_pos + _(" of ") + scope - + _(" reached while searching ") + dir + ".\n" - + "\n" - + _("Continue searching from ") + new_pos + " ?"; + docstring message = opt.forward ? + bformat(_("End of %1$s reached while searching forward.\n" + "Continue searching from the beginning?"), + scope) : + bformat(_("Beginning of %1$s reached while searching backward.\n" + "Continue searching from the end?"), + scope); + + return message; } -void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) { +void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) +{ int wrap_answer = -1; ostringstream oss; oss << opt; @@ -309,8 +361,11 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) { vector const & v = allManualsFiles(); if (std::find(v.begin(), v.end(), buf->absFileName()) == v.end()) { FileName const & fname = FileName(*v.begin()); - if (!theBufferList().exists(fname)) + if (!theBufferList().exists(fname)) { + guiApp->currentView()->setBusy(false); guiApp->currentView()->loadDocument(fname, false); + guiApp->currentView()->setBusy(true); + } buf = theBufferList().getBuffer(fname); lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, buf->absFileName())); @@ -328,7 +383,8 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) { return; } - // No match found in current buffer: select next buffer in scope, if any + // No match found in current buffer: + // select next buffer in scope, if any bool prompt = next_prev_buffer(buf, opt); if (prompt) { if (wrap_answer != -1) @@ -350,12 +406,14 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) { lyx::dispatch(FuncRequest(LFUN_BUFFER_END)); bv->cursor().setCursor(doc_iterator_end(buf)); bv->cursor().backwardPos(); - LYXERR(Debug::FIND, "findBackAdv5: cur: " << bv->cursor()); + LYXERR(Debug::FIND, "findBackAdv5: cur: " + << bv->cursor()); } bv->clearSelection(); } while (wrap_answer != 1); - lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, - buf_orig->absFileName())); + if (buf != buf_orig) + lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, + buf_orig->absFileName())); bv = view_.documentBufferView(); bv->cursor() = cur_orig; } @@ -380,25 +438,33 @@ void FindAndReplaceWidget::findAndReplace( runparams.linelen = 100000; //lyxrc.plaintext_linelen; runparams.dryrun = true; for (; it != end; ++it) { - LYXERR(Debug::FIND, "Adding to search string: '" << it->asString(false) << "'"); - searchString += it->stringify(pos_type(0), it->size(), AS_STR_INSETS, runparams); + LYXERR(Debug::FIND, "Adding to search string: '" + << it->asString(false) + << "'"); + searchString += + it->stringify(pos_type(0), it->size(), + AS_STR_INSETS, runparams); } } if (to_utf8(searchString).empty()) { buffer.message(_("Nothing to search")); return; } - bool const regexp = to_utf8(searchString).find("\\regexp") != std::string::npos; + bool const regexp = + to_utf8(searchString).find("\\regexp") != std::string::npos; docstring replaceString; if (replace) { - Buffer & repl_buffer = replace_work_area_->bufferView().buffer(); + Buffer & repl_buffer = + replace_work_area_->bufferView().buffer(); ostringstream oss; repl_buffer.write(oss); - replaceString = from_utf8(oss.str()); //buffer_to_latex(replace_buffer); + //buffer_to_latex(replace_buffer); + replaceString = from_utf8(oss.str()); } else { replaceString = from_utf8(LYX_FR_NULL_STRING); } - FindAndReplaceOptions::SearchScope scope = FindAndReplaceOptions::S_BUFFER; + FindAndReplaceOptions::SearchScope scope = + FindAndReplaceOptions::S_BUFFER; if (CurrentDocument->isChecked()) scope = FindAndReplaceOptions::S_BUFFER; else if (MasterDocument->isChecked()) @@ -420,9 +486,12 @@ void FindAndReplaceWidget::findAndReplace( << ", replaceString" << replaceString << ", keep_case=" << keep_case << ", scope=" << scope); - FindAndReplaceOptions opt(searchString, casesensitive, matchword, ! backwards, - expandmacros, ignoreformat, regexp, replaceString, keep_case, scope); + FindAndReplaceOptions opt(searchString, casesensitive, matchword, + !backwards, expandmacros, ignoreformat, + regexp, replaceString, keep_case, scope); + view_.setBusy(true); findAndReplaceScope(opt); + view_.setBusy(false); } @@ -432,7 +501,8 @@ void FindAndReplaceWidget::findAndReplace(bool backwards, bool replace) view_.message(_("No open document(s) in which to search")); return; } - // FIXME: create a Dialog::returnFocus() or something instead of this: + // FIXME: create a Dialog::returnFocus() + // or something instead of this: view_.setCurrentWorkArea(view_.currentMainWorkArea()); findAndReplace(caseCB->isChecked(), wordsCB->isChecked(), @@ -444,24 +514,19 @@ void FindAndReplaceWidget::findAndReplace(bool backwards, bool replace) } -void FindAndReplaceWidget::on_regexpInsertCombo_currentIndexChanged(int index) +void FindAndReplaceWidget::insertRegexp(QAction * action) { - static char const * regexps[] = { - ".*", ".+", "[a-z]+", "[0-9]+", "" - }; - LYXERR(Debug::FIND, "Index: " << index); - if (index >= 1 && index < 1 + int(sizeof(regexps)/sizeof(regexps[0]))) { - find_work_area_->setFocus(); - Cursor & cur = find_work_area_->bufferView().cursor(); - if (! cur.inRegexped()) - dispatch(FuncRequest(LFUN_REGEXP_MODE)); - dispatch(FuncRequest(LFUN_SELF_INSERT, regexps[index - 1])); - regexpInsertCombo->setCurrentIndex(0); - } + string const regexp = fromqstr(action->data().toString()); + LYXERR(Debug::FIND, "Regexp: " << regexp); + find_work_area_->setFocus(); + Cursor & cur = find_work_area_->bufferView().cursor(); + if (!cur.inRegexped()) + dispatch(FuncRequest(LFUN_REGEXP_MODE)); + dispatch(FuncRequest(LFUN_SELF_INSERT, regexp)); } -void FindAndReplaceWidget::on_closePB_clicked() +void FindAndReplaceWidget::hideDialog() { dispatch(FuncRequest(LFUN_DIALOG_TOGGLE, "findreplaceadv")); } @@ -518,7 +583,7 @@ void FindAndReplaceWidget::hideEvent(QHideEvent *ev) } -bool FindAndReplaceWidget::initialiseParams(std::string const & /* params */) +bool FindAndReplaceWidget::initialiseParams(std::string const & /*params*/) { return true; } @@ -526,7 +591,8 @@ bool FindAndReplaceWidget::initialiseParams(std::string const & /* params */) FindAndReplace::FindAndReplace(GuiView & parent, Qt::DockWidgetArea area, Qt::WindowFlags flags) - : DockView(parent, "Find LyX", qt_("Find LyX Dialog"), area, flags) + : DockView(parent, "Find LyX", qt_("Advanced Find and Replace"), + area, flags) { widget_ = new FindAndReplaceWidget(parent); setWidget(widget_);