From 8207c86fb570cb7a0c7b84359c157f5b56a6bb02 Mon Sep 17 00:00:00 2001 From: Sergey Vlasov Date: Sun, 23 Feb 2025 09:30:29 +0500 Subject: [PATCH] Fixed REFRESH for .intellisense.xml file and Workbook.CustomXMLParts. --- .../Providers/WorkbookIntelliSenseProvider.cs | 37 +++++++++++-------- .../Providers/XmlIntelliSenseProvider.cs | 23 +++++------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Source/ExcelDna.IntelliSense/Providers/WorkbookIntelliSenseProvider.cs b/Source/ExcelDna.IntelliSense/Providers/WorkbookIntelliSenseProvider.cs index a759c23..7a6b634 100644 --- a/Source/ExcelDna.IntelliSense/Providers/WorkbookIntelliSenseProvider.cs +++ b/Source/ExcelDna.IntelliSense/Providers/WorkbookIntelliSenseProvider.cs @@ -353,21 +353,7 @@ void RegisterWithXmlProvider(Workbook wb) var path = wb.FullName; var xmlPath = GetXmlPath(path); _xmlProvider.RegisterXmlFunctionInfo(xmlPath); // Will check if file exists - - Logger.Provider.Verbose($"WorkbookIntelliSenseProvider.RegisterWithXmlProvider - Checking CustomXMLParts"); - - var customXmlParts = wb.CustomXMLParts.SelectByNamespace(XmlIntelliSense.Namespace); - if (customXmlParts.Count > 0) - { - Logger.Provider.Verbose($"WorkbookIntelliSenseProvider.RegisterWithXmlProvider - CustomXMLPart found"); - // We just take the first one - register against the Bworkbook name - _xmlProvider.RegisterXmlFunctionInfo(path, customXmlParts[1].XML); - } - else - { - Logger.Provider.Verbose($"WorkbookIntelliSenseProvider.RegisterWithXmlProvider - No CustomXMLPart found"); - } - + _xmlProvider.RegisterXmlFunctionInfo(path, () => GetIntelliSenseFromCustomXMLParts(wb)); } void UnregisterWithXmlProvider(Workbook wb) @@ -404,6 +390,27 @@ public void Dispose() } } + string GetIntelliSenseFromCustomXMLParts(Workbook wb) + { + string result = null; + + Logger.Provider.Verbose($"WorkbookIntelliSenseProvider.RegisterWithXmlProvider - Checking CustomXMLParts"); + + var customXmlParts = wb.CustomXMLParts.SelectByNamespace(XmlIntelliSense.Namespace); + if (customXmlParts.Count > 0) + { + Logger.Provider.Verbose($"WorkbookIntelliSenseProvider.RegisterWithXmlProvider - CustomXMLPart found"); + // We just take the first one - register against the workbook name + result = customXmlParts[1].XML; + } + else + { + Logger.Provider.Verbose($"WorkbookIntelliSenseProvider.RegisterWithXmlProvider - No CustomXMLPart found"); + } + + return result; + } + string GetXmlPath(string wbPath) => Path.ChangeExtension(wbPath, ".intellisense.xml"); } } diff --git a/Source/ExcelDna.IntelliSense/Providers/XmlIntelliSenseProvider.cs b/Source/ExcelDna.IntelliSense/Providers/XmlIntelliSenseProvider.cs index 2247de6..0f4a334 100644 --- a/Source/ExcelDna.IntelliSense/Providers/XmlIntelliSenseProvider.cs +++ b/Source/ExcelDna.IntelliSense/Providers/XmlIntelliSenseProvider.cs @@ -17,28 +17,25 @@ class XmlIntelliSenseProvider : IIntelliSenseProvider { public class XmlRegistrationInfo { - string _fileName; // Might be .xml file or Workbook path. Use only if _xmlIntelliSense is null. - string _xmlIntelliSense; // Might be null + string _fileName; // Might be .xml file or Workbook path. Use only if _xmlIntelliSenseSource is null. + Func _xmlIntelliSenseSource; // Might be null XmlIntelliSense _intelliSense; // Might be null - lazy parsed string _path; // Directory of file, used to expand HelpTopic - public XmlRegistrationInfo(string fileName, string xmlIntelliSense) + public XmlRegistrationInfo(string fileName, Func xmlIntelliSenseSource) { _fileName = fileName; - _xmlIntelliSense = xmlIntelliSense; + _xmlIntelliSenseSource = xmlIntelliSenseSource; _path = Path.GetDirectoryName(fileName); } // Called in a macro context public void Refresh() { - if (_intelliSense != null) - return; // Already done - try { // Parse first - var xml = _xmlIntelliSense; + var xml = _xmlIntelliSenseSource?.Invoke(); if (xml == null) { xml = File.ReadAllText(_fileName); @@ -87,15 +84,15 @@ public XmlIntelliSenseProvider() // May be called on the main Excel thread or on another thread (e.g. our automation thread) // Pass in the xmlFunctionInfo if available (from inside document), else file will be read // We make the parsing lazy... - public void RegisterXmlFunctionInfo(string fileName, string xmlIntelliSense = null) + public void RegisterXmlFunctionInfo(string fileName, Func xmlIntelliSenseSource = null) { - if (!File.Exists(fileName) && xmlIntelliSense == null) + if (!File.Exists(fileName) && xmlIntelliSenseSource == null) { Logger.Provider.Verbose($"XmlIntelliSenseProvider.RegisterXmlFunctionInfo - Not IntelliSense file at {fileName}"); return; } - - var regInfo = new XmlRegistrationInfo(fileName, xmlIntelliSense); + + var regInfo = new XmlRegistrationInfo(fileName, xmlIntelliSenseSource); Logger.Provider.Verbose($"XmlIntelliSenseProvider.RegisterXmlFunctionInfo - Created XmlRegistrationInfo info for {fileName}"); lock (_xmlRegistrationInfos) { @@ -157,7 +154,7 @@ public IList GetFunctionInfos() Logger.Provider.Verbose("XmlIntelliSenseProvider.GetFunctionInfos - End"); return functionInfos; } - + void OnInvalidate(object _unused_) { Logger.Provider.Verbose($"XmlIntelliSenseProvider.OnInvalidate - Invoking Invalidate event");