File indexing completed on 2024-12-01 13:46:49

0001 // clang-format off
0002 /*
0003  * KDiff3 - Text Diff And Merge Tool
0004  *
0005  * SPDX-FileCopyrightText: 2002-2011 Joachim Eibl, joachim.eibl at gmx.de
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 // clang-format on
0009 
0010 #include "smalldialogs.h"
0011 
0012 #include "diff.h"
0013 #include "FileNameLineEdit.h"
0014 #include "kdiff3.h"
0015 #include "options.h"
0016 #include "TypeUtils.h"
0017 #include "ui_opendialog.h"
0018 
0019 #include <QCheckBox>
0020 #include <QComboBox>
0021 #include <QDialogButtonBox>
0022 #include <QDir>
0023 #include <QDropEvent>
0024 #include <QFileDialog>
0025 #include <QLabel>
0026 #include <QLayout>
0027 #include <QLineEdit>
0028 #include <QMenu>
0029 #include <QMimeData>
0030 #include <QPushButton>
0031 #include <QToolTip>
0032 #include <QUrl>
0033 
0034 #include <KLocalizedString>
0035 
0036 // OpenDialog **************************************************************
0037 
0038 OpenDialog::OpenDialog(
0039     KDiff3App* pParent, const QString& n1, const QString& n2, const QString& n3,
0040     bool bMerge, const QString& outputName)
0041     : QDialog(pParent)
0042 {
0043     dialogUi.setupUi(this);
0044     setModal(true);
0045     //Abort if verticalLayout is not the immediate child of the dialog. This interferes with re-sizing.
0046     assert(dialogUi.virticalLayout->parent() == this);
0047 
0048     dialogUi.lineA->insertItems(0, gOptions->getRecentFilesA());
0049     dialogUi.lineA->setEditText(n1);
0050 
0051     QPushButton* button = dialogUi.fileSelectA;
0052     chk_connect_a(button, &QPushButton::clicked, this, &OpenDialog::selectFileA);
0053     QPushButton* button2 = dialogUi.folderSelectA;
0054     chk_connect_a(button2, &QPushButton::clicked, this, &OpenDialog::selectDirA);
0055     chk_connect_a(dialogUi.lineA, &QComboBox::editTextChanged, this, &OpenDialog::inputFilenameChanged);
0056 
0057     dialogUi.lineB->setEditable(true);
0058     dialogUi.lineB->insertItems(0, gOptions->getRecentFilesB());
0059     dialogUi.lineB->setEditText(n2);
0060 
0061     dialogUi.lineB->setMinimumWidth(200);
0062     button = dialogUi.fileSelectB;
0063     chk_connect_a(button, &QPushButton::clicked, this, &OpenDialog::selectFileB);
0064     button2 = dialogUi.folderSelectB;
0065     chk_connect_a(button2, &QPushButton::clicked, this, &OpenDialog::selectDirB);
0066     chk_connect_a(dialogUi.lineB, &QComboBox::editTextChanged, this, &OpenDialog::inputFilenameChanged);
0067 
0068     dialogUi.lineC->setEditable(true);
0069     dialogUi.lineC->insertItems(0, gOptions->getRecentFilesC());
0070     dialogUi.lineC->setEditText(n3);
0071     dialogUi.lineC->setMinimumWidth(200);
0072     button = dialogUi.fileSelectC;
0073     chk_connect_a(button, &QPushButton::clicked, this, &OpenDialog::selectFileC);
0074     button2 = dialogUi.folderSelectC;
0075     chk_connect_a(button2, &QPushButton::clicked, this, &OpenDialog::selectDirC);
0076     chk_connect_a(dialogUi.lineC, &QComboBox::editTextChanged, this, &OpenDialog::inputFilenameChanged);
0077 
0078     button = dialogUi.swapCopy;
0079 
0080     QMenu* m = new QMenu(this);
0081     m->addAction(i18n("Swap %1<->%2", QStringLiteral("A"), QStringLiteral("B")));
0082     m->addAction(i18n("Swap %1<->%2", QStringLiteral("B"), QStringLiteral("C")));
0083     m->addAction(i18n("Swap %1<->%2", QStringLiteral("C"), QStringLiteral("A")));
0084     m->addAction(i18n("Copy %1->Output", QStringLiteral("A")));
0085     m->addAction(i18n("Copy %1->Output", QStringLiteral("B")));
0086     m->addAction(i18n("Copy %1->Output", QStringLiteral("C")));
0087     m->addAction(i18n("Swap %1<->Output", QStringLiteral("A")));
0088     m->addAction(i18n("Swap %1<->Output", QStringLiteral("B")));
0089     m->addAction(i18n("Swap %1<->Output", QStringLiteral("C")));
0090     chk_connect_a(m, &QMenu::triggered, this, &OpenDialog::slotSwapCopyNames);
0091     button->setMenu(m);
0092 
0093     dialogUi.lineOut->insertItems(0, gOptions->getRecentOutputFiles());
0094     dialogUi.lineOut->setEditText(outputName);
0095 
0096     button = dialogUi.selectOutputFile;
0097     chk_connect_a(button, &QPushButton::clicked, this, &OpenDialog::selectOutputName);
0098     button2 = dialogUi.selectOutputFolder;
0099     chk_connect_a(button2, &QPushButton::clicked, this, &OpenDialog::selectOutputDir);
0100     chk_connect_a(dialogUi.mergeCheckBox, &QCheckBox::stateChanged, this, &OpenDialog::internalSlot);
0101     chk_connect_a(this, &OpenDialog::internalSignal, dialogUi.lineOut, &QComboBox::setEnabled);
0102     chk_connect_a(this, &OpenDialog::internalSignal, button, &QPushButton::setEnabled);
0103     chk_connect_a(this, &OpenDialog::internalSignal, button2, &QPushButton::setEnabled);
0104 
0105     dialogUi.mergeCheckBox->setChecked(bMerge);
0106 
0107     QDialogButtonBox *box = dialogUi.buttonBox;
0108     button = box->addButton(i18n("Configure..."), QDialogButtonBox::ActionRole);
0109     button->setIcon(QIcon::fromTheme("configure"));
0110     chk_connect_a(button, &QPushButton::clicked, pParent, &KDiff3App::slotConfigure);
0111     chk_connect_a(box, &QDialogButtonBox::accepted, this, &OpenDialog::accept);
0112     chk_connect_a(box, &QDialogButtonBox::rejected, this, &OpenDialog::reject);
0113 
0114     QSize sh = sizeHint();
0115     if(sh.height() > 10)
0116         setFixedHeight(sh.height());
0117     else
0118     {
0119         //This is likely a bug. It is also a recoverable condition. Assert for it in debug builds.
0120         assert(sh.isValid() && sh.height() > 10);
0121         setFixedHeight(262);
0122     }
0123     m_bInputFileNameChanged = false;
0124 
0125     /*
0126         QComboBox's default handling of Drag and Drop fails to clear existing text on drop.
0127         On some systems it may fail to do anything at all.
0128 
0129         This is not what we want. So manually replace the each QLineEdit object with a FileNameLineEdit.
0130         This makes behavior consitant with the main window.
0131 
0132         On windows this step also needed to bypasses Qt's quirky behavior when converting from QUrl
0133         to QString. Specifically % encoding is by handled differently on windows. This is explicitly documented
0134         as platform specific unspecified behavior. Not what we need.
0135     */
0136     dialogUi.lineA->setLineEdit(new FileNameLineEdit(dialogUi.lineA));
0137     dialogUi.lineB->setLineEdit(new FileNameLineEdit(dialogUi.lineB));
0138     dialogUi.lineC->setLineEdit(new FileNameLineEdit(dialogUi.lineC));
0139     dialogUi.lineOut->setLineEdit(new FileNameLineEdit(dialogUi.lineOut));
0140 }
0141 
0142 void OpenDialog::selectURL(QComboBox* pLine, bool bDir, qint32 i, bool bSave)
0143 {
0144     QString current = pLine->currentText();
0145     QUrl currentUrl;
0146 
0147     if(current.isEmpty() && i > 3)
0148     {
0149         current = dialogUi.lineC->currentText();
0150     }
0151     if(current.isEmpty())
0152     {
0153         current = dialogUi.lineB->currentText();
0154     }
0155     if(current.isEmpty())
0156     {
0157         current = dialogUi.lineA->currentText();
0158     }
0159 
0160     currentUrl = QUrl::fromUserInput(current, QString(), QUrl::AssumeLocalFile);
0161     QUrl newURL = bDir ? QFileDialog::getExistingDirectoryUrl(this, i18n("Open Folder"), currentUrl)
0162                        : bSave ? QFileDialog::getSaveFileUrl(this, i18n("Select Output File"), currentUrl)
0163                                : QFileDialog::getOpenFileUrl(this, i18n("Open File"), currentUrl);
0164     if(!newURL.isEmpty())
0165     {
0166         /*
0167             Since we are selecting a directory open in the parent directory
0168             not the one selected.
0169         */
0170         //QFileDialog::setStartDir( KIO::upUrl( newURL ) );
0171         pLine->setEditText(newURL.url());
0172     }
0173     // newURL won't be modified if nothing was selected.
0174 }
0175 
0176 void OpenDialog::selectFileA() { selectURL(dialogUi.lineA, false, 1, false); }
0177 void OpenDialog::selectFileB() { selectURL(dialogUi.lineB, false, 2, false); }
0178 void OpenDialog::selectFileC() { selectURL(dialogUi.lineC, false, 3, false); }
0179 void OpenDialog::selectOutputName() { selectURL(dialogUi.lineOut, false, 4, true); }
0180 void OpenDialog::selectDirA() { selectURL(dialogUi.lineA, true, 1, false); }
0181 void OpenDialog::selectDirB() { selectURL(dialogUi.lineB, true, 2, false); }
0182 void OpenDialog::selectDirC() { selectURL(dialogUi.lineC, true, 3, false); }
0183 void OpenDialog::selectOutputDir() { selectURL(dialogUi.lineOut, true, 4, true); }
0184 
0185 void OpenDialog::internalSlot(qint32 i)
0186 {
0187     Q_EMIT internalSignal(i != 0);
0188 }
0189 
0190 // Clear the output-filename when any input-filename changed,
0191 // because users forgot to change the output and accidentally overwrote it with
0192 // wrong data during a merge.
0193 void OpenDialog::inputFilenameChanged()
0194 {
0195     if(!m_bInputFileNameChanged)
0196     {
0197         m_bInputFileNameChanged = true;
0198         dialogUi.lineOut->clearEditText();
0199     }
0200 }
0201 
0202 void OpenDialog::fixCurrentText(QComboBox* pCB)
0203 {
0204     QString s = pCB->currentText();
0205     QtSizeType pos = s.indexOf('\n');
0206 
0207     if(pos >= 0)
0208         s = s.left(pos);
0209     pos = s.indexOf('\r');
0210     if(pos >= 0)
0211         s = s.left(pos);
0212 
0213     pCB->setEditText(s);
0214 }
0215 
0216 void OpenDialog::accept()
0217 {
0218     fixCurrentText(dialogUi.lineA);
0219     QString s = dialogUi.lineA->currentText();
0220     s = FileAccess::prettyAbsPath(QUrl::fromUserInput(s, QString(), QUrl::AssumeLocalFile));
0221     gOptions->getRecentFilesA().push_front(s);
0222 
0223     fixCurrentText(dialogUi.lineB);
0224     s = dialogUi.lineB->currentText();
0225     s = FileAccess::prettyAbsPath(QUrl::fromUserInput(s, QString(), QUrl::AssumeLocalFile));
0226     gOptions->getRecentFilesB().push_front(s);
0227 
0228     fixCurrentText(dialogUi.lineC);
0229     s = dialogUi.lineC->currentText();
0230     s = FileAccess::prettyAbsPath(QUrl::fromUserInput(s, QString(), QUrl::AssumeLocalFile));
0231     gOptions->getRecentFilesC().push_front(s);
0232 
0233     fixCurrentText(dialogUi.lineOut);
0234     s = dialogUi.lineOut->currentText();
0235     s = FileAccess::prettyAbsPath(QUrl::fromUserInput(s, QString(), QUrl::AssumeLocalFile));
0236     gOptions->getRecentOutputFiles().push_front(s);
0237 
0238     QDialog::accept();
0239 }
0240 
0241 void OpenDialog::slotSwapCopyNames(QAction* pAction) const // id selected in the popup menu
0242 {
0243     const QtSizeType id = pAction->parentWidget()->actions().indexOf(pAction);
0244     QComboBox* cb1 = nullptr;
0245     QComboBox* cb2 = nullptr;
0246 
0247     switch(id)
0248     {
0249         case swapAB:
0250             cb1 = dialogUi.lineA;
0251             cb2 = dialogUi.lineB;
0252             break;
0253         case swapBC:
0254             cb1 = dialogUi.lineB;
0255             cb2 = dialogUi.lineC;
0256             break;
0257         case swapCA:
0258             cb1 = dialogUi.lineC;
0259             cb2 = dialogUi.lineA;
0260             break;
0261         case copyAToOut:
0262             cb1 = dialogUi.lineA;
0263             cb2 = dialogUi.lineOut;
0264             break;
0265         case copyBToOut:
0266             cb1 = dialogUi.lineB;
0267             cb2 = dialogUi.lineOut;
0268             break;
0269         case copyCToOut:
0270             cb1 = dialogUi.lineC;
0271             cb2 = dialogUi.lineOut;
0272             break;
0273         case swapAOut:
0274             cb1 = dialogUi.lineA;
0275             cb2 = dialogUi.lineOut;
0276             break;
0277         case swapBOut:
0278             cb1 = dialogUi.lineB;
0279             cb2 = dialogUi.lineOut;
0280             break;
0281         case swapCOut:
0282             cb1 = dialogUi.lineC;
0283             cb2 = dialogUi.lineOut;
0284             break;
0285     }
0286 
0287     if(cb1 && cb2)
0288     {
0289         QString t1 = cb1->currentText();
0290         QString t2 = cb2->currentText();
0291         cb2->setEditText(t1);
0292         if(id <= swapCA || id >= swapAOut)
0293         {
0294             cb1->setEditText(t2);
0295         }
0296     }
0297 }
0298 
0299 // FindDialog *********************************************
0300 
0301 FindDialog::FindDialog(QWidget* pParent)
0302     : QDialog(pParent)
0303 {
0304     QGridLayout* layout = new QGridLayout(this);
0305     layout->setContentsMargins(5, 5, 5, 5);
0306     layout->setSpacing(5);
0307 
0308     qint32 line = 0;
0309     layout->addWidget(new QLabel(i18n("Search text:"), this), line, 0, 1, 2);
0310     ++line;
0311 
0312     m_pSearchString = new QLineEdit(this);
0313     layout->addWidget(m_pSearchString, line, 0, 1, 2);
0314     ++line;
0315 
0316     m_pCaseSensitive = new QCheckBox(i18n("Case sensitive"), this);
0317     layout->addWidget(m_pCaseSensitive, line, 1);
0318 
0319     m_pSearchInA = new QCheckBox(i18n("Search A"), this);
0320     layout->addWidget(m_pSearchInA, line, 0);
0321     m_pSearchInA->setChecked(true);
0322     ++line;
0323 
0324     m_pSearchInB = new QCheckBox(i18n("Search B"), this);
0325     layout->addWidget(m_pSearchInB, line, 0);
0326     m_pSearchInB->setChecked(true);
0327     ++line;
0328 
0329     m_pSearchInC = new QCheckBox(i18n("Search C"), this);
0330     layout->addWidget(m_pSearchInC, line, 0);
0331     m_pSearchInC->setChecked(true);
0332     ++line;
0333 
0334     m_pSearchInOutput = new QCheckBox(i18n("Search output"), this);
0335     layout->addWidget(m_pSearchInOutput, line, 0);
0336     m_pSearchInOutput->setChecked(true);
0337     ++line;
0338 
0339     QDialogButtonBox *box = new QDialogButtonBox(QDialogButtonBox::Cancel, this);
0340     layout->addWidget(box, line, 0, 1, 2);
0341     box->addButton(i18n("&Search"), QDialogButtonBox::AcceptRole);
0342     chk_connect_a(box, &QDialogButtonBox::accepted, this, &FindDialog::accept);
0343     chk_connect_a(box, &QDialogButtonBox::rejected, this, &FindDialog::reject);
0344 
0345     hide();
0346 }
0347 
0348 void FindDialog::restartFind()
0349 {
0350     currentLine = 0;
0351     currentPos = 0;
0352     currentWindow = eWindowIndex::A;
0353 }
0354 
0355 void FindDialog::setVisible(bool bVisible)
0356 {
0357     QDialog::setVisible(bVisible);
0358     m_pSearchString->selectAll();
0359     m_pSearchString->setFocus();
0360 }
0361 
0362 RegExpTester::RegExpTester(QWidget* pParent, const QString& autoMergeRegExpToolTip,
0363                            const QString& historyStartRegExpToolTip, const QString& historyEntryStartRegExpToolTip, const QString& historySortKeyOrderToolTip)
0364     : QDialog(pParent)
0365 {
0366     qint32 line = 0;
0367     setWindowTitle(i18n("Regular Expression Tester"));
0368     QGridLayout* pGrid = new QGridLayout(this);
0369     pGrid->setSpacing(5);
0370     pGrid->setContentsMargins(5, 5, 5, 5);
0371 
0372     QLabel* l = new QLabel(i18n("Auto merge regular expression:"), this);
0373     pGrid->addWidget(l, line, 0);
0374     l->setToolTip(autoMergeRegExpToolTip);
0375     m_pAutoMergeRegExpEdit = new QLineEdit(this);
0376     pGrid->addWidget(m_pAutoMergeRegExpEdit, line, 1);
0377     chk_connect_a(m_pAutoMergeRegExpEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0378     ++line;
0379 
0380     l = new QLabel(i18n("Example auto merge line:"), this);
0381     pGrid->addWidget(l, line, 0);
0382     l->setToolTip(i18nc("Tool Tip", "To test auto merge, copy a line as used in your files."));
0383     m_pAutoMergeExampleEdit = new QLineEdit(this);
0384     pGrid->addWidget(m_pAutoMergeExampleEdit, line, 1);
0385     chk_connect_a(m_pAutoMergeExampleEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0386     ++line;
0387 
0388     l = new QLabel(i18n("Match result:"), this);
0389     pGrid->addWidget(l, line, 0);
0390     m_pAutoMergeMatchResult = new QLineEdit(this);
0391     m_pAutoMergeMatchResult->setReadOnly(true);
0392     pGrid->addWidget(m_pAutoMergeMatchResult, line, 1);
0393     ++line;
0394 
0395     pGrid->addItem(new QSpacerItem(100, 20), line, 0);
0396     pGrid->setRowStretch(line, 5);
0397     ++line;
0398 
0399     l = new QLabel(i18n("History start regular expression:"), this);
0400     pGrid->addWidget(l, line, 0);
0401     l->setToolTip(historyStartRegExpToolTip);
0402     m_pHistoryStartRegExpEdit = new QLineEdit(this);
0403     pGrid->addWidget(m_pHistoryStartRegExpEdit, line, 1);
0404     chk_connect_a(m_pHistoryStartRegExpEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0405     ++line;
0406 
0407     l = new QLabel(i18n("Example history start line (with leading comment):"), this);
0408     pGrid->addWidget(l, line, 0);
0409     l->setToolTip(i18nc("Tool Tip", "Copy a history start line as used in your files,\n"
0410                                     "including the leading comment."));
0411     m_pHistoryStartExampleEdit = new QLineEdit(this);
0412     pGrid->addWidget(m_pHistoryStartExampleEdit, line, 1);
0413     chk_connect_a(m_pHistoryStartExampleEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0414     ++line;
0415 
0416     l = new QLabel(i18n("Match result:"), this);
0417     pGrid->addWidget(l, line, 0);
0418     m_pHistoryStartMatchResult = new QLineEdit(this);
0419     m_pHistoryStartMatchResult->setReadOnly(true);
0420     pGrid->addWidget(m_pHistoryStartMatchResult, line, 1);
0421     ++line;
0422 
0423     pGrid->addItem(new QSpacerItem(100, 20), line, 0);
0424     pGrid->setRowStretch(line, 5);
0425     ++line;
0426 
0427     l = new QLabel(i18n("History entry start regular expression:"), this);
0428     pGrid->addWidget(l, line, 0);
0429     l->setToolTip(historyEntryStartRegExpToolTip);
0430     m_pHistoryEntryStartRegExpEdit = new QLineEdit(this);
0431     pGrid->addWidget(m_pHistoryEntryStartRegExpEdit, line, 1);
0432     chk_connect_a(m_pHistoryEntryStartRegExpEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0433     ++line;
0434 
0435     l = new QLabel(i18n("History sort key order:"), this);
0436     pGrid->addWidget(l, line, 0);
0437     l->setToolTip(historySortKeyOrderToolTip);
0438     m_pHistorySortKeyOrderEdit = new QLineEdit(this);
0439     pGrid->addWidget(m_pHistorySortKeyOrderEdit, line, 1);
0440     chk_connect_a(m_pHistorySortKeyOrderEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0441     ++line;
0442 
0443     l = new QLabel(i18n("Example history entry start line (without leading comment):"), this);
0444     pGrid->addWidget(l, line, 0);
0445     l->setToolTip(i18nc("Tool Tip", "Copy a history entry start line as used in your files,\n"
0446                                     "but omit the leading comment."));
0447     m_pHistoryEntryStartExampleEdit = new QLineEdit(this);
0448     pGrid->addWidget(m_pHistoryEntryStartExampleEdit, line, 1);
0449     chk_connect_a(m_pHistoryEntryStartExampleEdit, &QLineEdit::textChanged, this, &RegExpTester::slotRecalc);
0450     ++line;
0451 
0452     l = new QLabel(i18n("Match result:"), this);
0453     pGrid->addWidget(l, line, 0);
0454     m_pHistoryEntryStartMatchResult = new QLineEdit(this);
0455     m_pHistoryEntryStartMatchResult->setReadOnly(true);
0456     pGrid->addWidget(m_pHistoryEntryStartMatchResult, line, 1);
0457     ++line;
0458 
0459     l = new QLabel(i18n("Sort key result:"), this);
0460     pGrid->addWidget(l, line, 0);
0461     m_pHistorySortKeyResult = new QLineEdit(this);
0462     m_pHistorySortKeyResult->setReadOnly(true);
0463     pGrid->addWidget(m_pHistorySortKeyResult, line, 1);
0464     ++line;
0465 
0466     QDialogButtonBox *box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
0467     pGrid->addWidget(box, line, 0, 1, 2);
0468     chk_connect_a(box, &QDialogButtonBox::accepted, this, &RegExpTester::accept);
0469     chk_connect_a(box, &QDialogButtonBox::rejected, this, &RegExpTester::reject);
0470 
0471     resize(800, sizeHint().height());
0472 }
0473 
0474 void RegExpTester::init(const QString& autoMergeRegExp, const QString& historyStartRegExp, const QString& historyEntryStartRegExp, const QString& historySortKeyOrder)
0475 {
0476     m_pAutoMergeRegExpEdit->setText(autoMergeRegExp);
0477     m_pHistoryStartRegExpEdit->setText(historyStartRegExp);
0478     m_pHistoryEntryStartRegExpEdit->setText(historyEntryStartRegExp);
0479     m_pHistorySortKeyOrderEdit->setText(historySortKeyOrder);
0480 }
0481 
0482 QString RegExpTester::autoMergeRegExp() const
0483 {
0484     return m_pAutoMergeRegExpEdit->text();
0485 }
0486 
0487 QString RegExpTester::historyStartRegExp() const
0488 {
0489     return m_pHistoryStartRegExpEdit->text();
0490 }
0491 
0492 QString RegExpTester::historyEntryStartRegExp() const
0493 {
0494     return m_pHistoryEntryStartRegExpEdit->text();
0495 }
0496 
0497 QString RegExpTester::historySortKeyOrder() const
0498 {
0499     return m_pHistorySortKeyOrderEdit->text();
0500 }
0501 
0502 void RegExpTester::slotRecalc()
0503 {
0504     const QRegularExpression autoMergeRegExp(m_pAutoMergeRegExpEdit->text());
0505     QRegularExpressionMatch match = autoMergeRegExp.match(m_pAutoMergeExampleEdit->text());
0506 
0507     if(match.hasMatch())
0508     {
0509         m_pAutoMergeMatchResult->setText(i18n("Match success."));
0510     }
0511     else
0512     {
0513         m_pAutoMergeMatchResult->setText(i18n("Match failed."));
0514     }
0515 
0516     const QRegularExpression historyStartRegExp(m_pHistoryStartRegExpEdit->text());
0517     match = historyStartRegExp.match(m_pHistoryStartExampleEdit->text());
0518 
0519     if(match.hasMatch())
0520     {
0521         m_pHistoryStartMatchResult->setText(i18n("Match success."));
0522     }
0523     else
0524     {
0525         m_pHistoryStartMatchResult->setText(i18n("Match failed."));
0526     }
0527 
0528     QStringList parenthesesGroups;
0529     bool bSuccess = findParenthesesGroups(m_pHistoryEntryStartRegExpEdit->text(), parenthesesGroups);
0530     if(!bSuccess)
0531     {
0532         m_pHistoryEntryStartMatchResult->setText(i18n("Opening and closing parentheses do not match in regular expression."));
0533         m_pHistorySortKeyResult->setText("");
0534         return;
0535     }
0536     const QRegularExpression historyEntryStartRegExp(m_pHistoryEntryStartRegExpEdit->text());
0537     const QString s = m_pHistoryEntryStartExampleEdit->text();
0538     match = historyEntryStartRegExp.match(s);
0539 
0540     if(match.hasMatch())
0541     {
0542         m_pHistoryEntryStartMatchResult->setText(i18n("Match success."));
0543         QString key = calcHistorySortKey(m_pHistorySortKeyOrderEdit->text(), match, parenthesesGroups);
0544         m_pHistorySortKeyResult->setText(key);
0545     }
0546     else
0547     {
0548         m_pHistoryEntryStartMatchResult->setText(i18n("Match failed."));
0549         m_pHistorySortKeyResult->setText("");
0550     }
0551 }
0552 
0553 //#include "smalldialogs.moc"