1 /*
2  * This file is part of the Code::Blocks IDE and licensed under the GNU Lesser General Public License, version 3
3  * http://www.gnu.org/licenses/lgpl-3.0.html
4  *
5  * $Revision: 11887 $
6  * $Id: scriptbindings.cpp 11887 2019-10-26 09:12:28Z fuscated $
7  * $HeadURL: svn://svn.code.sf.net/p/codeblocks/code/branches/release-20.xx/src/sdk/scripting/bindings/scriptbindings.cpp $
8  */
9 
10 #include <sdk_precomp.h>
11 #ifndef CB_PRECOMP
12     #include <settings.h>
13     #include <manager.h>
14     #include <logmanager.h>
15     #include <configmanager.h>
16     #include <editormanager.h>
17     #include <projectmanager.h>
18     #include <macrosmanager.h>
19     #include <compilerfactory.h>
20     #include <cbproject.h>
21     #include <cbeditor.h>
22     #include <globals.h>
23 #endif
24 #include "cbstyledtextctrl.h"
25 
26 #include "scriptbindings.h"
27 #include <cbexception.h>
28 #include "sc_base_types.h"
29 
30 namespace ScriptBindings
31 {
32     extern void Register_Constants();
33     extern void Register_Globals();
34     extern void Register_wxTypes();
35     extern void Register_Dialog();
36     extern void Register_ProgressDialog();
37     extern void Register_UtilDialogs();
38     extern void Register_IO();
39     extern void Register_ScriptPlugin();
40 
ConfigManager_Read(HSQUIRRELVM v)41     SQInteger ConfigManager_Read(HSQUIRRELVM v)
42     {
43         StackHandler sa(v);
44         int paramCount = sa.GetParamCount();
45         if (paramCount == 3)
46         {
47             wxString key = *SqPlus::GetInstance<wxString,false>(v, 2);
48             if (sa.GetType(3) == OT_INTEGER)
49                 return sa.Return((SQInteger)Manager::Get()->GetConfigManager(_T("scripts"))->ReadInt(key, sa.GetInt(3)));
50             else if (sa.GetType(3) == OT_BOOL)
51                 return sa.Return(Manager::Get()->GetConfigManager(_T("scripts"))->ReadBool(key, sa.GetBool(3)));
52             else if (sa.GetType(3) == OT_FLOAT)
53                 return sa.Return((float)Manager::Get()->GetConfigManager(_T("scripts"))->ReadDouble(key, sa.GetFloat(3)));
54             else
55             {
56                 wxString val = *SqPlus::GetInstance<wxString,false>(v, 3);
57                 wxString ret = Manager::Get()->GetConfigManager(_T("scripts"))->Read(key, val);
58                 return SqPlus::ReturnCopy(v, ret);
59             }
60         }
61         return sa.ThrowError("Invalid arguments to \"ConfigManager::Read\"");
62     }
ConfigManager_Write(HSQUIRRELVM v)63     SQInteger ConfigManager_Write(HSQUIRRELVM v)
64     {
65         StackHandler sa(v);
66         int paramCount = sa.GetParamCount();
67         if (paramCount == 3)
68         {
69             wxString key = *SqPlus::GetInstance<wxString,false>(v, 2);
70             if (sa.GetType(3) == OT_INTEGER)
71             {
72                 Manager::Get()->GetConfigManager(_T("scripts"))->Write(key, (int)sa.GetInt(3));
73                 return SQ_OK;
74             }
75             else if (sa.GetType(3) == OT_BOOL)
76             {
77                 Manager::Get()->GetConfigManager(_T("scripts"))->Write(key, (bool)sa.GetBool(3));
78                 return SQ_OK;
79             }
80             else if (sa.GetType(3) == OT_FLOAT)
81             {
82                 Manager::Get()->GetConfigManager(_T("scripts"))->Write(key, sa.GetFloat(3));
83                 return SQ_OK;
84             }
85             else
86             {
87                 Manager::Get()->GetConfigManager(_T("scripts"))->Write(key, *SqPlus::GetInstance<wxString,false>(v, 3));
88                 return SQ_OK;
89             }
90         }
91         else if (paramCount == 4)
92         {
93             wxString key = *SqPlus::GetInstance<wxString,false>(v, 2);
94             wxString val = *SqPlus::GetInstance<wxString,false>(v, 3);
95             if (sa.GetType(4) == OT_BOOL)
96             {
97                 Manager::Get()->GetConfigManager(_T("scripts"))->Write(key, val, sa.GetBool(4));
98                 return SQ_OK;
99             }
100         }
101         return sa.ThrowError("Invalid arguments to \"ConfigManager::Write\"");
102     }
EditorManager_GetBuiltinEditor(HSQUIRRELVM v)103     SQInteger EditorManager_GetBuiltinEditor(HSQUIRRELVM v)
104     {
105         StackHandler sa(v);
106         int paramCount = sa.GetParamCount();
107         if (paramCount == 2)
108         {
109             cbEditor* ed = nullptr;
110             if (sa.GetType(2) == OT_INTEGER)
111                 ed = Manager::Get()->GetEditorManager()->GetBuiltinEditor(sa.GetInt(2));
112             else
113                 ed = Manager::Get()->GetEditorManager()->GetBuiltinEditor(*SqPlus::GetInstance<wxString,false>(v, 2));
114             SqPlus::Push(v, ed);
115             return 1;
116         }
117         return sa.ThrowError("Invalid arguments to \"EditorManager::GetBuiltinEditor\"");
118     }
EditorManager_Open(HSQUIRRELVM v)119     SQInteger EditorManager_Open(HSQUIRRELVM v)
120     {
121         StackHandler sa(v);
122         int paramCount = sa.GetParamCount();
123         if (paramCount == 2)
124         {
125             cbEditor* ed = Manager::Get()->GetEditorManager()->Open(*SqPlus::GetInstance<wxString,false>(v, 2));
126             SqPlus::Push(v, ed);
127             return 1;
128         }
129         return sa.ThrowError("Invalid arguments to \"EditorManager::Open\"");
130     }
EditorManager_Close(HSQUIRRELVM v)131     SQInteger EditorManager_Close(HSQUIRRELVM v)
132     {
133         StackHandler sa(v);
134         int paramCount = sa.GetParamCount();
135         if (paramCount == 2)
136         {
137             if (sa.GetType(2) == OT_INTEGER)
138                 return sa.Return(Manager::Get()->GetEditorManager()->Close(sa.GetInt(2)));
139             else
140                 return sa.Return(Manager::Get()->GetEditorManager()->Close(*SqPlus::GetInstance<wxString,false>(v, 2)));
141         }
142         return sa.ThrowError("Invalid arguments to \"EditorManager::Close\"");
143     }
EditorManager_Save(HSQUIRRELVM v)144     SQInteger EditorManager_Save(HSQUIRRELVM v)
145     {
146         StackHandler sa(v);
147         int paramCount = sa.GetParamCount();
148         if (paramCount == 2)
149         {
150             if (sa.GetType(2) == OT_INTEGER)
151                 return sa.Return(Manager::Get()->GetEditorManager()->Save(sa.GetInt(2)));
152             else
153                 return sa.Return(Manager::Get()->GetEditorManager()->Save(*SqPlus::GetInstance<wxString,false>(v, 2)));
154         }
155         return sa.ThrowError("Invalid arguments to \"EditorManager::Save\"");
156     }
cbProject_RemoveFile(HSQUIRRELVM v)157     SQInteger cbProject_RemoveFile(HSQUIRRELVM v)
158     {
159         StackHandler sa(v);
160         int paramCount = sa.GetParamCount();
161         if (paramCount == 2)
162         {
163             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
164             if (sa.GetType(2) == OT_INTEGER)
165                 return sa.ThrowError("Invalid arguments to \"cbProject::RemoveFile\"");
166             else
167                 return sa.Return(prj->RemoveFile(SqPlus::GetInstance<ProjectFile,false>(v, 2)));
168         }
169         return sa.ThrowError("Invalid arguments to \"cbProject::RemoveFile\"");
170     }
cbProject_AddFile(HSQUIRRELVM v)171     SQInteger cbProject_AddFile(HSQUIRRELVM v)
172     {
173         StackHandler sa(v);
174         int paramCount = sa.GetParamCount();
175         if (paramCount >= 3)
176         {
177             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
178             wxString str = *SqPlus::GetInstance<wxString,false>(v, 3);
179             bool b1 = paramCount >= 4 ? sa.GetBool(4) : true;
180             bool b2 = paramCount >= 5 ? sa.GetBool(5) : true;
181             int i = paramCount == 6 ? sa.GetInt(6) : 50;
182             ProjectFile* pf = nullptr;
183             if (sa.GetType(2) == OT_INTEGER)
184                 pf = prj->AddFile(sa.GetInt(2), str, b1, b2, i);
185             else
186                 pf = prj->AddFile(*SqPlus::GetInstance<wxString,false>(v, 2), str, b1, b2, i);
187             SqPlus::Push(v, pf);
188             return 1;
189         }
190         return sa.ThrowError("Invalid arguments to \"cbProject::AddFile\"");
191     }
cbProject_GetBuildTarget(HSQUIRRELVM v)192     SQInteger cbProject_GetBuildTarget(HSQUIRRELVM v)
193     {
194         StackHandler sa(v);
195         int paramCount = sa.GetParamCount();
196         if (paramCount == 2)
197         {
198             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
199             ProjectBuildTarget* bt = nullptr;
200             if (sa.GetType(2) == OT_INTEGER)
201                 bt = prj->GetBuildTarget(sa.GetInt(2));
202             else
203                 bt = prj->GetBuildTarget(*SqPlus::GetInstance<wxString,false>(v, 2));
204             SqPlus::Push(v, bt);
205             return 1;
206         }
207         return sa.ThrowError("Invalid arguments to \"cbProject::GetBuildTarget\"");
208     }
cbProject_RenameBuildTarget(HSQUIRRELVM v)209     SQInteger cbProject_RenameBuildTarget(HSQUIRRELVM v)
210     {
211         StackHandler sa(v);
212         int paramCount = sa.GetParamCount();
213         if (paramCount == 3)
214         {
215             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
216             if (sa.GetType(2) == OT_INTEGER)
217                 return sa.Return(prj->RenameBuildTarget(sa.GetInt(2), *SqPlus::GetInstance<wxString,false>(v, 3)));
218             else
219                 return sa.Return(prj->RenameBuildTarget(*SqPlus::GetInstance<wxString,false>(v, 2), *SqPlus::GetInstance<wxString,false>(v, 3)));
220         }
221         return sa.ThrowError("Invalid arguments to \"cbProject::RenameBuildTarget\"");
222     }
cbProject_DuplicateBuildTarget(HSQUIRRELVM v)223     SQInteger cbProject_DuplicateBuildTarget(HSQUIRRELVM v)
224     {
225         StackHandler sa(v);
226         int paramCount = sa.GetParamCount();
227         if (paramCount == 3)
228         {
229             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
230             ProjectBuildTarget* bt = nullptr;
231             if (sa.GetType(2) == OT_INTEGER)
232                 bt = prj->DuplicateBuildTarget(sa.GetInt(2), *SqPlus::GetInstance<wxString,false>(v, 3));
233             else
234                 bt = prj->DuplicateBuildTarget(*SqPlus::GetInstance<wxString,false>(v, 2), *SqPlus::GetInstance<wxString,false>(v, 3));
235             SqPlus::Push(v, bt);
236             return 1;
237         }
238         return sa.ThrowError("Invalid arguments to \"cbProject::DuplicateBuildTarget\"");
239     }
cbProject_RemoveBuildTarget(HSQUIRRELVM v)240     SQInteger cbProject_RemoveBuildTarget(HSQUIRRELVM v)
241     {
242         StackHandler sa(v);
243         int paramCount = sa.GetParamCount();
244         if (paramCount == 2)
245         {
246             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
247             if (sa.GetType(2) == OT_INTEGER)
248                 return sa.Return(prj->RemoveBuildTarget(sa.GetInt(2)));
249             else
250                 return sa.Return(prj->RemoveBuildTarget(*SqPlus::GetInstance<wxString,false>(v, 2)));
251         }
252         return sa.ThrowError("Invalid arguments to \"cbProject::RemoveBuildTarget\"");
253     }
cbProject_ExportTargetAsProject(HSQUIRRELVM v)254     SQInteger cbProject_ExportTargetAsProject(HSQUIRRELVM v)
255     {
256         StackHandler sa(v);
257         int paramCount = sa.GetParamCount();
258         if (paramCount == 2)
259         {
260             cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 1);
261             if (sa.GetType(2) == OT_INTEGER)
262                 return sa.Return(prj->ExportTargetAsProject(sa.GetInt(2)));
263             else
264                 return sa.Return(prj->ExportTargetAsProject(*SqPlus::GetInstance<wxString,false>(v, 2)));
265         }
266         return sa.ThrowError("Invalid arguments to \"cbProject::ExportTargetAsProject\"");
267     }
268 
269     struct FindXmlElementResult
270     {
271         TiXmlElement *element = nullptr;
272         wxString errorStr;
273     };
274 
FindExtensionElement(cbProject * project,const wxString & query)275     static FindXmlElementResult FindExtensionElement(cbProject *project, const wxString &query)
276     {
277         TiXmlNode *extensionNode = project->GetExtensionsNode();
278         if (!extensionNode)
279             return FindXmlElementResult();
280         TiXmlElement *currentElem = extensionNode->ToElement();
281         if (!currentElem)
282             return FindXmlElementResult();
283 
284         // Note: This is slow!
285         const wxArrayString names = GetArrayFromString(query, wxT("/"), false);
286         for (const wxString &name : names)
287         {
288             const wxString::size_type openBracePos = name.find_first_of(wxT("[("));
289             if (openBracePos != wxString::npos)
290             {
291                 if (name[openBracePos] == wxT('['))
292                 {
293                     const wxString::size_type closeBracePos = name.find(wxT(']'), openBracePos + 1);
294                     if (closeBracePos == wxString::npos || closeBracePos != name.length() - 1)
295                     {
296                         FindXmlElementResult result;
297                         result.errorStr.Printf(wxT("Invalid index format in '%s'!"), name.wx_str());
298                         return result;
299                     }
300 
301                     const wxString nameStripped = name.substr(0, openBracePos);
302                     long lIndex;
303                     const wxString indexStr = name.substr(openBracePos + 1,
304                                                           closeBracePos - openBracePos - 1);
305                     if (!indexStr.ToLong(&lIndex))
306                     {
307                         FindXmlElementResult result;
308                         result.errorStr.Printf(wxT("Can't convert '%s' to integer!"),
309                                                indexStr.wx_str());
310                         return result;
311                     }
312 
313                     const int index = int(lIndex);
314 
315                     int currentIndex = -1;
316                     for (TiXmlNode *child = currentElem->FirstChild();
317                          child;
318                          child = child->NextSibling())
319                     {
320                         TiXmlElement *childElement = child->ToElement();
321                         if (wxString(childElement->Value(), wxConvUTF8) != nameStripped)
322                             continue;
323                         ++currentIndex;
324                         if (currentIndex == index)
325                         {
326                             currentElem = childElement;
327                             break;
328                         }
329                     }
330                     if (currentIndex != index)
331                         return FindXmlElementResult();
332                 }
333                 else if (name[openBracePos] == wxT('('))
334                 {
335                     const wxString::size_type closeBracePos = name.find(wxT(')'), openBracePos + 1);
336                     if (closeBracePos == wxString::npos || closeBracePos != name.length() - 1)
337                     {
338                         FindXmlElementResult result;
339                         result.errorStr.Printf(wxT("Invalid attribute format in '%s'!"),
340                                                name.wx_str());
341                         return result;
342                     }
343 
344                     const wxString nameStripped = name.substr(0, openBracePos);
345                     const wxString attributeStr = name.substr(openBracePos + 1,
346                                                            closeBracePos - openBracePos - 1);
347                     const wxString::size_type equalPos = attributeStr.find(wxT('='));
348                     if (equalPos == wxString::npos)
349                     {
350                         FindXmlElementResult result;
351                         result.errorStr.Printf(wxT("Invalid attribute format in '%s'!"),
352                                                attributeStr.wx_str());
353                         return result;
354                     }
355 
356                     const std::string attributeName = wxString(attributeStr.substr(0, equalPos)).utf8_str().data();
357                     const std::string attributeValue = wxString(attributeStr.substr(equalPos + 1)).utf8_str().data();
358                     for (TiXmlNode *child = currentElem->FirstChild();
359                          child;
360                          child = child->NextSibling())
361                     {
362                         TiXmlElement *childElement = child->ToElement();
363                         if (wxString(childElement->Value(), wxConvUTF8) != nameStripped)
364                             continue;
365 
366                         const char *value = childElement->Attribute(attributeName.c_str());
367                         if (value != nullptr && attributeValue == value)
368                         {
369                             currentElem = childElement;
370                             break;
371                         }
372                     }
373                 }
374             }
375             else
376                 currentElem = currentElem->FirstChildElement(name.utf8_str().data());
377 
378             if (!currentElem)
379                 return FindXmlElementResult();
380         }
381 
382         FindXmlElementResult result;
383         result.element = currentElem;
384         return result;
385     }
386 
FindFullExtensionPathForNode(const TiXmlNode * node)387     wxString FindFullExtensionPathForNode(const TiXmlNode *node)
388     {
389         if (!node)
390             return wxString();
391 
392         struct StackItem
393         {
394             const char *name;
395             int index;
396         };
397         std::vector<StackItem> extensionStack;
398 
399         while (node)
400         {
401             const char *nodeValue = node->ToElement()->Value();
402             if (strcmp(nodeValue, "Extensions") == 0)
403                 break;
404 
405             int index = 0;
406             // Find index by going back through the siblings and matching the names.
407             for (const TiXmlNode *sibling = node->PreviousSibling();
408                  sibling;
409                  sibling = sibling->PreviousSibling())
410             {
411                 const char *value = sibling->ToElement()->Value();
412                 if (strcmp(nodeValue, value) == 0)
413                     index++;
414             }
415 
416             StackItem item;
417             item.name = nodeValue;
418             item.index = index;
419             extensionStack.push_back(item);
420 
421             node = node->Parent();
422         }
423 
424         wxString result;
425         for (std::vector<StackItem>::reverse_iterator it = extensionStack.rbegin();
426              it != extensionStack.rend();
427              ++it)
428         {
429             if (!result.empty())
430                 result << wxT('/');
431             result << wxString(it->name, wxConvUTF8) << wxT('[') << it->index << wxT(']');
432         }
433         return result;
434     }
435 
436     /// Squirrel function would expect a cbProject and an extension string. It will return a
437     /// wxArrayString object.
cbProject_ExtensionListNodes(HSQUIRRELVM v)438     SQInteger cbProject_ExtensionListNodes(HSQUIRRELVM v)
439     {
440         StackHandler sa(v);
441         int paramCount = sa.GetParamCount();
442         if (paramCount != 2)
443             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionListNodes\"");
444 
445         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
446         if (!project)
447             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionListNodes\"");
448         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
449         if (!extension)
450             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionListNodes\"");
451 
452         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
453         if (queryResult.element == nullptr)
454         {
455             if (queryResult.errorStr.empty())
456                 return SqPlus::ReturnCopy(v, wxArrayString());
457             else
458                 return sa.ThrowError(queryResult.errorStr.utf8_str().data());
459         }
460 
461         wxArrayString result;
462         int index = 0;
463         for (const TiXmlNode *child = queryResult.element->FirstChild();
464              child;
465              child = child->NextSibling())
466         {
467             wxString msg = *extension + wxT("/") + wxString(child->Value(), wxConvUTF8);
468             msg << wxT('[') << index << wxT(']');
469             result.Add(msg);
470             ++index;
471         }
472         return SqPlus::ReturnCopy(v, result);
473     }
474 
475     /// Squirrel function would expect a cbProject and an extension string. It will return a
476     /// wxArrayString object.
cbProject_ExtensionListNodeAttributes(HSQUIRRELVM v)477     SQInteger cbProject_ExtensionListNodeAttributes(HSQUIRRELVM v)
478     {
479         StackHandler sa(v);
480         int paramCount = sa.GetParamCount();
481         if (paramCount != 2)
482             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionListNodeAttributes\"");
483 
484         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
485         if (!project)
486             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionListNodeAttributes\"");
487         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
488         if (!extension)
489             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionListNodeAttributes\"");
490 
491         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
492         if (queryResult.element == nullptr)
493         {
494             if (queryResult.errorStr.empty())
495                 return SqPlus::ReturnCopy(v, wxArrayString());
496             else
497                 return sa.ThrowError(queryResult.errorStr.utf8_str().data());
498         }
499 
500         wxArrayString result;
501         for (const TiXmlAttribute *attr = queryResult.element->FirstAttribute();
502              attr;
503              attr = attr->Next())
504         {
505             result.Add(wxString(attr->Name(), wxConvUTF8));
506         }
507         return SqPlus::ReturnCopy(v, result);
508     }
509 
510     /// Squirrel function would expect a cbProject, an extension string and attribute name. It will
511     /// return a wxString object.
cbProject_ExtensionGetNodeAttribute(HSQUIRRELVM v)512     SQInteger cbProject_ExtensionGetNodeAttribute(HSQUIRRELVM v)
513     {
514         StackHandler sa(v);
515         int paramCount = sa.GetParamCount();
516         if (paramCount != 3)
517             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionGetNodeAttribute\"");
518 
519         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
520         if (!project)
521             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionGetNodeAttribute\"");
522         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
523         if (!extension)
524             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionGetNodeAttribute\"");
525         const wxString *attributeName = SqPlus::GetInstance<wxString, false>(v, 3);
526         if (!attributeName)
527             return sa.ThrowError("Invalid attribute name argument to \"cbProject::ExtensionGetNodeAttribute\"");
528 
529         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
530         if (queryResult.element == nullptr)
531         {
532             if (queryResult.errorStr.empty())
533                 return SqPlus::ReturnCopy(v, wxString());
534             else
535                 return sa.ThrowError(queryResult.errorStr.utf8_str().data());
536         }
537 
538         wxString result;
539         const char *attributeValue = queryResult.element->Attribute(attributeName->utf8_str().data());
540         if (attributeValue)
541             result = wxString(attributeValue, wxConvUTF8);
542         return SqPlus::ReturnCopy(v, result);
543     }
544 
545     /// Squirrel function would expect a cbProject, an extension string, attribute name and
546     /// attribute value.
cbProject_ExtensionSetNodeAttribute(HSQUIRRELVM v)547     SQInteger cbProject_ExtensionSetNodeAttribute(HSQUIRRELVM v)
548     {
549         StackHandler sa(v);
550         int paramCount = sa.GetParamCount();
551         if (paramCount != 4)
552             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionSetNodeAttribute\"");
553 
554         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
555         if (!project)
556             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionSetNodeAttribute\"");
557         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
558         if (!extension)
559             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionSetNodeAttribute\"");
560         const wxString *attributeName = SqPlus::GetInstance<wxString, false>(v, 3);
561         if (!attributeName)
562             return sa.ThrowError("Invalid attribute name argument to \"cbProject::ExtensionSetNodeAttribute\"");
563         const wxString *attributeValue = SqPlus::GetInstance<wxString, false>(v, 4);
564         if (!attributeName)
565             return sa.ThrowError("Invalid attribute value argument to \"cbProject::ExtensionSetNodeAttribute\"");
566 
567         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
568         if (queryResult.element == nullptr)
569         {
570             if (queryResult.errorStr.empty())
571             {
572                 queryResult.errorStr.Printf(wxT("Can't find extension node '%s'!"),
573                                             extension->wx_str());
574             }
575             return sa.ThrowError(queryResult.errorStr.utf8_str().data());
576         }
577 
578         queryResult.element->SetAttribute(attributeName->utf8_str().data(),
579                                           attributeValue->utf8_str().data());
580         project->SetModified(true);
581         return sa.Return();
582     }
583 
584     /// Squirrel function would expect a cbProject, an extension string, attribute name.
cbProject_ExtensionRemoveNodeAttribute(HSQUIRRELVM v)585     SQInteger cbProject_ExtensionRemoveNodeAttribute(HSQUIRRELVM v)
586     {
587         StackHandler sa(v);
588         int paramCount = sa.GetParamCount();
589         if (paramCount != 3)
590             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionRemoveNodeAttribute\"");
591 
592         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
593         if (!project)
594             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionRemoveNodeAttribute\"");
595         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
596         if (!extension)
597             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionRemoveNodeAttribute\"");
598         const wxString *attributeName = SqPlus::GetInstance<wxString, false>(v, 3);
599         if (!attributeName)
600             return sa.ThrowError("Invalid attribute name argument to \"cbProject::ExtensionRemoveNodeAttribute\"");
601 
602         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
603         if (queryResult.element == nullptr)
604         {
605             if (queryResult.errorStr.empty())
606             {
607                 queryResult.errorStr.Printf(wxT("Can't find extension node '%s'!"),
608                                             extension->wx_str());
609             }
610             return sa.ThrowError(queryResult.errorStr.utf8_str().data());
611         }
612 
613         queryResult.element->RemoveAttribute(attributeName->utf8_str().data());
614         project->SetModified(true);
615         return sa.Return();
616     }
617 
618     /// Squirrel function would expect a cbProject, an extension string and node name.
619     /// It will return the extension of the newly created node, so it could be used in other
620     /// node calls.
cbProject_ExtensionAddNode(HSQUIRRELVM v)621     SQInteger cbProject_ExtensionAddNode(HSQUIRRELVM v)
622     {
623         StackHandler sa(v);
624         int paramCount = sa.GetParamCount();
625         if (paramCount != 3)
626             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionAddNode\"");
627 
628         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
629         if (!project)
630             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionAddNode\"");
631         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
632         if (!extension)
633             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionAddNode\"");
634         const wxString *nodeName = SqPlus::GetInstance<wxString, false>(v, 3);
635         if (!nodeName)
636             return sa.ThrowError("Invalid node name argument to \"cbProject::ExtensionAddNode\"");
637 
638         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
639         if (queryResult.element == nullptr)
640         {
641             if (queryResult.errorStr.empty())
642             {
643                 queryResult.errorStr.Printf(wxT("Can't find extension node '%s'!"),
644                                             extension->wx_str());
645             }
646             return sa.ThrowError(queryResult.errorStr.utf8_str().data());
647         }
648 
649         TiXmlNode *newNode = queryResult.element->InsertEndChild(TiXmlElement(cbU2C(*nodeName)));
650         const wxString resultExtension = FindFullExtensionPathForNode(newNode);
651         project->SetModified(true);
652         return SqPlus::ReturnCopy(v, resultExtension);
653     }
654 
655     /// Squirrel function would expect a cbProject and extension string.
cbProject_ExtensionRemoveNode(HSQUIRRELVM v)656     SQInteger cbProject_ExtensionRemoveNode(HSQUIRRELVM v)
657     {
658         StackHandler sa(v);
659         int paramCount = sa.GetParamCount();
660         if (paramCount != 2)
661             return sa.ThrowError("Invalid arguments to \"cbProject::ExtensionRemoveNode\"");
662 
663         cbProject *project = SqPlus::GetInstance<cbProject, false>(v, 1);
664         if (!project)
665             return sa.ThrowError("Invalid project argument to \"cbProject::ExtensionRemoveNode\"");
666         const wxString *extension = SqPlus::GetInstance<wxString, false>(v, 2);
667         if (!extension)
668             return sa.ThrowError("Invalid extension argument to \"cbProject::ExtensionRemoveNode\"");
669 
670         FindXmlElementResult queryResult = FindExtensionElement(project, *extension);
671         if (queryResult.element == nullptr)
672         {
673             if (queryResult.errorStr.empty())
674             {
675                 queryResult.errorStr.Printf(wxT("Can't find extension node '%s'!"),
676                                             extension->wx_str());
677             }
678             return sa.ThrowError(queryResult.errorStr.utf8_str().data());
679         }
680 
681         TiXmlNode *parent = queryResult.element->Parent();
682         parent->RemoveChild(queryResult.element);
683         project->SetModified(true);
684         return sa.Return();
685     }
686 
ProjectManager_AddFileToProject(HSQUIRRELVM v)687     SQInteger ProjectManager_AddFileToProject(HSQUIRRELVM v)
688     {
689         StackHandler sa(v);
690         int paramCount = sa.GetParamCount();
691         if (paramCount == 4)
692         {
693             if (sa.GetType(4) == OT_INTEGER)
694             {
695                 wxString fname = *SqPlus::GetInstance<wxString,false>(v, 2);
696                 cbProject* prj = SqPlus::GetInstance<cbProject,false>(v, 3);
697                 int idx = sa.GetInt(4);
698                 return sa.Return((SQInteger)Manager::Get()->GetProjectManager()->AddFileToProject(fname, prj, idx));
699             }
700         }
701         return sa.ThrowError("Invalid arguments to \"ProjectManager::AddFileToProject\"");
702     }
703 
ProjectManager_GetProjectCount(HSQUIRRELVM v)704     SQInteger ProjectManager_GetProjectCount(HSQUIRRELVM v)
705     {
706         StackHandler sa(v);
707         int count = sa.GetParamCount();
708         if (count != 1)
709             return sa.ThrowError("Invalid arguments to \"ProjectManager::GetProjectCount\"");
710         else
711         {
712             ProjectManager *manager = SqPlus::GetInstance<ProjectManager, false>(v, 1);
713             int project_count = manager->GetProjects()->GetCount();
714             return sa.Return((SQInteger)project_count);
715         }
716     }
717 
ProjectManager_GetProject(HSQUIRRELVM v)718     SQInteger ProjectManager_GetProject(HSQUIRRELVM v)
719     {
720         StackHandler sa(v);
721         int count = sa.GetParamCount();
722         if (count != 2)
723             return sa.ThrowError("Invalid arguments to \"ProjectManager::GetProject\"");
724         else
725         {
726             ProjectManager *manager = SqPlus::GetInstance<ProjectManager, false>(v, 1);
727             int index = sa.GetInt(2);
728             int project_count = manager->GetProjects()->GetCount();
729             if(index >= project_count)
730                 return sa.ThrowError("Index out of bounds in \"ProjectManager::GetProject\"");
731             else
732             {
733                 cbProject *project = (*manager->GetProjects())[index];
734                 SqPlus::Push(v, project);
735                 return 1;
736             }
737         }
738     }
ProjectManager_RebuildTree(HSQUIRRELVM v)739     SQInteger ProjectManager_RebuildTree(HSQUIRRELVM v)
740     {
741         StackHandler sa(v);
742         int paramCount = sa.GetParamCount();
743         if (paramCount == 1)
744         {
745             ProjectManager *manager = SqPlus::GetInstance<ProjectManager, false>(v, 1);
746             if (manager)
747             {
748                 manager->GetUI().RebuildTree();
749                 return sa.Return();
750             }
751             return sa.ThrowError("'this' is NULL!?! (type of ProjectManager*)");
752         }
753         return sa.ThrowError("Invalid arguments to \"ProjectManager::RebuildTree\"");
754     }
755 
cbEditor_SetText(HSQUIRRELVM v)756     SQInteger cbEditor_SetText(HSQUIRRELVM v)
757     {
758         StackHandler sa(v);
759         int paramCount = sa.GetParamCount();
760         if (paramCount == 2)
761         {
762             cbEditor* self = SqPlus::GetInstance<cbEditor,false>(v, 1);
763             if (self)
764             {
765                 self->GetControl()->SetText(*SqPlus::GetInstance<wxString,false>(v, 2));
766                 return sa.Return();
767             }
768             return sa.ThrowError("'this' is NULL!?! (type of cbEditor*)");
769         }
770         return sa.ThrowError("Invalid arguments to \"cbEditor::SetText\"");
771     }
cbEditor_GetText(HSQUIRRELVM v)772     SQInteger cbEditor_GetText(HSQUIRRELVM v)
773     {
774         StackHandler sa(v);
775         int paramCount = sa.GetParamCount();
776         if (paramCount == 1)
777         {
778             cbEditor* self = SqPlus::GetInstance<cbEditor,false>(v, 1);
779             if (self)
780             {
781                 wxString str = self->GetControl()->GetText();
782                 return SqPlus::ReturnCopy(v, str);
783             }
784             return sa.ThrowError("'this' is NULL!?! (type of cbEditor*)");
785         }
786         return sa.ThrowError("Invalid arguments to \"cbEditor::GetText\"");
787     }
CompilerFactory_GetCompilerIndex(HSQUIRRELVM v)788     SQInteger CompilerFactory_GetCompilerIndex(HSQUIRRELVM v)
789     {
790         StackHandler sa(v);
791         int paramCount = sa.GetParamCount();
792         if (paramCount == 2)
793             return sa.Return((SQInteger)CompilerFactory::GetCompilerIndex(*SqPlus::GetInstance<wxString,false>(v, 2)));
794         return sa.ThrowError("Invalid arguments to \"CompilerFactory::GetCompilerIndex\"");
795     }
796 
CompilerFactory_GetCompilerIDByName(const wxString & name)797     wxString CompilerFactory_GetCompilerIDByName(const wxString &name)
798     {
799         Compiler *compiler = CompilerFactory::GetCompilerByName(name);
800         return (compiler ? compiler->GetID() : wxString(wxEmptyString));
801     }
802 
RegisterBindings()803     void RegisterBindings()
804     {
805         if (!SquirrelVM::GetVMPtr())
806             cbThrow(_T("Scripting engine not initialized!?"));
807 
808         Register_wxTypes();
809         Register_Constants();
810         Register_Globals();
811         Register_IO(); // IO is enabled, but just for harmless functions
812         Register_Dialog();
813         Register_ProgressDialog();
814         Register_UtilDialogs();
815 
816         SqPlus::SQClassDef<ConfigManager>("ConfigManager").
817                 staticFuncVarArgs(&ConfigManager_Read, "Read", "*").
818                 staticFuncVarArgs(&ConfigManager_Write, "Write", "*");
819 
820         SqPlus::SQClassDef<ProjectFile>("ProjectFile").
821                 func(&ProjectFile::AddBuildTarget, "AddBuildTarget").
822                 func(&ProjectFile::RenameBuildTarget, "RenameBuildTarget").
823                 func(&ProjectFile::RemoveBuildTarget, "RemoveBuildTarget").
824                 func(&ProjectFile::GetBuildTargets, "GetBuildTargets").
825                 func(&ProjectFile::GetBaseName, "GetBaseName").
826                 func(&ProjectFile::GetObjName, "GetObjName").
827                 func(&ProjectFile::SetObjName, "SetObjName").
828                 func(&ProjectFile::GetParentProject, "GetParentProject").
829                 func(&ProjectFile::SetUseCustomBuildCommand, "SetUseCustomBuildCommand").
830                 func(&ProjectFile::SetCustomBuildCommand, "SetCustomBuildCommand").
831                 func(&ProjectFile::GetUseCustomBuildCommand, "GetUseCustomBuildCommand").
832                 func(&ProjectFile::GetCustomBuildCommand, "GetCustomBuildCommand").
833                 var(&ProjectFile::file, "file").
834                 var(&ProjectFile::relativeFilename, "relativeFilename").
835                 var(&ProjectFile::relativeToCommonTopLevelPath, "relativeToCommonTopLevelPath").
836                 var(&ProjectFile::compile, "compile").
837                 var(&ProjectFile::link, "link").
838                 var(&ProjectFile::weight, "weight").
839                 var(&ProjectFile::compilerVar, "compilerVar").
840                 var(&ProjectFile::buildTargets, "buildTargets");
841 
842         SqPlus::SQClassDef<CompileOptionsBase>("CompileOptionsBase").
843                 func(&CompileOptionsBase::AddPlatform, "AddPlatform").
844                 func(&CompileOptionsBase::RemovePlatform, "RemovePlatform").
845                 func(&CompileOptionsBase::SetPlatforms, "SetPlatforms").
846                 func(&CompileOptionsBase::GetPlatforms, "GetPlatforms").
847                 func(&CompileOptionsBase::SupportsCurrentPlatform, "SupportsCurrentPlatform").
848                 func(&CompileOptionsBase::SetLinkerOptions, "SetLinkerOptions").
849                 func(&CompileOptionsBase::SetLinkLibs, "SetLinkLibs").
850                 func(&CompileOptionsBase::SetLinkerExecutable, "SetLinkerExecutable").
851                 func(&CompileOptionsBase::GetLinkerExecutable, "GetLinkerExecutable").
852                 func(&CompileOptionsBase::SetCompilerOptions, "SetCompilerOptions").
853                 func(&CompileOptionsBase::SetResourceCompilerOptions, "SetResourceCompilerOptions").
854                 func(&CompileOptionsBase::SetIncludeDirs, "SetIncludeDirs").
855                 func(&CompileOptionsBase::SetResourceIncludeDirs, "SetResourceIncludeDirs").
856                 func(&CompileOptionsBase::SetLibDirs, "SetLibDirs").
857                 func(&CompileOptionsBase::SetCommandsBeforeBuild, "SetCommandsBeforeBuild").
858                 func(&CompileOptionsBase::SetCommandsAfterBuild, "SetCommandsAfterBuild").
859                 func(&CompileOptionsBase::GetLinkerOptions, "GetLinkerOptions").
860                 func(&CompileOptionsBase::GetLinkLibs, "GetLinkLibs").
861                 func(&CompileOptionsBase::GetCompilerOptions, "GetCompilerOptions").
862                 func(&CompileOptionsBase::GetResourceCompilerOptions, "GetResourceCompilerOptions").
863                 func(&CompileOptionsBase::GetIncludeDirs, "GetIncludeDirs").
864                 func(&CompileOptionsBase::GetResourceIncludeDirs, "GetResourceIncludeDirs").
865                 func(&CompileOptionsBase::GetLibDirs, "GetLibDirs").
866                 func(&CompileOptionsBase::GetCommandsBeforeBuild, "GetCommandsBeforeBuild").
867                 func(&CompileOptionsBase::GetCommandsAfterBuild, "GetCommandsAfterBuild").
868                 func(&CompileOptionsBase::GetModified, "GetModified").
869                 func(&CompileOptionsBase::SetModified, "SetModified").
870                 func(&CompileOptionsBase::AddLinkerOption, "AddLinkerOption").
871                 func(&CompileOptionsBase::AddLinkLib, "AddLinkLib").
872                 func(&CompileOptionsBase::AddCompilerOption, "AddCompilerOption").
873                 func(&CompileOptionsBase::AddResourceCompilerOption, "AddResourceCompilerOption").
874                 func(&CompileOptionsBase::AddIncludeDir, "AddIncludeDir").
875                 func(&CompileOptionsBase::AddResourceIncludeDir, "AddResourceIncludeDir").
876                 func(&CompileOptionsBase::AddLibDir, "AddLibDir").
877                 func(&CompileOptionsBase::AddCommandsBeforeBuild, "AddCommandsBeforeBuild").
878                 func(&CompileOptionsBase::AddCommandsAfterBuild, "AddCommandsAfterBuild").
879                 func(&CompileOptionsBase::ReplaceLinkerOption, "ReplaceLinkerOption").
880                 func(&CompileOptionsBase::ReplaceLinkLib, "ReplaceLinkLib").
881                 func(&CompileOptionsBase::ReplaceCompilerOption, "ReplaceCompilerOption").
882                 func(&CompileOptionsBase::ReplaceResourceCompilerOption, "ReplaceResourceCompilerOption").
883                 func(&CompileOptionsBase::ReplaceIncludeDir, "ReplaceIncludeDir").
884                 func(&CompileOptionsBase::ReplaceResourceIncludeDir, "ReplaceResourceIncludeDir").
885                 func(&CompileOptionsBase::ReplaceLibDir, "ReplaceLibDir").
886                 func(&CompileOptionsBase::RemoveLinkerOption, "RemoveLinkerOption").
887                 func(&CompileOptionsBase::RemoveLinkLib, "RemoveLinkLib").
888                 func(&CompileOptionsBase::RemoveCompilerOption, "RemoveCompilerOption").
889                 func(&CompileOptionsBase::RemoveIncludeDir, "RemoveIncludeDir").
890                 func(&CompileOptionsBase::RemoveResourceCompilerOption, "RemoveResourceCompilerOption").
891                 func(&CompileOptionsBase::RemoveResourceIncludeDir, "RemoveResourceIncludeDir").
892                 func(&CompileOptionsBase::RemoveLibDir, "RemoveLibDir").
893                 func(&CompileOptionsBase::RemoveCommandsBeforeBuild, "RemoveCommandsBeforeBuild").
894                 func(&CompileOptionsBase::RemoveCommandsAfterBuild, "RemoveCommandsAfterBuild").
895                 func(&CompileOptionsBase::GetAlwaysRunPostBuildSteps, "GetAlwaysRunPostBuildSteps").
896                 func(&CompileOptionsBase::SetAlwaysRunPostBuildSteps, "SetAlwaysRunPostBuildSteps").
897                 func(&CompileOptionsBase::SetBuildScripts, "SetBuildScripts").
898                 func(&CompileOptionsBase::GetBuildScripts, "GetBuildScripts").
899                 func(&CompileOptionsBase::AddBuildScript, "AddBuildScript").
900                 func(&CompileOptionsBase::RemoveBuildScript, "RemoveBuildScript").
901                 func(&CompileOptionsBase::SetVar, "SetVar").
902                 func(&CompileOptionsBase::GetVar, "GetVar").
903                 func(&CompileOptionsBase::UnsetVar, "UnsetVar").
904                 func(&CompileOptionsBase::UnsetAllVars, "UnsetAllVars");
905 
906         SqPlus::SQClassDef<CompileTargetBase>("CompileTargetBase", "CompileOptionsBase").
907                 func(&CompileTargetBase::SetTargetFilenameGenerationPolicy, "SetTargetFilenameGenerationPolicy").
908 //                func(&CompileTargetBase::GetTargetFilenameGenerationPolicy, "GetTargetFilenameGenerationPolicy"). // not exposed because its args are non-const references
909                 func(&CompileTargetBase::GetFilename, "GetFilename").
910                 func(&CompileTargetBase::GetTitle, "GetTitle").
911                 func(&CompileTargetBase::SetTitle, "SetTitle").
912                 func(&CompileTargetBase::SetOutputFilename, "SetOutputFilename").
913                 func(&CompileTargetBase::SetWorkingDir, "SetWorkingDir").
914                 func(&CompileTargetBase::SetObjectOutput, "SetObjectOutput").
915                 func(&CompileTargetBase::SetDepsOutput, "SetDepsOutput").
916                 func(&CompileTargetBase::GetOptionRelation, "GetOptionRelation").
917                 func(&CompileTargetBase::SetOptionRelation, "SetOptionRelation").
918                 func(&CompileTargetBase::GetWorkingDir, "GetWorkingDir").
919                 func(&CompileTargetBase::GetObjectOutput, "GetObjectOutput").
920                 func(&CompileTargetBase::GetDepsOutput, "GetDepsOutput").
921                 func(&CompileTargetBase::GetOutputFilename, "GetOutputFilename").
922                 func(&CompileTargetBase::SuggestOutputFilename, "SuggestOutputFilename").
923                 func(&CompileTargetBase::GetExecutableFilename, "GetExecutableFilename").
924                 func(&CompileTargetBase::GetDynamicLibFilename, "GetDynamicLibFilename").
925                 func(&CompileTargetBase::GetDynamicLibDefFilename, "GetDynamicLibDefFilename").
926                 func(&CompileTargetBase::GetStaticLibFilename, "GetStaticLibFilename").
927                 func(&CompileTargetBase::GetBasePath, "GetBasePath").
928                 func(&CompileTargetBase::SetTargetType, "SetTargetType").
929                 func(&CompileTargetBase::GetTargetType, "GetTargetType").
930                 func(&CompileTargetBase::GetExecutionParameters, "GetExecutionParameters").
931                 func(&CompileTargetBase::SetExecutionParameters, "SetExecutionParameters").
932                 func(&CompileTargetBase::GetHostApplication, "GetHostApplication").
933                 func(&CompileTargetBase::SetHostApplication, "SetHostApplication").
934                 func(&CompileTargetBase::SetCompilerID, "SetCompilerID").
935                 func(&CompileTargetBase::GetCompilerID, "GetCompilerID").
936                 func(&CompileTargetBase::GetMakeCommandFor, "GetMakeCommandFor").
937                 func(&CompileTargetBase::SetMakeCommandFor, "SetMakeCommandFor").
938                 func(&CompileTargetBase::MakeCommandsModified, "MakeCommandsModified");
939 
940         SqPlus::SQClassDef<ProjectBuildTarget>("ProjectBuildTarget", "CompileTargetBase").
941                 func<const cbProject* (ProjectBuildTarget::*)() const>(&ProjectBuildTarget::GetParentProject, "GetParentProject").
942                 func(&ProjectBuildTarget::GetFullTitle, "GetFullTitle").
943                 func(&ProjectBuildTarget::GetExternalDeps, "GetExternalDeps").
944                 func(&ProjectBuildTarget::SetExternalDeps, "SetExternalDeps").
945                 func(&ProjectBuildTarget::SetAdditionalOutputFiles, "SetAdditionalOutputFiles").
946                 func(&ProjectBuildTarget::GetAdditionalOutputFiles, "GetAdditionalOutputFiles").
947                 func(&ProjectBuildTarget::GetIncludeInTargetAll, "GetIncludeInTargetAll").
948                 func(&ProjectBuildTarget::SetIncludeInTargetAll, "SetIncludeInTargetAll").
949                 func(&ProjectBuildTarget::GetCreateDefFile, "GetCreateDefFile").
950                 func(&ProjectBuildTarget::SetCreateDefFile, "SetCreateDefFile").
951                 func(&ProjectBuildTarget::GetCreateStaticLib, "GetCreateStaticLib").
952                 func(&ProjectBuildTarget::SetCreateStaticLib, "SetCreateStaticLib").
953                 func(&ProjectBuildTarget::GetUseConsoleRunner, "GetUseConsoleRunner").
954                 func(&ProjectBuildTarget::SetUseConsoleRunner, "SetUseConsoleRunner").
955                 func(&ProjectBuildTarget::GetFilesCount, "GetFilesCount").
956                 func(&ProjectBuildTarget::GetFile, "GetFile");
957 
958         SqPlus::SQClassDef<cbProject>("cbProject", "CompileTargetBase").
959                 func(&cbProject::GetModified, "GetModified").
960                 func(&cbProject::SetModified, "SetModified").
961                 func(&cbProject::GetMakefile, "GetMakefile").
962                 func(&cbProject::SetMakefile, "SetMakefile").
963                 func(&cbProject::IsMakefileCustom, "IsMakefileCustom").
964                 func(&cbProject::SetMakefileCustom, "SetMakefileCustom").
965                 func(&cbProject::CloseAllFiles, "CloseAllFiles").
966                 func(&cbProject::SaveAllFiles, "SaveAllFiles").
967                 func(&cbProject::Save, "Save").
968 //                func(&cbProject::SaveAs, "SaveAs"). // *UNSAFE*
969                 func(&cbProject::SaveLayout, "SaveLayout").
970                 func(&cbProject::LoadLayout, "LoadLayout").
971 //                func(&cbProject::ShowOptions, "ShowOptions").
972                 func(&cbProject::GetCommonTopLevelPath, "GetCommonTopLevelPath").
973                 func(&cbProject::GetFilesCount, "GetFilesCount").
974                 func(&cbProject::GetFile, "GetFile").
975                 func(&cbProject::GetFileByFilename, "GetFileByFilename").
976                 staticFuncVarArgs(&cbProject_RemoveFile, "RemoveFile", "*").
977                 staticFuncVarArgs(&cbProject_AddFile, "AddFile", "*").
978                 func(&cbProject::GetBuildTargetsCount, "GetBuildTargetsCount").
979                 staticFuncVarArgs(&cbProject_GetBuildTarget, "GetBuildTarget", "*").
980                 func(&cbProject::AddBuildTarget, "AddBuildTarget").
981                 staticFuncVarArgs(&cbProject_RenameBuildTarget, "RenameBuildTarget", "*").
982                 staticFuncVarArgs(&cbProject_DuplicateBuildTarget, "DuplicateBuildTarget", "*").
983                 staticFuncVarArgs(&cbProject_RemoveBuildTarget, "RemoveBuildTarget", "*").
984                 staticFuncVarArgs(&cbProject_ExportTargetAsProject, "ExportTargetAsProject", "*").
985                 func(&cbProject::BuildTargetValid, "BuildTargetValid").
986                 func(&cbProject::GetFirstValidBuildTargetName, "GetFirstValidBuildTargetName").
987                 func(&cbProject::SetDefaultExecuteTarget, "SetDefaultExecuteTarget").
988                 func(&cbProject::GetDefaultExecuteTarget, "GetDefaultExecuteTarget").
989                 func(&cbProject::SetActiveBuildTarget, "SetActiveBuildTarget").
990                 func(&cbProject::GetActiveBuildTarget, "GetActiveBuildTarget").
991                 func(&cbProject::SelectTarget, "SelectTarget").
992                 func<const ProjectBuildTarget* (cbProject::*)() const>(&cbProject::GetCurrentlyCompilingTarget, "GetCurrentlyCompilingTarget").
993                 func(&cbProject::SetCurrentlyCompilingTarget, "SetCurrentlyCompilingTarget").
994                 func(&cbProject::GetModeForPCH, "GetModeForPCH").
995                 func(&cbProject::SetModeForPCH, "SetModeForPCH").
996                 func(&cbProject::SetExtendedObjectNamesGeneration, "SetExtendedObjectNamesGeneration").
997                 func(&cbProject::GetExtendedObjectNamesGeneration, "GetExtendedObjectNamesGeneration").
998                 func(&cbProject::SetNotes, "SetNotes").
999                 func(&cbProject::GetNotes, "GetNotes").
1000                 func(&cbProject::SetShowNotesOnLoad, "SetShowNotesOnLoad").
1001                 func(&cbProject::GetShowNotesOnLoad, "GetShowNotesOnLoad").
1002                 func(&cbProject::SetCheckForExternallyModifiedFiles, "SetCheckForExternallyModifiedFiles").
1003                 func(&cbProject::GetCheckForExternallyModifiedFiles, "GetCheckForExternallyModifiedFiles").
1004                 func(&cbProject::ShowNotes, "ShowNotes").
1005                 func(&cbProject::AddToExtensions, "AddToExtensions").
1006                 staticFuncVarArgs(cbProject_ExtensionListNodes, "ExtensionListNodes", "*").
1007                 staticFuncVarArgs(cbProject_ExtensionListNodeAttributes, "ExtensionListNodeAttributes", "*").
1008                 staticFuncVarArgs(cbProject_ExtensionGetNodeAttribute, "ExtensionGetNodeAttribute", "*").
1009                 staticFuncVarArgs(cbProject_ExtensionSetNodeAttribute, "ExtensionSetNodeAttribute", "*").
1010                 staticFuncVarArgs(cbProject_ExtensionRemoveNodeAttribute, "ExtensionRemoveNodeAttribute", "*").
1011                 staticFuncVarArgs(cbProject_ExtensionAddNode, "ExtensionAddNode", "*").
1012                 staticFuncVarArgs(cbProject_ExtensionRemoveNode, "ExtensionRemoveNode", "*").
1013                 func(&cbProject::DefineVirtualBuildTarget, "DefineVirtualBuildTarget").
1014                 func(&cbProject::HasVirtualBuildTarget, "HasVirtualBuildTarget").
1015                 func(&cbProject::RemoveVirtualBuildTarget, "RemoveVirtualBuildTarget").
1016                 func(&cbProject::GetVirtualBuildTargets, "GetVirtualBuildTargets").
1017                 func(&cbProject::GetVirtualBuildTargetGroup, "GetVirtualBuildTargetGroup").
1018                 func(&cbProject::GetExpandedVirtualBuildTargetGroup, "GetExpandedVirtualBuildTargetGroup").
1019                 func(&cbProject::CanAddToVirtualBuildTarget, "CanAddToVirtualBuildTarget").
1020                 func(&cbProject::SetTitle, "SetTitle");
1021 
1022 
1023         SqPlus::SQClassDef<ProjectManager>("ProjectManager").
1024                 func(&ProjectManager::GetDefaultPath, "GetDefaultPath").
1025                 func(&ProjectManager::SetDefaultPath, "SetDefaultPath").
1026                 func(&ProjectManager::GetActiveProject, "GetActiveProject").
1027                 staticFuncVarArgs(&ProjectManager_GetProjectCount, "GetProjectCount", "*").
1028                 staticFuncVarArgs(&ProjectManager_GetProject, "GetProject", "*").
1029                 func(&ProjectManager::SetProject, "SetProject").
1030                 func(&ProjectManager::LoadWorkspace, "LoadWorkspace").
1031                 func(&ProjectManager::SaveWorkspace, "SaveWorkspace").
1032                 func(&ProjectManager::SaveWorkspaceAs, "SaveWorkspaceAs").
1033                 func(&ProjectManager::CloseWorkspace, "CloseWorkspace").
1034                 func(&ProjectManager::IsOpen, "IsOpen").
1035                 func(&ProjectManager::LoadProject, "LoadProject").
1036                 func(&ProjectManager::SaveProject, "SaveProject").
1037                 func(&ProjectManager::SaveProjectAs, "SaveProjectAs").
1038                 func(&ProjectManager::SaveActiveProject, "SaveActiveProject").
1039                 func(&ProjectManager::SaveActiveProjectAs, "SaveActiveProjectAs").
1040                 func(&ProjectManager::SaveAllProjects, "SaveAllProjects").
1041                 func(&ProjectManager::CloseProject, "CloseProject").
1042                 func(&ProjectManager::CloseActiveProject, "CloseActiveProject").
1043                 func(&ProjectManager::CloseAllProjects, "CloseAllProjects").
1044                 func(&ProjectManager::NewProject, "NewProject").
1045                 staticFuncVarArgs(&ProjectManager_AddFileToProject, "AddFileToProject", "*").
1046 //                func(&ProjectManager::AskForBuildTargetIndex, "AskForBuildTargetIndex").
1047                 func(&ProjectManager::AddProjectDependency, "AddProjectDependency").
1048                 func(&ProjectManager::RemoveProjectDependency, "RemoveProjectDependency").
1049                 func(&ProjectManager::ClearProjectDependencies, "ClearProjectDependencies").
1050                 func(&ProjectManager::RemoveProjectFromAllDependencies, "RemoveProjectFromAllDependencies").
1051                 func(&ProjectManager::GetDependenciesForProject, "GetDependenciesForProject").
1052 //                func(&ProjectManager::ConfigureProjectDependencies, "ConfigureProjectDependencies");
1053                 staticFuncVarArgs(&ProjectManager_RebuildTree, "RebuildTree", "*");
1054 
1055         SqPlus::SQClassDef<EditorBase>("EditorBase").
1056                 func(&EditorBase::GetFilename, "GetFilename").
1057                 func(&EditorBase::SetFilename, "SetFilename").
1058                 func(&EditorBase::GetShortName, "GetShortName").
1059                 func(&EditorBase::GetModified, "GetModified").
1060                 func(&EditorBase::SetModified, "SetModified").
1061                 func(&EditorBase::GetTitle, "GetTitle").
1062                 func(&EditorBase::SetTitle, "SetTitle").
1063                 func(&EditorBase::Activate, "Activate").
1064                 func(&EditorBase::Close, "Close").
1065                 func(&EditorBase::Save, "Save").
1066                 func(&EditorBase::IsBuiltinEditor, "IsBuiltinEditor").
1067                 func(&EditorBase::ThereAreOthers, "ThereAreOthers").
1068                 func(&EditorBase::GotoLine, "GotoLine").
1069                 func(&EditorBase::Undo, "Undo").
1070                 func(&EditorBase::Redo, "Redo").
1071                 func(&EditorBase::Cut, "Cut").
1072                 func(&EditorBase::Copy, "Copy").
1073                 func(&EditorBase::Paste, "Paste").
1074                 func(&EditorBase::CanUndo, "CanUndo").
1075                 func(&EditorBase::CanRedo, "CanRedo").
1076                 func(&EditorBase::CanPaste, "CanPaste").
1077                 func(&EditorBase::IsReadOnly, "IsReadOnly").
1078                 func(&EditorBase::HasSelection, "HasSelection");
1079 
1080         SqPlus::SQClassDef<cbEditor>("cbEditor", "EditorBase").
1081                 func(&cbEditor::SetEditorTitle, "SetEditorTitle").
1082                 func(&cbEditor::GetProjectFile, "GetProjectFile").
1083                 func(&cbEditor::Save, "Save").
1084                 func(&cbEditor::SaveAs, "SaveAs").
1085                 func(&cbEditor::FoldAll, "FoldAll").
1086                 func(&cbEditor::UnfoldAll, "UnfoldAll").
1087                 func(&cbEditor::ToggleAllFolds, "ToggleAllFolds").
1088                 func(&cbEditor::FoldBlockFromLine, "FoldBlockFromLine").
1089                 func(&cbEditor::UnfoldBlockFromLine, "UnfoldBlockFromLine").
1090                 func(&cbEditor::ToggleFoldBlockFromLine, "ToggleFoldBlockFromLine").
1091                 func(&cbEditor::GetLineIndentInSpaces, "GetLineIndentInSpaces").
1092                 func(&cbEditor::GetLineIndentString, "GetLineIndentString").
1093                 func(&cbEditor::Touch, "Touch").
1094                 func(&cbEditor::Reload, "Reload").
1095                 func(&cbEditor::Print, "Print").
1096                 func(&cbEditor::AutoComplete, "AutoComplete").
1097                 func(&cbEditor::AddBreakpoint, "AddBreakpoint").
1098                 func(&cbEditor::RemoveBreakpoint, "RemoveBreakpoint").
1099                 func(&cbEditor::ToggleBookmark, "ToggleBookmark").
1100                 func(&cbEditor::HasBookmark, "HasBookmark").
1101                 func(&cbEditor::GotoNextBookmark, "GotoNextBookmark").
1102                 func(&cbEditor::GotoPreviousBookmark, "GotoPreviousBookmark").
1103                 func(&cbEditor::ClearAllBookmarks, "ClearAllBookmarks").
1104                 func(&cbEditor::ToggleBreakpoint, "ToggleBreakpoint").
1105                 func(&cbEditor::HasBreakpoint, "HasBreakpoint").
1106                 func(&cbEditor::GotoNextBreakpoint, "GotoNextBreakpoint").
1107                 func(&cbEditor::GotoPreviousBreakpoint, "GotoPreviousBreakpoint").
1108 
1109 
1110                 // these are not present in cbEditor; included to help scripts edit text
1111                 staticFuncVarArgs(&cbEditor_SetText, "SetText", "*").
1112                 staticFuncVarArgs(&cbEditor_GetText, "GetText", "*");
1113 
1114         SqPlus::SQClassDef<EditorManager>("EditorManager").
1115                 func(&EditorManager::New, "New").
1116                 staticFuncVarArgs(&EditorManager_Open, "Open").
1117                 func(&EditorManager::IsBuiltinOpen, "IsBuiltinOpen").
1118                 staticFuncVarArgs(&EditorManager_GetBuiltinEditor, "GetBuiltinEditor", "*").
1119                 func(&EditorManager::GetBuiltinActiveEditor, "GetBuiltinActiveEditor").
1120                 func(&EditorManager::GetActiveEditor, "GetActiveEditor").
1121                 func(&EditorManager::ActivateNext, "ActivateNext").
1122                 func(&EditorManager::ActivatePrevious, "ActivatePrevious").
1123                 func(&EditorManager::SwapActiveHeaderSource, "SwapActiveHeaderSource").
1124                 func(&EditorManager::CloseActive, "CloseActive").
1125                 staticFuncVarArgs(&EditorManager_Close, "Close", "*").
1126                 func(&EditorManager::CloseAll, "CloseAll").
1127                 staticFuncVarArgs(&EditorManager_Save, "Save", "*").
1128                 func(&EditorManager::SaveActive, "SaveActive").
1129                 func(&EditorManager::SaveAs, "SaveAs").
1130                 func(&EditorManager::SaveActiveAs, "SaveActiveAs").
1131                 func(&EditorManager::SaveAll, "SaveAll");
1132         //        func(&EditorManager::ShowFindDialog, "ShowFindDialog");
1133 
1134         SqPlus::SQClassDef<UserVariableManager>("UserVariableManager").
1135                 func(&UserVariableManager::Exists, "Exists");
1136 
1137         SqPlus::SQClassDef<ScriptingManager>("ScriptingManager").
1138                 func(&ScriptingManager::RegisterScriptMenu, "RegisterScriptMenu");
1139 
1140         typedef bool(*CF_INHERITSFROM)(const wxString&, const wxString&); // CompilerInheritsFrom
1141 
1142         SqPlus::SQClassDef<CompilerFactory>("CompilerFactory").
1143                 staticFunc(&CompilerFactory::IsValidCompilerID, "IsValidCompilerID").
1144                 staticFuncVarArgs(&CompilerFactory_GetCompilerIndex, "GetCompilerIndex", "*").
1145                 staticFunc(&CompilerFactory::GetDefaultCompilerID, "GetDefaultCompilerID").
1146                 staticFunc(&CompilerFactory::GetCompilerVersionString, "GetCompilerVersionString").
1147                 staticFunc<CF_INHERITSFROM>(&CompilerFactory::CompilerInheritsFrom, "CompilerInheritsFrom").
1148                 staticFunc(CompilerFactory_GetCompilerIDByName, "GetCompilerIDByName");
1149 
1150         SqPlus::SQClassDef<PluginInfo>("PluginInfo").
1151             emptyCtor().
1152             var(&PluginInfo::name, "name").
1153             var(&PluginInfo::title, "title").
1154             var(&PluginInfo::version, "version").
1155             var(&PluginInfo::description, "description").
1156             var(&PluginInfo::author, "author").
1157             var(&PluginInfo::authorEmail, "authorEmail").
1158             var(&PluginInfo::authorWebsite, "authorWebsite").
1159             var(&PluginInfo::thanksTo, "thanksTo").
1160             var(&PluginInfo::license, "license");
1161 
1162         SqPlus::SQClassDef<FileTreeData>("FileTreeData").
1163             func(&FileTreeData::GetKind, "GetKind").
1164             func(&FileTreeData::GetProject, "GetProject").
1165             func(&FileTreeData::GetFileIndex, "GetFileIndex").
1166             func(&FileTreeData::GetProjectFile, "GetProjectFile").
1167             func(&FileTreeData::GetFolder, "GetFolder").
1168             func(&FileTreeData::SetKind, "SetKind").
1169             func(&FileTreeData::SetProject, "SetProject").
1170             func(&FileTreeData::SetFileIndex, "SetFileIndex").
1171             func(&FileTreeData::SetProjectFile, "SetProjectFile").
1172             func(&FileTreeData::SetFolder, "SetFolder");
1173 
1174         // called last because it needs a few previously registered types
1175         Register_ScriptPlugin();
1176     }
1177 } // namespace ScriptBindings
1178