Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
LedIt/Sources/Options.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
5#include "Stroika/Foundation/StroikaPreComp.h"
6
7#if defined(WIN32)
8#include <afxadv.h>
9#endif
10
13#include "Stroika/Foundation/Execution/ModuleGetterSetter.h"
15
16#include "Options.h"
17
18using std::byte;
19
20using namespace Stroika::Foundation;
22using namespace Stroika::Foundation::Execution;
23using namespace Stroika::Foundation::Time;
24
25using namespace Stroika::Frameworks::Led;
26
28using Memory::BLOB;
29
30using SearchParameters = TextInteractor::SearchParameters;
31
32namespace {
33
34 struct Options_ {
35 BLOB fDockBarState;
36 SearchParameters fSearchParameters{};
37 bool fSmartCutAndPaste{true};
38 bool fWrapToWindow{false};
39 bool fShowHiddenText{true};
40 bool fShowParagraphGlyphs{false};
41 bool fShowTabGlyphs{false};
42 bool fShowSpaceGlyphs{false};
43#if qStroika_Foundation_Common_Platform_Windows
44 bool fCheckFileAssocAtStartup{true};
45 BLOB fDefaultNewDocFont;
46#endif
47 };
48
49 struct Options_Storage_IMPL_ {
50 Options_Storage_IMPL_ ()
51 : fOptionsFile_{"AppSettings"sv,
52 [] () -> ObjectVariantMapper {
54
55 // really should use String, no longer Led_tString, but for now... (note this only works as is for wchar_t Led_tString
56 mapper.Add<Led_tString> ([] (const ObjectVariantMapper& /*mapper*/,
57 const Led_tString* obj) -> VariantValue { return String{*obj}; },
58 [] (const ObjectVariantMapper& /*mapper*/, const VariantValue& d,
59 Led_tString* intoObj) -> void { *intoObj = d.As<String> ().As<Led_tString> (); });
60 mapper.AddCommonType<vector<Led_tString>> ();
61 mapper.AddCommonType<Memory::BLOB> ();
62
63 mapper.AddClass<SearchParameters> ({
64 {"MatchString"sv, &SearchParameters::fMatchString},
65 {"WrapSearch"sv, &SearchParameters::fWrapSearch},
66 {"WholeWordSearch"sv, &SearchParameters::fWholeWordSearch},
67 {"CaseSensativeSearch"sv, &SearchParameters::fCaseSensativeSearch},
68 {"RecentMatchStrings"sv, &SearchParameters::fRecentFindStrings},
69 });
70
71 mapper.AddClass<Options_> ({
72 {"DockBarState"sv, &Options_::fDockBarState},
73 {"Search-Parameters"sv, &Options_::fSearchParameters},
74 {"SmartCutAndPaste"sv, &Options_::fSmartCutAndPaste},
75 {"WrapToWindow"sv, &Options_::fWrapToWindow},
76 {"ShowHiddenText"sv, &Options_::fShowHiddenText},
77 {"ShowParagraphGlyphs"sv, &Options_::fShowParagraphGlyphs},
78 {"ShowTabGlyphs"sv, &Options_::fShowTabGlyphs},
79 {"ShowSpaceGlyphs"sv, &Options_::fShowSpaceGlyphs},
80#if qStroika_Foundation_Common_Platform_Windows
81 {"CheckFileAssocAtStartup"sv, &Options_::fCheckFileAssocAtStartup},
82 {"DefaultNewDocFont"sv, &Options_::fDefaultNewDocFont},
83#endif
84 });
85 return mapper;
86 }(),
87
89
90 OptionsFile::mkFilenameMapper ("LedIt"sv)}
91 , fActualCurrentConfigData_{fOptionsFile_.Read<Options_> (Options_{})}
92 {
93 Set (fActualCurrentConfigData_); // assure derived data (and changed fields etc) up to date
94 }
95 Options_ Get () const
96 {
97 return fActualCurrentConfigData_;
98 }
99 void Set (const Options_& v)
100 {
101 fActualCurrentConfigData_ = v;
102 fOptionsFile_.Write (v);
103 }
104
105 private:
106 OptionsFile fOptionsFile_;
107 Options_ fActualCurrentConfigData_;
108 };
109
111}
112
113/*
114 ********************************************************************************
115 *********************************** Options ************************************
116 ********************************************************************************
117 */
118SearchParameters Options::GetSearchParameters () const
119{
120 return sOptions_.Get ().fSearchParameters;
121}
122
123void Options::SetSearchParameters (const SearchParameters& searchParameters)
124{
125 sOptions_.Update ([=] (Options_ d) {
126 d.fSearchParameters = searchParameters;
127 return d;
128 });
129}
130
131#if qStroika_Foundation_Common_Platform_Windows
132const CDockState& Options::GetDocBarState () const
133{
134 static CDockState dockState; // keep static copy and clear each time cuz CDocState doesn't support copy CTOR - LGP971214
135 static std::once_flag sOnce_;
136 std::call_once (sOnce_, [] () {
137 dockState.Clear ();
138 BLOB bytes = sOptions_.Get ().fDockBarState;
139 if (not bytes.empty ()) {
140 CMemFile file;
141 file.Write (Traversal::Iterator2Pointer (bytes.begin ()), static_cast<UINT> (bytes.size ()));
142 file.SeekToBegin ();
143 CArchive ar (&file, CArchive::load);
144 dockState.Serialize (ar);
145 ar.Close ();
146 }
147 });
148 return dockState;
149}
150
151void Options::SetDocBarState (const CDockState& dockState)
152{
153 CMemFile file;
154 CArchive ar (&file, CArchive::store);
155 CDockState& ds = const_cast<CDockState&> (dockState); // Serialize/Write shouldn't change object!
156 ds.Serialize (ar);
157 ar.Close ();
158 ULONG nSize = static_cast<ULONG> (file.GetLength ());
159 ASSERT (nSize < 4096);
160 byte* p = new byte[nSize];
161 file.SeekToBegin ();
162 file.Read (p, nSize);
163 sOptions_.Update ([=] (Options_ d) {
164 d.fDockBarState = BLOB{p, p + nSize};
165 return d;
166 });
167 delete[] p;
168}
169#endif
170
171bool Options::GetSmartCutAndPaste () const
172{
173 return sOptions_.Get ().fSmartCutAndPaste;
174}
175
176void Options::SetSmartCutAndPaste (bool smartCutAndPaste)
177{
178 sOptions_.Update ([=] (Options_ d) {
179 d.fSmartCutAndPaste = smartCutAndPaste;
180 return d;
181 });
182}
183
184bool Options::GetWrapToWindow () const
185{
186 return sOptions_.Get ().fWrapToWindow;
187}
188
189void Options::SetWrapToWindow (bool wrapToWindow)
190{
191 sOptions_.Update ([=] (Options_ d) {
192 d.fWrapToWindow = wrapToWindow;
193 return d;
194 });
195}
196
197bool Options::GetShowHiddenText () const
198{
199 return sOptions_.Get ().fShowHiddenText;
200}
201
202void Options::SetShowHiddenText (bool showHiddenText)
203{
204 sOptions_.Update ([=] (Options_ d) {
205 d.fShowHiddenText = showHiddenText;
206 return d;
207 });
208}
209
210bool Options::GetShowParagraphGlyphs () const
211{
212 return sOptions_.Get ().fShowParagraphGlyphs;
213}
214
215void Options::SetShowParagraphGlyphs (bool showParagraphGlyphs)
216{
217 sOptions_.Update ([=] (Options_ d) {
218 d.fShowParagraphGlyphs = showParagraphGlyphs;
219 return d;
220 });
221}
222
223bool Options::GetShowTabGlyphs () const
224{
225 return sOptions_.Get ().fShowTabGlyphs;
226}
227
228void Options::SetShowTabGlyphs (bool showTabGlyphs)
229{
230 sOptions_.Update ([=] (Options_ d) {
231 d.fShowTabGlyphs = showTabGlyphs;
232 return d;
233 });
234}
235
236bool Options::GetShowSpaceGlyphs () const
237{
238 return sOptions_.Get ().fShowSpaceGlyphs;
239}
240
241void Options::SetShowSpaceGlyphs (bool showSpaceGlyphs)
242{
243 sOptions_.Update ([=] (Options_ d) {
244 d.fShowSpaceGlyphs = showSpaceGlyphs;
245 return d;
246 });
247}
248
249#if qStroika_Foundation_Common_Platform_Windows
250bool Options::GetCheckFileAssocsAtStartup () const
251{
252 return sOptions_.Get ().fCheckFileAssocAtStartup;
253}
254
255void Options::SetCheckFileAssocsAtStartup (bool checkFileAssocsAtStartup)
256{
257 sOptions_.Update ([=] (Options_ d) {
258 d.fCheckFileAssocAtStartup = checkFileAssocsAtStartup;
259 return d;
260 });
261}
262#endif
263
264FontSpecification Options::GetDefaultNewDocFont () const
265{
266#if qStroika_Foundation_Common_Platform_Windows
267 BLOB bytes = sOptions_.Get ().fDefaultNewDocFont;
268 if (not bytes.empty ()) {
269 if (bytes.size () == sizeof (LOGFONT)) {
271 fsp.SetOSRep (bytes.As<LOGFONT> ());
272 return fsp;
273 }
274 }
275#endif
276 return GetStaticDefaultFont ();
277}
278
279void Options::SetDefaultNewDocFont ([[maybe_unused]] const FontSpecification& defaultNewDocFont)
280{
281#if qStroika_Foundation_Common_Platform_Windows
282 sOptions_.Update ([&] (Options_ d) {
283 d.fDefaultNewDocFont = BLOB::FromRaw (defaultNewDocFont.GetOSRep ());
284 return d;
285 });
286#endif
287}
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
ObjectVariantMapper can be used to map C++ types to and from variant-union types, which can be transp...
static const ModuleDataUpgraderType kDefaultUpgrader
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
nonvirtual bool empty() const
Definition BLOB.inl:246
static BLOB FromRaw(const T *s, const T *e)
Convert pointed to/referenced data to BLOB (treating the argument as raw bytes).
Definition BLOB.inl:145
nonvirtual size_t size() const
Definition BLOB.inl:281
Helper to define synchronized, lazy constructed, module initialization (intended to work with DataExc...