1 ///////////////////////////////////////////////////////////////////////////////
2 // File:        steprefs.cpp
3 // Purpose:     wxSTEditor Preferences/Styles/Languages initialization
4 // Maintainer:
5 // Created:     2003-04-04
6 // Copyright:   (c) John Labenski, Otto Wyss
7 // Licence:     wxWidgets licence
8 ///////////////////////////////////////////////////////////////////////////////
9 
10 #include "precomp.h"
11 
12 #include "wx/stedit/steprefs.h"
13 #include "wx/stedit/stedit.h"
14 
15 extern wxSTEditorPrefs  s_wxSTEditorPrefs;
16 
17 //----------------------------------------------------------------------------
18 // wxSTEditorPrefBase
19 //----------------------------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxSTEditorPrefBase,wxObject)20 IMPLEMENT_ABSTRACT_CLASS(wxSTEditorPrefBase, wxObject)
21 
22 #define M_BASEDATA ((wxSTEditorPrefBase_RefData *)m_refData)
23 
24 size_t wxSTEditorPrefBase::GetEditorCount() const
25 {
26     wxCHECK_MSG(IsOk(), 0, wxT("wxSTEditorPrefBase not created"));
27     return M_BASEDATA->m_editors.GetCount();
28 }
29 
FindEditor(wxSTEditor * editor) const30 int wxSTEditorPrefBase::FindEditor(wxSTEditor* editor) const
31 {
32     wxCHECK_MSG(IsOk(), wxNOT_FOUND, wxT("wxSTEditorPrefBase not created"));
33     return M_BASEDATA->m_editors.Index(editor);
34 }
35 
GetEditor(size_t n) const36 wxSTEditor *wxSTEditorPrefBase::GetEditor(size_t n) const
37 {
38     wxCHECK_MSG(IsOk(), NULL, wxT("wxSTEditorPrefBase not created"));
39     return (wxSTEditor*)M_BASEDATA->m_editors[n];
40 }
41 
UpdateAllEditors()42 void wxSTEditorPrefBase::UpdateAllEditors()
43 {
44     wxCHECK_RET(IsOk(), wxT("wxSTEditorPrefBase not created"));
45     size_t n, count = GetEditorCount();
46     for (n = 0; n < count; n++)
47     {
48         //wxPrintf(wxT("wxSTEditorPrefBase::UpdateAllEditors %ld editor %ld\n"), (long)this, (long)M_BASEDATA->m_editors[n]);
49         UpdateEditor((wxSTEditor*)M_BASEDATA->m_editors[n]);
50     }
51 }
52 
RegisterEditor(wxSTEditor * editor,bool update_now)53 void wxSTEditorPrefBase::RegisterEditor(wxSTEditor *editor, bool update_now)
54 {
55     wxCHECK_RET(IsOk(), wxT("wxSTEditorPrefBase not created"));
56     wxCHECK_RET(editor, wxT("Invalid editor"));
57 
58     // not an error, just let them do it to avoid having to check
59     if (!HasEditor(editor))
60         M_BASEDATA->m_editors.Add(editor);
61 
62     if (update_now)
63         UpdateEditor(editor);
64 }
RemoveEditor(wxSTEditor * editor)65 void wxSTEditorPrefBase::RemoveEditor(wxSTEditor *editor)
66 {
67     wxCHECK_RET(IsOk(), wxT("wxSTEditorPrefBase not created"));
68     wxCHECK_RET(editor, wxT("Invalid editor"));
69 
70     // not an error, if not found allows for this to be called in destructor
71     int index = FindEditor(editor);
72     if (index != wxNOT_FOUND)
73         M_BASEDATA->m_editors.RemoveAt(index);
74 }
75 
76 //----------------------------------------------------------------------------
77 // wxSTEditorPref_RefData
78 //----------------------------------------------------------------------------
79 
80 static wxArrayString s_STE_PrefNames;
81 static wxArrayString s_STE_PrefValues;
82 static wxArrayInt    s_STE_PrefFlags;
83 
84 class wxSTEditorPref_RefData : public wxSTEditorPrefBase_RefData
85 {
86 public:
wxSTEditorPref_RefData()87     wxSTEditorPref_RefData()
88     {
89         m_prefs = s_STE_PrefValues;
90         m_lineNumberAutoWidth = -1;
91     }
92 
93     wxArrayString m_prefs;
94     wxString      m_lineNumberStyle;
95     int           m_lineNumberAutoWidth;
96 };
97 
98 #define M_PREFDATA ((wxSTEditorPref_RefData *)m_refData)
99 
100 //----------------------------------------------------------------------------
101 // wxSTEditorPrefs
102 //----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxSTEditorPrefs,wxSTEditorPrefBase)103 IMPLEMENT_DYNAMIC_CLASS(wxSTEditorPrefs, wxSTEditorPrefBase)
104 
105 wxSTEditorPrefs& wxSTEditorPrefs::GetGlobalEditorPrefs()
106 {
107     return s_wxSTEditorPrefs;
108 }
109 
Init()110 void wxSTEditorPrefs::Init()
111 {
112     if (s_STE_PrefNames.GetCount() != 0) return;  // only add once
113 
114     // sanity check, run in debug mode only
115     wxASSERT_MSG(ID_STE_PREF__LAST-ID_STE_PREF__FIRST == STE_PREF__MAX - 1,
116                  wxT("The ID_STE_PREF_XXX count != STE_PREF_XXX count"));
117 
118     s_STE_PrefNames.Alloc(STE_PREF__MAX);
119     s_STE_PrefValues.Alloc(STE_PREF__MAX);
120     s_STE_PrefFlags.Alloc(STE_PREF__MAX);
121 
122     AddInitPref(wxT("Highlight Syntax"),    1, STE_PREF_FLAG_BOOL);
123     AddInitPref(wxT("Highlight Preprocessor"), 1, STE_PREF_FLAG_BOOL);
124     AddInitPref(wxT("Highlight Braces"),    1, STE_PREF_FLAG_BOOL);
125     AddInitPref(wxT("Load Init Language"),  1, STE_PREF_FLAG_BOOL);
126     AddInitPref(wxT("Load Unicode"),        STE_LOAD_DEFAULT, STE_PREF_FLAG_INT);
127     AddInitPref(wxT("Wrap Mode"),           wxSTC_WRAP_NONE, STE_PREF_FLAG_INT);
128     AddInitPref(wxT("Wrap Visual Flags"),   wxSTC_WRAPVISUALFLAG_END, STE_PREF_FLAG_INT);
129     AddInitPref(wxT("Wrap Visual Flags Location"), wxSTC_WRAPVISUALFLAGLOC_DEFAULT, STE_PREF_FLAG_INT);
130     AddInitPref(wxT("Wrap Start Indent"),   0, STE_PREF_FLAG_INT);
131     AddInitPref(wxT("Zoom"),                0, STE_PREF_FLAG_INT);
132     AddInitPref(wxT("View EOL"),            0, STE_PREF_FLAG_BOOL);
133     AddInitPref(wxT("View Whitespace"),     wxSTC_WS_INVISIBLE, STE_PREF_FLAG_INT);
134     AddInitPref(wxT("Indent Guides"),       1, STE_PREF_FLAG_BOOL);
135     AddInitPref(wxT("Edge Mode"),           wxSTC_EDGE_LINE, STE_PREF_FLAG_INT);
136     AddInitPref(wxT("Edge Column"),         80, STE_PREF_FLAG_INT);
137     AddInitPref(wxT("View Line Margin"),    0, STE_PREF_FLAG_BOOL);
138     AddInitPref(wxT("View Marker Margin"),  0, STE_PREF_FLAG_BOOL);
139     AddInitPref(wxT("View Fold Margin"),    1, STE_PREF_FLAG_BOOL);
140     AddInitPref(wxT("Use Tabs"),            0, STE_PREF_FLAG_BOOL);
141     AddInitPref(wxT("Tab Indents"),         1, STE_PREF_FLAG_BOOL);
142     AddInitPref(wxT("Tab Width"),           4, STE_PREF_FLAG_INT);
143     AddInitPref(wxT("Indent Width"),        4, STE_PREF_FLAG_INT);
144     AddInitPref(wxT("BackSpace Unindents"), 1, STE_PREF_FLAG_BOOL);
145     AddInitPref(wxT("Auto Indent"),         1, STE_PREF_FLAG_BOOL);
146     AddInitPref(wxT("Caret Line Visible"),  1, STE_PREF_FLAG_BOOL);
147     AddInitPref(wxT("Caret Width"),         1, STE_PREF_FLAG_INT);
148     AddInitPref(wxT("Caret Period"),        500, STE_PREF_FLAG_INT);
149     AddInitPref(wxT("Caret Policy X"),      wxSTC_CARET_EVEN|wxSTC_VISIBLE_STRICT|wxSTC_CARET_SLOP, STE_PREF_FLAG_INT);
150     AddInitPref(wxT("Caret Policy Y"),      wxSTC_CARET_EVEN|wxSTC_VISIBLE_STRICT|wxSTC_CARET_SLOP, STE_PREF_FLAG_INT);
151     AddInitPref(wxT("Caret Slop X"),        1, STE_PREF_FLAG_INT);
152     AddInitPref(wxT("Caret Slop Y"),        1, STE_PREF_FLAG_INT);
153     AddInitPref(wxT("Visible Policy"),      wxSTC_VISIBLE_STRICT|wxSTC_VISIBLE_SLOP, STE_PREF_FLAG_INT);
154     AddInitPref(wxT("Visible Slop"),        1, STE_PREF_FLAG_INT);
155     AddInitPref(wxT("EOL Mode"),
156 #if defined(__WXMSW__) || defined(__WXPM__)
157                                             wxSTC_EOL_CRLF, STE_PREF_FLAG_INT);
158 #elif defined(__WXMAC__) && !defined(__DARWIN__)
159                                             wxSTC_EOL_CR, STE_PREF_FLAG_INT);
160 #else
161                                             wxSTC_EOL_LF, STE_PREF_FLAG_INT);
162 #endif
163     AddInitPref(wxT("Selection mode"),      -1, STE_PREF_FLAG_INT);
164     AddInitPref(wxT("Print Magnification"), -2, STE_PREF_FLAG_INT);
165     AddInitPref(wxT("Print Colour Mode"),   wxSTC_PRINT_COLOURONWHITE, STE_PREF_FLAG_INT);
166     AddInitPref(wxT("Print Wrap Mode"),     wxSTC_WRAP_WORD, STE_PREF_FLAG_INT);
167     AddInitPref(wxT("Print Linenumbers"),   STE_PRINT_LINENUMBERS_DEFAULT, STE_PREF_FLAG_INT);
168     AddInitPref(wxT("Fold Flags"),          wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED|wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED, STE_PREF_FLAG_INT); //wxSTC_FOLDFLAG_LEVELNUMBERS
169     AddInitPref(wxT("Fold Styles"),         STE_FOLD_STYLE_DEFAULT, STE_PREF_FLAG_INT);
170     AddInitPref(wxT("Fold Margin Style"),   STE_FOLDMARGIN_STYLE_SQUARES, STE_PREF_FLAG_INT);
171     AddInitPref(wxT("Buffered Draw"),       1, STE_PREF_FLAG_BOOL);
172     AddInitPref(wxT("Two Phase Draw"),      0, STE_PREF_FLAG_BOOL);
173     // DO NOT USE page cache in wxWidgets < 2.5.4, leads to a crash eventually Need Scintilla 1.61
174     AddInitPref(wxT("Layout Cache"),
175                                             wxSTC_CACHE_PAGE, STE_PREF_FLAG_INT);
176     AddInitPref(wxT("Use Antialiasing"),    1,                STE_PREF_FLAG_BOOL);
177 
178     AddInitPref(wxT("Save Remove Trailing Whitespace"), 0,    STE_PREF_FLAG_BOOL);
179     AddInitPref(wxT("Save Convert EOL"),                0,    STE_PREF_FLAG_BOOL);
180 
181 
182     AddInitPref(wxT("Horizontal Scrollbar"), 1,                 STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
183     AddInitPref(wxT("Vertical Scrollbar"),   1,                 STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
184     AddInitPref(wxT("Margin0 Type"),       wxSTC_MARGIN_NUMBER, STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
185     AddInitPref(wxT("Margin1 Type"),       wxSTC_MARGIN_SYMBOL, STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
186     AddInitPref(wxT("Margin2 Type"),       wxSTC_MARGIN_SYMBOL, STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
187     AddInitPref(wxT("Margin0 Width"),      -1,                  STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
188     AddInitPref(wxT("Margin1 Width"),      16,                  STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
189     AddInitPref(wxT("Margin2 Width"),      16,                  STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
190     AddInitPref(wxT("Margin0 Mask"),       0,                   STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
191     AddInitPref(wxT("Margin1 Mask"),       ~wxSTC_MASK_FOLDERS, STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
192     AddInitPref(wxT("Margin2 Mask"),       wxSTC_MASK_FOLDERS,  STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
193     AddInitPref(wxT("Margin0 Sensitive"),  0,                   STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
194     AddInitPref(wxT("Margin1 Sensitive"),  1,                   STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
195     AddInitPref(wxT("Margin2 Sensitive"),  1,                   STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
196 
197     AddInitPref(wxT("Bookmark Margin1 DClick"),  1,             STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
198 
199     AddInitPref(wxT("Auto Completion Stops"),             wxT(" ()[]{}<>:;.?"), STE_PREF_FLAG_STRING|STE_PREF_FLAG_NOCONFIG);
200     AddInitPref(wxT("Auto Completion Separator"),         int(' '),      STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
201     AddInitPref(wxT("Auto Completion FillUps"),           wxEmptyString, STE_PREF_FLAG_STRING|STE_PREF_FLAG_NOCONFIG);
202     AddInitPref(wxT("Auto Completion Cancel at Start"),   1,             STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
203     AddInitPref(wxT("Auto Completion Choose Single"),     1,             STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
204     AddInitPref(wxT("Auto Completion Ignore Case"),       0,             STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
205     AddInitPref(wxT("Auto Completion Auto Hide"),         1,             STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
206     AddInitPref(wxT("Auto Completion Drop Rest of Word"), 1,             STE_PREF_FLAG_BOOL|STE_PREF_FLAG_NOCONFIG);
207     AddInitPref(wxT("Auto Completion Type Separator"),    int('?'),      STE_PREF_FLAG_INT|STE_PREF_FLAG_NOCONFIG);
208 
209     wxASSERT(s_STE_PrefNames.GetCount() == STE_PREF__MAX);
210 }
211 
GetPrefName(size_t pref_n) const212 wxString wxSTEditorPrefs::GetPrefName(size_t pref_n) const
213 {
214     wxCHECK_MSG(pref_n < GetInitPrefCount(), wxEmptyString,
215                 wxT("Invalid pref id in wxSTEditorPrefs::GetPrefName"));
216     return s_STE_PrefNames[pref_n];
217 }
SetPrefName(size_t pref_n,const wxString & prefName)218 void wxSTEditorPrefs::SetPrefName(size_t pref_n, const wxString& prefName)
219 {
220     wxCHECK_RET(pref_n < GetInitPrefCount(),
221         wxT("Invalid pref id in wxSTEditorPrefs::SetPrefName"));
222     s_STE_PrefNames[pref_n] = prefName;
223 }
224 
GetPrefFlags(size_t pref_n) const225 int wxSTEditorPrefs::GetPrefFlags(size_t pref_n) const
226 {
227     wxCHECK_MSG(pref_n < GetInitPrefCount(), 0,
228                 wxT("Invalid pref id in wxSTEditorPrefs::GetPrefFlags"));
229     return s_STE_PrefFlags[pref_n];
230 }
SetPrefFlags(size_t pref_n,int flags)231 void wxSTEditorPrefs::SetPrefFlags(size_t pref_n, int flags)
232 {
233     wxCHECK_RET(pref_n < GetInitPrefCount(),
234                 wxT("Invalid pref id in wxSTEditorPrefs::SetPrefFlags"));
235     s_STE_PrefFlags[pref_n] = flags;
236 }
237 
GetInitPrefValue(size_t pref_n) const238 wxString wxSTEditorPrefs::GetInitPrefValue(size_t pref_n) const
239 {
240     wxCHECK_MSG(pref_n < GetInitPrefCount(), wxEmptyString,
241                 wxT("Invalid pref id in wxSTEditorPrefs::GetInitPrefValue"));
242     return s_STE_PrefValues[pref_n];
243 }
SetInitPrefValue(size_t pref_n,const wxString & value) const244 void wxSTEditorPrefs::SetInitPrefValue(size_t pref_n, const wxString& value) const
245 {
246     wxCHECK_RET(pref_n < GetInitPrefCount(),
247                 wxT("Invalid pref id in wxSTEditorPrefs::SetInitPrefValue"));
248     s_STE_PrefValues[pref_n] = value;
249 }
250 
AddInitPref(const wxString & prefName,const wxString & value,int flags) const251 size_t wxSTEditorPrefs::AddInitPref(const wxString& prefName,
252                                           const wxString& value, int flags) const
253 {
254     s_STE_PrefNames.Add(prefName);
255     s_STE_PrefValues.Add(value);
256     s_STE_PrefFlags.Add(flags);
257     return s_STE_PrefValues.GetCount() - 1;
258 }
AddInitPref(const wxString & prefName,int value,int flags) const259 size_t wxSTEditorPrefs::AddInitPref(const wxString& prefName, int value, int flags) const
260 {
261     return AddInitPref(prefName, wxString::Format(wxT("%d"), value), flags);
262 }
GetInitPrefCount() const263 size_t wxSTEditorPrefs::GetInitPrefCount() const
264 {
265     return s_STE_PrefValues.GetCount();
266 }
267 
Create()268 bool wxSTEditorPrefs::Create()
269 {
270     UnRef();
271     m_refData = new wxSTEditorPref_RefData();
272     return true;
273 }
274 
Create(const wxSTEditorPrefs & prefs)275 bool wxSTEditorPrefs::Create(const wxSTEditorPrefs &prefs)
276 {
277     Ref(prefs);
278     return true;
279 }
280 
Create(wxSTEditor * editor)281 bool wxSTEditorPrefs::Create(wxSTEditor *editor)
282 {
283     wxCHECK_MSG(editor, false, wxT("Invalid editor in wxSTEditorPrefs::Create"));
284 
285     UnRef();
286     m_refData = new wxSTEditorPref_RefData();
287 
288     // STE_PREF_HIGHLIGHT_SYNTAX
289     // STE_PREF_HIGHLIGHT_PREPROC
290     // STE_PREF_HIGHLIGHT_BRACES
291     // STE_PREF_LOAD_INIT_LANG
292     // STE_PREF_LOAD_UNICODE
293 
294     SetPrefInt(STE_PREF_WRAP_MODE,           editor->GetWrapMode(), false);
295     SetPrefInt(STE_PREF_WRAP_VISUALFLAGS,    editor->GetWrapVisualFlags(), false);
296     SetPrefInt(STE_PREF_WRAP_VISUALFLAGSLOC, editor->GetWrapVisualFlagsLocation(), false);
297     SetPrefInt(STE_PREF_WRAP_STARTINDENT,    editor->GetWrapStartIndent(), false);
298 
299     SetPrefInt(STE_PREF_ZOOM, editor->GetZoom(), false);
300 
301     SetPrefBool(STE_PREF_VIEW_EOL,       editor->GetViewEOL(), false);
302     SetPrefInt(STE_PREF_VIEW_WHITESPACE, editor->GetViewWhiteSpace(), false);
303 
304 
305     SetPrefBool(STE_PREF_INDENT_GUIDES, editor->GetIndentationGuides() ? true : false, false);
306     SetPrefInt(STE_PREF_EDGE_MODE,      editor->GetEdgeMode(), false);
307     SetPrefInt(STE_PREF_EDGE_COLUMN,    editor->GetEdgeColumn(), false);
308 
309     bool view;
310     view = (editor->GetMarginType(STE_MARGIN_NUMBER) == wxSTC_MARGIN_NUMBER) &&
311            (editor->GetMarginWidth(STE_MARGIN_NUMBER) > 0);
312     SetPrefBool(STE_PREF_VIEW_LINEMARGIN, view, false);
313     view = (editor->GetMarginType(STE_MARGIN_MARKER) == wxSTC_MARGIN_SYMBOL) &&
314            (editor->GetMarginWidth(STE_MARGIN_MARKER) > 0);
315     SetPrefBool(STE_PREF_VIEW_MARKERMARGIN, view, false);
316     view = (editor->GetMarginType(STE_MARGIN_FOLD) == wxSTC_MARGIN_SYMBOL) &&
317            (editor->GetMarginMask(STE_MARGIN_FOLD) == (int)wxSTC_MASK_FOLDERS) &&
318            (editor->GetMarginWidth(STE_MARGIN_FOLD) > 0);
319     SetPrefBool(STE_PREF_VIEW_FOLDMARGIN, view, false);
320 
321     SetPrefBool(STE_PREF_USE_TABS,            editor->GetUseTabs(), false);
322     SetPrefBool(STE_PREF_TAB_INDENTS,         editor->GetTabIndents(), false);
323     SetPrefInt(STE_PREF_TAB_WIDTH,            editor->GetTabWidth(), false);
324     SetPrefInt(STE_PREF_INDENT_WIDTH,         editor->GetIndent(), false);
325     SetPrefBool(STE_PREF_BACKSPACE_UNINDENTS, editor->GetBackSpaceUnIndents(), false);
326 
327     SetPrefBool(STE_PREF_CARET_LINE_VISIBLE,  editor->GetCaretLineVisible(), false);
328     SetPrefInt(STE_PREF_CARET_WIDTH,          editor->GetCaretWidth(), false);
329     SetPrefInt(STE_PREF_CARET_PERIOD,         editor->GetCaretPeriod(), false);
330     //STE_PREF_CARET_POLICY_X - can't get these values from editor
331     //STE_PREF_CARET_POLICY_Y
332     //STE_PREF_CARET_SLOP_X
333     //STE_PREF_CARET_SLOP_Y
334 
335     SetPrefInt(STE_PREF_EOL_MODE,            editor->GetEOLMode(), false);
336 
337     SetPrefInt(STE_PREF_SELECTION_MODE,      editor->GetSelectionMode(), false);
338 
339     SetPrefInt(STE_PREF_PRINT_MAGNIFICATION, editor->GetPrintMagnification(), false);
340     SetPrefInt(STE_PREF_PRINT_COLOURMODE,    editor->GetPrintColourMode(), false);
341     SetPrefInt(STE_PREF_PRINT_WRAPMODE,      editor->GetPrintWrapMode(), false);
342 
343     // STE_PREF_FOLD_FLAGS - can't get these values from editor
344     // STE_PREF_FOLD_STYLE
345     // STE_PREF_FOLDMARGIN_STYLE
346 
347     SetPrefBool(STE_PREF_BUFFERED_DRAW,     editor->GetBufferedDraw(), false);
348     SetPrefBool(STE_PREF_TWOPHASE_DRAW,     editor->GetTwoPhaseDraw(), false);
349     SetPrefInt(STE_PREF_LAYOUT_CACHE,       editor->GetLayoutCache(),  false);
350     SetPrefInt(STE_PREF_USEANTIALIASING,    editor->GetUseAntiAliasing(), false);
351 
352     // STE_PREF_SAVE_REMOVE_WHITESP
353     // STE_PREF_SAVE_CONVERT_EOL
354 
355     SetPrefBool(STE_PREF_HORIZ_SCROLLBAR,   editor->GetUseHorizontalScrollBar(), false);
356     SetPrefBool(STE_PREF_VERT_SCROLLBAR,    editor->GetUseVerticalScrollBar(), false);
357 
358     SetPrefInt(STE_PREF_MARGIN0_TYPE,       editor->GetMarginType(0),  false);
359     SetPrefInt(STE_PREF_MARGIN1_TYPE,       editor->GetMarginType(1),  false);
360     SetPrefInt(STE_PREF_MARGIN2_TYPE,       editor->GetMarginType(2),  false);
361     SetPrefInt(STE_PREF_MARGIN0_WIDTH,      editor->GetMarginWidth(0), false);
362     SetPrefInt(STE_PREF_MARGIN1_WIDTH,      editor->GetMarginWidth(1), false);
363     SetPrefInt(STE_PREF_MARGIN2_WIDTH,      editor->GetMarginWidth(2), false);
364     SetPrefInt(STE_PREF_MARGIN0_MASK,       editor->GetMarginMask(0),  false);
365     SetPrefInt(STE_PREF_MARGIN1_MASK,       editor->GetMarginMask(1),  false);
366     SetPrefInt(STE_PREF_MARGIN2_MASK,       editor->GetMarginMask(2),  false);
367     SetPrefBool(STE_PREF_MARGIN0_SENSITIVE, editor->GetMarginSensitive(0), false);
368     SetPrefBool(STE_PREF_MARGIN1_SENSITIVE, editor->GetMarginSensitive(1), false);
369     SetPrefBool(STE_PREF_MARGIN2_SENSITIVE, editor->GetMarginSensitive(2), false);
370 
371     //STE_PREF_AUTOC_STOPS - can't get this from the editor
372     SetPrefInt(STE_PREF_AUTOC_SEPARATOR,       editor->AutoCompGetSeparator(), false);
373     //STE_PREF_AUTOC_FILLUPS - can't get this from the editor
374     SetPrefBool(STE_PREF_AUTOC_CANCELATSTART,  editor->AutoCompGetCancelAtStart(), false);
375     SetPrefBool(STE_PREF_AUTOC_CHOOSESINGLE,   editor->AutoCompGetChooseSingle(), false);
376     SetPrefBool(STE_PREF_AUTOC_IGNORECASE,     editor->AutoCompGetIgnoreCase(), false);
377     SetPrefBool(STE_PREF_AUTOC_AUTOHIDE,       editor->AutoCompGetAutoHide(), false);
378     SetPrefBool(STE_PREF_AUTOC_DROPRESTOFWORD, editor->AutoCompGetDropRestOfWord(), false);
379     SetPrefInt(STE_PREF_AUTOC_TYPESEPARATOR,   editor->AutoCompGetTypeSeparator(), false);
380 
381     return true;
382 }
383 
Copy(const wxSTEditorPrefs & other)384 void wxSTEditorPrefs::Copy(const wxSTEditorPrefs &other)
385 {
386     wxCHECK_RET(other.IsOk(), wxT("Prefs not created"));
387     if (!IsOk()) Create();
388     if (*this == other) return;
389     wxSTEditorPref_RefData *otherPrefData = (wxSTEditorPref_RefData*)other.GetRefData();
390     M_PREFDATA->m_prefs = otherPrefData->m_prefs;
391 }
392 
Reset()393 void wxSTEditorPrefs::Reset()
394 {
395     wxCHECK_RET(IsOk(), wxT("Prefs not created"));
396     Create();
397 }
398 
IsEqualTo(const wxSTEditorPrefs & prefs) const399 bool wxSTEditorPrefs::IsEqualTo(const wxSTEditorPrefs &prefs) const
400 {
401     wxCHECK_MSG(IsOk() && prefs.IsOk(), false, wxT("Prefs not created"));
402     const wxArrayString& prefArray = M_PREFDATA->m_prefs;
403     const wxArrayString& otherPrefArray = ((wxSTEditorPref_RefData*)prefs.GetRefData())->m_prefs;
404     if (prefArray.GetCount() != otherPrefArray.GetCount()) return false;
405     size_t n, count = prefArray.GetCount();
406     for (n = 0; n < count; n++)
407     {
408         if (prefArray[n] != otherPrefArray[n]) return false;
409     }
410 
411     return true;
412 }
413 
GetPrefCount() const414 size_t wxSTEditorPrefs::GetPrefCount() const
415 {
416     wxCHECK_MSG(IsOk(), 0, wxT("Prefs not created"));
417     return M_PREFDATA->m_prefs.GetCount();
418 }
419 
GetPref(size_t pref_n) const420 wxString wxSTEditorPrefs::GetPref(size_t pref_n) const
421 {
422     wxCHECK_MSG(IsOk(), wxEmptyString, wxT("Prefs not created"));
423     wxCHECK_MSG(pref_n < GetPrefCount(), wxEmptyString,
424                 wxT("Invalid pref id in wxSTEditorPrefs::GetPrefInt"));
425     return M_PREFDATA->m_prefs[pref_n];
426 }
SetPref(size_t pref_n,const wxString & value,bool update)427 bool wxSTEditorPrefs::SetPref(size_t pref_n, const wxString& value, bool update)
428 {
429     wxCHECK_MSG(IsOk(), false, wxT("Prefs not created"));
430     wxCHECK_MSG(pref_n < GetPrefCount(), false,
431                 wxT("Invalid pref id in wxSTEditorPrefs::SetPref"));
432     M_PREFDATA->m_prefs[pref_n] = value;
433 
434     if (update)
435         UpdateAllEditors();
436 
437     return true;
438 }
GetPrefInt(size_t pref_n) const439 int wxSTEditorPrefs::GetPrefInt(size_t pref_n) const
440 {
441     return wxAtoi(GetPref(pref_n));
442 }
SetPrefInt(size_t pref_n,int value,bool update)443 bool wxSTEditorPrefs::SetPrefInt(size_t pref_n, int value, bool update)
444 {
445     return SetPref(pref_n, wxString::Format(wxT("%d"), value), update);
446 }
447 
448 // Note: The define generates this code for:
449 // UPEDIT(STE_PREF_WRAP_MODE, GetWrapMode, SetWrapMode, GetPrefInt)
450 // if (!HasPrefFlag(STE_PREF_WRAP_MODE, STE_PREF_FLAG_IGNORE) &&
451 //     (editor->GetWrapMode() != GetPrefInt(STE_PREF_WRAP_MODE)))
452 //     editor->SetWrapMode(GetPrefInt(STE_PREF_WRAP_MODE));
453 
454 #define UPEDIT(pref_n, editGetFn, editSetFn, getPrefFn) \
455     if (!HasPrefFlag(pref_n, STE_PREF_FLAG_IGNORE) &&   \
456         (editor->editGetFn() != getPrefFn(pref_n)))     \
457         editor->editSetFn(getPrefFn(pref_n));
458 
459 #define UPEDIT_PARAM(pref_n, param, editGetFn, editSetFn, getPrefFn) \
460     if (!HasPrefFlag(pref_n, STE_PREF_FLAG_IGNORE) &&   \
461         (editor->editGetFn(param) != getPrefFn(pref_n)))     \
462         editor->editSetFn(param, getPrefFn(pref_n));
463 
UpdateEditor(wxSTEditor * editor)464 void wxSTEditorPrefs::UpdateEditor(wxSTEditor *editor)
465 {
466     wxCHECK_RET(IsOk(), wxT("Prefs not created"));
467     wxCHECK_RET(editor, wxT("Invalid wxSTEditor"));
468 
469     // STE_PREF_SYNTAXHILIGHT  done in langs
470 
471     if (!HasPrefFlag(STE_PREF_HIGHLIGHT_PREPROC, STE_PREF_FLAG_IGNORE))
472         editor->SetProperty(wxT("styling.within.preprocessor"),
473                             GetPrefBool(STE_PREF_HIGHLIGHT_PREPROC) ? wxT("1") : wxT("0"));
474 
475     // STE_PREF_HIGHLIGHT_BRACES nothing to set, see wxSTEditor::OnSTCUpdateUI
476     // STE_PREF_LOAD_INIT_LANG nothing to set, see wxSTEditor::LoadFile
477     // STE_PREF_LOAD_UNICODE nothing to set, see wxSTEditor::LoadFile
478 
479     UPEDIT(STE_PREF_WRAP_MODE,           GetWrapMode, SetWrapMode, GetPrefInt)
480     UPEDIT(STE_PREF_WRAP_VISUALFLAGS,    GetWrapVisualFlags, SetWrapVisualFlags, GetPrefInt)
481     UPEDIT(STE_PREF_WRAP_VISUALFLAGSLOC, GetWrapVisualFlagsLocation, SetWrapVisualFlagsLocation, GetPrefInt)
482     UPEDIT(STE_PREF_WRAP_STARTINDENT,    GetWrapStartIndent, SetWrapStartIndent, GetPrefInt)
483 
484     UPEDIT(STE_PREF_ZOOM, GetZoom, SetZoom, GetPrefInt)
485 
486     UPEDIT(STE_PREF_VIEW_EOL,        GetViewEOL, SetViewEOL, GetPrefBool)
487     UPEDIT(STE_PREF_VIEW_WHITESPACE, GetViewWhiteSpace, SetViewWhiteSpace, GetPrefInt)
488 
489     UPEDIT(STE_PREF_INDENT_GUIDES, GetIndentationGuides, SetIndentationGuides, GetPrefBool)
490     UPEDIT(STE_PREF_EDGE_MODE,     GetEdgeMode, SetEdgeMode, GetPrefInt)
491     UPEDIT(STE_PREF_EDGE_COLUMN,   GetEdgeColumn, SetEdgeColumn, GetPrefInt)
492 
493     // STE_PREF_VIEW_LINEMARGIN   see below
494     // STE_PREF_VIEW_MARKERMARGIN see below
495     // STE_PREF_VIEW_FOLDMARGIN   see below
496 
497     UPEDIT(STE_PREF_USE_TABS,            GetUseTabs, SetUseTabs, GetPrefBool)
498     UPEDIT(STE_PREF_TAB_INDENTS,         GetTabIndents, SetTabIndents, GetPrefBool)
499     UPEDIT(STE_PREF_TAB_WIDTH,           GetTabWidth, SetTabWidth, GetPrefInt)
500     UPEDIT(STE_PREF_INDENT_WIDTH,        GetIndent, SetIndent, GetPrefInt)
501     UPEDIT(STE_PREF_BACKSPACE_UNINDENTS, GetBackSpaceUnIndents, SetBackSpaceUnIndents, GetPrefBool)
502     // STE_PREF_AUTOINDENT - doesn't require changing the editor
503 
504     UPEDIT(STE_PREF_CARET_LINE_VISIBLE, GetCaretLineVisible, SetCaretLineVisible, GetPrefBool)
505     UPEDIT(STE_PREF_CARET_WIDTH,        GetCaretWidth, SetCaretWidth, GetPrefInt)
506     UPEDIT(STE_PREF_CARET_PERIOD,       GetCaretPeriod, SetCaretPeriod, GetPrefInt)
507     if (!HasPrefFlag(STE_PREF_CARET_POLICY_X, STE_PREF_FLAG_IGNORE))
508         editor->SetXCaretPolicy(GetPrefInt(STE_PREF_CARET_POLICY_X), GetPrefInt(STE_PREF_CARET_SLOP_X));
509     if (!HasPrefFlag(STE_PREF_CARET_POLICY_Y, STE_PREF_FLAG_IGNORE))
510         editor->SetYCaretPolicy(GetPrefInt(STE_PREF_CARET_POLICY_Y), GetPrefInt(STE_PREF_CARET_SLOP_Y));
511     if (!HasPrefFlag(STE_PREF_VISIBLE_POLICY, STE_PREF_FLAG_IGNORE))
512         editor->SetVisiblePolicy(GetPrefInt(STE_PREF_VISIBLE_POLICY), GetPrefInt(STE_PREF_VISIBLE_SLOP));
513 
514     UPEDIT(STE_PREF_EOL_MODE, GetEOLMode, SetEOLMode, GetPrefInt)
515 
516     UPEDIT(STE_PREF_SELECTION_MODE, GetSelectionMode, SetSelectionMode, GetPrefInt)
517 
518     UPEDIT(STE_PREF_PRINT_MAGNIFICATION, GetPrintMagnification, SetPrintMagnification, GetPrefInt)
519     UPEDIT(STE_PREF_PRINT_COLOURMODE,    GetPrintColourMode, SetPrintColourMode, GetPrefInt)
520     UPEDIT(STE_PREF_PRINT_WRAPMODE,      GetPrintWrapMode, SetPrintWrapMode, GetPrefInt)
521 
522     if (!HasPrefFlag(STE_PREF_FOLD_FLAGS, STE_PREF_FLAG_IGNORE))
523         editor->SetFoldFlags(GetPrefInt(STE_PREF_FOLD_FLAGS));
524     if (!HasPrefFlag(STE_PREF_FOLD_STYLES, STE_PREF_FLAG_IGNORE))
525     {
526         int fold_style = GetPrefInt(STE_PREF_FOLD_STYLES);
527         editor->SetProperty(wxT("fold.compact"),           STE_HASBIT(fold_style, STE_FOLD_COMPACT)   ? wxT("1") : wxT("0"));
528         editor->SetProperty(wxT("fold.comment"),           STE_HASBIT(fold_style, STE_FOLD_COMMENT)   ? wxT("1") : wxT("0"));
529         editor->SetProperty(wxT("fold.preprocessor"),      STE_HASBIT(fold_style, STE_FOLD_PREPROC)   ? wxT("1") : wxT("0"));
530         editor->SetProperty(wxT("fold.at.else"),           STE_HASBIT(fold_style, STE_FOLD_ATELSE)    ? wxT("1") : wxT("0"));
531         editor->SetProperty(wxT("fold.html"),              STE_HASBIT(fold_style, STE_FOLD_HTML)      ? wxT("1") : wxT("0"));
532         editor->SetProperty(wxT("fold.html.preprocessor"), STE_HASBIT(fold_style, STE_FOLD_HTMLPREP)  ? wxT("1") : wxT("0"));
533         editor->SetProperty(wxT("fold.directive"),         STE_HASBIT(fold_style, STE_FOLD_DIRECTIVE) ? wxT("1") : wxT("0"));
534         editor->SetProperty(wxT("fold.comment.python"),    STE_HASBIT(fold_style, STE_FOLD_COMMENTPY) ? wxT("1") : wxT("0"));
535         editor->SetProperty(wxT("fold.quotes.python"),     STE_HASBIT(fold_style, STE_FOLD_QUOTESPY)  ? wxT("1") : wxT("0"));
536         editor->SetProperty(wxT("tab.timmy.whinge.level"), STE_HASBIT(fold_style, STE_FOLD_TABTIMMY)  ? wxT("1") : wxT("0"));
537     }
538 
539     // try to set fold margin styles, the styles will try as well
540     if (!HasPrefFlag(STE_PREF_FOLDMARGIN_STYLE, STE_PREF_FLAG_IGNORE) && editor->GetEditorStyles().IsOk())
541         editor->GetEditorStyles().SetFoldMarkerStyle(GetPrefInt(STE_PREF_FOLDMARGIN_STYLE));
542 
543     UPEDIT(STE_PREF_BUFFERED_DRAW, GetBufferedDraw, SetBufferedDraw, GetPrefBool)
544     UPEDIT(STE_PREF_TWOPHASE_DRAW, GetTwoPhaseDraw, SetTwoPhaseDraw, GetPrefBool)
545     UPEDIT(STE_PREF_LAYOUT_CACHE,  GetLayoutCache, SetLayoutCache, GetPrefInt)
546     UPEDIT(STE_PREF_USEANTIALIASING, GetUseAntiAliasing, SetUseAntiAliasing, GetPrefBool)
547 
548     // STE_PREF_SAVE_REMOVE_WHITESP nothing to set
549     // STE_PREF_SAVE_CONVERT_EOL    nothing to set
550 
551     // -----------------------------------------
552     UPEDIT(STE_PREF_HORIZ_SCROLLBAR,  GetUseHorizontalScrollBar, SetUseHorizontalScrollBar, GetPrefBool)
553     UPEDIT(STE_PREF_VERT_SCROLLBAR,   GetUseVerticalScrollBar, SetUseVerticalScrollBar, GetPrefBool)
554 
555     UPEDIT_PARAM(STE_PREF_MARGIN0_TYPE, STE_MARGIN_0, GetMarginType, SetMarginType, GetPrefInt)
556     UPEDIT_PARAM(STE_PREF_MARGIN1_TYPE, STE_MARGIN_1, GetMarginType, SetMarginType, GetPrefInt)
557     UPEDIT_PARAM(STE_PREF_MARGIN2_TYPE, STE_MARGIN_2, GetMarginType, SetMarginType, GetPrefInt)
558 
559     UPEDIT_PARAM(STE_PREF_MARGIN0_MASK, STE_MARGIN_0, GetMarginMask, SetMarginMask, GetPrefInt)
560     UPEDIT_PARAM(STE_PREF_MARGIN1_MASK, STE_MARGIN_1, GetMarginMask, SetMarginMask, GetPrefInt)
561     UPEDIT_PARAM(STE_PREF_MARGIN2_MASK, STE_MARGIN_2, GetMarginMask, SetMarginMask, GetPrefInt)
562 
563     UPEDIT_PARAM(STE_PREF_MARGIN0_SENSITIVE, STE_MARGIN_0, GetMarginSensitive, SetMarginSensitive, GetPrefBool)
564     UPEDIT_PARAM(STE_PREF_MARGIN1_SENSITIVE, STE_MARGIN_1, GetMarginSensitive, SetMarginSensitive, GetPrefBool)
565     UPEDIT_PARAM(STE_PREF_MARGIN2_SENSITIVE, STE_MARGIN_2, GetMarginSensitive, SetMarginSensitive, GetPrefBool)
566 
567     int margin0_width = GetPrefBool(STE_PREF_VIEW_LINEMARGIN)   ? GetPrefInt(STE_PREF_MARGIN0_WIDTH) : 0;
568     int margin1_width = GetPrefBool(STE_PREF_VIEW_MARKERMARGIN) ? GetPrefInt(STE_PREF_MARGIN1_WIDTH) : 0;
569     int margin2_width = GetPrefBool(STE_PREF_VIEW_FOLDMARGIN)   ? GetPrefInt(STE_PREF_MARGIN2_WIDTH) : 0;
570 
571     // The wxSTC::TextWidth is a very expensive operation. Avoid if possible.
572     if ((margin0_width < 0) || (margin1_width < 0) || (margin2_width < 0))
573     {
574         if ((M_PREFDATA->m_lineNumberAutoWidth < 1) ||
575             !editor->GetEditorStyles().IsOk() ||
576             (editor->GetEditorStyles().CreateConfigLine(STE_STYLE_LINENUMBER) !=
577              M_PREFDATA->m_lineNumberStyle))
578         {
579             M_PREFDATA->m_lineNumberStyle = editor->GetEditorStyles().CreateConfigLine(STE_STYLE_LINENUMBER);
580             M_PREFDATA->m_lineNumberAutoWidth = editor->TextWidth(wxSTC_STYLE_LINENUMBER, wxT("_999999"));
581         }
582 
583         if (margin0_width < 0) margin0_width = M_PREFDATA->m_lineNumberAutoWidth;
584         if (margin1_width < 0) margin1_width = M_PREFDATA->m_lineNumberAutoWidth;
585         if (margin2_width < 0) margin2_width = M_PREFDATA->m_lineNumberAutoWidth;
586     }
587 
588     if (!HasPrefFlag(STE_PREF_MARGIN0_WIDTH, STE_PREF_FLAG_IGNORE) &&
589         (editor->GetMarginWidth(STE_MARGIN_0) != margin0_width))
590         editor->SetMarginWidth(STE_MARGIN_0,    margin0_width);
591     if (!HasPrefFlag(STE_PREF_MARGIN1_WIDTH, STE_PREF_FLAG_IGNORE) &&
592         (editor->GetMarginWidth(STE_MARGIN_1) != margin1_width))
593         editor->SetMarginWidth(STE_MARGIN_1,    margin1_width);
594     if (!HasPrefFlag(STE_PREF_MARGIN2_WIDTH, STE_PREF_FLAG_IGNORE) &&
595         (editor->GetMarginWidth(STE_MARGIN_2) != margin2_width))
596         editor->SetMarginWidth(STE_MARGIN_2,    margin2_width);
597 
598     if (!HasPrefFlag(STE_PREF_AUTOC_STOPS, STE_PREF_FLAG_IGNORE))
599         editor->AutoCompStops(GetPref(STE_PREF_AUTOC_STOPS));
600     UPEDIT(STE_PREF_AUTOC_SEPARATOR,  AutoCompGetSeparator, AutoCompSetSeparator, GetPrefInt)
601     if (!HasPrefFlag(STE_PREF_AUTOC_FILLUPS, STE_PREF_FLAG_IGNORE))
602         editor->AutoCompSetFillUps(GetPref(STE_PREF_AUTOC_FILLUPS));
603     UPEDIT(STE_PREF_AUTOC_CANCELATSTART,  AutoCompGetCancelAtStart, AutoCompSetCancelAtStart, GetPrefBool)
604     UPEDIT(STE_PREF_AUTOC_CHOOSESINGLE,   AutoCompGetChooseSingle, AutoCompSetChooseSingle, GetPrefBool)
605     UPEDIT(STE_PREF_AUTOC_IGNORECASE,     AutoCompGetIgnoreCase, AutoCompSetIgnoreCase, GetPrefBool)
606     UPEDIT(STE_PREF_AUTOC_AUTOHIDE,       AutoCompGetAutoHide, AutoCompSetAutoHide, GetPrefBool)
607     UPEDIT(STE_PREF_AUTOC_DROPRESTOFWORD, AutoCompGetDropRestOfWord, AutoCompSetDropRestOfWord, GetPrefBool)
608     UPEDIT(STE_PREF_AUTOC_TYPESEPARATOR,  AutoCompGetTypeSeparator, AutoCompSetTypeSeparator, GetPrefInt)
609 }
610 
611 #define MENU_IDVAL(menu_id) menu_id, GetPrefBoolByID(menu_id)
612 #define MENU_FIND_CHECK_ENABLE(menu_id, enabled) \
613                 { wxMenuItem *item = menu->FindItem(menu_id); \
614                   if (item) { item->Check(GetPrefBoolByID(menu_id)); item->Enable(enabled); } }
615 
UpdateMenuToolItems(wxMenu * menu,wxMenuBar * menuBar,wxToolBar * toolBar)616 void wxSTEditorPrefs::UpdateMenuToolItems(wxMenu *menu, wxMenuBar *menuBar,
617                                           wxToolBar *toolBar)
618 {
619     wxCHECK_RET(IsOk(), wxT("Prefs not created"));
620     if (!menu && !menuBar && !toolBar) return;
621 
622     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_VIEW_EOL));
623     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_EDGE_MODE));
624     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_VIEW_LINEMARGIN));
625     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_VIEW_FOLDMARGIN));
626     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_VIEW_MARKERMARGIN));
627     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_VIEW_WHITESPACE));
628     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_WRAP_MODE));
629     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_USE_TABS));
630     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_TAB_INDENTS));
631     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_BACKSPACE_UNINDENTS));
632     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_AUTOINDENT));
633     STE_MM::DoCheckItem(menu, menuBar, toolBar, MENU_IDVAL(ID_STE_PREF_INDENT_GUIDES));
634 }
635 
LoadConfig(wxConfigBase & config,const wxString & configPath)636 void wxSTEditorPrefs::LoadConfig( wxConfigBase &config,
637                                   const wxString &configPath )
638 {
639     wxCHECK_RET(IsOk(), wxT("Prefs not created"));
640     wxString key = wxSTEditorOptions::FixConfigPath(configPath, true);
641 
642     long val = 0;
643     wxString strVal;
644     size_t pref_n, pref_count = GetPrefCount();
645     for (pref_n = 0; pref_n < pref_count; pref_n++)
646     {
647         wxString name = GetPrefName(pref_n);
648         name.Replace(wxT(" "), wxT("_"), true);
649 
650         if (HasPrefFlag(pref_n, STE_PREF_FLAG_INT|STE_PREF_FLAG_BOOL))
651         {
652             if (config.Read(key + name, &val))
653                 SetPrefInt(pref_n, val, false);
654         }
655         else if (config.Read(key + name, &strVal))
656             SetPref(pref_n, strVal, false);
657     }
658 
659     UpdateAllEditors();
660 }
661 
SaveConfig(wxConfigBase & config,const wxString & configPath,int flags) const662 void wxSTEditorPrefs::SaveConfig( wxConfigBase &config,
663                                   const wxString &configPath,
664                                   int flags ) const
665 {
666     wxCHECK_RET(IsOk(), wxT("Prefs not created"));
667     wxString key = wxSTEditorOptions::FixConfigPath(configPath, true);
668 
669     size_t pref_n, pref_count = GetPrefCount();
670     for (pref_n = 0; pref_n < pref_count; pref_n++)
671     {
672         wxString name = GetPrefName(pref_n);
673         name.Replace(wxT(" "), wxT("_"), true);
674 
675         if (!HasPrefFlag(pref_n, STE_PREF_FLAG_NOCONFIG))
676         {
677             if (((flags && STE_CONFIG_SAVE_DIFFS) == 0) ||
678                 (M_PREFDATA->m_prefs[pref_n] != GetInitPrefValue(pref_n)))
679             {
680                 if (HasPrefFlag(pref_n, STE_PREF_FLAG_INT|STE_PREF_FLAG_BOOL))
681                     config.Write(key + name, GetPrefInt(pref_n));
682                 else
683                     config.Write(key + name, M_PREFDATA->m_prefs[pref_n]);
684             }
685         }
686     }
687 }
688 
689 // global precreated wxSTEditorPrefs
690 wxSTEditorPrefs  s_wxSTEditorPrefs(true);
691