39#include <wx/xml/xml.h>
45#include <wx/filename.h>
46#include <wx/hashmap.h>
47#include "Configuration.h"
50#include <unordered_map>
62 typedef std::unordered_map <wxString, int, wxStringHash> WorksheetWords;
64 using WordList = std::vector<wxString>;
115 void AddWorksheetWords(WordList::const_iterator begin, WordList::const_iterator end);
137 void LoadableFiles_BackgroundTask(wxString sharedir, wxString demodir);
139 void BuiltinSymbols_BackgroundTask();
142 void UpdateLoadFiles_BackgroundTask(wxString partial, wxString maximaDir);
144 std::vector<wxString> m_builtInLoadFiles;
146 std::vector<wxString> m_builtInDemoFiles;
148 class GetGeneralFiles :
public wxDirTraverser
151 explicit GetGeneralFiles(std::vector<wxString>& files,
153 std::atomic_bool *abort =
nullptr,
154 const wxString &prefix = wxEmptyString) :
155 m_files(files), m_lock(lock), m_abort(abort), m_prefix(prefix) {
156 for(
const auto &i : m_files)
159 wxDirTraverseResult OnFile(
const wxString& filename)
override
161 if (m_abort && *m_abort)
return wxDIR_STOP;
162 wxFileName newItemName(filename);
163 wxString newItem =
"\"" + m_prefix + newItemName.GetFullName() +
"\"";
164 newItem.Replace(wxFileName::GetPathSeparator(),
"/");
166 const std::lock_guard<std::mutex> lock(*m_lock);
167 if (m_filesHash.find(newItem) == m_filesHash.end())
169 m_files.push_back(newItem);
170 m_filesHash[newItem];
173 return wxDIR_CONTINUE;
175 wxDirTraverseResult OnDir(
const wxString& dirname)
override
177 if (m_abort && *m_abort)
return wxDIR_STOP;
178 wxFileName newItemName(dirname);
179 wxString newItem =
"\"" + m_prefix + newItemName.GetFullName() +
"/\"";
180 newItem.Replace(wxFileName::GetPathSeparator(),
"/");
182 const std::lock_guard<std::mutex> lock(*m_lock);
183 if (m_filesHash.find(newItem) == m_filesHash.end())
185 m_files.push_back(newItem);
186 m_filesHash[newItem];
191 std::vector<wxString> GetResult(){
192 const std::lock_guard<std::mutex> lock(*m_lock);
197 std::vector<wxString>& m_files;
199 std::unordered_map<wxString, wxEvtHandler*, wxStringHash> m_filesHash;
201 std::atomic_bool *m_abort;
206 class GetMacFiles_includingSubdirs :
public wxDirTraverser
209 explicit GetMacFiles_includingSubdirs(std::vector<wxString>& files,
211 std::atomic_bool *abort =
nullptr,
212 const wxString &prefix = wxEmptyString) :
213 m_files(files), m_lock(lock), m_abort(abort), m_prefix(prefix)
215 for(
const auto &i : m_files)
218 wxDirTraverseResult OnFile(
const wxString& filename)
override
220 if (m_abort && *m_abort)
return wxDIR_STOP;
222 (filename.EndsWith(
".mac"))||
223 (filename.EndsWith(
".lisp"))||
224 (filename.EndsWith(
".wxm"))
227 wxFileName newItemName(filename);
228 wxString newItem =
"\"" + m_prefix + newItemName.GetName() +
"\"";
229 newItem.Replace(wxFileName::GetPathSeparator(),
"/");
231 const std::lock_guard<std::mutex> lock(*m_lock);
232 if (m_filesHash.find(newItem) == m_filesHash.end())
234 m_files.push_back(newItem);
235 m_filesHash[newItem];
239 return wxDIR_CONTINUE;
241 wxDirTraverseResult OnDir(
const wxString& dirname)
override
243 if (m_abort && *m_abort)
return wxDIR_STOP;
244 if((dirname.EndsWith(
".git")) ||
245 (dirname.EndsWith(
"/share/share")) ||
246 (dirname.EndsWith(
"/src/src")) ||
247 (dirname.EndsWith(
"/doc/doc")) ||
248 (dirname.EndsWith(
"/interfaces/interfaces"))
252 return wxDIR_CONTINUE;
254 std::vector<wxString> GetResult(){
255 const std::lock_guard<std::mutex> lock(*m_lock);
260 std::vector<wxString>& m_files;
262 std::unordered_map<wxString, wxEvtHandler*, wxStringHash> m_filesHash;
264 std::atomic_bool *m_abort;
269 class GetMacFiles :
public GetMacFiles_includingSubdirs
272 explicit GetMacFiles(std::vector<wxString>& files,
274 std::atomic_bool *abort =
nullptr,
275 const wxString &prefix = wxEmptyString) :
276 GetMacFiles_includingSubdirs(files, lock, abort, prefix){ }
277 wxDirTraverseResult OnDir(
const wxString& dirname)
override
279 if (m_abort && *m_abort)
return wxDIR_STOP;
280 wxFileName newItemName(dirname);
281 wxString newItem =
"\"" + m_prefix + newItemName.GetFullName() +
"/\"";
282 newItem.Replace(wxFileName::GetPathSeparator(),
"/");
284 const std::lock_guard<std::mutex> lock(*m_lock);
285 if (m_filesHash.find(newItem) == m_filesHash.end())
287 m_files.push_back(newItem);
288 m_filesHash[newItem];
296 class GetDemoFiles_includingSubdirs :
public wxDirTraverser
299 explicit GetDemoFiles_includingSubdirs(std::vector<wxString>& files,
301 std::atomic_bool *abort =
nullptr,
302 const wxString &prefix = wxEmptyString) :
303 m_files(files), m_lock(lock), m_abort(abort), m_prefix(prefix)
305 for(
const auto &i : m_files)
308 wxDirTraverseResult OnFile(
const wxString& filename)
override
310 if (m_abort && *m_abort)
return wxDIR_STOP;
311 if(filename.EndsWith(
".dem"))
313 wxFileName newItemName(filename);
314 wxString newItem =
"\"" + m_prefix + newItemName.GetName() +
"\"";
315 newItem.Replace(wxFileName::GetPathSeparator(),
"/");
317 const std::lock_guard<std::mutex> lock(*m_lock);
318 if (m_filesHash.find(newItem) == m_filesHash.end())
320 m_files.push_back(newItem);
321 m_filesHash[newItem];
325 return wxDIR_CONTINUE;
327 wxDirTraverseResult OnDir(
const wxString& dirname)
override
329 if (m_abort && *m_abort)
return wxDIR_STOP;
330 if((dirname.EndsWith(
".git")) ||
331 (dirname.EndsWith(
"/share/share")) ||
332 (dirname.EndsWith(
"/src/src")) ||
333 (dirname.EndsWith(
"/doc/doc")) ||
334 (dirname.EndsWith(
"/interfaces/interfaces"))
338 return wxDIR_CONTINUE;
340 std::vector<wxString> GetResult(){
341 const std::lock_guard<std::mutex> lock(*m_lock);
346 std::vector<wxString>& m_files;
348 std::unordered_map<wxString, wxEvtHandler*, wxStringHash> m_filesHash;
350 std::atomic_bool *m_abort;
355 class GetDemoFiles :
public GetDemoFiles_includingSubdirs
358 explicit GetDemoFiles(std::vector<wxString>& files,
360 std::atomic_bool *abort =
nullptr,
361 const wxString &prefix = wxEmptyString) :
362 GetDemoFiles_includingSubdirs(files, lock, abort, prefix){ }
363 virtual wxDirTraverseResult OnDir(
const wxString& dirname)
override
365 if (m_abort && *m_abort)
return wxDIR_STOP;
366 wxFileName newItemName(dirname);
367 wxString newItem =
"\"" + m_prefix + newItemName.GetFullName() +
"/\"";
368 newItem.Replace(wxFileName::GetPathSeparator(),
"/");
370 const std::lock_guard<std::mutex> lock(*m_lock);
371 if (m_filesHash.find(newItem) == m_filesHash.end())
373 m_files.push_back(newItem);
374 m_filesHash[newItem];
381 jthread m_addSymbols_backgroundThread;
382 jthread m_addFiles_backgroundThread;
384 std::atomic_bool m_abortBackgroundTask{
false};
386 std::mutex m_keywordsLock;
388 std::vector<std::vector<wxString>> m_wordList;
389 static wxRegEx m_args;
390 WorksheetWords m_worksheetWords;
393wxDECLARE_EVENT(NEW_DEMO_FILES_EVENT, wxCommandEvent);
Definition: Autocomplete.h:61
std::vector< wxString > GetSymbolList()
Returns a list of Symbols we know.
Definition: Autocomplete.cpp:62
void AddSymbols_Backgroundtask(wxXmlDocument xmldoc)
The real work of AddSymbols is made here and in the background.
Definition: Autocomplete.cpp:148
virtual ~AutoComplete()
The destructor of AutoComplete.
Definition: Autocomplete.cpp:228
void ClearDemofileList()
Clear the list of files demo() can be applied on.
Definition: Autocomplete.cpp:103
std::vector< wxString > GetDemoFilesList()
Returns a list of demo files we know of.
Definition: Autocomplete.cpp:57
void UpdateDemoFiles(wxString partial, const wxString &maximaDir)
Replace the list of files in the directory the worksheet file is in to the demo files list.
Definition: Autocomplete.cpp:412
void LoadSymbols()
Load all autocomplete symbols wxMaxima knows about by itself.
Definition: Autocomplete.cpp:235
autoCompletionType
All types of things we can autocomplete.
Definition: Autocomplete.h:68
@ tmplte
Command names.
Definition: Autocomplete.h:70
@ generalfile
loadable files
Definition: Autocomplete.h:73
@ demofile
loadable files
Definition: Autocomplete.h:72
@ numberOfTypes
Unit names.
Definition: Autocomplete.h:76
@ unit
Esc commands describing symbols.
Definition: Autocomplete.h:75
@ loadfile
Function templates.
Definition: Autocomplete.h:71
@ esccommand
general files
Definition: Autocomplete.h:74
std::vector< wxString > CompleteSymbol(wxString partial, autoCompletionType type=command)
Returns a list of possible autocompletions for the string "partial".
Definition: Autocomplete.cpp:523
void UpdateLoadFiles(wxString partial, const wxString &maximaDir)
Replace the list of files in the directory the worksheet file is in to the load files list.
Definition: Autocomplete.cpp:481
void LoadBuiltinSymbols()
Makes wxMaxima know all its builtin symbols.
Definition: Autocomplete.cpp:68
void UpdateGeneralFiles(wxString partial, const wxString &maximaDir)
Assemble a list of files.
Definition: Autocomplete.cpp:448
void AddSymbols(wxString xml)
Interprets the XML autocompletable symbol list maxima can send us.
Definition: Autocomplete.cpp:108
void AddWorksheetWords(const WordList &words)
Add words to the list of words that appear in the workSheet's code cells.
Definition: Autocomplete.cpp:224
void AddSymbols_Backgroundtask_string(wxString xml)
The real work of AddSymbols is made here and in the background.
Definition: Autocomplete.cpp:141
static wxString FixTemplate(wxString templ)
Basically runs a regex over templates.
Definition: Autocomplete.cpp:634
bool HasDemofile(const wxString &commandname)
Does a demo file for this command exist?
Definition: Autocomplete.cpp:93
void AddSymbol(wxString fun, autoCompletionType type=command)
Manually add an autocompletable symbol to our symbols lists.
Definition: Autocomplete.cpp:578
void ClearWorksheetWords()
Clear the list of words that appear in the workSheet's code cells.
Definition: Autocomplete.cpp:52
The configuration storage for the current worksheet.
Definition: Configuration.h:85