void SearchReplace::slotDoSearch() { int maxChar = m_item->itemText.length() - 1; DoReplace->setEnabled(false); AllReplace->setEnabled(false); if (m_itemMode) { 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; int sEff = 0; int sFillSh = 100; int sStrokeSh = 100; bool searchForReplace = false; bool rep = false; bool found = true; if ((RFill->isChecked()) || (RStroke->isChecked()) || (RStyle->isChecked()) || (RFont->isChecked()) || (RStrokeS->isChecked()) || (RFillS->isChecked()) || (RSize->isChecked()) || (RText->isChecked()) || (REffect->isChecked()) || (RAlign->isChecked())) rep = true; if ((SFill->isChecked()) || (SStroke->isChecked()) || (SStyle->isChecked()) || (SFont->isChecked()) || (SStrokeS->isChecked()) || (SFillS->isChecked()) || (SSize->isChecked()) || (SText->isChecked()) || (SEffect->isChecked()) || (SAlign->isChecked())) searchForReplace = true; if (SText->isChecked()) sText = STextVal->text(); if (CaseIgnore->isChecked()) sText = sText.toLower(); if (SEffect->isChecked()) sEff = SEffVal->getStyle(); if (SFill->isChecked()) fCol = SFillVal->currentText(); if (SFillS->isChecked()) sFillSh = SFillSVal->getValue(); if (SStroke->isChecked()) sCol = SStrokeVal->currentText(); if (SStrokeS->isChecked()) sStrokeSh = SStrokeSVal->getValue(); if (SFont->isChecked()) sFont = SFontVal->currentText(); if (SStyle->isChecked()) sStyle = SStyleVal->currentIndex(); if (SAlign->isChecked()) sAlign = SAlignVal->currentIndex(); if (SSize->isChecked()) sSize = qRound(SSizeVal->value() * 10); if (sText.length() > 0) found = false; uint as = m_item->itemText.cursorPosition(); m_replStart = as; int a, textLen(0); if (m_itemMode) { Qt::CaseSensitivity cs = Qt::CaseSensitive; if (CaseIgnore->isChecked()) cs = Qt::CaseInsensitive; for (a = as; a < m_item->itemText.length(); ++a) { found = true; if (SText->isChecked()) { a = m_item->itemText.indexOf(sText, a, cs, &textLen); found = (a >= 0); if (!found) break; if (Word->isChecked() && (a > 0) && m_item->itemText.text(a - 1).isLetterOrNumber()) found = false; if (Word->isChecked()) { int lastChar = qMin(a + textLen, maxChar); found = ((lastChar == maxChar) || !m_item->itemText.text(lastChar).isLetterOrNumber()); } if (!found) continue; } if (SSize->isChecked()) { if (m_item->itemText.charStyle(a).fontSize() != sSize) found = false; } if (SFont->isChecked()) { if (m_item->itemText.charStyle(a).font().scName() != sFont) found = false; } if (SStyle->isChecked()) { if (m_item->itemText.paragraphStyle(a).parent() != m_doc->paragraphStyles()[sStyle].name()) found = false; } if (SAlign->isChecked()) { if (m_item->itemText.paragraphStyle(a).alignment() != sAlign) found = false; } if (SStroke->isChecked()) { if (m_item->itemText.charStyle(a).strokeColor() != sCol) found = false; } if (SStrokeS->isChecked()) { if (m_item->itemText.charStyle(a).strokeShade() != sStrokeSh) found = false; } if (SFillS->isChecked()) { if (m_item->itemText.charStyle(a).fillShade() != sFillSh) found = false; } if (SEffect->isChecked()) { if ((m_item->itemText.charStyle(a).effects() & ScStyle_UserStyles) != sEff) found = false; } if (SFill->isChecked()) { if (m_item->itemText.charStyle(a).fillColor() != fCol) found = false; } if (found && searchForReplace) { m_item->itemText.select(a, textLen); m_item->HasSel = true; if (rep) { DoReplace->setEnabled(true); AllReplace->setEnabled(true); } m_item->itemText.setCursorPosition(a + textLen); if (!SText->isChecked()) break; m_replStart = a; break; } else { if (SText->isChecked()) { for (int xx = m_replStart; xx < a+1; ++xx) m_item->itemText.select(qMin(xx, maxChar), 1, false); m_item->HasSel = false; } } } if ((!found) || (a == m_item->itemText.length())) { m_doc->DoDrawing = true; 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; } } else if (m_doc->scMW()->CurrStED != NULL) { found = false; SEditor* storyTextEdit = m_doc->scMW()->CurrStED->Editor; if (storyTextEdit->StyledText.length() == 0) return; QTextCursor cursor = storyTextEdit->textCursor(); int position = cursor.position(); StoryText& styledText = storyTextEdit->StyledText; int firstChar = -1, lastChar = styledText.length(); if (SText->isChecked()) { Qt::CaseSensitivity cs = Qt::CaseSensitive; if (CaseIgnore->isChecked()) cs = Qt::CaseInsensitive; for (int i = position; i < styledText.length(); ++i) { i = styledText.indexOf(sText, i, cs, &textLen); found = (i >= 0); if (!found) break; if (Word->isChecked() && (i > 0) && styledText.text(i - 1).isLetterOrNumber()) found = false; if (Word->isChecked()) { int lastChar = qMin(i + textLen, maxChar); found = ((lastChar == maxChar) || !styledText.text(lastChar).isLetterOrNumber()); } if (!found) continue; int selStart = i; for (int ap = 0; ap < textLen; ++ap) { const ParagraphStyle& parStyle = storyTextEdit->StyledText.paragraphStyle(selStart + ap); const CharStyle& charStyle = storyTextEdit->StyledText.charStyle(selStart + ap); if (SSize->isChecked() && (charStyle.fontSize() != sSize)) found = false; if (SFont->isChecked() && (charStyle.font().scName() != sFont)) found = false; if (SStyle->isChecked() && (parStyle.parent() != m_doc->paragraphStyles()[sStyle].name())) found = false; if (SAlign->isChecked() && (parStyle.alignment() != sAlign)) found = false; if (SFill->isChecked() && (charStyle.fillColor() != fCol)) found = false; if (SStroke->isChecked() && (charStyle.strokeColor() != sCol)) found = false; if (SStrokeS->isChecked() && (charStyle.strokeShade() != sStrokeSh)) found = false; if (SFillS->isChecked() && (charStyle.fillShade() != sFillSh)) found = false; if (SEffect->isChecked() && ((charStyle.effects() & ScStyle_UserStyles) != sEff)) found = false; } if (found) { firstChar = i; lastChar = i + textLen; break; } } } else { for (int i = position; i < styledText.length(); ++i) { found = true; const ParagraphStyle& parStyle = storyTextEdit->StyledText.paragraphStyle(i); const CharStyle& charStyle = styledText.charStyle(i); if (SSize->isChecked() && (charStyle.fontSize() != sSize)) found = false; if (SFont->isChecked() && (charStyle.font().scName() != sFont)) found = false; if (SStyle->isChecked() && (parStyle.parent() != m_doc->paragraphStyles()[sStyle].name())) found = false; if (SAlign->isChecked() && (parStyle.alignment() != sAlign)) found = false; if (SFill->isChecked() && (charStyle.fillColor() != fCol)) found = false; if (SFillS->isChecked() && (charStyle.fillShade() != sFillSh)) found = false; if (SStroke->isChecked() && (charStyle.strokeColor() != sCol)) found = false; if (SStrokeS->isChecked() && (charStyle.strokeShade() != sStrokeSh)) found = false; if (SEffect->isChecked() && ((charStyle.effects() & ScStyle_UserStyles) != sEff)) found = false; if (found && (firstChar < 0)) firstChar = i; else if ((firstChar >= 0) && !found) { lastChar = i; break; } // When searching paragraph styles break at the end of each found paragraph if (SStyle->isChecked() && (firstChar >= 0) && styledText.text(i) == SpecialChars::PARSEP) { lastChar = i; break; } } } found = (firstChar >= 0); if (found) { cursor.setPosition(firstChar); cursor.setPosition(lastChar, QTextCursor::KeepAnchor); storyTextEdit->setTextCursor(cursor); } if (found && searchForReplace) { // m_doc->scMW()->CurrStED->updateProps(); FIXME if (rep) { DoReplace->setEnabled(true); AllReplace->setEnabled(true); } 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; QTextCursor cursor = storyTextEdit->textCursor(); cursor.clearSelection(); cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor); storyTextEdit->setTextCursor(cursor); } } }
void SearchReplace::slotDoSearch() { int maxChar = Item->itemText.length() - 1; DoReplace->setEnabled(false); AllReplace->setEnabled(false); if (SMode) { Item->itemText.deselectAll(); Item->HasSel = false; } QString fCol = ""; QString sCol = ""; QString sFont = ""; QString sText = ""; NotFound = true; int sStyle = 0; int sAlign = 0; int sSize = 0; int sEff = 0; int sFillSh = 100; int sStrokeSh = 100; bool rep = false; bool found = true; if ((RFill->isChecked()) || (RStroke->isChecked()) || (RStyle->isChecked()) || (RFont->isChecked()) || (RStrokeS->isChecked()) || (RFillS->isChecked()) || (RSize->isChecked()) || (RText->isChecked()) || (REffect->isChecked())) rep = true; if (SText->isChecked()) sText = STextVal->text(); if (CaseIgnore->isChecked()) sText = sText.toLower(); if (SEffect->isChecked()) sEff = SEffVal->getStyle(); if (SFill->isChecked()) fCol = SFillVal->currentText(); if (SFillS->isChecked()) sFillSh = SFillSVal->getValue(); if (SStroke->isChecked()) sCol = SStrokeVal->currentText(); if (SStrokeS->isChecked()) sStrokeSh = SStrokeSVal->getValue(); if (SFont->isChecked()) sFont = SFontVal->currentText(); if (SStyle->isChecked()) sStyle = SStyleVal->currentIndex(); if (SAlign->isChecked()) sAlign = SAlignVal->currentIndex(); if (SSize->isChecked()) sSize = qRound(SSizeVal->value() * 10); if (sText.length() > 0) found = false; uint as = Item->itemText.cursorPosition(); ReplStart = as; int a; if (SMode) { Qt::CaseSensitivity cs = Qt::CaseSensitive; if (CaseIgnore->isChecked()) cs = Qt::CaseInsensitive; for (a = as; a < Item->itemText.length(); ++a) { found = true; if (SText->isChecked()) { a = Item->itemText.indexOf(sText, a, cs); found = (a >= 0); if (!found) break; if (Word->isChecked() && (a > 0) && !Item->itemText.text(a - 1).isSpace()) found = false; if (Word->isChecked()) { int lastChar = qMin(a + sText.length(), maxChar); found = ((lastChar == maxChar) || Item->itemText.text(lastChar).isSpace()); } if (!found) continue; } if (SSize->isChecked()) { if (Item->itemText.charStyle(a).fontSize() != sSize) found = false; } if (SFont->isChecked()) { if (Item->itemText.charStyle(a).font().scName() != sFont) found = false; } #ifndef NLS_PROTO if (SStyle->isChecked()) { if (Item->itemText.paragraphStyle(a).parent() != Doc->paragraphStyles()[sStyle].name()) found = false; } #endif if (SAlign->isChecked()) { if (Item->itemText.paragraphStyle(a).alignment() != sAlign) found = false; } if (SStroke->isChecked()) { if (Item->itemText.charStyle(a).strokeColor() != sCol) found = false; } if (SStrokeS->isChecked()) { if (Item->itemText.charStyle(a).strokeShade() != sStrokeSh) found = false; } if (SFillS->isChecked()) { if (Item->itemText.charStyle(a).fillShade() != sFillSh) found = false; } if (SEffect->isChecked()) { if ((Item->itemText.charStyle(a).effects() & 1919) != sEff) found = false; } if (SFill->isChecked()) { if (Item->itemText.charStyle(a).fillColor() != fCol) found = false; } if (found) { Item->itemText.select(a, sText.length()); Item->HasSel = true; if (rep) { DoReplace->setEnabled(true); AllReplace->setEnabled(true); } Item->itemText.setCursorPosition(a + sText.length()); if (!SText->isChecked()) break; ReplStart = a; break; } else { if (SText->isChecked()) { for (int xx = ReplStart; xx < a+1; ++xx) Item->itemText.select(qMin(xx, maxChar), 1, false); Item->HasSel = false; } } } if ((!found) || (a == Item->itemText.length())) { Doc->DoDrawing = true; Item->update(); DoReplace->setEnabled(false); AllReplace->setEnabled(false); QMessageBox::information(this, tr("Search/Replace"), tr("Search finished"), CommonStrings::tr_OK); Item->itemText.setCursorPosition(0); NotFound = false; } } else if (Doc->scMW()->CurrStED != NULL) { found = false; SEditor* storyTextEdit = Doc->scMW()->CurrStED->Editor; if (storyTextEdit->StyledText.length() == 0) return; if (SText->isChecked()) { QTextDocument::FindFlags flags; if (!CaseIgnore->isChecked()) flags |= QTextDocument::FindCaseSensitively; if (Word->isChecked()) flags |= QTextDocument::FindWholeWords; do { found = storyTextEdit->find(sText, flags); if (!found) break; QTextCursor cursor = storyTextEdit->textCursor(); int selStart = cursor.selectionStart(); for (int ap = 0; ap < sText.length(); ++ap) { const ParagraphStyle& parStyle = storyTextEdit->StyledText.paragraphStyle(selStart + ap); const CharStyle& charStyle = storyTextEdit->StyledText.charStyle(selStart + ap); if (SSize->isChecked() && (charStyle.fontSize() != sSize)) found = false; if (SFont->isChecked() && (charStyle.font().scName() != sFont)) found = false; if (SStyle->isChecked() && (parStyle.parent() != Doc->paragraphStyles()[sStyle].name())) found = false; if (SAlign->isChecked() && (parStyle.alignment() != sAlign)) found = false; if (SFill->isChecked() && (charStyle.fillColor() != fCol)) found = false; if (SStroke->isChecked() && (charStyle.strokeColor() != sCol)) found = false; if (SStrokeS->isChecked() && (charStyle.strokeShade() != sStrokeSh)) found = false; if (SFillS->isChecked() && (charStyle.fillShade() != sFillSh)) found = false; if (SEffect->isChecked() && ((charStyle.effects() & 1919) != sEff)) found = false; } } while(!found); } else { QTextCursor cursor = storyTextEdit->textCursor(); int position = cursor.position(); StoryText& styledText = storyTextEdit->StyledText; int firstChar = -1, lastChar = styledText.length(); for (int i = position; i < styledText.length(); ++i) { found = true; const ParagraphStyle& parStyle = storyTextEdit->StyledText.paragraphStyle(i); const CharStyle& charStyle = styledText.charStyle(i); if (SSize->isChecked() && (charStyle.fontSize() != sSize)) found = false; if (SFont->isChecked() && (charStyle.font().scName() != sFont)) found = false; if (SStyle->isChecked() && (parStyle.parent() != Doc->paragraphStyles()[sStyle].name())) found = false; if (SAlign->isChecked() && (parStyle.alignment() != sAlign)) found = false; if (SFill->isChecked() && (charStyle.fillColor() != fCol)) found = false; if (SFillS->isChecked() && (charStyle.fillShade() != sFillSh)) found = false; if (SStroke->isChecked() && (charStyle.strokeColor() != sCol)) found = false; if (SStrokeS->isChecked() && (charStyle.strokeShade() != sStrokeSh)) found = false; if (SEffect->isChecked() && ((charStyle.effects() & 1919) != sEff)) found = false; if (found && (firstChar < 0)) firstChar = i; else if ((firstChar >= 0) && !found) { lastChar = i; break; } // When searching paragraph styles break at the end of each found paragraph if (SStyle->isChecked() && (firstChar >= 0) && styledText.text(i) == SpecialChars::PARSEP) { lastChar = i; break; } } found = (firstChar >= 0); if (found) { cursor.setPosition(firstChar); cursor.setPosition(lastChar, QTextCursor::KeepAnchor); storyTextEdit->setTextCursor(cursor); } } if (found) { // Doc->scMW()->CurrStED->updateProps(); FIXME if (rep) { DoReplace->setEnabled(true); AllReplace->setEnabled(true); } matchesFound++; } else { QMessageBox::information(this, tr("Search/Replace"), tr("Search finished, found %1 matches").arg(matchesFound), CommonStrings::tr_OK); matchesFound = 0; NotFound = false; QTextCursor cursor = storyTextEdit->textCursor(); cursor.clearSelection(); cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor); storyTextEdit->setTextCursor(cursor); } } }