summaryrefslogtreecommitdiff
path: root/example/searchdialog.cpp
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2023-07-07 12:37:21 +0200
committerToni Uhlig <matzeton@googlemail.com>2023-07-07 12:37:21 +0200
commit004b73ed7ef33cb407897f7eccbec5f3861f99d7 (patch)
tree590f4a80bb66fcc74452c9ae0ac824b7d4bc5871 /example/searchdialog.cpp
Squashed 'qhexedit2/' content from commit 7f22526
git-subtree-dir: qhexedit2 git-subtree-split: 7f22526a86685aec1c5722154b8a7422d5037b77
Diffstat (limited to 'example/searchdialog.cpp')
-rw-r--r--example/searchdialog.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/example/searchdialog.cpp b/example/searchdialog.cpp
new file mode 100644
index 0000000..7b9d9e7
--- /dev/null
+++ b/example/searchdialog.cpp
@@ -0,0 +1,115 @@
+#include "searchdialog.h"
+#include "ui_searchdialog.h"
+
+#include <QMessageBox>
+
+SearchDialog::SearchDialog(QHexEdit *hexEdit, QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::SearchDialog)
+{
+ ui->setupUi(this);
+ _hexEdit = hexEdit;
+}
+
+SearchDialog::~SearchDialog()
+{
+ delete ui;
+}
+
+qint64 SearchDialog::findNext()
+{
+ qint64 from = _hexEdit->cursorPosition() / 2;
+ _findBa = getContent(ui->cbFindFormat->currentIndex(), ui->cbFind->currentText());
+ qint64 idx = -1;
+
+ if (_findBa.length() > 0)
+ {
+ if (ui->cbBackwards->isChecked())
+ idx = _hexEdit->lastIndexOf(_findBa, from);
+ else
+ idx = _hexEdit->indexOf(_findBa, from);
+ }
+ return idx;
+}
+
+void SearchDialog::on_pbFind_clicked()
+{
+ findNext();
+}
+
+void SearchDialog::on_pbReplace_clicked()
+{
+ int idx = findNext();
+ if (idx >= 0)
+ {
+ QByteArray replaceBa = getContent(ui->cbReplaceFormat->currentIndex(), ui->cbReplace->currentText());
+ replaceOccurrence(idx, replaceBa);
+ }
+}
+
+void SearchDialog::on_pbReplaceAll_clicked()
+{
+ int replaceCounter = 0;
+ int idx = 0;
+ int goOn = QMessageBox::Yes;
+
+ while ((idx >= 0) && (goOn == QMessageBox::Yes))
+ {
+ idx = findNext();
+ if (idx >= 0)
+ {
+ QByteArray replaceBa = getContent(ui->cbReplaceFormat->currentIndex(), ui->cbReplace->currentText());
+ int result = replaceOccurrence(idx, replaceBa);
+
+ if (result == QMessageBox::Yes)
+ replaceCounter += 1;
+
+ if (result == QMessageBox::Cancel)
+ goOn = result;
+ }
+ }
+
+ if (replaceCounter > 0)
+ QMessageBox::information(this, tr("QHexEdit"), QString(tr("%1 occurrences replaced.")).arg(replaceCounter));
+}
+
+
+QByteArray SearchDialog::getContent(int comboIndex, const QString &input)
+{
+ QByteArray findBa;
+ switch (comboIndex)
+ {
+ case 0: // hex
+ findBa = QByteArray::fromHex(input.toLatin1());
+ break;
+ case 1: // text
+ findBa = input.toUtf8();
+ break;
+ }
+ return findBa;
+}
+
+qint64 SearchDialog::replaceOccurrence(qint64 idx, const QByteArray &replaceBa)
+{
+ int result = QMessageBox::Yes;
+ if (replaceBa.length() >= 0)
+ {
+ if (ui->cbPrompt->isChecked())
+ {
+ result = QMessageBox::question(this, tr("QHexEdit"),
+ tr("Replace occurrence?"),
+ QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
+
+ if (result == QMessageBox::Yes)
+ {
+ _hexEdit->replace(idx, replaceBa.length(), replaceBa);
+ _hexEdit->update();
+ }
+ }
+ else
+ {
+ _hexEdit->replace(idx, _findBa.length(), replaceBa);
+ }
+ }
+ return result;
+}