Pārlūkot izejas kodu

Added option to search regex case insensitive

Scott Brogden 1 gadu atpakaļ
vecāks
revīzija
323f7fec35
7 mainītis faili ar 54 papildinājumiem un 1 dzēšanām
  1. 9 0
      AdvGeneral.cpp
  2. 1 0
      DatabaseUtilities.cpp
  3. 7 1
      ICU_Loader/icu.cpp
  4. 10 0
      Options.cpp
  5. 3 0
      Options.h
  6. 22 0
      sqlite/CppSQLite3.cpp
  7. 2 0
      sqlite/CppSQLite3.h

+ 9 - 0
AdvGeneral.cpp

@@ -143,6 +143,7 @@ END_MESSAGE_MAP()
 #define SETTING_CLIPBOARD_RESTORE_AFTER_COPY_BUFFER_DELAY 92
 #define SETTING_SUPPORT_ALL_TYPES 93
 #define SETTING_IGNORE_ANNOYING_CF_DIB 94
+#define SETTING_REGEX_CASE_INSENSITIVE 95
 
 BOOL CAdvGeneral::OnInitDialog()
 {
@@ -242,6 +243,8 @@ BOOL CAdvGeneral::OnInitDialog()
 
 	AddTrueFalse(pGroupTest, _T("Refresh view after paste"), CGetSetOptions::GetRefreshViewAfterPasting(), SETTING_REFRESH_VIEW_AFTER_PASTE);
 
+	AddTrueFalse(pGroupTest, _T("Regex case insensitive search"), CGetSetOptions::GetRegexCaseInsensitive(), SETTING_REGEX_CASE_INSENSITIVE);
+
 	pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Save clipboard delay (ms, default: 100)"), (long)(CGetSetOptions::GetProcessDrawClipboardDelay()), _T(""), SETTING_CLIPBOARD_SAVE_DELAY));
 
 	AddTrueFalse(pGroupTest, _T("Save multi-pastes"), CGetSetOptions::GetSaveMultiPaste(), SETTING_SAVE_MULTI_PASTE);
@@ -829,6 +832,12 @@ void CAdvGeneral::OnBnClickedOk()
 					CGetSetOptions::SetIgnoreAnnoyingCFDIB(pNewValue->bstrVal);
 				}
 				break;
+			case SETTING_REGEX_CASE_INSENSITIVE:
+				if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
+				{
+					BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
+					CGetSetOptions::SetRegexCaseInsensitive(val);
+				}
 			}
 		}
 	}

+ 1 - 0
DatabaseUtilities.cpp

@@ -215,6 +215,7 @@ BOOL OpenDatabase(CString dbPath)
 		theApp.m_db.open(dbPath);
 
 		theApp.m_db.setBusyTimeout(CGetSetOptions::GetDbTimeout());
+		theApp.m_db.SetRegexCaseInsensitive(CGetSetOptions::GetRegexCaseInsensitive());
 
 		return TRUE;
 	}

+ 7 - 1
ICU_Loader/icu.cpp

@@ -48,6 +48,7 @@ SQLITE_EXTENSION_INIT1
 #endif
 
 
+URegexpFlag regexFlags = (URegexpFlag)0;
 
 /*
 ** This function is called when an ICU function called from within
@@ -300,7 +301,7 @@ static void icuRegexpFunc(sqlite3_context* p, int nArg, sqlite3_value** apArg) {
         if (!zPattern) {
             return;
         }
-        pExpr = uregex_open(zPattern, -1, 0, 0, &status);
+        pExpr = uregex_open(zPattern, -1, regexFlags, 0, &status);
 
         if (U_SUCCESS(status)) {
             sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete);
@@ -558,6 +559,11 @@ extern "C"
 
             return brogden(db);
     }
+
+    void __declspec(dllexport) sqlite3_icu_regex_flags(int flags)
+    {
+        regexFlags = (URegexpFlag)flags;
+    }
 }
 
 

+ 10 - 0
Options.cpp

@@ -3014,3 +3014,13 @@ std::set<CString> CGetSetOptions::GetIgnoreAnnoyingCFDIBSet(BOOL useCache)
 
 	return processSet;
 }
+
+BOOL CGetSetOptions::GetRegexCaseInsensitive()
+{
+	return GetProfileLong("RegexCaseInsensitive", FALSE);
+}
+
+void CGetSetOptions::SetRegexCaseInsensitive(BOOL val)
+{
+	SetProfileLong("RegexCaseInsensitive", val);
+}

+ 3 - 0
Options.h

@@ -682,6 +682,9 @@ public:
 	static CString m_ignoreAnnoyingCFDIB;
 	static void SetIgnoreAnnoyingCFDIB(CString val);
 	static std::set<CString> GetIgnoreAnnoyingCFDIBSet(BOOL useCache = FALSE);
+
+	static BOOL GetRegexCaseInsensitive();
+	static void SetRegexCaseInsensitive(BOOL val);
 };
 
 // global for easy access and for initialization of fast access variables

+ 22 - 0
sqlite/CppSQLite3.cpp

@@ -805,6 +805,28 @@ void CppSQLite3DB::open(const TCHAR* szFile)
 	sqlite3_load_extension(mpDB, "ICU_Loader.dll", "sqlite3_icu_init", &e);
 }
 
+void CppSQLite3DB::SetRegexCaseInsensitive(bool insensitive)
+{
+	auto h = ::LoadLibrary(_T("ICU_Loader.dll"));
+	if (h != NULL)
+	{
+		void(__cdecl * SetRegexFlags)(int flags);
+
+		SetRegexFlags = (void(__cdecl*)(int flags))GetProcAddress(h, "sqlite3_icu_regex_flags");
+		if (SetRegexFlags != NULL)
+		{
+			if (insensitive)
+			{
+				SetRegexFlags(2); // 2 is the enum URegexpFlag::UREGEX_CASE_INSENSITIVE
+			}
+			else
+			{
+				SetRegexFlags(0);
+			}
+		}
+	}
+}
+
 bool CppSQLite3DB::close()
 {
 	bool bRet = true;

+ 2 - 0
sqlite/CppSQLite3.h

@@ -178,6 +178,8 @@ public:
 
     void open(const TCHAR* szFile);
 
+    void SetRegexCaseInsensitive(bool insensitive);
+
     bool close();
 
 	bool tableExists(const TCHAR* szTable);