]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiSearch.cpp
On Linux show in crash message box the backtrace
[lyx.git] / src / frontends / qt4 / GuiSearch.cpp
index b6c7cc74006c8a30a7aa6545c6a919ada5be8f33..712464738093463ff100f58c69f572d9717897c4 100644 (file)
 
 #include <config.h>
 
-#include "GuiSearch.h"
-
+#include "lyxfind.h"
 #include "qt_helpers.h"
-
 #include "FuncRequest.h"
-#include "lyxfind.h"
+#include "BufferView.h"
+#include "Buffer.h"
+#include "Cursor.h"
+#include "GuiSearch.h"
+#include "GuiView.h"
+
+#include "support/gettext.h"
+#include "frontends/alert.h"
 
-#include <QCloseEvent>
 #include <QLineEdit>
 #include <QShowEvent>
 
@@ -34,7 +38,7 @@ static void uniqueInsert(QComboBox * box, QString const & text)
                if (box->itemText(i) == text)
                        return;
 
-       box->addItem(text);
+       box->insertItem(0, text);
 }
 
 
@@ -65,18 +69,12 @@ GuiSearch::GuiSearch(GuiView & lv)
 
 void GuiSearch::showEvent(QShowEvent * e)
 {
+       findPB->setFocus();
        findCO->lineEdit()->selectAll();
        GuiDialog::showEvent(e);
 }
 
 
-void GuiSearch::closeEvent(QCloseEvent * e)
-{
-       slotClose();
-       GuiDialog::closeEvent(e);
-}
-
-
 void GuiSearch::findChanged()
 {
        if (findCO->currentText().isEmpty()) {
@@ -122,12 +120,49 @@ void GuiSearch::replaceallClicked()
 }
 
 
+void GuiSearch::wrap_dispatch(const FuncRequest & func, bool forward)
+{
+       dispatch(func);
+
+       BufferView * bv = const_cast<BufferView *>(bufferview());
+
+       if (!bv->cursor().result().dispatched()) {
+               GuiView & lv = *const_cast<GuiView *>(&lyxview());
+               DocIterator cur_orig(bv->cursor());
+               docstring q;
+               if (forward)
+                       q = _("End of file reached while searching forward.\n"
+                         "Continue searching from the beginning?");
+               else
+                       q = _("Beginning of file reached while searching backward.\n"
+                         "Continue searching from the end?");
+               int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
+                       q, 0, 1, _("&Yes"), _("&No"));
+               if (wrap_answer == 0) {
+                       if (forward) {
+                               bv->cursor().clear();
+                               bv->cursor().push_back(CursorSlice(bv->buffer().inset()));
+                       } else {
+                               bv->cursor().setCursor(doc_iterator_end(&bv->buffer()));
+                               bv->cursor().backwardPos();
+                       }
+                       bv->clearSelection();
+                       dispatch(func);
+                       if (bv->cursor().result().dispatched())
+                               return;
+               }
+               bv->cursor().setCursor(cur_orig);
+               lv.message(_("String not found."));
+       }
+}
+
+
 void GuiSearch::find(docstring const & search, bool casesensitive,
                         bool matchword, bool forward)
 {
        docstring const data =
                find2string(search, casesensitive, matchword, forward);
-       dispatch(FuncRequest(LFUN_WORD_FIND, data));
+       wrap_dispatch(FuncRequest(LFUN_WORD_FIND, data), forward);
 }
 
 
@@ -136,11 +171,12 @@ void GuiSearch::replace(docstring const & search, docstring const & replace,
                            bool forward, bool all)
 {
        docstring const data =
-               replace2string(search, replace, casesensitive,
+               replace2string(replace, search, casesensitive,
                                     matchword, all, forward);
-       dispatch(FuncRequest(LFUN_WORD_REPLACE, data));
+       wrap_dispatch(FuncRequest(LFUN_WORD_REPLACE, data), forward);
 }
 
+
 Dialog * createGuiSearch(GuiView & lv) { return new GuiSearch(lv); }
 
 
@@ -148,4 +184,4 @@ Dialog * createGuiSearch(GuiView & lv) { return new GuiSearch(lv); }
 } // namespace lyx
 
 
-#include "GuiSearch_moc.cpp"
+#include "moc_GuiSearch.cpp"