Skip to content

Commit be4ff52

Browse files
committed
refactor(Config, Language): Extract logic into dedicated classes
1 parent bb032f1 commit be4ff52

14 files changed

+1147
-614
lines changed

languages.ini

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ panel_quote="Quote:"
2121
panel_add_into_list="Add into List"
2222
panel_replace_all="Replace All"
2323
panel_replace="Replace"
24+
panel_find_all="Find All"
2425
panel_find_next="Find Next"
2526
panel_find_next_small="Find Next"
2627
panel_mark_matches="Mark Matches"
@@ -201,6 +202,17 @@ ctxmenu_undo="&Undo Ctrl+Z"
201202
ctxmenu_redo="&Redo Ctrl+Y"
202203
ctxmenu_add_new_line="&Add New Line Ctrl+I"
203204

205+
; Result Docking Menu
206+
rdmenu_fold_all="Fold all"
207+
rdmenu_unfold_all="Unfold all"
208+
rdmenu_copy_lines="Copy Selected Line(s)"
209+
rdmenu_copy_paths="Copy Selected Pathname(s)"
210+
rdmenu_select_all="Select All"
211+
rdmenu_clear_all="Clear all"
212+
rdmenu_open_paths="Open Selected Pathname(s)"
213+
rdmenu_wrap="Word wrap long lines"
214+
rdmenu_purge="Purge for every search"
215+
204216

205217
[german]
206218
; Panel labels (visible text on the control elements)
@@ -225,6 +237,7 @@ panel_quote="Anführ"
225237
panel_add_into_list="Zur Liste hinzufügen"
226238
panel_replace_all="Alle ersetzen"
227239
panel_replace="Ersetzen"
240+
panel_find_all="Alle suchen"
228241
panel_find_next="Nächstes finden"
229242
panel_find_next_small="Nächstes finden"
230243
panel_mark_matches="Alle markieren"
@@ -404,6 +417,17 @@ ctxmenu_undo="&Rückgängig Ctrl+Z"
404417
ctxmenu_redo="&Wiederholen Ctrl+Y"
405418
ctxmenu_add_new_line="Neue &Zeile einfügen Ctrl+I"
406419

420+
; Result Docking Menu
421+
rdmenu_fold_all="Alles einklappen"
422+
rdmenu_unfold_all="Alles aufklappen"
423+
rdmenu_copy_lines="Kopiere ausgewählte Zeile(n)"
424+
rdmenu_copy_paths="Gewählte(n) Pfadnamen kopieren"
425+
rdmenu_select_all="Alles auswählen"
426+
rdmenu_clear_all="Alles löschen"
427+
rdmenu_open_paths="Gewählte(n) Pfadnamen öffnen"
428+
rdmenu_wrap="Zeilenumbruch bei langen Zeilen"
429+
rdmenu_purge="Vor jeder Suche leeren"
430+
407431

408432
[italian]
409433
; Panel labels (visible text on the control elements)
@@ -428,6 +452,7 @@ panel_quote="Virg.:"
428452
panel_add_into_list="Aggiungi all'elenco"
429453
panel_replace_all="Sostituisci tutto"
430454
panel_replace="Sostituisci"
455+
panel_find_all="Trova tutti"
431456
panel_find_next="Trova successivo"
432457
panel_find_next_small="Trova succ."
433458
panel_mark_matches="Evidenzia corrispondenze"
@@ -607,6 +632,17 @@ ctxmenu_undo="&Annulla Ctrl+Z"
607632
ctxmenu_redo="&Ripeti Ctrl+Y"
608633
ctxmenu_add_new_line="&Nuova Riga Ctrl+I"
609634
635+
; Result Docking Menu
636+
rdmenu_fold_all="Riduci tutto"
637+
rdmenu_unfold_all="Espandi tutto"
638+
rdmenu_copy_lines="Copia righe selezionate"
639+
rdmenu_copy_paths="Copia i Percorsi Selezionati"
640+
rdmenu_select_all="Seleziona tutto"
641+
rdmenu_clear_all="Pulisci tutto"
642+
rdmenu_open_paths="Apri i Percorsi Selezionati"
643+
rdmenu_wrap="Attiva il Ritorno a capo automatico"
644+
rdmenu_purge="Pulisci ad ogni ricerca"
645+
610646
611647
[hungarian]
612648
; Panel labels
@@ -631,6 +667,7 @@ panel_quote="Idézőj."
631667
panel_add_into_list="Hozzáadás a listához"
632668
panel_replace_all="Az összes cseréje"
633669
panel_replace="Cserél"
670+
panel_find_all="Az összes keresése"
634671
panel_find_next="Következő keresés"
635672
panel_find_next_small="Követk. keresés"
636673
panel_mark_matches="Megjelölések"
@@ -810,6 +847,17 @@ ctxmenu_disable="&Letilt Alt+D"
810847
ctxmenu_undo="Visszavo&n Ctrl+Z"
811848
ctxmenu_add_new_line="&Új Sor Beszúrása Ctrl+I"
812849

850+
; Result Docking Menu
851+
rdmenu_fold_all="Minden blokk összecsukása"
852+
rdmenu_unfold_all="Minden blokk kibontása"
853+
rdmenu_copy_lines="Kijelölt sor(ok) másolása"
854+
rdmenu_copy_paths="A kijelölt elérési út/utak másolása"
855+
rdmenu_select_all="Az összes kijelölése"
856+
rdmenu_clear_all="Az összes eredmény eltávolítása"
857+
rdmenu_open_paths="A kijelölt elérési út/utak megnyitása"
858+
rdmenu_wrap="A hosszú sorok tördelése"
859+
rdmenu_purge="Az előző eredmények eltávolítása minden kereséskor"
860+
813861

814862
[russian]
815863
; Panel labels
@@ -834,6 +882,7 @@ panel_quote="Кав:"
834882
panel_add_into_list="Добавить в список"
835883
panel_replace_all="Заменить все"
836884
panel_replace="Заменить"
885+
panel_find_all="Найти все"
837886
panel_find_next="Найти следующий"
838887
panel_find_next_small="Найти след."
839888
panel_mark_matches="Выделять соответствия"
@@ -1014,6 +1063,17 @@ ctxmenu_undo="&Отменить Ctrl+Z"
10141063
ctxmenu_redo="Повто&р Ctrl+Y"
10151064
ctxmenu_add_new_line="Добавить &новую строку Ctrl+I"
10161065

1066+
; Result Docking Menu
1067+
rdmenu_fold_all="Свернуть все блоки"
1068+
rdmenu_unfold_all="Развернуть все блоки"
1069+
rdmenu_copy_lines="Копировать (выбранные строки)"
1070+
rdmenu_copy_paths="Путь и Имя выделенных файлов в буфер"
1071+
rdmenu_select_all="Выделить Всё"
1072+
rdmenu_clear_all="Очистить Окно Поиска"
1073+
rdmenu_open_paths="Открыть все выделенные файлы"
1074+
rdmenu_wrap="Перенос длинных строк"
1075+
rdmenu_purge="Очистка при каждом поиске"
1076+
10171077

10181078
[spanish]
10191079
; Panel labels
@@ -1038,6 +1098,7 @@ panel_quote="Com:"
10381098
panel_add_into_list="Añadir a la lista"
10391099
panel_replace_all="Sustituir todo"
10401100
panel_replace="Sustituir"
1101+
panel_find_all="Buscar todo"
10411102
panel_find_next="Encontrar siguiente"
10421103
panel_find_next_small="Encontrar sig."
10431104
panel_mark_matches="Marcar todo"
@@ -1218,6 +1279,17 @@ ctxmenu_undo="&Deshacer Ctrl+Z"
12181279
ctxmenu_redo="&Rehacer Ctrl+Y"
12191280
ctxmenu_add_new_line="&Añadir Nueva Línea Ctrl+I"
12201281

1282+
; Result Docking Menu
1283+
rdmenu_fold_all="Contraer todo"
1284+
rdmenu_unfold_all="Expandir todo"
1285+
rdmenu_copy_lines="Copiar línea(s) seleccionada(s)"
1286+
rdmenu_copy_paths="Copiar nombre(s) de ruta(s) seleccionada(s)"
1287+
rdmenu_select_all="Seleccionar todo"
1288+
rdmenu_clear_all="Limpiar todo"
1289+
rdmenu_open_paths="Abrir ruta(s) seleccionada(s)"
1290+
rdmenu_wrap="Ajustar longitud del texto"
1291+
rdmenu_purge="Depurar para cada búsqueda"
1292+
12211293

12221294
[french]
12231295
; Panel labels (visible text on the control elements)
@@ -1242,6 +1314,7 @@ panel_quote="Guil.:"
12421314
panel_add_into_list="Ajouter à la liste"
12431315
panel_replace_all="Remplacer tout"
12441316
panel_replace="Remplacer"
1317+
panel_find_all="Trouver tout"
12451318
panel_find_next="Rechercher suivant"
12461319
panel_find_next_small="Rech. suiv."
12471320
panel_mark_matches="Marquer les occurrences"
@@ -1422,6 +1495,17 @@ ctxmenu_undo="&Annuler Ctrl+Z"
14221495
ctxmenu_redo="&Rétablir Ctrl+Y"
14231496
ctxmenu_add_new_line="&Ajouter une nouvelle ligne Ctrl+I"
14241497

1498+
; Result Docking Menu
1499+
rdmenu_fold_all="Replier tout"
1500+
rdmenu_unfold_all="Déplier tout"
1501+
rdmenu_copy_lines="Copier la(les) ligne(s) sélectionnée(s)"
1502+
rdmenu_copy_paths="Copier le(s) chemin(s) sélectionné(s)"
1503+
rdmenu_select_all="Sélectionner tout"
1504+
rdmenu_clear_all="Effacer tout"
1505+
rdmenu_open_paths="Ouvrir le(s) chemin(s) sélectionné(s)"
1506+
rdmenu_wrap="Retour à la ligne automatique"
1507+
rdmenu_purge="Purger chaque recherche""
1508+
14251509
14261510
[portuguese]
14271511
; Panel labels (visible text on the control elements)
@@ -1446,6 +1530,7 @@ panel_quote="Aspas:"
14461530
panel_add_into_list="Adicionar à lista"
14471531
panel_replace_all="Substituir tudo"
14481532
panel_replace="Substituir"
1533+
panel_find_all="Localizar tudo"
14491534
panel_find_next="Localizar próximo"
14501535
panel_find_next_small="Próximo"
14511536
panel_mark_matches="Marcar ocorrências"
@@ -1626,6 +1711,17 @@ ctxmenu_undo="&Desfazer Ctrl+Z"
16261711
ctxmenu_redo="&Refazer Ctrl+Y"
16271712
ctxmenu_add_new_line="&Adicionar Nova Linha Ctrl+I"
16281713
1714+
; Result Docking Menu
1715+
rdmenu_fold_all="Recolher tudo"
1716+
rdmenu_unfold_all="Expandir tudo"
1717+
rdmenu_copy_lines="Copiar linha(s) selecionada(s)"
1718+
rdmenu_copy_paths="Copiar nome do caminho selecionado(s)"
1719+
rdmenu_select_all="Selecionar tudo"
1720+
rdmenu_clear_all="Limpar tudo"
1721+
rdmenu_open_paths="Abrir nome do caminho selecionado(s)"
1722+
rdmenu_wrap="Quebra de linha em linhas longas"
1723+
rdmenu_purge="Eliminar para cada pesquisa"
1724+
16291725
16301726
[danish]
16311727
; Panel labels (visible text on the control elements)
@@ -1650,6 +1746,7 @@ panel_quote="Citat"
16501746
panel_add_into_list="Tilføj til listen"
16511747
panel_replace_all="Erstat alle"
16521748
panel_replace="Erstatte"
1749+
panel_find_all="Find alle"
16531750
panel_find_next="Find næste"
16541751
panel_find_next_small="Find næste"
16551752
panel_mark_matches="Marker fund"
@@ -1830,6 +1927,17 @@ ctxmenu_undo="&Fortryd Ctrl+Z"
18301927
ctxmenu_redo="&Gentag Ctrl+Y"
18311928
ctxmenu_add_new_line="Indsæt &Ny Linje Ctrl+I"
18321929
1930+
; Result Docking Menu
1931+
rdmenu_fold_all="Sammenfold alle"
1932+
rdmenu_unfold_all="Udvid alle"
1933+
rdmenu_copy_lines="Kopiér valgte linie(r)"
1934+
rdmenu_copy_paths="Copy Selected Pathname(s)"
1935+
rdmenu_select_all="Markér alt"
1936+
rdmenu_clear_all="Ryd alle"
1937+
rdmenu_open_paths="Open Selected Pathname(s)"
1938+
rdmenu_wrap="Ombryd lange linier"
1939+
rdmenu_purge="Ryd ved ny søgning"
1940+
18331941
18341942
[ukrainian]
18351943
; Panel labels (visible text on the control elements)
@@ -1854,6 +1962,7 @@ panel_quote="Кав:"
18541962
panel_add_into_list="Додати до списку"
18551963
panel_replace_all="Замінити все"
18561964
panel_replace="Замінити"
1965+
panel_find_all="Знайти все"
18571966
panel_find_next="Знайти наступне"
18581967
panel_find_next_small="Знайти наступне"
18591968
panel_mark_matches="Позначити відповідності"
@@ -2033,3 +2142,14 @@ ctxmenu_disable="Вимк&нути Alt+D"
20332142
ctxmenu_undo="Скас&увати Ctrl+Z"
20342143
ctxmenu_redo="Повто&рити Ctrl+Y"
20352144
ctxmenu_add_new_line="&Додати новий рядок Ctrl+I"
2145+
2146+
; Result Docking Menu
2147+
rdmenu_fold_all="Згорнути все"
2148+
rdmenu_unfold_all="Розгорнути все"
2149+
rdmenu_copy_lines="Копіювати вибрані рядки"
2150+
rdmenu_copy_paths="Copy Selected Pathname(s)"
2151+
rdmenu_select_all="Вибрати все"
2152+
rdmenu_clear_all="Очистити все"
2153+
rdmenu_open_paths="Open Selected Pathname(s)"
2154+
rdmenu_wrap="Обтинати слова в довгих рядках"
2155+
rdmenu_purge="Очищати для кожного пошуку"

src/ConfigManager.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// This file is part of the MultiReplace plugin for Notepad++.
2+
// Copyright (C) 2023 Thomas Knoefel
3+
//
4+
// This program is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// This program is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU General Public License
15+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
17+
// -----------------------------------------------------------------------------
18+
// Handles user settings stored in “MultiReplace.ini”.
19+
// • wrap IniFileCache for typed read access
20+
// • simple write helpers modify the in‑memory cache
21+
// • save() serialises the full cache back to disk (UTF‑8 +BOM)
22+
// -----------------------------------------------------------------------------
23+
24+
#include "ConfigManager.h"
25+
#include "Encoding.h" // Encoding::wstringToUtf8
26+
#include <fstream>
27+
#include <sstream>
28+
#include <windows.h>
29+
30+
//
31+
// Singleton access
32+
//
33+
ConfigManager& ConfigManager::instance()
34+
{
35+
static ConfigManager mgr;
36+
return mgr;
37+
}
38+
39+
//
40+
// Load settings from file
41+
//
42+
bool ConfigManager::load(const std::wstring& iniFile)
43+
{
44+
_iniPath = iniFile;
45+
return _cache.load(iniFile);
46+
}
47+
48+
//
49+
// Save current cache to disk (UTF‑8 with BOM)
50+
//
51+
bool ConfigManager::save(const std::wstring& file) const
52+
{
53+
std::wstring path = file.empty() ? _iniPath : file;
54+
if (path.empty()) return false;
55+
56+
// to UTF‑8 narrow path
57+
int sz8 = WideCharToMultiByte(CP_UTF8, 0, path.c_str(), (int)path.size(),
58+
nullptr, 0, nullptr, nullptr);
59+
std::string narrow(sz8, 0);
60+
WideCharToMultiByte(CP_UTF8, 0, path.c_str(), (int)path.size(),
61+
narrow.data(), sz8, nullptr, nullptr);
62+
63+
std::ofstream out(narrow, std::ios::binary);
64+
if (!out.is_open()) return false;
65+
66+
// UTF‑8 BOM
67+
out.write("\xEF\xBB\xBF", 3);
68+
69+
const auto& data = _cache.raw();
70+
for (const auto& secPair : data) {
71+
const std::wstring& section = secPair.first;
72+
out << Encoding::wstringToUtf8(L"[" + section + L"]\n");
73+
74+
for (const auto& kv : secPair.second) {
75+
std::wstring line = kv.first + L"=" + kv.second + L"\n";
76+
out << Encoding::wstringToUtf8(line);
77+
}
78+
out << '\n';
79+
}
80+
out.close();
81+
return !out.fail();
82+
}
83+
84+
//
85+
// Write helpers (update cache only – caller calls save() later)
86+
//
87+
void ConfigManager::writeString(const std::wstring& sec, const std::wstring& key,
88+
const std::wstring& val)
89+
{
90+
_cache._data[sec][key] = val; // direct because ConfigManager is friend
91+
}
92+
93+
void ConfigManager::writeInt(const std::wstring& sec, const std::wstring& key,
94+
int val)
95+
{
96+
writeString(sec, key, std::to_wstring(val));
97+
}
98+
99+
// Further writeBool / writeFloat / … could be added similarly

0 commit comments

Comments
 (0)