void KReplaceDialogPrivate::_k_slotOk() { // If regex and backrefs are enabled, do a sanity check. if ( q->KFindDialog::d->regExp->isChecked() && q->KFindDialog::d->backRef->isChecked() ) { QRegExp r ( q->pattern() ); int caps = r.numCaptures(); QRegExp check(QString("((?:\\\\)+)(\\d+)")); int p = 0; QString rep = q->replacement(); while ( (p = check.indexIn( rep, p ) ) > -1 ) { if ( check.cap(1).length()%2 && check.cap(2).toInt() > caps ) { KMessageBox::information( q, i18n( "Your replacement string is referencing a capture greater than '\\%1', ", caps ) + ( caps ? i18np("but your pattern only defines 1 capture.", "but your pattern only defines %1 captures.", caps ) : i18n("but your pattern defines no captures.") ) + i18n("\nPlease correct.") ); return; // abort OKing } p += check.matchedLength(); } } q->KFindDialog::d->_k_slotOk(); q->KFindDialog::d->replace->addToHistory(q->replacement()); }
void KateSearch::replace() { if (!doc()->isReadWrite()) return; // if multiline selection around, search in it long searchf = KateViewConfig::global()->searchFlags(); if (m_view->hasSelection() && m_view->selStartLine() != m_view->selEndLine()) searchf |= KFindDialog::SelectedText; KReplaceDialog *replaceDialog = new KReplaceDialog ( m_view, "", searchf, s_searchList, s_replaceList, m_view->hasSelection() ); replaceDialog->setPattern (getSearchText()); if( replaceDialog->exec() == TQDialog::Accepted ) { long opts = replaceDialog->options(); m_replacement = replaceDialog->replacement(); s_searchList = replaceDialog->findHistory () ; s_replaceList = replaceDialog->replacementHistory () ; // Do *not* remove the TQString() wrapping, it fixes a nasty crash replace( TQString(s_searchList.first()), m_replacement, opts ); } delete replaceDialog; m_view->update (); }