2021-08-02 21:58:39 +08:00
|
|
|
#include "searchdialog.h"
|
|
|
|
#include "ui_searchdialog.h"
|
2022-11-11 21:20:57 +08:00
|
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
#include <memory>
|
2022-09-26 14:54:28 +08:00
|
|
|
#include <qsynedit/Search.h>
|
|
|
|
#include <qsynedit/SearchRegex.h>
|
2022-11-11 21:20:57 +08:00
|
|
|
#include "../utils.h"
|
|
|
|
#include "../editor.h"
|
|
|
|
#include "../editorlist.h"
|
|
|
|
#include "../mainwindow.h"
|
2021-08-02 21:58:39 +08:00
|
|
|
|
|
|
|
SearchDialog::SearchDialog(QWidget *parent) :
|
|
|
|
QDialog(parent),
|
2021-08-03 23:55:57 +08:00
|
|
|
ui(new Ui::SearchDialog),
|
2022-11-11 21:20:57 +08:00
|
|
|
mSearchOptions()
|
2021-08-02 21:58:39 +08:00
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
2022-11-11 21:20:57 +08:00
|
|
|
mBasicSearchEngine= std::make_shared<QSynedit::BasicSearcher>();
|
|
|
|
mRegexSearchEngine= std::make_shared<QSynedit::RegexSearcher>();
|
2021-08-02 21:58:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
SearchDialog::~SearchDialog()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
2021-08-02 23:42:10 +08:00
|
|
|
|
|
|
|
void SearchDialog::find(const QString &text)
|
|
|
|
{
|
|
|
|
ui->cbFind->setCurrentText(text);
|
2022-03-11 20:51:33 +08:00
|
|
|
ui->cbFind->setFocus();
|
2021-08-02 23:42:10 +08:00
|
|
|
show();
|
|
|
|
}
|
|
|
|
|
2021-08-04 00:17:38 +08:00
|
|
|
void SearchDialog::findNext()
|
|
|
|
{
|
2022-11-11 21:20:57 +08:00
|
|
|
doSearch(false);
|
|
|
|
if (ui->chkCloseAfterSearch)
|
|
|
|
close();
|
2021-08-04 00:17:38 +08:00
|
|
|
}
|
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
void SearchDialog::findPrevious()
|
2021-08-02 23:42:10 +08:00
|
|
|
{
|
2022-11-11 21:20:57 +08:00
|
|
|
doSearch(true);
|
|
|
|
if (ui->chkCloseAfterSearch)
|
|
|
|
close();
|
2021-08-02 23:42:10 +08:00
|
|
|
}
|
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
void SearchDialog::doSearch(bool backward)
|
2021-08-02 23:42:10 +08:00
|
|
|
{
|
2021-11-05 10:44:23 +08:00
|
|
|
saveComboHistory(ui->cbFind,ui->cbFind->currentText());
|
2021-08-03 23:55:57 +08:00
|
|
|
|
|
|
|
mSearchOptions&=0;
|
|
|
|
|
|
|
|
// Apply options
|
2022-11-11 21:20:57 +08:00
|
|
|
if (backward) {
|
|
|
|
mSearchOptions.setFlag(QSynedit::ssoBackwards);
|
|
|
|
}
|
|
|
|
|
2021-08-03 23:55:57 +08:00
|
|
|
if (ui->chkRegExp->isChecked()) {
|
2022-09-25 09:55:18 +08:00
|
|
|
mSearchOptions.setFlag(QSynedit::ssoRegExp);
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
|
|
|
if (ui->chkCaseSensetive->isChecked()) {
|
2022-09-25 09:55:18 +08:00
|
|
|
mSearchOptions.setFlag(QSynedit::ssoMatchCase);
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
|
|
|
if (ui->chkWholeWord->isChecked()) {
|
2022-09-25 09:55:18 +08:00
|
|
|
mSearchOptions.setFlag(QSynedit::ssoWholeWord);
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
2022-01-13 12:55:55 +08:00
|
|
|
if (ui->chkWrapAround->isChecked()) {
|
2022-09-25 09:55:18 +08:00
|
|
|
mSearchOptions.setFlag(QSynedit::ssoWrapAround);
|
2022-01-13 12:55:55 +08:00
|
|
|
}
|
2021-08-03 23:55:57 +08:00
|
|
|
|
2021-08-04 00:17:38 +08:00
|
|
|
// Apply scope, when enabled
|
|
|
|
if (ui->grpScope->isEnabled()) {
|
2021-08-03 23:55:57 +08:00
|
|
|
if (ui->rbSelection->isChecked()) {
|
2022-09-25 09:55:18 +08:00
|
|
|
mSearchOptions.setFlag(QSynedit::ssoSelectedOnly);
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-04 00:17:38 +08:00
|
|
|
// Apply origin, when enabled
|
|
|
|
if (ui->grpOrigin->isEnabled()) {
|
2021-08-03 23:55:57 +08:00
|
|
|
if (ui->rbEntireScope->isChecked()) {
|
2022-09-25 09:55:18 +08:00
|
|
|
mSearchOptions.setFlag(QSynedit::ssoEntireScope);
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
Editor *editor = pMainWindow->editorList()->getEditor();
|
|
|
|
if (editor) {
|
|
|
|
// Modify the caret when using 'from cursor' and when the selection is ignored
|
|
|
|
if (!mSearchOptions.testFlag(QSynedit::ssoEntireScope) && !mSearchOptions.testFlag(QSynedit::ssoSelectedOnly)
|
|
|
|
&& editor->selAvail()) {
|
|
|
|
// start at end of selection
|
|
|
|
if (mSearchOptions.testFlag(QSynedit::ssoBackwards)) {
|
|
|
|
editor->setCaretXY(editor->blockBegin());
|
|
|
|
} else {
|
|
|
|
editor->setCaretXY(editor->blockEnd());
|
2021-09-29 20:45:03 +08:00
|
|
|
}
|
2021-08-05 12:31:53 +08:00
|
|
|
}
|
2022-11-11 21:20:57 +08:00
|
|
|
QSynedit::PSynSearchBase searchEngine;
|
|
|
|
if (mSearchOptions.testFlag(QSynedit::ssoRegExp)) {
|
|
|
|
searchEngine = mRegexSearchEngine;
|
2021-08-03 23:55:57 +08:00
|
|
|
} else {
|
2022-11-11 21:20:57 +08:00
|
|
|
searchEngine = mBasicSearchEngine;
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
2022-11-11 21:20:57 +08:00
|
|
|
editor->searchReplace(
|
|
|
|
ui->cbFind->currentText(),
|
|
|
|
"",
|
|
|
|
mSearchOptions,
|
|
|
|
searchEngine, nullptr, [this,backward](){
|
|
|
|
QString msg;
|
|
|
|
if (backward) {
|
|
|
|
msg = tr("Beginning of file has been reached. ")
|
|
|
|
+tr("Do you want to continue from file's end?");
|
|
|
|
} else {
|
|
|
|
msg = tr("End of file has been reached. ")
|
|
|
|
+tr("Do you want to continue from file's beginning?");
|
|
|
|
}
|
|
|
|
QWidget *p;
|
|
|
|
if (isVisible()) {
|
|
|
|
p=this;
|
|
|
|
} else {
|
|
|
|
p=pMainWindow;
|
|
|
|
}
|
|
|
|
return QMessageBox::question(p,
|
|
|
|
tr("Continue Search"),
|
|
|
|
msg,
|
|
|
|
QMessageBox::Yes|QMessageBox::No,
|
|
|
|
QMessageBox::Yes) == QMessageBox::Yes;
|
|
|
|
});
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
2021-08-05 12:31:53 +08:00
|
|
|
}
|
2021-08-03 23:55:57 +08:00
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
void SearchDialog::on_cbFind_currentTextChanged(const QString &value)
|
2021-08-05 12:31:53 +08:00
|
|
|
{
|
2022-11-11 21:20:57 +08:00
|
|
|
ui->btnNext->setEnabled(!value.isEmpty());
|
|
|
|
ui->btnPrevious->setEnabled(!value.isEmpty());
|
2021-08-03 23:55:57 +08:00
|
|
|
}
|
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
void SearchDialog::on_btnClose_clicked()
|
2022-04-11 09:39:44 +08:00
|
|
|
{
|
2022-11-11 21:20:57 +08:00
|
|
|
close();
|
2022-04-11 09:39:44 +08:00
|
|
|
}
|
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
void SearchDialog::on_btnNext_clicked()
|
2021-08-04 00:17:38 +08:00
|
|
|
{
|
2022-11-11 21:20:57 +08:00
|
|
|
doSearch(false);
|
2021-08-04 00:17:38 +08:00
|
|
|
}
|
|
|
|
|
2022-11-11 21:20:57 +08:00
|
|
|
void SearchDialog::on_btnPrevious_clicked()
|
2021-08-03 23:55:57 +08:00
|
|
|
{
|
2022-11-11 21:20:57 +08:00
|
|
|
doSearch(true);
|
2021-08-04 00:17:38 +08:00
|
|
|
}
|