main
1using System;
2using Gorilla.Commons.Infrastructure.Container;
3using gorilla.commons.utility;
4using MoMoney.Presentation.Winforms.Keyboard;
5using MoMoney.Presentation.Winforms.Resources;
6using MoMoney.Service.Infrastructure.Eventing;
7using MoMoney.Service.Infrastructure.Threading;
8
9namespace MoMoney.Presentation.Model.Menu
10{
11 public interface IMenuItemBuilder : Builder<IMenuItem>
12 {
13 IMenuItemBuilder named(string name);
14 IMenuItemBuilder that_executes<TheCommand>() where TheCommand : Command;
15 IMenuItemBuilder that_executes(Action action);
16 IMenuItemBuilder represented_by(HybridIcon project);
17 IMenuItemBuilder can_be_accessed_with(ShortcutKey hot_key);
18 IMenuItemBuilder can_be_clicked_when(Func<bool> predicate);
19 }
20
21 public class MenuItemBuilder : IMenuItemBuilder
22 {
23 readonly DependencyRegistry registry;
24 readonly IEventAggregator aggregator;
25 readonly CommandProcessor processor;
26
27 string name_of_the_menu { get; set; }
28 Action command_to_execute { get; set; }
29 HybridIcon icon { get; set; }
30 ShortcutKey key { get; set; }
31 Func<bool> can_be_clicked = () => true;
32
33 public MenuItemBuilder(DependencyRegistry registry, IEventAggregator aggregator, CommandProcessor processor)
34 {
35 name_of_the_menu = "Unknown";
36 command_to_execute = () => {};
37 this.registry = registry;
38 this.processor = processor;
39 this.aggregator = aggregator;
40 icon = ApplicationIcons.Empty;
41 key = ShortcutKeys.none;
42 }
43
44 public IMenuItemBuilder named(string name)
45 {
46 name_of_the_menu = name;
47 return this;
48 }
49
50 public IMenuItemBuilder that_executes<TheCommand>() where TheCommand : Command
51 {
52 command_to_execute = () => processor.add(registry.get_a<TheCommand>());
53 return this;
54 }
55
56 public IMenuItemBuilder that_executes(Action action)
57 {
58 command_to_execute = action;
59 return this;
60 }
61
62 public IMenuItemBuilder represented_by(HybridIcon project)
63 {
64 icon = project;
65 return this;
66 }
67
68 public IMenuItemBuilder can_be_accessed_with(ShortcutKey hot_key)
69 {
70 key = hot_key;
71 return this;
72 }
73
74 public IMenuItemBuilder can_be_clicked_when(Func<bool> predicate)
75 {
76 can_be_clicked = predicate;
77 return this;
78 }
79
80 public IMenuItem build()
81 {
82 var item = new MenuItem(name_of_the_menu, command_to_execute, icon, key, can_be_clicked);
83 aggregator.subscribe(item);
84 return item;
85 }
86 }
87}