]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/FindAndReplace.cpp
Cleanup private part of Layout Box on destructor (probably not really an
[lyx.git] / src / frontends / qt4 / FindAndReplace.cpp
index 18fffa605e8640caf925459a61328ed141c1832d..0801d4b66420798dd1dd28a234b9b91678d5ecb9 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "BufferParams.h"
 #include "BufferList.h"
+#include "TextClass.h"
 #include "Cursor.h"
 #include "FuncRequest.h"
 #include "lyxfind.h"
@@ -45,22 +46,8 @@ namespace lyx {
 namespace frontend {
 
 
-/// Apply to buf the parameters supplied through bp
-static void ApplyParams(Buffer &buf, BufferParams const & bp) {
-       ostringstream ss;
-       ss << "\\begin_header\n";
-       bp.writeFile(ss);
-       ss << "\\end_header\n";
-       istringstream iss(ss.str());
-       Lexer lex;
-       lex.setStream(iss);
-       int unknown_tokens = buf.readHeader(lex);
-       LASSERT(unknown_tokens == 0, /* */);
-}
-
-
 FindAndReplaceWidget::FindAndReplaceWidget(GuiView & view)
-       :       view_(view)
+       : QTabWidget(&view), view_(view)
 {
        setupUi(this);
        find_work_area_->setGuiView(view_);
@@ -170,7 +157,7 @@ static bool nextDocumentBuffer(Buffer * & buf)
        LYXERR(Debug::FIND, "children.size()=" << children.size());
        ListOfBuffers::const_iterator it =
                find(children.begin(), children.end(), buf);
-       LASSERT(it != children.end(), /**/)
+       LASSERT(it != children.end(), /**/);
        ++it;
        if (it == children.end()) {
                buf = *children.begin();
@@ -293,11 +280,12 @@ docstring getQuestionString(FindAndReplaceOptions const & opt)
 }
 
 
-void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt)
+/// Return true if a match was found
+bool FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt, bool replace_all)
 {
        BufferView * bv = view_.documentBufferView();
        if (!bv)
-               return;
+               return false;
        Buffer * buf = &bv->buffer();
        Buffer * buf_orig = &bv->buffer();
        DocIterator cur_orig(bv->cursor());
@@ -331,8 +319,10 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt)
                LYXERR(Debug::FIND, "dispatched");
                if (bv->cursor().result().dispatched()) {
                        // New match found and selected (old selection replaced if needed)
+                       if (replace_all)
+                               continue;
                        view_.setBusy(false);
-                       return;
+                       return true;
                }
 
                // No match found in current buffer (however old selection might have been replaced)
@@ -375,20 +365,22 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt)
                cur_orig.pos() = cur_orig.lastpos();
        bv->cursor().setCursor(cur_orig);
        view_.setBusy(false);
+       return false;
 }
 
 
-void FindAndReplaceWidget::findAndReplace(
+/// Return true if a match was found
+bool FindAndReplaceWidget::findAndReplace(
        bool casesensitive, bool matchword, bool backwards,
        bool expandmacros, bool ignoreformat, bool replace,
-       bool keep_case)
+       bool keep_case, bool replace_all)
 {
        Buffer & find_buf = find_work_area_->bufferView().buffer();
        docstring const & find_buf_name = find_buf.fileName().absoluteFilePath();
 
        if (find_buf.text().empty()) {
                view_.message(_("Nothing to search"));
-               return;
+               return false;
        }
 
        Buffer & repl_buf = replace_work_area_->bufferView().buffer();
@@ -420,15 +412,15 @@ void FindAndReplaceWidget::findAndReplace(
        FindAndReplaceOptions opt(find_buf_name, casesensitive, matchword,
                                  !backwards, expandmacros, ignoreformat,
                                  repl_buf_name, keep_case, scope);
-       findAndReplaceScope(opt);
+       return findAndReplaceScope(opt, replace_all);
 }
 
 
-void FindAndReplaceWidget::findAndReplace(bool backwards, bool replace)
+bool FindAndReplaceWidget::findAndReplace(bool backwards, bool replace, bool replace_all)
 {
        if (! view_.currentMainWorkArea()) {
                view_.message(_("No open document(s) in which to search"));
-               return;
+               return false;
        }
        // Finalize macros that are being typed, both in main document and in search or replacement WAs
        if (view_.currentWorkArea()->bufferView().cursor().macroModeClose())
@@ -439,13 +431,14 @@ void FindAndReplaceWidget::findAndReplace(bool backwards, bool replace)
        // FIXME: create a Dialog::returnFocus()
        // or something instead of this:
        view_.setCurrentWorkArea(view_.currentMainWorkArea());
-       findAndReplace(caseCB->isChecked(),
+       return findAndReplace(caseCB->isChecked(),
                wordsCB->isChecked(),
                backwards,
                expandMacrosCB->isChecked(),
                ignoreFormatCB->isChecked(),
                replace,
-               keepCaseCB->isChecked());
+               keepCaseCB->isChecked(),
+               replace_all);
 }
 
 
@@ -471,29 +464,33 @@ void FindAndReplaceWidget::on_replacePB_clicked()
 
 void FindAndReplaceWidget::on_replaceallPB_clicked()
 {
+       findAndReplace(searchbackCB->isChecked(), true, true);
        replace_work_area_->setFocus();
 }
 
 
+/** Copy selected elements from bv's BufferParams to the dest_bv's one
+ ** We don't want to copy'em all, e.g., not the default master **/
+static void copy_params(BufferView const & bv, BufferView & dest_bv) {
+       Buffer const & doc_buf = bv.buffer();
+       BufferParams const & doc_bp = doc_buf.params();
+       string const & lang = doc_bp.language->lang();
+       string const & doc_class = doc_bp.documentClass().name();
+       Buffer & dest_buf = dest_bv.buffer();
+       dest_buf.params().setLanguage(lang);
+       dest_buf.params().setBaseClass(doc_class);
+       dest_buf.params().makeDocumentClass();
+       dest_bv.cursor().current_font.setLanguage(doc_bp.language);
+}
+
+
 void FindAndReplaceWidget::showEvent(QShowEvent * /* ev */)
 {
        LYXERR(Debug::DEBUG, "showEvent()" << endl);
        BufferView * bv = view_.documentBufferView();
        if (bv) {
-               Buffer & doc_buf = bv->buffer();
-               BufferParams & doc_bp = doc_buf.params();
-               Buffer & find_buf = find_work_area_->bufferView().buffer();
-               LYXERR(Debug::FIND, "Applying document params to find buffer");
-               ApplyParams(find_buf, doc_bp);
-               Buffer & replace_buf = replace_work_area_->bufferView().buffer();
-               LYXERR(Debug::FIND, "Applying document params to replace buffer");
-               ApplyParams(replace_buf, doc_bp);
-
-               string lang = doc_bp.language->lang();
-               LYXERR(Debug::FIND, "Setting current editing language to " << lang << endl);
-               FuncRequest cmd(LFUN_LANGUAGE, lang);
-               find_buf.text().dispatch(find_work_area_->bufferView().cursor(), cmd);
-               replace_buf.text().dispatch(replace_work_area_->bufferView().cursor(), cmd);
+               copy_params(*bv, find_work_area_->bufferView());
+               copy_params(*bv, replace_work_area_->bufferView());
        }
 
        find_work_area_->installEventFilter(this);