24 #include <QtGui/QLabel>
31 #include <QtCore/QRegExp>
34 #define INDEX_NOMATCH -1
36 class KReplaceNextDialog :
public KDialog
39 explicit KReplaceNextDialog(
QWidget *parent );
40 void setLabel(
const QString& pattern,
const QString& replacement );
45 KReplaceNextDialog::KReplaceNextDialog(
QWidget *parent) :
49 setCaption(
i18n(
"Replace") );
50 setButtons( User3 | User2 | User1 |
Close );
51 setButtonGuiItem( User1,
KGuiItem(
i18nc(
"@action:button Replace all occurrences",
"&All")) );
54 setDefaultButton( User3 );
56 m_mainLabel =
new QLabel(
this );
57 setMainWidget( m_mainLabel );
60 void KReplaceNextDialog::setLabel(
const QString& pattern,
const QString& replacement )
62 m_mainLabel->setText(
i18n(
"Replace '%1' with '%2'?", pattern, replacement) );
72 , m_replacement( replacement )
76 KReplaceNextDialog* dialog();
80 void _k_slotReplace();
81 void _k_slotReplaceAll();
85 unsigned m_replacements;
92 KFind( pattern, options, parent ),
93 d( new KReplacePrivate(this, replacement) )
98 KFind( pattern, options, parent, dlg ),
99 d( new KReplacePrivate(this, replacement) )
110 return d->m_replacements;
115 if ( KFind::d->dialog || create )
120 KReplaceNextDialog* KReplacePrivate::dialog()
122 if ( !q->KFind::d->dialog )
124 q->KFind::d->dialog =
new KReplaceNextDialog( q->parentWidget() );
125 q->connect( q->KFind::d->dialog, SIGNAL(user1Clicked()), q, SLOT(_k_slotReplaceAll()) );
126 q->connect( q->KFind::d->dialog, SIGNAL(user2Clicked()), q, SLOT(_k_slotSkip()) );
127 q->connect( q->KFind::d->dialog, SIGNAL(user3Clicked()), q, SLOT(_k_slotReplace()) );
128 q->connect( q->KFind::d->dialog, SIGNAL(finished()), q, SLOT(_k_slotDialogClosed()) );
130 return static_cast<KReplaceNextDialog *
>(q->KFind::d->dialog);
135 if ( !d->m_replacements )
146 rep.replace(
"\\0", text.mid( index, length ) );
151 for (
int i = 0; i < caps.count(); ++i) {
152 rep.replace(
"\\" + QString::number(i), caps.at(i) );
158 text.replace(index, length, rep);
164 KFind::Private* df = KFind::d;
166 kDebug() <<
"d->index=" << df->index;
177 kDebug() <<
"beginning of loop: df->index=" << df->index;
181 df->index =
KFind::find(df->text, *df->regExp, df->index, df->options, &df->matchedLength);
183 df->index =
KFind::find(df->text, df->pattern, df->index, df->options, &df->matchedLength);
186 kDebug() <<
"KFind::find returned df->index=" << df->index;
188 if ( df->index != -1 )
191 if (
validateMatch( df->text, df->index, df->matchedLength ) )
196 kDebug() <<
"PromptOnReplace";
199 QString matchedText (df->text.mid( df->index, df->matchedLength ));
201 replaceHelper(rep, d->m_replacement, 0, df->options, df->matchedLength, df->regExp);
202 d->dialog()->setLabel( matchedText, rep );
207 emit
highlight(df->text, df->index, df->matchedLength);
209 df->lastResult =
Match;
238 index =
KFind::find(text, pattern, index, options, &matchedLength);
241 *replacedLength =
replaceHelper(text, replacement, index, options, matchedLength, NULL);
245 index += *replacedLength;
254 index =
KFind::find(text, pattern, index, options, &matchedLength);
257 *replacedLength =
replaceHelper(text, replacement, index, options, matchedLength, &pattern);
261 index += *replacedLength;
266 void KReplacePrivate::_k_slotReplaceAll()
274 void KReplacePrivate::_k_slotSkip()
277 q->KFind::d->index--;
279 q->KFind::d->index++;
280 if ( q->KFind::d->dialogClosed ) {
281 q->KFind::d->dialog->deleteLater(); q->KFind::d->dialog = 0L;
286 void KReplacePrivate::_k_slotReplace()
289 if ( q->KFind::d->dialogClosed ) {
290 q->KFind::d->dialog->deleteLater(); q->KFind::d->dialog = 0L;
295 void KReplacePrivate::doReplace()
297 KFind::Private* df = q->KFind::d;
298 Q_ASSERT(df->index >= 0);
299 const int replacedLength =
replaceHelper(df->text, m_replacement, df->index, df->options, df->matchedLength, df->regExp);
303 emit q->replace(df->text, df->index, replacedLength, df->matchedLength);
305 kDebug() <<
"after replace() signal: KFind::d->index=" << df->index <<
" replacedLength=" << replacedLength;
309 Q_ASSERT(df->index >= 0);
312 df->index += replacedLength;
314 if ( df->pattern.isEmpty() )
318 kDebug() <<
"after adjustement: KFind::d->index=" << df->index;
325 d->m_replacements = 0;
341 if ( showNumMatches )
343 if ( !d->m_replacements )
344 message =
i18n(
"No text was replaced.");
346 message =
i18np(
"1 replacement done.",
"%1 replacements done.", d->m_replacements );
351 message =
i18n(
"Beginning of document reached." );
353 message =
i18n(
"End of document reached." );
360 i18n(
"Do you want to restart search from the end?")
361 :
i18n(
"Do you want to restart search at the beginning?");
364 KGuiItem(
i18nc(
"@action:button Restart find & replace",
"Restart")),
365 KGuiItem(
i18nc(
"@action:button Stop find & replace",
"Stop")) );
374 #include "kreplace.moc"