summaryrefslogtreecommitdiff
path: root/product/desktop.ui/WPFApplicationController.cs
blob: 562653eb89605421f3cb65f0afe1edc1c6401a32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Windows;
using gorilla.utility;
using solidware.financials.infrastructure.eventing;

namespace solidware.financials.windows.ui
{
    public class WPFApplicationController : ApplicationController
    {
        RegionManager region_manager;
        PresenterFactory factory;
        EventAggregator event_aggregator;

        public WPFApplicationController(RegionManager region_manager, PresenterFactory factory, EventAggregator event_aggregator)
        {
            this.region_manager = region_manager;
            this.event_aggregator = event_aggregator;
            this.factory = factory;
        }

        public void add_tab<Presenter, View>() where Presenter : TabPresenter where View : Tab<Presenter>, new()
        {
            var presenter = open<Presenter>();
            var view = new View();
            view.bind_to(presenter);
            region_manager.region(new TabRegionConfiguration(presenter,view.downcast_to<FrameworkElement>()));
        }

        public void load_tab<Presenter, View>(Presenter presenter) where Presenter : TabPresenter where View : Tab<Presenter>, new()
        {
            throw new NotImplementedException();
        }

        public void load_region<TPresenter, Region>() where TPresenter : Presenter where Region : FrameworkElement, View<TPresenter>, new()
        {
            configure_region<Region>(x => { x.DataContext = open<TPresenter>(); });
        }

        void configure_region<TRegion>(Action<TRegion> configure) where TRegion : UIElement
        {
            region_manager.region(configure);
        }

        TPresenter open<TPresenter>() where TPresenter : Presenter
        {
            var presenter = factory.create<TPresenter>();
            event_aggregator.subscribe(presenter);
            presenter.present();
            return presenter;
        }
    }
}