X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FFindAndReplace.cpp;h=7164aa25db6b20f1e0b6814f5701e54dd80470b8;hb=31d6e4a9fc3937bc4c32cfdaff5beef3573cc85c;hp=a1314e120ff36399bd43a6007c4846d7ed1329f2;hpb=09738dbba43faca1dbf9de0125135b7ee645f7ad;p=lyx.git diff --git a/src/frontends/qt4/FindAndReplace.cpp b/src/frontends/qt4/FindAndReplace.cpp index a1314e120f..7164aa25db 100644 --- a/src/frontends/qt4/FindAndReplace.cpp +++ b/src/frontends/qt4/FindAndReplace.cpp @@ -26,7 +26,6 @@ #include "output_latex.h" #include "TexRow.h" -#include "support/convert.h" #include "support/debug.h" #include "support/FileName.h" #include "support/gettext.h" @@ -43,19 +42,29 @@ using namespace lyx::support; namespace lyx { namespace frontend { -FindAndReplace::FindAndReplace(GuiView & parent) - : DockView(parent, "Find LyX", "Find LyX Dialog", Qt::RightDockWidgetArea), - parent_view_(parent) + +FindAndReplaceWidget::FindAndReplaceWidget(GuiView & view) + : view_(view) { setupUi(this); - find_work_area_->setGuiView(parent_view_); +#if QT_VERSION < 0x040400 + scrollArea->setWidget(scrollAreaWidgetContents); +#endif + find_work_area_->setGuiView(view_); find_work_area_->init(); + setFocusProxy(find_work_area_); + replace_work_area_->setGuiView(view_); + replace_work_area_->init(); + // We don't want two cursors blinking. + replace_work_area_->stopBlinkingCursor(); } -bool FindAndReplace::eventFilter(QObject *obj, QEvent *event) +bool FindAndReplaceWidget::eventFilter(QObject *obj, QEvent *event) { - LYXERR(Debug::DEBUG, "FindAndReplace::eventFilter()" << std::endl); + LYXERR(Debug::FIND, "FindAndReplace::eventFilter(): obj=" << obj + << ", fwa=" << find_work_area_ << ", rwa=" << replace_work_area_ + << "fsa=" << find_scroll_area_ << ", rsa=" << replace_scroll_area_); if (obj == find_work_area_ && event->type() == QEvent::KeyPress) { QKeyEvent *e = static_cast (event); if (e->key() == Qt::Key_Escape && e->modifiers() == Qt::NoModifier) { @@ -69,107 +78,144 @@ bool FindAndReplace::eventFilter(QObject *obj, QEvent *event) 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(); + 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(); + return true; + } + } else if (e->key() == Qt::Key_Backtab) { + LYXERR(Debug::FIND, "Focusing find WA"); + find_work_area_->setFocus(); + return true; } } // standard event processing - return QObject::eventFilter(obj, event); + return QWidget::eventFilter(obj, event); } - -void FindAndReplace::selectAll() -{ - dispatch(FuncRequest(LFUN_BUFFER_BEGIN)); - dispatch(FuncRequest(LFUN_BUFFER_END_SELECT)); - find_work_area_->redraw(); +static docstring buffer_to_latex(Buffer & buffer) { + OutputParams runparams(&buffer.params().encoding()); + odocstringstream os; + runparams.nice = true; + runparams.flavor = OutputParams::LATEX; + runparams.linelen = 80; //lyxrc.plaintext_linelen; + // No side effect of file copying and image conversion + runparams.dryrun = true; + buffer.texrow().reset(); + 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()); + } + return os.str(); } - -void FindAndReplace::findAdv(bool casesensitive, - bool matchword, bool backwards, - bool expandmacros, bool ignoreformat) +void FindAndReplaceWidget::findAndReplace( + bool casesensitive, bool matchword, bool backwards, + bool expandmacros, bool ignoreformat, bool replace, + bool keep_case) { Buffer & buffer = find_work_area_->bufferView().buffer(); docstring searchString; if (!ignoreformat) { + searchString = buffer_to_latex(buffer); + } else { + ParIterator it = buffer.par_iterator_begin(); + ParIterator end = buffer.par_iterator_end(); OutputParams runparams(&buffer.params().encoding()); odocstringstream os; runparams.nice = true; runparams.flavor = OutputParams::LATEX; - runparams.linelen = 80; //lyxrc.plaintext_linelen; - // No side effect of file copying and image conversion + runparams.linelen = 100000; //lyxrc.plaintext_linelen; runparams.dryrun = true; - buffer.texrow().reset(); -// latexParagraphs(buffer, buffer.paragraphs(), os, buffer.texrow(), runparams); - 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); - LYXERR0("searchString up to here: " << os.str()); - } - searchString = os.str(); - } else { - ParIterator it = buffer.par_iterator_begin(); - ParIterator end = buffer.par_iterator_end(); for (; it != end; ++it) { - LYXERR0("Adding to search string: '" << it->asString(false) << "'"); - searchString += it->asString(AS_STR_INSETS); + LYXERR(Debug::FIND, "Adding to search string: '" << it->asString(false) << "'"); + searchString += it->stringify(pos_type(0), it->size(), AS_STR_INSETS, runparams); } } -// lyxerr << "Searching for '" << to_utf8(searchString) << "'" << std::endl; if (to_utf8(searchString).empty()) { buffer.message(_("Nothing to search")); return; } bool const regexp = to_utf8(searchString).find("\\regexp") != std::string::npos; - FindAdvOptions opt(searchString, casesensitive, matchword, ! backwards, - expandmacros, ignoreformat, regexp); - std::cerr << "Dispatching LFUN_WORD_FINDADV" << std::endl; + docstring replaceString; + if (replace) { + Buffer & repl_buffer = replace_work_area_->bufferView().buffer(); + ostringstream oss; + repl_buffer.write(oss); + replaceString = from_utf8(oss.str()); //buffer_to_latex(replace_buffer); + } else { + replaceString = from_utf8(LYX_FR_NULL_STRING); + } + FindAndReplaceOptions::SearchScope scope = FindAndReplaceOptions::S_BUFFER; + if (CurrentDocument->isChecked()) + scope = FindAndReplaceOptions::S_BUFFER; + else if (MasterDocument->isChecked()) + scope = FindAndReplaceOptions::S_DOCUMENT; + else if (OpenDocuments->isChecked()) + scope = FindAndReplaceOptions::S_OPEN_BUFFERS; + else + LASSERT(false, /**/); + LYXERR(Debug::FIND, "FindAndReplaceOptions: " + << "searchstring=" << searchString + << ", casesensitiv=" << casesensitive + << ", matchword=" << matchword + << ", backwards=" << backwards + << ", expandmacros=" << expandmacros + << ", ignoreformat=" << ignoreformat + << ", regexp=" << regexp + << ", replaceString" << replaceString + << ", keep_case=" << keep_case + << ", scope=" << scope); + FindAndReplaceOptions opt(searchString, casesensitive, matchword, ! backwards, + expandmacros, ignoreformat, regexp, replaceString, keep_case, scope); + LYXERR(Debug::FIND, "Dispatching LFUN_WORD_FINDADV"); std::ostringstream oss; oss << opt; - std::cerr << "Dispatching LFUN_WORD_FINDADV" << std::endl; + LYXERR(Debug::FIND, "Dispatching LFUN_WORD_FINDADV"); dispatch(FuncRequest(LFUN_WORD_FINDADV, from_utf8(oss.str()))); - - // findAdv(&theApp()->currentView()->currentWorkArea()->bufferView(), - // searchString, len, casesensitive, matchword, ! backwards, expandmacros); -} - - -void FindAndReplace::showEvent(QShowEvent *ev) -{ - selectAll(); - QWidget::showEvent(ev); } -void FindAndReplace::hideEvent(QHideEvent *ev) +void FindAndReplaceWidget::findAndReplace(bool backwards, bool replace) { - LYXERR(Debug::DEBUG, "FindAndReplace::hideEvent"); - find_work_area_->removeEventFilter(this); - find_work_area_->disable(); - this->QWidget::hideEvent(ev); -} - - -void FindAndReplace::find(bool backwards) -{ - parent_view_.setCurrentWorkArea(parent_view_.currentMainWorkArea()); - findAdv(caseCB->isChecked(), - wordsCB->isChecked(), - backwards, - expandMacrosCB->isChecked(), - ignoreFormatCB->isChecked()); - parent_view_.currentMainWorkArea()->redraw(); - parent_view_.setCurrentWorkArea(find_work_area_); - find_work_area_->setFocus(); + if (! view_.currentMainWorkArea()) { + view_.message(_("No open document(s) in which to search")); + return; + } + // FIXME: create a Dialog::returnFocus() or something instead of this: + view_.setCurrentWorkArea(view_.currentMainWorkArea()); + findAndReplace(caseCB->isChecked(), + wordsCB->isChecked(), + backwards, + expandMacrosCB->isChecked(), + ignoreFormatCB->isChecked(), + replace, + keepCaseCB->isChecked()); } -void FindAndReplace::on_regexpInsertCombo_currentIndexChanged(int index) +void FindAndReplaceWidget::on_regexpInsertCombo_currentIndexChanged(int index) { static char const * regexps[] = { - ".*", ".+", "[a-z]+", "[0-9]+" + ".*", ".+", "[a-z]+", "[0-9]+", "" }; - //lyxerr << "Index: " << index << std::endl; + 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(); @@ -181,36 +227,95 @@ void FindAndReplace::on_regexpInsertCombo_currentIndexChanged(int index) } -void FindAndReplace::on_closePB_clicked() +void FindAndReplaceWidget::on_closePB_clicked() { - find_work_area_->disable(); - LYXERR(Debug::DEBUG, "Dispatching dialog-hide findreplaceadv" << std::endl); - parent_view_.dispatch(FuncRequest(LFUN_DIALOG_TOGGLE, "findreplaceadv")); + dispatch(FuncRequest(LFUN_DIALOG_TOGGLE, "findreplaceadv")); +} + + +void FindAndReplaceWidget::on_findNextPB_clicked() { + findAndReplace(false, false); + find_work_area_->setFocus(); +} + + +void FindAndReplaceWidget::on_findPrevPB_clicked() { + findAndReplace(true, false); + find_work_area_->setFocus(); } -void FindAndReplace::on_findNextPB_clicked() { - find(false); +void FindAndReplaceWidget::on_replaceNextPB_clicked() +{ + findAndReplace(false, true); + replace_work_area_->setFocus(); } -void FindAndReplace::on_findPrevPB_clicked() { - find(true); +void FindAndReplaceWidget::on_replacePrevPB_clicked() +{ + findAndReplace(true, true); + replace_work_area_->setFocus(); } -void FindAndReplace::on_replacePB_clicked() +void FindAndReplaceWidget::on_replaceallPB_clicked() { + replace_work_area_->setFocus(); } -void FindAndReplace::on_replaceallPB_clicked() +void FindAndReplaceWidget::showEvent(QShowEvent * /* ev */) { + view_.setCurrentWorkArea(find_work_area_); + LYXERR(Debug::FIND, "Selecting entire find buffer"); + dispatch(FuncRequest(LFUN_BUFFER_BEGIN)); + dispatch(FuncRequest(LFUN_BUFFER_END_SELECT)); + find_work_area_->installEventFilter(this); + replace_work_area_->installEventFilter(this); } + +void FindAndReplaceWidget::hideEvent(QHideEvent *ev) +{ + replace_work_area_->removeEventFilter(this); + find_work_area_->removeEventFilter(this); + this->QWidget::hideEvent(ev); +} + + +bool FindAndReplaceWidget::initialiseParams(std::string const & /* params */) +{ + return true; +} + + +FindAndReplace::FindAndReplace(GuiView & parent, + Qt::DockWidgetArea area, Qt::WindowFlags flags) + : DockView(parent, "Find LyX", qt_("Find LyX Dialog"), area, flags) +{ + widget_ = new FindAndReplaceWidget(parent); + setWidget(widget_); + setFocusProxy(widget_); +} + + +FindAndReplace::~FindAndReplace() +{ + setFocusProxy(0); + delete widget_; +} + + +bool FindAndReplace::initialiseParams(std::string const & params) +{ + return widget_->initialiseParams(params); +} + + Dialog * createGuiSearchAdv(GuiView & lv) { - return new FindAndReplace(lv); + return new FindAndReplace(lv, Qt::RightDockWidgetArea); }