Index: MacroManager.cpp =================================================================== --- MacroManager.cpp (revision 11185) +++ MacroManager.cpp (working copy) @@ -2,11 +2,11 @@ #define METHOD_NAME "MacroManagerWindow " << UPP_FUNCTION_NAME << "(): " -static const int GLOBAL_MACRO_KEY = 0; -static const int LOCAL_MACRO_KEY = 10; +static const int GLOBAL_NODE_KEY = 0; +static const bool LOCAL_NODE_KEY = false; +static const double PACKAGE_NODE_KEY = 0.0; -MacroManagerWindow::MacroManagerWindow(Ide& ide) - : ide(ide) +MacroManagerWindow::MacroManagerWindow() { CtrlLayout(*this, t_("Macro Manager")); Zoomable().Sizeable().MinimizeBox(false); @@ -31,14 +31,23 @@ InitButtons(); } + void MacroManagerWindow::OnMacroBar(Bar& bar) { - bool isGlobalFile = IsString(macrosTree.Get()); - - bar.Add(t_("New global macro file.."), [=]{ OnNewMacroFile();}); - bar.Add(t_("Delete macro file"), [=]{ OnDeleteMacroFile();}) - .Enable(isGlobalFile); + bar.Add(t_("New global macro file.."), [=]{ OnNewMacroFile();}); + bar.Add(t_("Delete macro file.."), [=]{ OnDeleteMacroFile();}) + .Enable(IsAGlobalFile()); + + bar.Add(t_("Import macro file.."), [=]{ OnImport();}); + + bar.Add(t_("Export macro file.."), [=]{ OnExport();}) + .Enable(!IsAMacro()); + + bar.Separator(); + + bar.Add(t_("Edit"), [=]{ OnEditFile();}) + .Enable(IsAFile() || IsAMacro()); } void MacroManagerWindow::InitButtons() @@ -71,21 +80,21 @@ } Value key = macrosTree.Get(); - if(IsNumber(key)) { + if(IsARootOrAPackage()) { editor.Hide(); editButton.Disable(); int node = macrosTree.Find(key); - exportButton.Enable(macrosTree.GetChildCount(node) > 0); + exportButton.Enable(IsTheGlobalRoot() || IsAGlobalFile()); return; } - if(IsString(key)) { + if(IsAFile()) { editButton.Enable(); exportButton.Disable(); editor.Show(); - editor.Set(LoadFile(AppendFileName(GetLocalDir(), (String)key))); + editor.Set(LoadFile((String)key)); return; } @@ -146,17 +155,15 @@ void MacroManagerWindow::FindNodeFiles(int id, Index& list) { - Value key = macrosTree.Get(id); - if(IsNumber(key) || IsString(key)) { + if(IsAFile(id)) { + list.FindAdd((String)macrosTree.Get(id)); + } + else { for(int i = 0; i < macrosTree.GetChildCount(id); i++) { int node = macrosTree.GetChild(id, i); FindNodeFiles(node, list); } } - else { - MacroElement element = ValueTo(key); - list.FindAdd(element.fileName); - } } void MacroManagerWindow::OnExport() @@ -168,8 +175,7 @@ if(dir.IsEmpty()) return; - Value key = macrosTree.Get(); - if(IsNumber(key) || IsString(key)) { + if(!IsAMacro()) { int id = macrosTree.GetCursor(); Index list; FindNodeFiles(id, list); @@ -182,24 +188,15 @@ if(!macrosTree.IsCursor()) return; - Value key = macrosTree.Get(); - if(IsNumber(key)) - return; - - // TODO: Move this logic outside class - we serious don't want ide dependency here. - if(IsString(key)) { - ide.EditFile(AppendFileName(GetLocalDir(), (String)key)); - ide.editor.SetCursor(0); - ide.editor.CenterCursor(); - } else { - MacroElement element = ValueTo(key); - - ide.EditFile(element.fileName); - ide.editor.SetCursor(ide.editor.GetPos(element.line - 1)); - ide.editor.CenterCursor(); + if(IsAMacro()) { + MacroElement element = ValueTo(macrosTree.Get()); + WhenEdit(element.fileName, element.line - 1); + Break(); } - - Break(); + else if(IsAFile()) { + WhenEdit( (String)macrosTree.Get(), 1); + Break(); + } } void MacroManagerWindow::OnNewMacroFile() @@ -246,7 +243,7 @@ if(!ff.GetPath().EndsWith(String() << "UppLocal" << DIR_SEPS << ff.GetName())) fileTitle = "../" + fileTitle; - int fileNode = macrosTree.Add(globalNode, Image(), fileTitle, fileTitle); + int fileNode = macrosTree.Add(globalNode, Image(), ff.GetPath(), fileTitle); auto list = UscFileParser(ff.GetPath()).Parse(); for(const auto& element : list) { @@ -265,7 +262,7 @@ { int globalNode = macrosTree.Find(0); if(globalNode < 0) { - globalNode = macrosTree.Add(0, Image(), GLOBAL_MACRO_KEY, t_("Global macros")); + globalNode = macrosTree.Add(0, Image(), GLOBAL_NODE_KEY, t_("Global macros")); } else { macrosTree.RemoveChildren(globalNode); @@ -279,9 +276,9 @@ void MacroManagerWindow::ReloadLocalMacros() { - int localNode = macrosTree.Add(0, Image(), LOCAL_MACRO_KEY, t_("Local macros")); + int localNode = macrosTree.Add(0, Image(), LOCAL_NODE_KEY, t_("Local macros")); - const Workspace& wspc = ide.IdeWorkspace(); + const Workspace& wspc = GetIdeWorkspace(); for(int i = 0; i < wspc.GetCount(); i++) { const Package& package = wspc.GetPackage(i); @@ -297,9 +294,9 @@ continue; if(packageNode == -1) - packageNode = macrosTree.Add(localNode, Image(), LOCAL_MACRO_KEY + 1, wspc[i]); + packageNode = macrosTree.Add(localNode, Image(), PACKAGE_NODE_KEY, wspc[i]); - int fileNode = macrosTree.Add(packageNode, Image(), LOCAL_MACRO_KEY + 2, file); + int fileNode = macrosTree.Add(packageNode, Image(), filePath.ToWString(), file); for(int j = 0; j < list.GetCount(); j++) { MacroElement& element = list[j]; macrosTree.Add(fileNode, element.GetImage(), RawToValue(element), element.name); @@ -310,5 +307,13 @@ void Ide::DoMacroManager() { - MacroManagerWindow(*this).Execute(); + MacroManagerWindow dlg; + + dlg.WhenEdit = [&](String fileName, int line) { + EditFile(fileName); + editor.SetCursor(editor.GetPos(line)); + editor.CenterCursor(); + }; + + dlg.Execute(); } Index: MacroManager.h =================================================================== --- MacroManager.h (revision 11185) +++ MacroManager.h (working copy) @@ -52,9 +52,11 @@ using MacroStore = ArrayMap>; public: - MacroManagerWindow(Ide& ide); + MacroManagerWindow(); void Layout() override; + + Event WhenEdit; private: void InitButtons(); @@ -77,11 +79,22 @@ private: static String GenFileOverrideMessage(const String& fileName); + + bool IsAMacro() { return macrosTree.Get().Is();} + bool IsAMacro(int id) { return macrosTree.Get(id).Is();} + bool IsTheGlobalRoot() { return macrosTree.Get().Is(); } + bool IsTheLocalRoot() { return macrosTree.Get().Is(); } + bool IsAPackage() { return macrosTree.Get().Is(); } + bool IsARootOrAPackage() { return IsNumber(macrosTree.Get()); } + + bool IsAGlobalFile() { return macrosTree.Get().Is(); } + bool IsALocalFile() { return macrosTree.Get().Is(); } + + bool IsAFile() { return macrosTree.Get().Is() || macrosTree.Get().Is(); } + bool IsAFile(int id) { return macrosTree.Get(id).Is() || macrosTree.Get(id).Is(); } + private: - // TODO: MacroManager shold not depend upon Ide instance. - // The edit logic should be outside class the same as load macros. - Ide& ide; TreeCtrl macrosTree; SplitterFrame splitter;