1 #ifndef _MacroManager_MacroManager_h_ 2 #define _MacroManager_MacroManager_h_ 3 4 #include <CtrlLib/CtrlLib.h> 5 #include <CodeEditor/CodeEditor.h> 6 #include <ide/Core/Core.h> 7 8 namespace Upp { 9 10 #define LAYOUTFILE <ide/MacroManager/MacroManager.lay> 11 #include <CtrlCore/lay.h> 12 13 #define IMAGECLASS MacroManagerImg 14 #define IMAGEFILE <ide/MacroManager/MacroManager.iml> 15 #include <Draw/iml_header.h> 16 17 class MacroElement final { 18 public: 19 enum class Type { 20 MACRO, 21 FUNCTION, 22 UNKNOWN 23 }; 24 25 public: 26 MacroElement(Type type, const String& fileName, int line, const String& comment); 27 28 Image GetImage() const; 29 String GetContent() const; 30 31 public: 32 Type type; 33 String comment; 34 String name; 35 String prototype; 36 String args; 37 String code; 38 String fileName; 39 int line; 40 }; 41 42 class UscFileParser final { 43 public: 44 using MacroList = Array<MacroElement>; 45 46 public: 47 UscFileParser(const String& filePath); 48 49 MacroList Parse(); 50 bool IsValid(); 51 52 private: 53 void ReadFunction(CParser& parser, const String& comment, const char* prototypeBegin, MacroList& list); 54 void ReadMacro(CParser& parser, const String& comment, const char* prototypeBegin, MacroList& list); 55 void FinishRead(CParser& parser, const char* prototypeBegin, MacroElement& element, MacroList& list); 56 57 private: 58 static void FindNextElement(CParser& parser); 59 static String ReadArgs(CParser& parser); 60 static String ReadKeyDesc(CParser& parser); 61 62 private: 63 String filePath; 64 }; 65 66 class MacroManagerWindow final : public WithMacroManagerLayout<TopWindow> { 67 public: 68 using MacroStore = ArrayMap<String, Array<MacroElement>>; 69 70 public: 71 MacroManagerWindow(const Workspace& wspc, const String& hlStyles); 72 IsGlobalMacrosChanged()73 bool IsGlobalMacrosChanged() const { return globalMacrosChanged; } 74 75 void Layout() override; 76 77 public: 78 Event<String, int> WhenEdit; 79 80 private: 81 void InitButtons(); 82 void InitEvents(); 83 void InitToolBar(); 84 void InitToolButton(ToolButton& toolButton, const String& label, const Image& image); 85 86 void LoadUscDir(const String& dir); 87 void LoadMacros(); 88 void ReloadGlobalMacros(); 89 void ReloadLocalMacros(); 90 91 void OnMacroBar(Bar& bar); 92 void OnTreeSel(); 93 void OnTabSet(); 94 void OnImport(); 95 void OnExport(int id); 96 void OnEditFile(); 97 void OnNewMacroFile(); 98 void OnDeleteMacroFile(); 99 void OnGlobalMacrosChanged(); 100 101 void ExportFiles(Index<String>& files, const String& dir); 102 void FindNodeFiles(int id, Index<String>& list); 103 104 private: 105 static String GenFileOverrideMessage(const String& fileName); 106 IsGlobalFile()107 bool IsGlobalFile() const { return globalTree.IsCursor() && globalTree.Get().Is<String>(); } IsFile()108 bool IsFile() const { return GetCurrentTree().Get().Is<String>(); } IsFile(int id)109 bool IsFile(int id) const { return globalTree.Get(id).Is<String>(); } IsMacro()110 bool IsMacro() const { return GetCurrentTree().Get().Is<MacroElement>();} IsEditPossible()111 bool IsEditPossible() const { return IsFile() || IsMacro(); } 112 IsGlobalTab()113 bool IsGlobalTab() const { return !tab.Get(); } 114 GetCurrentTree()115 const TreeCtrl& GetCurrentTree() const { return tab.Get() ? localTree : globalTree;}; 116 117 private: 118 const Workspace& wspc; 119 120 ToolButton editLabel; 121 ToolButton exportLabel; 122 ToolButton newGlobalLabel; 123 ToolButton importGlobalsLabel; 124 ToolButton exportGlobalsLabel; 125 126 TabCtrl tab; 127 TreeCtrl globalTree; 128 TreeCtrl localTree; 129 130 SplitterFrame splitter; 131 CodeEditor editor; 132 133 bool globalMacrosChanged; 134 }; 135 136 } 137 138 139 #endif 140