Skip to content

Commit 8c24887

Browse files
committed
Merge pull request #786 from Excel-DNA/CommandMenu
Fixed command menu registration
1 parent 275d827 commit 8c24887

File tree

5 files changed

+70
-3
lines changed

5 files changed

+70
-3
lines changed

Source/ExcelDna.Integration/DnaLibrary.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,11 @@ internal void AutoOpen()
325325
RegistrationInfo.Register();
326326
SynchronizationManager.Install(true);
327327
// Register my Methods
328-
var allMethods = _methods.Select(i => new Registration.ExcelFunctionRegistration(i)).Concat(_excelFunctionsExtendedRegistration);
329-
ExtendedRegistration.Registration.RegisterExtended(allMethods, _excelParameterConversions, _excelReturnConversions, _excelFunctionProcessors, _excelFunctionExecutionHandlerSelectors);
328+
List<MethodInfo> commands = _methods.Where(Registration.ExcelCommandRegistration.IsCommand).ToList();
329+
ExcelIntegration.RegisterMethods(commands);
330+
331+
var functions = _methods.Except(commands).Select(i => new Registration.ExcelFunctionRegistration(i)).Concat(_excelFunctionsExtendedRegistration);
332+
ExtendedRegistration.Registration.RegisterExtended(functions, _excelParameterConversions, _excelReturnConversions, _excelFunctionProcessors, _excelFunctionExecutionHandlerSelectors);
330333

331334
// Invoke AutoOpen in all assemblies
332335
foreach (AssemblyLoader.ExcelAddInInfo addIn in _addIns)

Source/ExcelDna.Integration/Registration/ExcelCommandRegistration.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,10 @@ public ExcelCommandRegistration(MethodInfo methodInfo)
7777
CommandAttribute = new ExcelCommandAttribute { Name = methodInfo.Name };
7878
}
7979
}
80+
81+
internal static bool IsCommand(MethodInfo methodInfo)
82+
{
83+
return methodInfo.GetCustomAttribute<ExcelCommandAttribute>() != null;
84+
}
8085
}
8186
}

Source/ExcelDna.Integration/Registration/ExcelRegistration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public static IEnumerable<ExcelCommandRegistration> GetExcelCommands()
5454
return from ass in ExcelIntegration.GetExportedAssemblies()
5555
from typ in ass.GetTypes()
5656
from mi in typ.GetMethods(BindingFlags.Public | BindingFlags.Static)
57-
where mi.GetCustomAttribute<ExcelCommandAttribute>() != null
57+
where ExcelCommandRegistration.IsCommand(mi)
5858
select new ExcelCommandRegistration(mi);
5959
}
6060

Source/Tests/ExcelDna.AddIn.RuntimeTests/MyFunctions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ namespace ExcelDna.AddIn.RuntimeTests
77
{
88
public class MyFunctions
99
{
10+
[ExcelCommand(MenuText = "MyCommandHello")]
11+
public static void MyCommandHello()
12+
{
13+
Logger.Log("Hello command.");
14+
}
15+
1016
[ExcelFunction]
1117
public static string SayHello(string name)
1218
{
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using ExcelDna.Integration;
2+
using Microsoft.Office.Core;
3+
using Microsoft.Office.Interop.Excel;
4+
using Range = Microsoft.Office.Interop.Excel.Range;
5+
6+
namespace ExcelDna.RuntimeTests
7+
{
8+
public class UI
9+
{
10+
[ExcelFact(Workbook = "", AddIn = AddInPath.RuntimeTests)]
11+
public void Command()
12+
{
13+
CommandBarPopup? menu = FindPopupMenu("ExcelDna.AddIn.RuntimeTests add-in");
14+
Assert.NotNull(menu);
15+
16+
CommandBarButton? button = FindButton(menu, "MyCommandHello");
17+
Assert.NotNull(button);
18+
19+
button.Execute();
20+
21+
Range functionRange = ((Worksheet)ExcelDna.Testing.Util.Workbook.Sheets[1]).Range["B1"];
22+
functionRange.Formula = "=MyFunctionExecutionLog()";
23+
Assert.True(functionRange.Value.ToString().Contains("Hello command."));
24+
}
25+
26+
private static CommandBarPopup? FindPopupMenu(string name)
27+
{
28+
var app = (Microsoft.Office.Interop.Excel.Application)ExcelDnaUtil.Application;
29+
var controls = app.CommandBars[1].Controls;
30+
for (int i = 1; i <= controls.Count; i++)
31+
{
32+
CommandBarControl control = controls[i];
33+
if (control.Caption == name && control is CommandBarPopup menu)
34+
return menu;
35+
}
36+
37+
return null;
38+
}
39+
40+
private static CommandBarButton? FindButton(CommandBarPopup menu, string name)
41+
{
42+
CommandBarControls menuControls = menu.Controls;
43+
for (int i = 1; i <= menuControls.Count; i++)
44+
{
45+
CommandBarControl control = menuControls[i];
46+
if (control.Caption == name && control is CommandBarButton button)
47+
return button;
48+
}
49+
50+
return null;
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)