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}