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