File indexing completed on 2024-09-22 05:15:45

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #ifndef KASTEN_SEARCHTOOL_HPP
0010 #define KASTEN_SEARCHTOOL_HPP
0011 
0012 // libfinddialog
0013 #include <finddirection.hpp>
0014 // Kasten core
0015 #include <Kasten/AbstractTool>
0016 // Okteta core
0017 #include <Okteta/Address>
0018 
0019 namespace Okteta {
0020 class AbstractByteArrayModel;
0021 }
0022 
0023 namespace Kasten {
0024 
0025 namespace If {
0026 class SearchUserQueryable;
0027 }
0028 class ByteArrayView;
0029 
0030 class SearchTool : public AbstractTool
0031 {
0032     Q_OBJECT
0033 
0034 private:
0035     static inline constexpr Qt::CaseSensitivity DefaultCaseSensitivity = Qt::CaseInsensitive;
0036 
0037     static inline constexpr char ConfigGroupId[] = "SearchTool";
0038     static inline constexpr char CaseSensitivityConfigKey[] = "CaseSensitivity";
0039 
0040 public:
0041     SearchTool();
0042     ~SearchTool() override;
0043 
0044 public: // AbstractTool API
0045 //     virtual AbstractModel* targetModel() const;
0046     QString title() const override;
0047 
0048     void setTargetModel(AbstractModel* model) override;
0049 
0050 public: // status
0051     QByteArray searchData() const;
0052     Qt::CaseSensitivity caseSensitivity() const;
0053     bool hasSelectedData() const;
0054     QString charCodingName() const;
0055 
0056     bool isApplyable() const; // candidate for AbstractTool API
0057 
0058 public: // actions
0059     void search(FindDirection direction, bool fromCursor, bool inSelection);
0060 
0061 public:
0062     void setUserQueryAgent(If::SearchUserQueryable* userQueryAgent);
0063 
0064 public Q_SLOTS: // settings
0065     void setSearchData(const QByteArray& searchData);
0066     void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity);
0067 
0068 Q_SIGNALS:
0069     void isApplyableChanged(bool isApplyable);    // candidate for AbstractTool API
0070     void charCodecChanged(const QString& codecName);
0071 
0072     void dataNotFound();
0073 
0074 private:
0075     void doSearch(FindDirection direction);
0076 
0077 private: // settings
0078     QByteArray mSearchData;
0079     Qt::CaseSensitivity mCaseSensitivity{Qt::CaseSensitive};
0080 
0081 private: // status
0082     bool mPreviousFound : 1;
0083     Okteta::Address mSearchFirstIndex;
0084     Okteta::Address mSearchLastIndex;
0085 
0086 private:
0087     If::SearchUserQueryable* mUserQueryAgent = nullptr;
0088 
0089 private: // target
0090     ByteArrayView* mByteArrayView = nullptr;
0091     Okteta::AbstractByteArrayModel* mByteArrayModel = nullptr;
0092 };
0093 
0094 inline QByteArray SearchTool::searchData() const { return mSearchData; }
0095 inline Qt::CaseSensitivity SearchTool::caseSensitivity()  const { return mCaseSensitivity; }
0096 
0097 }
0098 
0099 #endif