KUtils
kreplacedialog.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kreplacedialog.h"
00022
00023 #include <qcheckbox.h>
00024 #include <qgroupbox.h>
00025 #include <qlabel.h>
00026 #include <qlayout.h>
00027 #include <qregexp.h>
00028 #include <kcombobox.h>
00029 #include <klocale.h>
00030 #include <kmessagebox.h>
00031 #include <kdebug.h>
00032
00038 class KReplaceDialog::KReplaceDialogPrivate {
00039 public:
00040 KReplaceDialogPrivate() : m_initialShowDone(false) {}
00041 QStringList replaceStrings;
00042 bool m_initialShowDone;
00043 };
00044
00045 KReplaceDialog::KReplaceDialog(QWidget *parent, const char *name, long options, const QStringList &findStrings, const QStringList &replaceStrings, bool hasSelection) :
00046 KFindDialog(parent, name, true)
00047 {
00048 d = new KReplaceDialogPrivate;
00049 d->replaceStrings = replaceStrings;
00050 init(true, findStrings, hasSelection);
00051 setOptions(options);
00052 }
00053
00054 KReplaceDialog::~KReplaceDialog()
00055 {
00056 delete d;
00057 }
00058
00059 void KReplaceDialog::showEvent( QShowEvent *e )
00060 {
00061 if ( !d->m_initialShowDone )
00062 {
00063 d->m_initialShowDone = true;
00064
00065 if (!d->replaceStrings.isEmpty())
00066 {
00067 setReplacementHistory(d->replaceStrings);
00068 m_replace->lineEdit()->setText( d->replaceStrings[0] );
00069 }
00070 }
00071
00072 KFindDialog::showEvent(e);
00073 }
00074
00075 long KReplaceDialog::options() const
00076 {
00077 long options = 0;
00078
00079 options = KFindDialog::options();
00080 if (m_promptOnReplace->isChecked())
00081 options |= PromptOnReplace;
00082 if (m_backRef->isChecked())
00083 options |= BackReference;
00084 return options;
00085 }
00086
00087 QWidget *KReplaceDialog::replaceExtension()
00088 {
00089 if (!m_replaceExtension)
00090 {
00091 m_replaceExtension = new QWidget(m_replaceGrp);
00092 m_replaceLayout->addMultiCellWidget(m_replaceExtension, 3, 3, 0, 1);
00093 }
00094
00095 return m_replaceExtension;
00096 }
00097
00098 QString KReplaceDialog::replacement() const
00099 {
00100 return m_replace->currentText();
00101 }
00102
00103 QStringList KReplaceDialog::replacementHistory() const
00104 {
00105 QStringList lst = m_replace->historyItems();
00106
00107 if ( m_replace->lineEdit()->text().isEmpty() )
00108 lst.prepend( QString::null );
00109 return lst;
00110 }
00111
00112 void KReplaceDialog::setOptions(long options)
00113 {
00114 KFindDialog::setOptions(options);
00115 m_promptOnReplace->setChecked(options & PromptOnReplace);
00116 m_backRef->setChecked(options & BackReference);
00117 }
00118
00119 void KReplaceDialog::setReplacementHistory(const QStringList &strings)
00120 {
00121 if (strings.count() > 0)
00122 m_replace->setHistoryItems(strings, true);
00123 else
00124 m_replace->clearHistory();
00125 }
00126
00127 void KReplaceDialog::slotOk()
00128 {
00129
00130 if ( m_regExp->isChecked() && m_backRef->isChecked() )
00131 {
00132 QRegExp r ( pattern() );
00133 int caps = r.numCaptures();
00134 QRegExp check(QString("((?:\\\\)+)(\\d+)"));
00135 int p = 0;
00136 QString rep = replacement();
00137 while ( (p = check.search( rep, p ) ) > -1 )
00138 {
00139 if ( check.cap(1).length()%2 && check.cap(2).toInt() > caps )
00140 {
00141 KMessageBox::information( this, i18n(
00142 "Your replacement string is referencing a capture greater than '\\%1', ").arg( caps ) +
00143 ( caps ?
00144 i18n("but your pattern only defines 1 capture.",
00145 "but your pattern only defines %n captures.", caps ) :
00146 i18n("but your pattern defines no captures.") ) +
00147 i18n("\nPlease correct.") );
00148 return;
00149 }
00150 p += check.matchedLength();
00151 }
00152
00153 }
00154
00155 KFindDialog::slotOk();
00156 m_replace->addToHistory(replacement());
00157 }
00158
00159
00160 #include "kreplacedialog.moc"