findwin.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #pragma once
  2. #include <QMainWindow>
  3. #include <QTabWidget>
  4. #include <QVector>
  5. #include "ui_findwin.h"
  6. #ifndef DEF_FIND_TAB_INDEX
  7. #define DEF_FIND_TAB_INDEX
  8. enum FindTabIndex {
  9. FIND_TAB =0,
  10. REPLACE_TAB,
  11. DIR_FIND_TAB,
  12. MARK_TAB,
  13. };
  14. #endif
  15. class ScintillaEditView;
  16. class QsciScintilla;
  17. struct FindRecord {
  18. int lineNum;
  19. int lineStartPos; //行开始位置
  20. int pos; //查找字段的开始位置
  21. int end; //查找字段的结束位置
  22. QString lineContents;
  23. };
  24. class FindRecords {
  25. public:
  26. QString findFilePath;
  27. QString findText;
  28. //是否区分大小写
  29. //int caseSensitivity;
  30. //int totalMatch; //全词匹配
  31. int hightLightColor; //高亮颜色
  32. ScintillaEditView* pEdit;
  33. QVector<FindRecord> records;
  34. FindRecords()
  35. {
  36. pEdit = nullptr;
  37. hightLightColor = 0;
  38. }
  39. ~FindRecords()
  40. {
  41. pEdit = nullptr;
  42. }
  43. };
  44. class FindWin : public QMainWindow
  45. {
  46. Q_OBJECT
  47. public:
  48. FindWin(QWidget *parent = Q_NULLPTR);
  49. ~FindWin();
  50. void setCurrentTab(FindTabIndex index);
  51. void setTabWidget(QTabWidget * editTabWidget);
  52. void setFindText(QString & text);
  53. void keywordWinGetFouse(FindTabIndex tabIndex);
  54. void setReplaceFindText(QString& text);
  55. void setDirFindText(QString& text);
  56. void setMarkFindText(QString& text);
  57. void disableReplace();
  58. void setFindHistory(QList<QString>* findHistory);
  59. void setReplaceHistory(QList<QString>* replaceHistory);
  60. int markAllWord(QString& word);
  61. void removeLineHeadEndBlank(int mode);
  62. static void showCallTip(QsciScintilla * pEdit, int pos);
  63. void removeEmptyLine(bool isBlankContained);
  64. void findNext();
  65. void findPrev();
  66. void setFindBackward(bool isBackward);
  67. int findAtBack(QStringList& keyword);
  68. int markAtBack(QStringList& keyword);
  69. int replaceAtBack(QStringList& keyword, QStringList& replace);
  70. protected:
  71. virtual void focusInEvent(QFocusEvent *ev);
  72. virtual void focusOutEvent(QFocusEvent *ev);
  73. virtual bool eventFilter(QObject * obj, QEvent * event);
  74. //bool eventFilter(QObject *, QEvent *); //注意这里
  75. signals:
  76. void sign_findAllInCurDoc(FindRecords* record);
  77. void sign_findAllInOpenDoc(QVector<FindRecords*>* record, int hits, QString findText);
  78. void sign_replaceSaveFile(QString filePath, ScintillaEditView * pEdit);
  79. void sign_clearResult();
  80. //void sign_markAllInCurDoc(FindRecords* record);
  81. private:
  82. void updateParameterFromUI();
  83. void addFindHistory(QString & text);
  84. void addReplaceHistory(QString& text);
  85. bool isFirstFind();
  86. QString addCurFindRecord(ScintillaEditView * pEdit, FindRecords & recordRet, bool isMark=false, bool getResult=false);
  87. bool findTextInFile(QString & filePath, int & findNums, QVector<FindRecords*>* allfileInDirRecord);
  88. bool replaceTextInFile(QString & filePath, int & replaceNums, QVector<FindRecords*>* r = nullptr);
  89. int walkDirfile(QString path, int & foundTimes, bool isSkipBinary, bool isSkipHide, int skipMaxSize, bool isfilterFileType, QStringList & fileExtType, bool isSkipDir, QStringList & skipDirNames, bool isSkipChildDirs, std::function<bool(QString&, int&, QVector<FindRecords*>*allfileInDirRecord)> foundCallBack, bool isAskAbort=true);
  90. QWidget* autoAdjustCurrentEditWin();
  91. void dealWithZeroFound(QsciScintilla * pEdit);
  92. void dealWithZeroFoundShowTip(QsciScintilla * pEdit, bool isShowTip=true);
  93. void adjustSearchStartPosChange(QsciScintilla* pEdit);
  94. void dofindNext();
  95. bool replaceFindNext(QsciScintilla* pEdit, bool showZeroFindTip);
  96. bool replace(ScintillaEditView* pEdit);
  97. int doReplaceAll(ScintillaEditView * pEdit, QString& whatFind, QString& replaceText, bool isCombineUndo = true);
  98. int replaceAll();
  99. int markAll(QSet<int>* outLineNum=nullptr);
  100. int findAllInCurDoc(QStringList * reResult=nullptr);
  101. void findAllInOpenDoc(int index = -1);
  102. private slots:
  103. void slot_findNext();
  104. void slot_findPrev();
  105. void slot_findCount();
  106. void slot_findAllInCurDoc();
  107. void slot_findAllInOpenDoc();
  108. void slot_replaceFindNext();
  109. void slot_replace();
  110. void slot_findModeRegularBtChange(bool checked);
  111. void slot_replaceModeRegularBtChange(bool checked);
  112. void slot_replaceAll();
  113. void slot_replaceAllInOpenDoc();
  114. void slot_markAll();
  115. void slot_clearMark();
  116. void slot_clearAllMark();
  117. void slot_dirSelectDest();
  118. void slot_dealFileTypeChange(int state);
  119. void slot_skipDirChange(int state);
  120. void slot_dirFindAll();
  121. void slot_dirReplaceAll();
  122. void slot_tabIndexChange(int index);
  123. void on_copyReFindResult();
  124. void on_markAndBook();
  125. private:
  126. Ui::FindWin ui;
  127. FindWin(const FindWin& other) = delete;
  128. FindWin& operator=(const FindWin& other) = delete;
  129. QTabWidget *m_editTabWidget;
  130. QWidget* m_pMainPad;
  131. //第一次查找,查找参数变化,认定为第一次查找
  132. bool m_isFindFirst;
  133. bool m_BackwardDir;
  134. bool m_matchWhole;
  135. bool m_matchCase;
  136. bool m_matchWrap;
  137. int m_searchMode; // 1 normal 2 regular expression 3 Exteral
  138. //find的参数
  139. QString m_expr;
  140. bool m_re;
  141. bool m_cs;
  142. bool m_wo;
  143. bool m_wrap;
  144. bool m_forward;//是否向前查找。注意如果向后,要为false
  145. bool m_line;
  146. bool m_index;
  147. bool m_extend;
  148. //bool m_show;
  149. //bool m_posix;
  150. //bool m_cxx11;
  151. bool m_isFound;
  152. QString m_replaceWithText;
  153. //上次点击的按钮id,如果两次点击的不一样
  154. //说明是不同的操作,如果是查找,则当前这次点击算是第一次查找
  155. QString m_lastClickBtName;
  156. QList<QString>* m_findHistory;
  157. QList<QString>* m_replaceHistory;
  158. ScintillaEditView* pEditTemp;
  159. QWidget* m_curEditWin;
  160. bool m_isStatic;//是否静默处理,不弹确认对话框
  161. bool m_isReverseFind; //是否反向查找。只有在查找前一个时才生效true 下一个必须是false
  162. };