Author: jghali
Date: Thu Dec  5 06:36:39 2019
New Revision: 23396

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23396
Log:
#11369: Scribus doesn't show the search results outside the viewport or outside 
of linked textframe

Modified:
    trunk/Scribus/scribus/canvasmode_edit.cpp
    trunk/Scribus/scribus/canvasmode_edittable.cpp
    trunk/Scribus/scribus/pageitem.cpp
    trunk/Scribus/scribus/pageitem.h
    trunk/Scribus/scribus/scribus.cpp
    trunk/Scribus/scribus/scribusdoc.cpp
    trunk/Scribus/scribus/scribusdoc.h
    trunk/Scribus/scribus/scribusview.cpp
    trunk/Scribus/scribus/scribusview.h
    trunk/Scribus/scribus/text/storytext.cpp
    trunk/Scribus/scribus/text/storytext.h
    trunk/Scribus/scribus/ui/search.cpp
    trunk/Scribus/scribus/ui/search.h

Modified: trunk/Scribus/scribus/canvasmode_edit.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/canvasmode_edit.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasmode_edit.cpp   (original)
+++ trunk/Scribus/scribus/canvasmode_edit.cpp   Thu Dec  5 06:36:39 2019
@@ -378,8 +378,7 @@
                                }
                                else
                                {
-                                       int newPos = 
currItem->itemText.selectWord(oldCp);
-                                       
currItem->itemText.setCursorPosition(newPos);
+                                       currItem->itemText.selectWord(oldCp);
                                }
                        }
                        currItem->HasSel = currItem->itemText.isSelected();

Modified: trunk/Scribus/scribus/canvasmode_edittable.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/canvasmode_edittable.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasmode_edittable.cpp      (original)
+++ trunk/Scribus/scribus/canvasmode_edittable.cpp      Thu Dec  5 06:36:39 2019
@@ -342,8 +342,7 @@
        {
                // Regular double click selects a word.
                m_lastCursorPos = textFrame->itemText.cursorPosition();
-               uint pos = 
textFrame->itemText.selectWord(textFrame->itemText.cursorPosition());
-               textFrame->itemText.setCursorPosition(pos);
+               
textFrame->itemText.selectWord(textFrame->itemText.cursorPosition());
        }
 
        updateCanvas(true);

Modified: trunk/Scribus/scribus/pageitem.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/pageitem.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem.cpp  (original)
+++ trunk/Scribus/scribus/pageitem.cpp  Thu Dec  5 06:36:39 2019
@@ -1183,6 +1183,30 @@
        checkChanges();
 }
 
+
+/// tests if a character is displayed by this frame
+bool PageItem::frameDisplays(int textpos) const
+{
+       return 0 <= textpos && textpos < signed(m_maxChars) && textpos < 
itemText.length();
+}
+
+PageItem* PageItem::frameOfChar(int textPos)
+{
+       PageItem* firstFrame = this->firstInChain();
+       PageItem* nextFrame = firstFrame;
+
+       while (nextFrame)
+       {
+               if (nextFrame->invalid)
+                       nextFrame->layout();
+               if (nextFrame->frameDisplays(textPos))
+                       return nextFrame;
+               nextFrame = nextFrame->nextInChain();
+       }
+
+       return nullptr;
+}
+
 //return frame where is text end
 PageItem * PageItem::frameTextEnd()
 {
@@ -1531,13 +1555,6 @@
                undoManager->action(this, is);
        }
 }
-
-/// tests if a character is displayed by this frame
-bool PageItem::frameDisplays(int textpos) const
-{
-       return 0 <= textpos && textpos < signed(m_maxChars) && textpos < 
itemText.length();
-}
-
 
 /// returns the style at the current charpos
 const ParagraphStyle& PageItem::currentStyle() const
@@ -7634,7 +7651,7 @@
 
 void PageItem::replaceNamedResources(ResourceCollection& newNames)
 {
-       QMap<QString,QString>::ConstIterator it;
+       QMap<QString, QString>::ConstIterator it;
        
        it = newNames.colors().find(softShadowColor());
        if (it != newNames.colors().end())

Modified: trunk/Scribus/scribus/pageitem.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/pageitem.h
==============================================================================
--- trunk/Scribus/scribus/pageitem.h    (original)
+++ trunk/Scribus/scribus/pageitem.h    Thu Dec  5 06:36:39 2019
@@ -404,6 +404,10 @@
        virtual void invalidateLayout() { invalid = true; }
        /// creates valid layout information
        virtual void layout() {}
+        ///< tests if a character is displayed by this frame
+       bool frameDisplays(int textpos) const;
+       /// get frame where is displayed text char in a chain
+       PageItem* frameOfChar(int textPos);
        /// returns frame where is text end
        PageItem * frameTextEnd();
        /// returns true if text overflows
@@ -418,7 +422,7 @@
        /// returns index of last char displayed in this frame, used to be 
MaxChars-1
        int lastInFrame() const;
 
-       bool frameDisplays(int textpos) const; ///< tests if a character is 
displayed by this fram
+       
        const ParagraphStyle& currentStyle() const; ///< returns the style at 
the current charpos
        ParagraphStyle& changeCurrentStyle(); ///< returns the style at the 
current charpos
        /// returns the style at the current charpos

Modified: trunk/Scribus/scribus/scribus.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/scribus.cpp
==============================================================================
--- trunk/Scribus/scribus/scribus.cpp   (original)
+++ trunk/Scribus/scribus/scribus.cpp   Thu Dec  5 06:36:39 2019
@@ -8453,14 +8453,26 @@
 
 void ScribusMainWindow::SearchText()
 {
+       bool wasModeEdit = (doc->appMode == modeEdit);
+
        PageItem *currItem = doc->m_Selection->itemAt(0);
-       view->requestMode(modeEdit);
-       currItem->itemText.setCursorPosition(0);
+       if (!wasModeEdit)
+       {
+               view->requestMode(modeEdit);
+               currItem->itemText.setCursorPosition(0);
+       }
+       
        SearchReplace* dia = new SearchReplace(this, doc, currItem);
+       if (wasModeEdit)
+       {
+               QString selText = currItem->itemText.selectedText();
+               if (!selText.isEmpty())
+                       dia->setSearchedText(selText);
+       }
        dia->exec();
        dia->disconnect();
        delete dia;
-       slotSelect();
+       //slotSelect();
 }
 
 /* call gimp and wait upon completion */

Modified: trunk/Scribus/scribus/scribusdoc.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/scribusdoc.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.cpp        (original)
+++ trunk/Scribus/scribus/scribusdoc.cpp        Thu Dec  5 06:36:39 2019
@@ -16138,6 +16138,25 @@
        return m_tserializer;
 }
 
+bool ScribusDoc::textCanvasPosition(PageItem* item, int textPos, QPointF& 
canvasPos)
+{
+       canvasPos = QPointF();
+
+       if (!item->isTextFrame() && !item->isPathText() && !item->isNoteFrame())
+               return false;
+
+       PageItem *charFrame = item->frameOfChar(textPos);
+       if (!charFrame)
+               return false;
+
+       QLineF charPos = charFrame->textLayout.positionToPoint(textPos);
+
+       QTransform itemTransform = charFrame->getTransform();
+       canvasPos = itemTransform.map(QPointF(charPos.x1(), charPos.y1()));
+
+       return true;
+}
+
 void ScribusDoc::setRotationMode(int val)
 {
        if (m_rotMode == val)

Modified: trunk/Scribus/scribus/scribusdoc.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/scribusdoc.h
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.h  (original)
+++ trunk/Scribus/scribus/scribusdoc.h  Thu Dec  5 06:36:39 2019
@@ -1212,6 +1212,9 @@
        //! \brief Returns a text serializer for this document, used to paste 
text chunks
        Serializer *textSerializer();
 
+       //! \brief Retrieve canvas position of text char in specified text chain
+       bool textCanvasPosition(PageItem* item, int textPos, QPointF& 
canvasPos);
+
        //! \brief Get rotation mode
        int rotationMode() const {return m_rotMode;}
        //! \brief Set rotation mode
@@ -1221,6 +1224,7 @@
        // unncessary signals when doing updates on multiple items
        void beginUpdate();
        void endUpdate();
+
        int addToInlineFrames(PageItem *item);
        void removeInlineFrame(int fIndex);
        void checkItemForFrames(PageItem *it, int fIndex);

Modified: trunk/Scribus/scribus/scribusview.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/scribusview.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusview.cpp       (original)
+++ trunk/Scribus/scribus/scribusview.cpp       Thu Dec  5 06:36:39 2019
@@ -2253,11 +2253,11 @@
 /*!
   returns the visible part of the canvas in canvas coordinates
  */
-QRectF ScribusView::visibleCanvas() const
+QRectF ScribusView::visibleCanvasRect() const
 {
        double scale = m_canvas->scale();
-       return QRectF(horizontalScrollBar()->value() / scale,
-                                 verticalScrollBar()->value() / scale,
+       return QRectF(horizontalScrollBar()->value() / scale + 
Doc->minCanvasCoordinate.x(),
+                                 verticalScrollBar()->value() / scale + 
Doc->minCanvasCoordinate.y(),
                                  viewport()->width() / scale,
                                  viewport()->height() / scale);
 }

Modified: trunk/Scribus/scribus/scribusview.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/scribusview.h
==============================================================================
--- trunk/Scribus/scribus/scribusview.h (original)
+++ trunk/Scribus/scribus/scribusview.h Thu Dec  5 06:36:39 2019
@@ -199,7 +199,7 @@
        void setCanvasOrigin(double x, double y);
        void setCanvasCenter(double x, double y);
        FPoint canvasOrigin() const;
-       QRectF visibleCanvas() const;
+       QRectF visibleCanvasRect() const;
        void setRedrawMarkerShown(bool shown);
        
 private:

Modified: trunk/Scribus/scribus/text/storytext.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/text/storytext.cpp
==============================================================================
--- trunk/Scribus/scribus/text/storytext.cpp    (original)
+++ trunk/Scribus/scribus/text/storytext.cpp    Thu Dec  5 06:36:39 2019
@@ -741,9 +741,43 @@
        invalidate(pos, pos + 1);
 }
 
+void StoryText::replaceSelection(const QString& newText)
+{
+       if (selectionLength() <= 0)
+               return;
+
+       int selStart = startOfSelection();
+       int selLength = selectionLength();
+
+       int lengthDiff = newText.length() - selLength;
+       if (lengthDiff == 0)
+       {
+               for (int i = 0; i < selLength; ++i)
+                       replaceChar(selStart + i, newText[i]);
+       }
+       else if (lengthDiff > 0)
+       {
+               for (int i = 0; i < selLength; ++i)
+                       replaceChar(selStart + i, newText[i]);
+               for (int i = selLength; i < newText.length(); ++i)
+                       insertChars(selStart + i, newText.mid(i, 1), true);
+       }
+       else
+       {
+               for (int i = 0; i < newText.length(); ++i)
+                       replaceChar(selStart + i, newText[i]);
+               removeChars(selStart + newText.length(), -lengthDiff);
+       }
+
+       deselectAll();
+       if (newText.length() > 0)
+               select(selStart, newText.length());
+       setCursorPosition(selStart + newText.length());
+}
+
 int StoryText::replaceWord(int pos, QString newWord)
 {
-       int eoWord=pos;
+       int eoWord = pos;
        while (eoWord < length())
        {
                if (text(eoWord).isLetterOrNumber() || 
SpecialChars::isIgnorableCodePoint(text(eoWord).unicode()))
@@ -756,23 +790,20 @@
        if (lengthDiff == 0)
        {
                for (int j = 0; j < word.length(); ++j)
-                       replaceChar(pos+j, newWord[j]);
+                       replaceChar(pos + j, newWord[j]);
+       }
+       else if (lengthDiff > 0)
+       {
+               for (int j = 0; j < word.length(); ++j)
+                       replaceChar(pos + j, newWord[j]);
+               for (int j = word.length(); j < newWord.length(); ++j)
+                       insertChars(pos + j, newWord.mid(j, 1), true);
        }
        else
        {
-               if (lengthDiff>0)
-               {
-                       for (int j = 0; j < word.length(); ++j)
-                               replaceChar(pos+j, newWord[j]);
-                       for (int j = word.length(); j < newWord.length(); ++j)
-                               insertChars(pos+j, newWord.mid(j,1), true);
-               }
-               else
-               {
-                       for (int j = 0; j < newWord.length(); ++j)
-                               replaceChar(pos+j, newWord[j]);
-                       removeChars(pos+newWord.length(), -lengthDiff);
-               }
+               for (int j = 0; j < newWord.length(); ++j)
+                       replaceChar(pos + j, newWord[j]);
+               removeChars(pos + newWord.length(), -lengthDiff);
        }
        return lengthDiff;
 }
@@ -1772,6 +1803,13 @@
        ;
 }
 
+QString StoryText::selectedText() const
+{
+       int selLen = selectionLength();
+       if (selLen <= 0)
+               return QString();
+       return text(startOfSelection(), selLen);
+}
 
 int StoryText::selectWord(int pos)
 {
@@ -1784,7 +1822,10 @@
        int end = it->next();
        int wordLength = end - start;
        if (wordLength > 0)
+       {
                select(start, wordLength);
+               setCursorPosition(endOfSelection());
+       }
        else
        {
                deselectAll();

Modified: trunk/Scribus/scribus/text/storytext.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/text/storytext.h
==============================================================================
--- trunk/Scribus/scribus/text/storytext.h      (original)
+++ trunk/Scribus/scribus/text/storytext.h      Thu Dec  5 06:36:39 2019
@@ -128,7 +128,10 @@
        void insertObject(int pos, int obj);
        // Insert mark at cursor or specific position
        void insertMark(Mark* Mark, int pos = -1);
+       // Replace a character
        void replaceChar(int pos, QChar ch);
+       // Replace current selection with specified text
+       void replaceSelection(const QString& newText);
        // Replaced a word, and return the difference in length between old and 
new
        int replaceWord(int pos, QString newWord);
        void replaceObject(int pos, int obj);
@@ -242,12 +245,13 @@
        void extendSelection(int oldPos, int newPos);
        int selectWord(int pos);
        void select(int pos, int len, bool on = true);
+       QString selectedText() const;
        bool selected(int pos) const;
        int startOfSelection() const;
        int endOfSelection() const;
        int selectionLength() const;
        bool isSelected() const;
-
+       
        // break iterators
        static BreakIterator* getGraphemeIterator();
        static BreakIterator* getWordIterator();

Modified: trunk/Scribus/scribus/ui/search.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/ui/search.cpp
==============================================================================
--- trunk/Scribus/scribus/ui/search.cpp (original)
+++ trunk/Scribus/scribus/ui/search.cpp Thu Dec  5 06:36:39 2019
@@ -6,20 +6,22 @@
 */
 #include "search.h"
 
+#include <QCheckBox>
+#include <QComboBox>
+#include <QGroupBox>
 #include <QHBoxLayout>
 #include <QGridLayout>
 #include <QVBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
 #include <QListView>
-#include <QGroupBox>
-#include <QCheckBox>
-#include <QLineEdit>
-#include <QComboBox>
+#include <QMessageBox>
+#include <QPixmap>
 #include <QPushButton>
-#include <QLabel>
-#include <QPixmap>
-#include <QMessageBox>
+#include <QScopedValueRollback>
 
 #include "appmodes.h"
+#include "canvas.h"
 #include "colorcombo.h"
 #include "colorlistbox.h"
 #include "commonstrings.h"
@@ -30,7 +32,9 @@
 #include "prefsmanager.h"
 #include "scpage.h"
 #include "scribus.h"
+#include "scribusview.h"
 #include "scrspinbox.h"
+#include "selection.h"
 #include "shadebutton.h"
 #include "styleselect.h"
 #include "ui/storyeditor.h"
@@ -38,14 +42,11 @@
 #include "util_text.h"
 
 SearchReplace::SearchReplace( QWidget* parent, ScribusDoc *doc, PageItem* ite, 
bool mode )
-       : QDialog( parent ),
-       matchesFound(0)
+       : QDialog( parent )
 {
        m_item = ite;
        m_doc = doc;
-       m_notFound = false;
        m_itemMode = mode;
-       m_firstMatchPosition = -1;
 
        setModal(true);
        setWindowTitle( tr( "Search/Replace" ) );
@@ -365,17 +366,15 @@
 
 void SearchReplace::slotSearch()
 {
-//     if (m_itemMode)
-//             m_doc->view()->slotDoCurs(false);
-       slotDoSearch();
+       doSearch();
+
        if (m_itemMode)
-       {
-//             m_doc->view()->slotDoCurs(true);
                m_item->update();
-       }
-}
-
-void SearchReplace::slotDoSearch()
+       if (!m_found)
+               showNotFoundMessage();
+}
+
+void SearchReplace::doSearch()
 {
        int maxChar = m_item->itemText.length() - 1;
        DoReplace->setEnabled(false);
@@ -385,11 +384,11 @@
                m_item->itemText.deselectAll();
                m_item->HasSel = false;
        }
+
        QString fCol = "";
        QString sCol = "";
        QString sFont = "";
        QString sText = "";
-       m_notFound = true;
        int sStyle = 0;
        int sAlign = 0;
        int sSize = 0;
@@ -399,6 +398,9 @@
        bool searchForReplace = false;
        bool rep = false;
        bool found = true;
+
+       m_found = true;
+
        if ((RFill->isChecked()) || (RStroke->isChecked()) || 
(RStyle->isChecked()) || (RFont->isChecked())
                || (RStrokeS->isChecked()) || (RFillS->isChecked()) || 
(RSize->isChecked()) || (RText->isChecked())
                || (REffect->isChecked())  || (RAlign->isChecked()))
@@ -431,17 +433,18 @@
                sSize = qRound(SSizeVal->value() * 10);
        if (sText.length() > 0)
                found = false;
-
-       uint as = m_item->itemText.cursorPosition();
-       m_replStart = as;
+       
        int a, textLen(0);
+       int cursorPos = m_item->itemText.cursorPosition();
+       m_replStart = cursorPos;
+
        if (m_itemMode)
        {
                Qt::CaseSensitivity cs = Qt::CaseSensitive;
                if (CaseIgnore->isChecked())
                        cs = Qt::CaseInsensitive;
 
-               for (a = as; a < m_item->itemText.length(); ++a)
+               for (a = cursorPos; a < m_item->itemText.length(); ++a)
                {
                        found = true;
                        if (SText->isChecked())
@@ -525,9 +528,45 @@
                        }
                        if (SText->isChecked())
                        {
-                               for (int xx = m_replStart; xx < a+1; ++xx)
+                               for (int xx = m_replStart; xx < a + 1; ++xx)
                                        m_item->itemText.select(qMin(xx, 
maxChar), 1, false);
                                m_item->HasSel = false;
+                       }
+               }
+               if (found && !m_replacingAll)
+               {
+                       QPointF textCanvasPos;
+                       int foundPos = m_item->itemText.cursorPosition();
+                       if (m_item->itemText.selectionLength() > 0)
+                               foundPos = m_item->itemText.startOfSelection();
+                       bool cPosFound = m_doc->textCanvasPosition(m_item, 
foundPos, textCanvasPos);
+                       if (cPosFound)
+                       {
+                               QRectF updateRect;
+                               PageItem* textItem = 
m_item->frameOfChar(foundPos);
+                               if (textItem != m_item)
+                               {
+                                       updateRect = 
m_item->getVisualBoundingRect();
+                                       updateRect = 
updateRect.united(textItem->getVisualBoundingRect());
+                                       int selLength = 
m_item->itemText.selectionLength();
+                                       m_item->itemText.deselectAll();
+                                       m_item->HasSel = false;
+                                       m_doc->m_Selection->delaySignalsOn();
+                                       m_doc->m_Selection->removeItem(m_item);
+                                       m_doc->m_Selection->addItem(textItem);
+                                       m_item = textItem;
+                                       m_item->itemText.deselectAll();
+                                       if (selLength > 0)
+                                               
m_item->itemText.select(foundPos, selLength);
+                                       
m_item->itemText.setCursorPosition(foundPos + selLength);
+                                       m_item->HasSel = true;
+                                       m_doc->m_Selection->delaySignalsOff();
+                               }
+                               QRectF visibleCanvasRect = 
m_doc->view()->visibleCanvasRect();
+                               if (!visibleCanvasRect.contains(textCanvasPos))
+                                       
m_doc->view()->setCanvasCenterPos(textCanvasPos.x(), textCanvasPos.y());
+                               if (!updateRect.isEmpty())
+                                       
m_doc->regionsChanged()->update(updateRect.adjusted(-10.0, -10.0, 10.0, 10.0));
                        }
                }
                if ((!found) || (a == m_item->itemText.length()))
@@ -536,9 +575,8 @@
                        m_item->update();
                        DoReplace->setEnabled(false);
                        AllReplace->setEnabled(false);
-                       ScMessageBox::information(this, tr("Search/Replace"), 
tr("Search finished"));
                        m_item->itemText.setCursorPosition(0);
-                       m_notFound = false;
+                       m_found = false;
                }
        }
        else if (m_doc->scMW()->CurrStED != nullptr)
@@ -662,15 +700,12 @@
                                DoReplace->setEnabled(true);
                                AllReplace->setEnabled(true);
                        }
-                       matchesFound++;
+                       m_matchesFound++;
                        m_firstMatchPosition = 
storyTextEdit->textCursor().selectionStart();
                }
                else
                {
-                       ScMessageBox::information(this, tr("Search/Replace"),
-                                       tr("Search finished, found %1 
matches").arg(matchesFound));
-                       matchesFound = 0;
-                       m_notFound = false;
+                       m_found = false;
                        QTextCursor cursor = storyTextEdit->textCursor();
                        cursor.clearSelection();
                        cursor.movePosition(QTextCursor::Start, 
QTextCursor::MoveAnchor);
@@ -681,55 +716,22 @@
 
 void SearchReplace::slotReplace()
 {
-//     if (m_itemMode)
-//             m_doc->view()->slotDoCurs(false);
-       slotDoReplace();
+       doReplace();
+
+       if (m_itemMode)
+               m_item->update();
+       if (!m_found)
+               showNotFoundMessage();
+}
+
+void SearchReplace::doReplace()
+{
        if (m_itemMode)
        {
-//             m_doc->view()->slotDoCurs(true);
-               m_item->update();
-       }
-}
-
-void SearchReplace::slotDoReplace()
-{
-       if (m_itemMode)
-       {
-               QString repl, sear;
-               int cs, cx;
-               int textLen = 0;
                if (RText->isChecked())
                {
-                       repl = RTextVal->text();
-                       sear = STextVal->text();
-                       textLen = m_item->itemText.selectionLength();
-                       if (textLen == repl.length())
-                       {
-                               for (cs = 0; cs < textLen; ++cs)
-                                       
m_item->itemText.replaceChar(m_replStart+cs, repl[cs]);
-                       }
-                       else
-                       {
-                               if (textLen < repl.length())
-                               {
-                                       for (cs = 0; cs < textLen; ++cs)
-                                               
m_item->itemText.replaceChar(m_replStart+cs, repl[cs]);
-                                       for (cx = cs; cx < repl.length(); ++cx)
-                                               
m_item->itemText.insertChars(m_replStart+cx, repl.mid(cx,1), true);
-                               }
-                               else
-                               {
-                                       for (cs = 0; cs < repl.length(); ++cs)
-                                               
m_item->itemText.replaceChar(m_replStart+cs, repl[cs]);
-                                       
m_item->itemText.removeChars(m_replStart+cs, textLen - cs);
-                               }
-                       }
-                       m_item->itemText.deselectAll();
-                       if (repl.length() > 0)
-                       {
-                               m_item->itemText.select(m_replStart, 
repl.length());
-                               m_item->itemText.setCursorPosition(m_replStart 
+ repl.length());
-                       }
+                       QString repl = RTextVal->text();
+                       m_item->itemText.replaceSelection(repl);
                }
                if (RStyle->isChecked())
                {
@@ -761,17 +763,13 @@
                {
                        int s = REffVal->getStyle() & ScStyle_UserStyles;
                        
m_doc->currentStyle.charStyle().setFeatures(static_cast<StyleFlag>(s).featureList());
 // ???
-                       for (int a = 0; a < m_item->itemText.length(); ++a)
-                       {
-                               if (m_item->itemText.selected(a))
+                       for (int i = 0; i < m_item->itemText.length(); ++i)
+                       {
+                               if (m_item->itemText.selected(i))
                                {
-//                    StyleFlag fl = m_item->itemText.charStyle(a).effects();
-//                                     fl &= static_cast<StyleFlag>(~1919);
-//                                     fl |= static_cast<StyleFlag>(s);
-//                                     
m_item->itemText.item(a)->setFeatures(fl.featureList());
                                        CharStyle newFeatures;
                                        
newFeatures.setFeatures(static_cast<StyleFlag>(s).featureList());
-                                       m_item->itemText.applyCharStyle(a, 1, 
newFeatures);
+                                       m_item->itemText.applyCharStyle(i, 1, 
newFeatures);
                                }
                        }
                }
@@ -830,7 +828,7 @@
        }
        DoReplace->setEnabled(false);
        AllReplace->setEnabled(false);
-       slotDoSearch();
+       doSearch();
 }
 
 int SearchReplace::firstMatchCursorPosition()
@@ -838,24 +836,48 @@
        return m_firstMatchPosition;
 }
 
+void SearchReplace::setSearchedText(const QString& text)
+{
+       if (SText->isChecked())
+               STextVal->setText(text);
+}
+
 void SearchReplace::slotReplaceAll()
 {
+       QScopedValueRollback<bool> replaceAllRollback(m_replacingAll, true);
+
        if (m_itemMode)
-       {
-//             m_doc->view()->slotDoCurs(false);
                m_doc->DoDrawing = false;
-       }
+
        do
        {
-               slotDoReplace();
-//             slotDoSearch();
+               doReplace();
        }
-       while (m_notFound);
+       while (m_found);
+
        if (m_itemMode)
        {
                m_doc->DoDrawing = true;
-//             m_doc->view()->slotDoCurs(true);
-               m_item->update();
+               if (m_item->isTextFrame())
+                       m_item->asTextFrame()->invalidateLayout(true);
+               m_doc->regionsChanged()->update(QRectF());
+       }
+
+       showNotFoundMessage();
+}
+
+void SearchReplace::showNotFoundMessage()
+{
+       if (m_found)
+               return;
+
+       if (m_itemMode)
+               ScMessageBox::information(this, tr("Search/Replace"), 
tr("Search finished"));
+       else
+       {
+               ScMessageBox::information(this, tr("Search/Replace"),
+                                       tr("Search finished, found %1 
matches").arg(m_matchesFound));
+               m_matchesFound = 0;
        }
 }
 
@@ -1060,7 +1082,7 @@
                replaceEnabled &= 
m_doc->scMW()->CurrStED->Editor->textCursor().hasSelection();
        else
                replaceEnabled = false;
-       replaceEnabled &= m_notFound;
+       replaceEnabled &= m_found;
        DoReplace->setEnabled(replaceEnabled);
        AllReplace->setEnabled(replaceEnabled);
 }

Modified: trunk/Scribus/scribus/ui/search.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23396&path=/trunk/Scribus/scribus/ui/search.h
==============================================================================
--- trunk/Scribus/scribus/ui/search.h   (original)
+++ trunk/Scribus/scribus/ui/search.h   Thu Dec  5 06:36:39 2019
@@ -35,9 +35,9 @@
 public:
        SearchReplace( QWidget* parent, ScribusDoc *doc, PageItem* ite, bool 
mode = true );
        ~SearchReplace() {};
-       virtual void slotDoSearch();
-       virtual void slotDoReplace();
+
        int firstMatchCursorPosition();
+       void setSearchedText(const QString& text);
 
        QLabel* SText1;
        QLabel* RText1;
@@ -126,8 +126,9 @@
 
        uint m_replStart;
        PrefsContext* m_prefs;
-       bool m_notFound;
+       bool m_found { false };
        bool m_itemMode;
+       bool m_replacingAll { false };
 
        QVBoxLayout* SearchReplaceLayout;
        QHBoxLayout* SelLayout;
@@ -136,11 +137,15 @@
        QHBoxLayout* OptsLayout;
        QHBoxLayout* ButtonsLayout;
 
+       virtual void doSearch();
+       virtual void doReplace();
+       virtual void showNotFoundMessage();
+
        virtual void readPrefs();
 
        /// Number of matches found thus far in a search
-       int matchesFound;
-       int m_firstMatchPosition;
+       int m_matchesFound { 0 };
+       int m_firstMatchPosition { -1 };
 
 };
 


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to