Commit 7f73942

mokhan <mokhan@ce5e1baf-6525-42e4-a1b2-857ea38da20a>
2009-03-08 20:46:00
refactoring presenters and how they are all loaded.
git-svn-id: https://svn.xp-dev.com/svn/mokhan-mo.money@61 ce5e1baf-6525-42e4-a1b2-857ea38da20a
1 parent 600cd9f
Changed files (75)
trunk
build
product
MyMoney
Infrastructure
Presentation
Testing
win.forms
windows.ui
trunk/build/resources/images/company_details.png
Binary file
trunk/build/resources/images/company_details_disabled.png
Binary file
trunk/build/resources/images/company_details_selected.png
Binary file
trunk/build/resources/images/generate_report.png
Binary file
trunk/build/resources/images/generate_report_disabled.png
Binary file
trunk/build/resources/images/generate_report_selected.png
Binary file
trunk/build/resources/images/home.png
Binary file
trunk/build/resources/images/new_file.png
Binary file
trunk/build/resources/images/new_file_selected.png
Binary file
trunk/build/resources/images/open_file.png
Binary file
trunk/build/resources/images/open_file_selected.png
Binary file
trunk/build/resources/images/plus.gif
Binary file
trunk/build/resources/images/unsaved.gif
Binary file
trunk/build/resources/images/welcome.png
Binary file
trunk/product/MyMoney/Infrastructure/eventing/event_aggregator.cs โ†’ trunk/product/MyMoney/Infrastructure/eventing/EventAggregator.cs
@@ -13,11 +13,11 @@ namespace MoMoney.Infrastructure.eventing
     }
 
     [Singleton]
-    public class event_aggregator : IEventAggregator
+    public class EventAggregator : IEventAggregator
     {
         private readonly IDictionary<string, HashSet<object>> subscribers;
 
-        public event_aggregator()
+        public EventAggregator()
         {
             subscribers = new Dictionary<string, HashSet<object>>();
         }
trunk/product/MyMoney/Presentation/Context/the_application_context.cs
@@ -12,7 +12,7 @@ namespace MoMoney.Presentation.Context
                                        IExitCommand exit_command,
                                        ILoadApplicationShellCommand command)
         {
-            shell_view.downcast_to<Form>().Closed += delegate { exit_command.run(); };
+            shell_view.downcast_to<Form>().Closed += ((sender, args) => exit_command.run());
             MainForm = shell_view.downcast_to<Form>();
             command.run();
         }
trunk/product/MyMoney/Presentation/Views/listbox_extensions.cs โ†’ trunk/product/MyMoney/Presentation/Databindings/listbox_extensions.cs
@@ -3,7 +3,7 @@ using System.Windows.Forms;
 using ComponentFactory.Krypton.Toolkit;
 using MoMoney.Utility.Extensions;
 
-namespace MoMoney.Presentation.Views
+namespace MoMoney.Presentation.Databindings
 {
     public static class listbox_extensions
     {
trunk/product/MyMoney/Presentation/Model/keyboard/shortcut_key.cs
@@ -1,24 +0,0 @@
-using System.Windows.Forms;
-
-namespace MoMoney.Presentation.Model.keyboard
-{
-    public class shortcut_key
-    {
-        private readonly Keys key;
-
-        public shortcut_key(Keys key)
-        {
-            this.key = key;
-        }
-
-        public shortcut_key and(shortcut_key other_key)
-        {
-            return new shortcut_key(key | other_key.key);
-        }
-
-        public static implicit operator Keys(shortcut_key key_to_convert)
-        {
-            return key_to_convert.key;
-        }
-    }
-}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/keyboard/shortcut_keys.cs
@@ -2,15 +2,15 @@ using System.Windows.Forms;
 
 namespace MoMoney.Presentation.Model.keyboard
 {
-    public class shortcut_keys
+    public static class shortcut_keys
     {
-        public static readonly shortcut_key control = new shortcut_key(Keys.Control);
-        public static readonly shortcut_key alt = new shortcut_key(Keys.Alt);
-        public static readonly shortcut_key none = new shortcut_key(Keys.None);
-        public static readonly shortcut_key L = new shortcut_key(Keys.L);
-        public static readonly shortcut_key N = new shortcut_key(Keys.N);
-        public static readonly shortcut_key O = new shortcut_key(Keys.O);
-        public static readonly shortcut_key S = new shortcut_key(Keys.S);
-        public static readonly shortcut_key X = new shortcut_key(Keys.X);
+        public static readonly ShortcutKey control = new ShortcutKey(Keys.Control);
+        public static readonly ShortcutKey alt = new ShortcutKey(Keys.Alt);
+        public static readonly ShortcutKey none = new ShortcutKey(Keys.None);
+        public static readonly ShortcutKey L = new ShortcutKey(Keys.L);
+        public static readonly ShortcutKey N = new ShortcutKey(Keys.N);
+        public static readonly ShortcutKey O = new ShortcutKey(Keys.O);
+        public static readonly ShortcutKey S = new ShortcutKey(Keys.S);
+        public static readonly ShortcutKey X = new ShortcutKey(Keys.X);
     }
 }
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/keyboard/ShortcutKey.cs
@@ -0,0 +1,24 @@
+using System.Windows.Forms;
+
+namespace MoMoney.Presentation.Model.keyboard
+{
+    public class ShortcutKey
+    {
+        private readonly Keys key;
+
+        public ShortcutKey(Keys key)
+        {
+            this.key = key;
+        }
+
+        public ShortcutKey and(ShortcutKey other_key)
+        {
+            return new ShortcutKey(key | other_key.key);
+        }
+
+        public static implicit operator Keys(ShortcutKey key_to_convert)
+        {
+            return key_to_convert.key;
+        }
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/close_project_command.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/CloseProjectCommand.cs
@@ -8,13 +8,13 @@ namespace MoMoney.Presentation.Model.Menu.File.Commands
     {
     }
 
-    public class close_project_command : ICloseCommand
+    public class CloseProjectCommand : ICloseCommand
     {
         readonly IShell shell;
         readonly IProject project;
         readonly ISaveChangesCommand command;
 
-        public close_project_command(IShell shell, IProject project, ISaveChangesCommand command)
+        public CloseProjectCommand(IShell shell, IProject project, ISaveChangesCommand command)
         {
             this.shell = shell;
             this.command = command;
@@ -28,13 +28,13 @@ namespace MoMoney.Presentation.Model.Menu.File.Commands
 
         public void saved()
         {
-            project.start_a_new_project();
+            project.close();
             shell.close_all_windows();
         }
 
         public void not_saved()
         {
-            project.start_a_new_project();
+            project.close();
             shell.close_all_windows();
         }
 
trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/new_command_specs.cs
@@ -7,13 +7,13 @@ using MoMoney.Testing.spechelpers.core;
 
 namespace MoMoney.Presentation.Model.Menu.File.Commands
 {
-    [Concern(typeof (new_command))]
-    public abstract class behaves_like_new_command : concerns_for<INewCommand, new_command>
+    [Concern(typeof (NewCommand))]
+    public abstract class behaves_like_new_command : concerns_for<INewCommand, NewCommand>
     {
-        public override INewCommand create_sut()
-        {
-            return new new_command(current_project, command, save_changes_command);
-        }
+        //public override INewCommand create_sut()
+        //{
+        //    return new NewCommand(current_project, command, save_changes_command);
+        //}
 
         context c = () =>
                         {
trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/new_command.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/NewCommand.cs
@@ -8,13 +8,13 @@ namespace MoMoney.Presentation.Model.Menu.File.Commands
     {
     }
 
-    public class new_command : INewCommand
+    public class NewCommand : INewCommand
     {
         readonly IProject current_project;
         readonly ILoadApplicationShellCommand command;
         readonly ISaveChangesCommand save_changes_command;
 
-        public new_command(IProject current_project, ILoadApplicationShellCommand command, ISaveChangesCommand save_changes_command)
+        public NewCommand(IProject current_project, ILoadApplicationShellCommand command, ISaveChangesCommand save_changes_command)
         {
             this.current_project = current_project;
             this.save_changes_command = save_changes_command;
trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/open_command.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/OpenCommand.cs
@@ -9,14 +9,14 @@ namespace MoMoney.Presentation.Model.Menu.File.Commands
     {
     }
 
-    public class open_command : IOpenCommand
+    public class OpenCommand : IOpenCommand
     {
         readonly ISelectFileToOpenDialog view;
         readonly IProject project;
         readonly ILoadApplicationShellCommand command;
         readonly ISaveChangesCommand save_changes_command;
 
-        public open_command(ISelectFileToOpenDialog view, IProject project, ILoadApplicationShellCommand command,
+        public OpenCommand(ISelectFileToOpenDialog view, IProject project, ILoadApplicationShellCommand command,
                             ISaveChangesCommand save_changes_command)
         {
             this.view = view;
trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/open_command_specs.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/File/Commands/OpenCommandSpecs.cs
@@ -8,12 +8,12 @@ using MoMoney.Testing.spechelpers.core;
 
 namespace MoMoney.Presentation.Model.Menu.File.Commands
 {
-    [Concern(typeof (open_command))]
-    public abstract class behaves_like_command_to_open_a_project : concerns_for<IOpenCommand, open_command>
+    [Concern(typeof (OpenCommand))]
+    public abstract class behaves_like_command_to_open_a_project : concerns_for<IOpenCommand, OpenCommand>
     {
         public override IOpenCommand create_sut()
         {
-            return new open_command(view, project, command, save_changes_command);
+            return new OpenCommand(view, project, command, save_changes_command);
         }
 
         context c = () =>
trunk/product/MyMoney/Presentation/Model/Menu/File/file_menu.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/File/FileMenu.cs
@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using MoMoney.Presentation.Model.keyboard;
 using MoMoney.Presentation.Model.Menu.File.Commands;
+using MoMoney.Presentation.Model.Projects;
 using MoMoney.Presentation.Resources;
 
 namespace MoMoney.Presentation.Model.Menu.File
@@ -9,8 +10,15 @@ namespace MoMoney.Presentation.Model.Menu.File
     {
     }
 
-    public class file_menu : IFileMenu
+    public class FileMenu : IFileMenu
     {
+        readonly IProject project;
+
+        public FileMenu(IProject project)
+        {
+            this.project = project;
+        }
+
         public IEnumerable<IMenuItem> all_menu_items()
         {
             yield return create
@@ -34,6 +42,7 @@ namespace MoMoney.Presentation.Model.Menu.File
                 .named("&Save")
                 .that_executes<ISaveCommand>()
                 .represented_by(ApplicationIcons.SaveProject)
+                .can_be_clicked_when(() => project.has_unsaved_changes())
                 .can_be_accessed_with(shortcut_keys.control.and(shortcut_keys.S))
                 .build();
 
@@ -41,12 +50,14 @@ namespace MoMoney.Presentation.Model.Menu.File
                 .a_menu_item()
                 .named("Save &As...")
                 .that_executes<ISaveAsCommand>()
+                //.can_be_clicked_when(() => project.has_unsaved_changes())
                 .represented_by(ApplicationIcons.SaveProjectAs)
                 .build();
 
             yield return create
                 .a_menu_item()
                 .named("&Close")
+                //.can_be_clicked_when(() => project.is_open())
                 .that_executes<ICloseCommand>()
                 .build();
 
trunk/product/MyMoney/Presentation/Model/Menu/create.cs
@@ -1,17 +1,18 @@
 using MoMoney.Infrastructure.Container;
+using MoMoney.Infrastructure.eventing;
 
 namespace MoMoney.Presentation.Model.Menu
 {
-    public class create
+    public static class create
     {
         public static IMenuItemBuilder a_menu_item()
         {
-            return new menu_item_builder(resolve.dependency_for<IDependencyRegistry>());
+            return new MenuItemBuilder(resolve.dependency_for<IDependencyRegistry>(),resolve.dependency_for<IEventAggregator>());
         }
 
         public static IMenuItem a_menu_item_separator()
         {
-            return new menu_item_separator();
+            return new MenuItemSeparator();
         }
 
         public static IToolbarItemBuilder a_tool_bar_item()
trunk/product/MyMoney/Presentation/Model/Menu/menu_item.cs
@@ -1,52 +0,0 @@
-using System;
-using System.Windows.Forms;
-using MoMoney.Presentation.Model.keyboard;
-using MoMoney.Presentation.Resources;
-
-namespace MoMoney.Presentation.Model.Menu
-{
-    public interface IMenuItem
-    {
-        string name { get; }
-        void click();
-        ToolStripItem build();
-        MenuItem build_menu_item();
-    }
-
-    public class menu_item : IMenuItem
-    {
-        public menu_item(string name, Action command, HybridIcon underlying_icon, shortcut_key key)
-        {
-            this.name = name;
-            this.command = command;
-            this.underlying_icon = underlying_icon;
-            this.key = key;
-        }
-
-        public string name { get; private set; }
-        public Action command { get; private set; }
-        public HybridIcon underlying_icon { get; private set; }
-        public shortcut_key key { get; set; }
-
-        public void click()
-        {
-            command();
-        }
-
-        public ToolStripItem build()
-        {
-            var tool_strip_menu_item = new ToolStripMenuItem(name);
-            tool_strip_menu_item.Click += delegate { click(); };
-            tool_strip_menu_item.Image = underlying_icon;
-            tool_strip_menu_item.ShortcutKeys = key;
-            return tool_strip_menu_item;
-        }
-
-        public MenuItem build_menu_item()
-        {
-            var menu_item = new MenuItem(name) {};
-            menu_item.Click += ((sender, e) => click());
-            return menu_item;
-        }
-    }
-}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Menu/menu_item_separator.cs
@@ -1,22 +0,0 @@
-using System.Windows.Forms;
-
-namespace MoMoney.Presentation.Model.Menu
-{
-    internal class menu_item_separator : IMenuItem
-    {
-        public string name { get; set; }
-
-        public void click()
-        {}
-
-        public ToolStripItem build()
-        {
-            return new ToolStripSeparator();
-        }
-
-        public MenuItem build_menu_item()
-        {
-            return new MenuItem("----------");
-        }
-    }
-}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Menu/MenuItem.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Windows.Forms;
+using MoMoney.Presentation.Model.keyboard;
+using MoMoney.Presentation.Resources;
+
+namespace MoMoney.Presentation.Model.Menu
+{
+    public interface IMenuItem
+    {
+        string name { get; }
+        void click();
+        ToolStripItem build();
+        System.Windows.Forms.MenuItem build_menu_item();
+    }
+
+    public class MenuItem : IMenuItem
+    {
+        public MenuItem(string name, Action command, HybridIcon underlying_icon, ShortcutKey key,
+                        Func<bool> can_be_clicked)
+        {
+            this.name = name;
+            this.command = command;
+            this.underlying_icon = underlying_icon;
+            this.key = key;
+            this.can_be_clicked = can_be_clicked;
+        }
+
+        public string name { get; private set; }
+        Action command { get; set; }
+        HybridIcon underlying_icon { get; set; }
+        ShortcutKey key { get; set; }
+        readonly Func<bool> can_be_clicked;
+        ToolStripMenuItem tool_strip_menu_item;
+        System.Windows.Forms.MenuItem menu_item;
+
+        public void click()
+        {
+            command();
+        }
+
+        public ToolStripItem build()
+        {
+            tool_strip_menu_item = new ToolStripMenuItem(name);
+            tool_strip_menu_item.Click += ((o, e) => click());
+            tool_strip_menu_item.Image = underlying_icon;
+            tool_strip_menu_item.ShortcutKeys = key;
+            tool_strip_menu_item.Enabled = can_be_clicked();
+            return tool_strip_menu_item;
+        }
+
+        public System.Windows.Forms.MenuItem build_menu_item()
+        {
+            menu_item = new System.Windows.Forms.MenuItem(name);
+            menu_item.Click += ((sender, e) => click());
+            menu_item.ShowShortcut = true;
+            menu_item.Enabled = can_be_clicked();
+            return menu_item;
+        }
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Menu/menu_item_builder.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/MenuItemBuilder.cs
@@ -1,5 +1,6 @@
 using System;
 using MoMoney.Infrastructure.Container;
+using MoMoney.Infrastructure.eventing;
 using MoMoney.Presentation.Model.keyboard;
 using MoMoney.Presentation.Resources;
 using MoMoney.Utility.Core;
@@ -12,19 +13,23 @@ namespace MoMoney.Presentation.Model.Menu
         IMenuItemBuilder that_executes<TheCommand>() where TheCommand : ICommand;
         IMenuItemBuilder that_executes(Action action);
         IMenuItemBuilder represented_by(HybridIcon project);
-        IMenuItemBuilder can_be_accessed_with(shortcut_key hot_key);
+        IMenuItemBuilder can_be_accessed_with(ShortcutKey hot_key);
+        IMenuItemBuilder can_be_clicked_when(Func<bool> predicate);
         IMenuItem build();
     }
 
-    public class menu_item_builder : IMenuItemBuilder
+    public class MenuItemBuilder : IMenuItemBuilder
     {
         readonly IDependencyRegistry registry;
+        Func<bool> can_be_clicked = () => true;
+        readonly IEventAggregator broker;
 
-        public menu_item_builder(IDependencyRegistry registry)
+        public MenuItemBuilder(IDependencyRegistry registry, IEventAggregator broker)
         {
             name_of_the_menu = "Unknown";
             command_to_execute = () => { };
             this.registry = registry;
+            this.broker = broker;
             icon = ApplicationIcons.Empty;
             key = shortcut_keys.none;
         }
@@ -32,7 +37,7 @@ namespace MoMoney.Presentation.Model.Menu
         public string name_of_the_menu { get; private set; }
         public Action command_to_execute { get; private set; }
         public HybridIcon icon { get; private set; }
-        public shortcut_key key { get; private set; }
+        public ShortcutKey key { get; private set; }
 
         public IMenuItemBuilder named(string name)
         {
@@ -58,15 +63,21 @@ namespace MoMoney.Presentation.Model.Menu
             return this;
         }
 
-        public IMenuItemBuilder can_be_accessed_with(shortcut_key hot_key)
+        public IMenuItemBuilder can_be_accessed_with(ShortcutKey hot_key)
         {
             key = hot_key;
             return this;
         }
 
+        public IMenuItemBuilder can_be_clicked_when(Func<bool> predicate)
+        {
+            can_be_clicked = predicate;
+            return this;
+        }
+
         public IMenuItem build()
         {
-            return new menu_item(name_of_the_menu, command_to_execute, icon, key);
+            return new MenuItem(name_of_the_menu, command_to_execute, icon, key, can_be_clicked);
         }
     }
 }
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Menu/MenuItemSeparator.cs
@@ -0,0 +1,23 @@
+using System.Windows.Forms;
+
+namespace MoMoney.Presentation.Model.Menu
+{
+    internal class MenuItemSeparator : IMenuItem
+    {
+        public string name { get; private set; }
+
+        public void click()
+        {
+        }
+
+        public ToolStripItem build()
+        {
+            return new ToolStripSeparator();
+        }
+
+        public System.Windows.Forms.MenuItem build_menu_item()
+        {
+            return new System.Windows.Forms.MenuItem("----------");
+        }
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Menu/sub_menu_registry.cs โ†’ trunk/product/MyMoney/Presentation/Model/Menu/SubMenuRegistry.cs
@@ -7,15 +7,16 @@ using MoMoney.Presentation.Model.Menu.window;
 namespace MoMoney.Presentation.Model.Menu
 {
     public interface ISubMenuRegistry : IRegistry<ISubMenu>
-    {}
+    {
+    }
 
-    public class sub_menu_registry : ISubMenuRegistry
+    public class SubMenuRegistry : ISubMenuRegistry
     {
-        private readonly IFileMenu file_menu;
-        private readonly IWindowMenu window_menu;
-        private readonly IHelpMenu help_menu;
+        readonly IFileMenu file_menu;
+        readonly IWindowMenu window_menu;
+        readonly IHelpMenu help_menu;
 
-        public sub_menu_registry(IFileMenu file_menu, IWindowMenu window_menu, IHelpMenu help_menu)
+        public SubMenuRegistry(IFileMenu file_menu, IWindowMenu window_menu, IHelpMenu help_menu)
         {
             this.file_menu = file_menu;
             this.window_menu = window_menu;
trunk/product/MyMoney/Presentation/Model/messages/closing_project_event.cs
@@ -0,0 +1,8 @@
+using MoMoney.Infrastructure.eventing;
+
+namespace MoMoney.Presentation.Model.messages
+{
+    public class closing_project_event : IEvent
+    {
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Model/Navigation/navigation_tree_visitor_specs.cs
@@ -7,13 +7,13 @@ using MoMoney.Testing.spechelpers.core;
 
 namespace MoMoney.Presentation.Model.Navigation
 {
-    [Concern(typeof (navigation_tree_visitor))]
+    [Concern(typeof (NavigationTreeVisitor))]
     public abstract class behaves_like_a_navigation_tree_visitor :
-        concerns_for<INavigationTreeVisitor, navigation_tree_visitor>
+        concerns_for<INavigationTreeVisitor, NavigationTreeVisitor>
     {
         public override INavigationTreeVisitor create_sut()
         {
-            return new navigation_tree_visitor(factory, registry);
+            return new NavigationTreeVisitor(factory, registry);
         }
 
         context c = () =>
trunk/product/MyMoney/Presentation/Model/Navigation/navigation_tree_visitor.cs โ†’ trunk/product/MyMoney/Presentation/Model/Navigation/NavigationTreeVisitor.cs
@@ -6,14 +6,15 @@ using MoMoney.Utility.Extensions;
 namespace MoMoney.Presentation.Model.Navigation
 {
     public interface INavigationTreeVisitor : IVisitor<TreeView>
-    {}
+    {
+    }
 
-    public class navigation_tree_visitor : INavigationTreeVisitor
+    public class NavigationTreeVisitor : INavigationTreeVisitor
     {
-        private readonly ITreeViewToRootNodeMapper mapper;
-        private readonly IDependencyRegistry registry;
+        readonly ITreeViewToRootNodeMapper mapper;
+        readonly IDependencyRegistry registry;
 
-        public navigation_tree_visitor(ITreeViewToRootNodeMapper mapper, IDependencyRegistry registry)
+        public NavigationTreeVisitor(ITreeViewToRootNodeMapper mapper, IDependencyRegistry registry)
         {
             this.mapper = mapper;
             this.registry = registry;
trunk/product/MyMoney/Presentation/Model/Projects/current_project.cs
@@ -16,6 +16,8 @@ namespace MoMoney.Presentation.Model.Projects
         bool has_been_saved_at_least_once();
         void save_changes();
         bool has_unsaved_changes();
+        bool is_open();
+        void close();
     }
 
     [Singleton]
@@ -24,6 +26,7 @@ namespace MoMoney.Presentation.Model.Projects
         readonly IDatabaseConfiguration configuration;
         readonly IEventAggregator broker;
         IFile current_file;
+        bool is_project_open = false;
         bool changes_to_save = false;
 
         public current_project(IDatabaseConfiguration configuration, IEventAggregator broker)
@@ -49,6 +52,7 @@ namespace MoMoney.Presentation.Model.Projects
 
         public void start_a_new_project()
         {
+            is_project_open = true;
             current_file = null;
             configuration.change_path_to((ApplicationFile) Path.GetTempFileName());
             changes_to_save = false;
@@ -83,6 +87,18 @@ namespace MoMoney.Presentation.Model.Projects
             return changes_to_save;
         }
 
+        public bool is_open()
+        {
+            return is_project_open;
+        }
+
+        public void close()
+        {
+            is_project_open = false;
+            changes_to_save = false;
+            broker.publish<closing_project_event>();
+        }
+
         void ensure_that_a_path_to_save_to_has_been_specified()
         {
             if (!has_been_saved_at_least_once())
trunk/product/MyMoney/Presentation/Presenters/billing/add_bill_payment_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/billing/AddBillPaymentPresenter.cs
@@ -13,12 +13,12 @@ namespace MoMoney.Presentation.Presenters.billing
         void submit_bill_payment(add_new_bill_dto dto);
     }
 
-    public class add_bill_payment_presenter : IAddBillPaymentPresenter
+    public class AddBillPaymentPresenter : IAddBillPaymentPresenter
     {
         private readonly IAddBillPaymentView view;
         private readonly IBillingTasks tasks;
 
-        public add_bill_payment_presenter(IAddBillPaymentView view, IBillingTasks tasks)
+        public AddBillPaymentPresenter(IAddBillPaymentView view, IBillingTasks tasks)
         {
             this.view = view;
             this.tasks = tasks;
trunk/product/MyMoney/Presentation/Presenters/billing/view_all_bills_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/billing/ViewAllBillsPresenter.cs
@@ -8,14 +8,15 @@ using MoMoney.Utility.Extensions;
 namespace MoMoney.Presentation.Presenters.billing
 {
     public interface IViewAllBillsPresenter : IContentPresenter
-    {}
+    {
+    }
 
-    public class view_all_bills_presenter : IViewAllBillsPresenter
+    public class ViewAllBillsPresenter : IViewAllBillsPresenter
     {
-        private readonly IViewAllBills view;
-        private readonly IBillingTasks tasks;
+        readonly IViewAllBills view;
+        readonly IBillingTasks tasks;
 
-        public view_all_bills_presenter(IViewAllBills view, IBillingTasks tasks)
+        public ViewAllBillsPresenter(IViewAllBills view, IBillingTasks tasks)
         {
             this.view = view;
             this.tasks = tasks;
@@ -27,11 +28,12 @@ namespace MoMoney.Presentation.Presenters.billing
                 tasks
                     .all_bills()
                     .map_all_using(
-                    x => new bill_information_dto {
-                                                      company_name = x.company_to_pay.name,
-                                                      the_amount_owed = x.the_amount_owed.ToString(),
-                                                      due_date = x.due_date.to_date_time(),
-                                                  }));
+                    x => new bill_information_dto
+                             {
+                                 company_name = x.company_to_pay.name,
+                                 the_amount_owed = x.the_amount_owed.ToString(),
+                                 due_date = x.due_date.to_date_time(),
+                             }));
         }
 
         IDockedContentView IContentPresenter.View
trunk/product/MyMoney/Presentation/Presenters/income/add_new_income_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/income/AddNewIncomePresenter.cs
@@ -15,12 +15,12 @@ namespace MoMoney.Presentation.Presenters.income
         void submit_new(income_submission_dto income);
     }
 
-    public class add_new_income_presenter : IAddNewIncomePresenter
+    public class AddNewIncomePresenter : IAddNewIncomePresenter
     {
         private readonly IAddNewIncomeView view;
         private readonly IIncomeTasks tasks;
 
-        public add_new_income_presenter(IAddNewIncomeView view, IIncomeTasks tasks)
+        public AddNewIncomePresenter(IAddNewIncomeView view, IIncomeTasks tasks)
         {
             this.view = view;
             this.tasks = tasks;
trunk/product/MyMoney/Presentation/Presenters/income/add_new_income_presenter_specs.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/income/AddNewIncomePresenterSpecs.cs
@@ -12,14 +12,9 @@ using MoMoney.Testing.spechelpers.core;
 
 namespace MoMoney.Presentation.Presenters.income
 {
-    [Concern(typeof (add_new_income_presenter))]
-    public abstract class behaves_like_add_new_income_presenter : concerns_for<IAddNewIncomePresenter, add_new_income_presenter>
+    [Concern(typeof (AddNewIncomePresenter))]
+    public abstract class behaves_like_add_new_income_presenter : concerns_for<IAddNewIncomePresenter, AddNewIncomePresenter>
     {
-        //public override IAddNewIncomePresenter create_sut()
-        //{
-        //    return new add_new_income_presenter(view, tasks);
-        //}
-
         context c = () =>
                         {
                             view = the_dependency<IAddNewIncomeView>();
@@ -62,7 +57,7 @@ namespace MoMoney.Presentation.Presenters.income
         static List<ICompany> companys;
     }
 
-    [Concern(typeof (add_new_income_presenter))]
+    [Concern(typeof (AddNewIncomePresenter))]
     public class when_attempting_to_submit_the_same_income_more_than_once : behaves_like_add_new_income_presenter
     {
         it should_inform_you_that_you_have_already_added_it =
trunk/product/MyMoney/Presentation/Presenters/income/view_income_history_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/income/ViewIncomeHistoryPresenter.cs
@@ -13,12 +13,12 @@ namespace MoMoney.Presentation.Presenters.income
     {
     }
 
-    public class view_income_history_presenter : IViewIncomeHistoryPresenter
+    public class ViewIncomeHistoryPresenter : IViewIncomeHistoryPresenter
     {
         private readonly IViewIncomeHistory view;
         private readonly IIncomeTasks tasks;
 
-        public view_income_history_presenter(IViewIncomeHistory view, IIncomeTasks tasks)
+        public ViewIncomeHistoryPresenter(IViewIncomeHistory view, IIncomeTasks tasks)
         {
             this.view = view;
             this.tasks = tasks;
trunk/product/MyMoney/Presentation/Presenters/Menu/main_menu_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/Menu/MainMenuPresenter.cs
@@ -9,12 +9,12 @@ namespace MoMoney.Presentation.Presenters.Menu
     {
     }
 
-    public class main_menu_presenter : IMainMenuPresenter
+    public class MainMenuPresenter : IMainMenuPresenter
     {
         readonly IMenuView main_menu;
         readonly ISubMenuRegistry registry;
 
-        public main_menu_presenter(IMenuView main_menu, ISubMenuRegistry registry)
+        public MainMenuPresenter(IMenuView main_menu, ISubMenuRegistry registry)
         {
             this.main_menu = main_menu;
             this.registry = registry;
trunk/product/MyMoney/Presentation/Presenters/Menu/main_menu_presenter_specs.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/Menu/MainMenuPresenterSpecs.cs
@@ -7,8 +7,8 @@ using MoMoney.Testing.spechelpers.core;
 
 namespace MoMoney.Presentation.Presenters.Menu
 {
-    [Concern(typeof (main_menu_presenter))]
-    public abstract class behaves_like_the_main_menu_presenter : concerns_for<IMainMenuPresenter, main_menu_presenter>
+    [Concern(typeof (MainMenuPresenter))]
+    public abstract class behaves_like_the_main_menu_presenter : concerns_for<IMainMenuPresenter, MainMenuPresenter>
     {
         context c = () =>
                         {
trunk/product/MyMoney/Presentation/Presenters/Navigation/ExpandoBuilder.cs
@@ -41,15 +41,10 @@ namespace MoMoney.Presentation.Presenters.Navigation
             pane.Anchor = (AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right;
             pane.Animate = true;
             pane.AutoLayout = true;
-            pane.ExpandedHeight = 63;
-            pane.Font = new Font("Tahoma", 8.25F);
             pane.Items.AddRange(create_items());
-            pane.Location = new Point(12, 12);
-            pane.Margin = new Padding(4);
+            //pane.Margin = new Padding(4);
             pane.Name = "ux_" + the_name;
-            pane.Size = new Size(292, 63);
             pane.SpecialGroup = true;
-            pane.TabIndex = 5;
             pane.Text = the_name;
 
             ((ISupportInitialize) (pane)).EndInit();
trunk/product/MyMoney/Presentation/Presenters/Navigation/ExpandoItemBuilder.cs
@@ -45,12 +45,12 @@ namespace MoMoney.Presentation.Presenters.Navigation
                                Anchor = ((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right),
                                BackColor = Color.Transparent,
                                Image = the_image,
-                               Location = new Point(12, 33),
+                               //Location = new Point(12, 33),
                                Name = "ux" + the_name,
-                               Size = new Size(266, 19),
-                               TabIndex = 0,
+                               //Size = new Size(266, 19),
+                               //TabIndex = 0,
                                Text = the_name,
-                               TextAlign = ContentAlignment.TopLeft,
+                               //TextAlign = ContentAlignment.TopLeft,
                                UseVisualStyleBackColor = false,
                            };
             item.Click += (sender, e) => the_action();
trunk/product/MyMoney/Presentation/Presenters/Navigation/MainMenuPresenter.cs
@@ -1,11 +1,13 @@
 using MoMoney.Domain.Core;
+using MoMoney.Infrastructure.eventing;
 using MoMoney.Presentation.Core;
+using MoMoney.Presentation.Model.messages;
 using MoMoney.Presentation.Views.Navigation;
 using MoMoney.Utility.Extensions;
 
 namespace MoMoney.Presentation.Presenters.Navigation
 {
-    public interface IMainMenuPresenter : IPresentationModule
+    public interface IMainMenuPresenter : IPresentationModule, IEventSubscriber<new_project_opened>
     {
     }
 
@@ -13,14 +15,21 @@ namespace MoMoney.Presentation.Presenters.Navigation
     {
         readonly IMainMenuView view;
         readonly IRegistry<IActionTaskPaneFactory> registry;
+        readonly IEventAggregator broker;
 
-        public MainMenuPresenter(IMainMenuView view, IRegistry<IActionTaskPaneFactory> registry)
+        public MainMenuPresenter(IMainMenuView view, IRegistry<IActionTaskPaneFactory> registry, IEventAggregator broker)
         {
             this.view = view;
+            this.broker = broker;
             this.registry = registry;
         }
 
         public void run()
+        {
+            broker.subscribe_to(this);
+        }
+
+        public void notify(new_project_opened message)
         {
             registry.all().each(x => view.add(x.create()));
             view.display();
trunk/product/MyMoney/Presentation/Presenters/Navigation/NavigationPresenter.cs
@@ -1,10 +1,12 @@
+using MoMoney.Infrastructure.eventing;
 using MoMoney.Presentation.Core;
+using MoMoney.Presentation.Model.messages;
 using MoMoney.Presentation.Model.Navigation;
 using MoMoney.Presentation.Views.Navigation;
 
 namespace MoMoney.Presentation.Presenters.Navigation
 {
-    public interface INavigationPresenter : IPresentationModule
+    public interface INavigationPresenter : IPresentationModule, IEventSubscriber<new_project_opened>
     {
     }
 
@@ -12,14 +14,22 @@ namespace MoMoney.Presentation.Presenters.Navigation
     {
         readonly INavigationView view;
         readonly INavigationTreeVisitor tree_view_visitor;
+        IEventAggregator broker;
 
-        public NavigationPresenter(INavigationView view, INavigationTreeVisitor tree_view_visitor)
+        public NavigationPresenter(INavigationView view, INavigationTreeVisitor tree_view_visitor,
+                                   IEventAggregator broker)
         {
             this.view = view;
+            this.broker = broker;
             this.tree_view_visitor = tree_view_visitor;
         }
 
         public void run()
+        {
+            broker.subscribe_to(this);
+        }
+
+        public void notify(new_project_opened message)
         {
             view.accept(tree_view_visitor);
         }
trunk/product/MyMoney/Presentation/Presenters/Navigation/NavigationPresenterSpecs.cs
@@ -1,4 +1,5 @@
 using jpboodhoo.bdd.contexts;
+using MoMoney.Presentation.Model.messages;
 using MoMoney.Presentation.Model.Navigation;
 using MoMoney.Presentation.Views.Navigation;
 using MoMoney.Testing.MetaData;
@@ -18,12 +19,7 @@ namespace MoMoney.Presentation.Presenters.Navigation
                             tree_view_visitor = the_dependency<INavigationTreeVisitor>();
                         };
 
-        because b = () => sut.run();
-
-        //public override INavigationPresenter create_sut()
-        //{
-        //    return new NavigationPresenter(view, tree_view_visitor);
-        //}
+        because b = () => sut.notify(new new_project_opened(""));
 
         static INavigationView view;
         static INavigationTreeVisitor tree_view_visitor;
trunk/product/MyMoney/Presentation/Presenters/reporting/report_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/reporting/ReportPresenter.cs
@@ -13,13 +13,13 @@ namespace MoMoney.Presentation.Presenters.reporting
     {
     }
 
-    public class report_presenter : IViewAllBillsReportPresenter
+    public class ReportPresenter : IViewAllBillsReportPresenter
     {
-        private readonly IReportViewer view;
-        private readonly IViewAllBillsReport report;
-        private readonly IBillingTasks tasks;
+        readonly IReportViewer view;
+        readonly IViewAllBillsReport report;
+        readonly IBillingTasks tasks;
 
-        public report_presenter(IReportViewer view, IViewAllBillsReport report, IBillingTasks tasks)
+        public ReportPresenter(IReportViewer view, IViewAllBillsReport report, IBillingTasks tasks)
         {
             this.view = view;
             this.tasks = tasks;
@@ -32,7 +32,7 @@ namespace MoMoney.Presentation.Presenters.reporting
             view.display(report);
         }
 
-        private bill_information_dto map_from(IBill x)
+        bill_information_dto map_from(IBill x)
         {
             return new bill_information_dto
                        {
trunk/product/MyMoney/Presentation/Presenters/Shell/GettingStartedPresenter.cs
@@ -24,6 +24,7 @@ namespace MoMoney.Presentation.Presenters.Shell
 
         public void run()
         {
+            view.display();
             broker.subscribe_to(this);
         }
 
trunk/product/MyMoney/Presentation/Presenters/Shell/ToolBarPresenter.cs
@@ -27,7 +27,7 @@ namespace MoMoney.Presentation.Presenters.Shell
             all_tool_bar_buttons().each(x => shell.add_to_tool_bar(x));
         }
 
-        IEnumerable<ToolStripItem> all_tool_bar_buttons()
+        static IEnumerable<ToolStripItem> all_tool_bar_buttons()
         {
             yield return create
                 .a_tool_bar_item()
trunk/product/MyMoney/Presentation/Presenters/add_company_presenter.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/AddCompanyPresenter.cs
@@ -13,12 +13,12 @@ namespace MoMoney.Presentation.Presenters
         void submit(register_new_company dto);
     }
 
-    public class add_company_presenter : IAddCompanyPresenter
+    public class AddCompanyPresenter : IAddCompanyPresenter
     {
         private readonly IAddCompanyView view;
         private readonly IBillingTasks tasks;
 
-        public add_company_presenter(IAddCompanyView view, IBillingTasks tasks)
+        public AddCompanyPresenter(IAddCompanyView view, IBillingTasks tasks)
         {
             this.view = view;
             this.tasks = tasks;
trunk/product/MyMoney/Presentation/Presenters/add_company_presenter_specs.cs โ†’ trunk/product/MyMoney/Presentation/Presenters/AddCompanyPresenterSpecs.cs
@@ -8,14 +8,9 @@ using MoMoney.Testing.spechelpers.core;
 
 namespace MoMoney.Presentation.Presenters
 {
-    [Concern(typeof (add_company_presenter))]
-    public abstract class behaves_like_the_add_company_presenter : concerns_for<IAddCompanyPresenter, add_company_presenter>
+    [Concern(typeof (AddCompanyPresenter))]
+    public abstract class behaves_like_the_add_company_presenter : concerns_for<IAddCompanyPresenter, AddCompanyPresenter>
     {
-        //public override IAddCompanyPresenter create_sut()
-        //{
-        //    return new add_company_presenter(view, tasks);
-        //}
-
         context c = () =>
                         {
                             view = the_dependency<IAddCompanyView>();
trunk/product/MyMoney/Presentation/Resources/ApplicationImage.cs
@@ -7,8 +7,8 @@ namespace MoMoney.Presentation.Resources
 {
     public class ApplicationImage : IDisposable
     {
-        private readonly string name_of_the_image;
-        private readonly Image underlying_image;
+        readonly string name_of_the_image;
+        readonly Image underlying_image;
 
         public ApplicationImage(string name_of_the_image)
         {
@@ -28,7 +28,12 @@ namespace MoMoney.Presentation.Resources
             return image_to_convert.underlying_image;
         }
 
-        private string FullPathToTheFile(ApplicationImage image_to_convert)
+        public static implicit operator Bitmap(ApplicationImage image_to_convert)
+        {
+            return new Bitmap(image_to_convert);
+        }
+
+        string FullPathToTheFile(ApplicationImage image_to_convert)
         {
             return Path.Combine(image_to_convert.startup_directory() + @"\images", image_to_convert.name_of_the_image);
         }
trunk/product/MyMoney/Presentation/Resources/ApplicationImages.cs
@@ -5,5 +5,28 @@ namespace MoMoney.Presentation.Resources
         public static readonly ApplicationImage Splash = new ApplicationImage("splash_screen.gif");
         public static readonly ApplicationImage ReadingABill = new ApplicationImage("reading_a_bill.jpg");
         public static readonly ApplicationImage PayingABill = new ApplicationImage("paying_a_bill.jpg");
+        public static readonly ApplicationImage Welcome = new ApplicationImage("welcome.png");
+
+        public static readonly ApplicationImage CreateNewFile = new ApplicationImage("new_file.png");
+        public static readonly ApplicationImage CreateNewFileSelected = new ApplicationImage("new_file_selected.png");
+
+        public static readonly ApplicationImage OpenExistingFile = new ApplicationImage("open_file.png");
+        public static readonly ApplicationImage OpenExistingFileSelected = new ApplicationImage("open_file_selected.png");
+
+        public static readonly ApplicationImage CompanyDetails = new ApplicationImage("company_details.png");
+
+        public static readonly ApplicationImage CompanyDetailsSelected =
+            new ApplicationImage("company_details_selected.png");
+
+        public static readonly ApplicationImage CompanyDetailsDisabled =
+            new ApplicationImage("company_details_disabled.png");
+
+        public static readonly ApplicationImage GenerateReport = new ApplicationImage("generate_report.png");
+
+        public static readonly ApplicationImage GenerateReportSelected =
+            new ApplicationImage("generate_report_selected.png");
+
+        public static readonly ApplicationImage GenerateReportDisabled =
+            new ApplicationImage("generate_report_disabled.png");
     }
 }
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/billing/add_bill_payment.cs
@@ -1,5 +1,6 @@
 ๏ปฟusing System.Collections.Generic;
 using MoMoney.Domain.accounting.billing;
+using MoMoney.Presentation.Databindings;
 using MoMoney.Presentation.Presenters.billing;
 using MoMoney.Presentation.Presenters.billing.dto;
 using MoMoney.Presentation.Views.core;
trunk/product/MyMoney/Presentation/Views/income/AddNewIncomeView.cs
@@ -2,6 +2,7 @@ using System.Collections.Generic;
 using System.Text;
 using System.Windows.Forms;
 using MoMoney.Domain.accounting.billing;
+using MoMoney.Presentation.Databindings;
 using MoMoney.Presentation.Model.interaction;
 using MoMoney.Presentation.Presenters.income;
 using MoMoney.Presentation.Presenters.income.dto;
@@ -23,9 +24,9 @@ namespace MoMoney.Presentation.Views.income
             ux_submit_button.Click += (sender, e) => presenter.submit_new(create_income());
         }
 
-        public void display(IEnumerable<ICompany> companys)
+        public void display(IEnumerable<ICompany> companies)
         {
-            ux_companys.bind_to(companys);
+            ux_companys.bind_to(companies);
         }
 
         public void display(IEnumerable<income_information_dto> incomes)
trunk/product/MyMoney/Presentation/Views/Menu/ApplicationMenuHost.cs
@@ -12,17 +12,17 @@ namespace MoMoney.Presentation.Views.Menu
     public class ApplicationMenuHost : IMenuView
     {
         private readonly ISubMenuToToolStripMenuItemMapper mapper;
-        private readonly IShell application_shell;
+        private readonly IShell shell;
 
         public ApplicationMenuHost(IShell application_shell, ISubMenuToToolStripMenuItemMapper mapper)
         {
             this.mapper = mapper;
-            this.application_shell = application_shell;
+            this.shell = application_shell;
         }
 
         public void add(ISubMenu menu_to_add)
         {
-            application_shell.add_to_main_menu(mapper.map_from(menu_to_add));
+            shell.add_to_main_menu(mapper.map_from(menu_to_add));
         }
     }
 }
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Navigation/MainMenuView.Designer.cs
@@ -34,21 +34,26 @@ namespace MoMoney.Presentation.Views.Navigation
             // 
             // ux_system_task_pane
             // 
+            this.ux_system_task_pane.AllowDrop = true;
             this.ux_system_task_pane.AutoScrollMargin = new System.Drawing.Size(12, 12);
+            this.ux_system_task_pane.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+            this.ux_system_task_pane.CausesValidation = false;
             this.ux_system_task_pane.Dock = System.Windows.Forms.DockStyle.Fill;
             this.ux_system_task_pane.Location = new System.Drawing.Point(0, 0);
+            this.ux_system_task_pane.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
             this.ux_system_task_pane.Name = "ux_system_task_pane";
-            this.ux_system_task_pane.Size = new System.Drawing.Size(237, 743);
+            this.ux_system_task_pane.Size = new System.Drawing.Size(316, 914);
             this.ux_system_task_pane.TabIndex = 2;
             this.ux_system_task_pane.Text = "taskPane1";
             // 
-            // actions_task_list
+            // MainMenuView
             // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(237, 743);
+            this.ClientSize = new System.Drawing.Size(316, 914);
             this.Controls.Add(this.ux_system_task_pane);
-            this.Name = "actions_task_list";
+            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.Name = "MainMenuView";
             this.TabText = "actions_task_list";
             this.Text = "actions_task_list";
             ((System.ComponentModel.ISupportInitialize)(this.ux_system_task_pane)).EndInit();
trunk/product/MyMoney/Presentation/Views/Shell/ApplicationShell.cs
@@ -1,6 +1,5 @@
 ๏ปฟusing System.ComponentModel.Composition;
 using System.Windows.Forms;
-using MoMoney.Presentation.Resources;
 using MoMoney.Presentation.Views.core;
 
 namespace MoMoney.Presentation.Views.Shell
@@ -11,7 +10,6 @@ namespace MoMoney.Presentation.Views.Shell
         public ApplicationShell()
         {
             InitializeComponent();
-            Icon = ApplicationIcons.Application;
         }
 
         public StatusStrip status_bar()
trunk/product/MyMoney/Presentation/Views/Shell/ApplicationShellSpecs.cs
@@ -0,0 +1,24 @@
+using System;
+using jpboodhoo.bdd.contexts;
+using MoMoney.Presentation.Model.Menu.File.Commands;
+using MoMoney.Testing.spechelpers.contexts;
+using MoMoney.Testing.spechelpers.core;
+using MoMoney.Testing.win.forms;
+
+namespace MoMoney.Presentation.Views.Shell
+{
+    public class behaves_like_application_shell : concerns_for<IShell, ApplicationShell>
+    {
+    }
+
+    //public class when_the_application_shell_is_closed : behaves_like_application_shell
+    //{
+    //    it should_execute_the_close_command = () => close_command.was_told_to(x => x.run());
+
+    //    context c = () => { close_command = the_dependency<ICloseCommand>(); };
+
+    //    because b = () => EventTrigger.trigger_event<Events.FormEvents>(x => x.OnClosed(new EventArgs()), sut);
+
+    //    static ICloseCommand close_command;
+    //}
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/BitmapRegion.cs
@@ -0,0 +1,125 @@
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace MoMoney.Presentation.Views.Shell
+{
+    public static class BitmapRegion
+    {
+        /// <summary>
+        /// Create and apply the region on the supplied control
+        /// </summary>
+        /// <param name="control">The Control object to apply the region to</param>
+        /// <param name="bitmap">The Bitmap object to create the region from</param>
+        public static void CreateControlRegion(Control control, Bitmap bitmap)
+        {
+            // Return if control and bitmap are null
+            if (control == null || bitmap == null)
+                return;
+
+            // Set our control's size to be the same as the bitmap + 6 pixels so that the borders don't affect it.
+            control.Width = bitmap.Width;
+            control.Height = bitmap.Height;
+
+            // Check if we are dealing with Form here
+            if (control is Form)
+            {
+                // Cast to a Form object
+                var form = (Form) control;
+
+                // Set our form's size to be a little larger that the bitmap just 
+                // in case the form's border style is not set to none in the first place
+                form.Width += 15;
+                form.Height += 35;
+
+                // No border
+                form.FormBorderStyle = FormBorderStyle.None;
+
+                // Set bitmap as the background image
+                form.BackgroundImage = bitmap;
+
+                // Calculate the graphics path based on the bitmap supplied
+                var graphicsPath = CalculateControlGraphicsPath(bitmap);
+
+                // Apply new region
+                form.Region = new Region(graphicsPath);
+            }
+
+                // Check if we are dealing with Button here
+            else if (control is Button)
+            {
+                // Cast to a button object
+                var button = (Button) control;
+
+                // Do not show button text
+                button.Text = "";
+
+                // Change cursor to hand when over button
+                button.Cursor = Cursors.Hand;
+
+                // Set background image of button
+                button.BackgroundImage = bitmap;
+
+                // Calculate the graphics path based on the bitmap supplied
+                var graphicsPath = CalculateControlGraphicsPath(bitmap);
+
+                // Apply new region
+                button.Region = new Region(graphicsPath);
+            }
+        }
+
+        /// <summary>
+        /// Calculate the graphics path that representing the figure in the bitmap 
+        /// excluding the transparent color which is the top left pixel.
+        /// </summary>
+        /// <param name="bitmap">The Bitmap object to calculate our graphics path from</param>
+        /// <returns>Calculated graphics path</returns>
+        static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
+        {
+            // Create GraphicsPath for our bitmap calculation
+            var graphicsPath = new GraphicsPath();
+
+            // Use the top left pixel as our transparent color
+            var colorTransparent = bitmap.GetPixel(0, 0);
+
+            // This is to store the column value where an opaque pixel is first found.
+            // This value will determine where we start scanning for trailing opaque pixels.
+            var colOpaquePixel = 0;
+
+            // Go through all rows (Y axis)
+            for (var row = 0; row < bitmap.Height; row ++)
+            {
+                // Reset value
+                colOpaquePixel = 0;
+
+                // Go through all columns (X axis)
+                for (var col = 0; col < bitmap.Width; col ++)
+                {
+                    // If this is an opaque pixel, mark it and search for anymore trailing behind
+                    if (bitmap.GetPixel(col, row) != colorTransparent)
+                    {
+                        // Opaque pixel found, mark current position
+                        colOpaquePixel = col;
+
+                        // Create another variable to set the current pixel position
+                        var colNext = col;
+
+                        // Starting from current found opaque pixel, search for anymore opaque pixels 
+                        // trailing behind, until a transparent pixel is found or minimum width is reached
+                        for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext ++)
+                            if (bitmap.GetPixel(colNext, row) == colorTransparent)
+                                break;
+
+                        // Form a rectangle for line of opaque pixels found and add it to our graphics path
+                        graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
+
+                        // No need to scan the line of opaque pixels just found
+                        col = colNext;
+                    }
+                }
+            }
+            // Return calculated graphics path
+            return graphicsPath;
+        }
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/button_extensions.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using MoMoney.Infrastructure.Container;
+using MoMoney.Utility.Core;
+
+namespace MoMoney.Presentation.Views.Shell
+{
+    public static class button_extensions
+    {
+        public static Button will_be_shown_as(this Button button, Bitmap image)
+        {
+            BitmapRegion.CreateControlRegion(button, image);
+            button.MouseLeave += (sender, e) => BitmapRegion.CreateControlRegion(button, image);
+            button.FlatAppearance.BorderSize = 0; //needs to be here so edges don't get affected by borders
+            return button;
+        }
+
+        public static Button when_hovered_over_will_show(this Button button, Bitmap image)
+        {
+            button.MouseEnter += (sender, e) => BitmapRegion.CreateControlRegion(button, image);
+            return button;
+        }
+
+        public static Button will_execute<Command>(this Button button, Func<bool> when) where Command : ICommand
+        {
+            button.Click += (sender, e) => { if (when()) resolve.dependency_for<Command>().run(); };
+            button.Enabled = when();
+            return button;
+        }
+
+        public static Control with_tool_tip(this Control control, string title, string caption)
+        {
+            new ToolTip
+                {
+                    IsBalloon = true,
+                    ToolTipTitle = title,
+                    ToolTipIcon = ToolTipIcon.Info,
+                    UseAnimation = true,
+                    UseFading = true,
+                    AutoPopDelay = 10000,
+                }.SetToolTip(control, caption);
+            return control;
+        }
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/NotificationIconView.cs
@@ -5,6 +5,8 @@ using MoMoney.Presentation.Model.Menu.File;
 using MoMoney.Presentation.Model.Menu.Help;
 using MoMoney.Presentation.Model.Menu.window;
 using MoMoney.Presentation.Resources;
+using MoMoney.Utility.Extensions;
+using MenuItem=System.Windows.Forms.MenuItem;
 
 namespace MoMoney.Presentation.Views.Shell
 {
@@ -64,12 +66,9 @@ namespace MoMoney.Presentation.Views.Shell
 
         MenuItem map_from(ISubMenu item)
         {
-            var toolStripMenuItem = new MenuItem(item.name);
-            foreach (var menuItem in item.all_menu_items())
-            {
-                toolStripMenuItem.MenuItems.Add(menuItem.build_menu_item());
-            }
-            return toolStripMenuItem;
+            var menu_item = new MenuItem(item.name);
+            item.all_menu_items().each(x => menu_item.MenuItems.Add(x.build_menu_item()) );
+            return menu_item;
         }
 
         public void Dispose()
trunk/product/MyMoney/Presentation/Views/Shell/UnhandledErrorView.cs
@@ -1,42 +1,24 @@
-using System;
-using System.Windows.Forms;
+๏ปฟusing System;
 using MoMoney.Presentation.Presenters.Shell;
+using MoMoney.Presentation.Views.core;
 
 namespace MoMoney.Presentation.Views.Shell
 {
-    public class UnhandledErrorView : IUnhandledErrorView
+    public partial class UnhandledErrorView : ApplicationWindow, IUnhandledErrorView
     {
-        public void attach_to(IUnhandledErrorPresenter presenter)
-        {
-        }
-
-        public void display(Exception exception)
-        {
-            MessageBox.Show(exception.ToString());
-        }
-
-        public IAsyncResult BeginInvoke(Delegate method, object[] args)
+        public UnhandledErrorView()
         {
-            return null;
+            InitializeComponent();
+            titled("Aw snap... an error occurred");
         }
 
-        public object EndInvoke(IAsyncResult result)
-        {
-            return new object();
-        }
-
-        public object Invoke(Delegate method, object[] args)
-        {
-            return new object();
-        }
-
-        public bool InvokeRequired
+        public void attach_to(IUnhandledErrorPresenter presenter)
         {
-            get { return false; }
         }
 
-        public void Dispose()
+        public void display(Exception exception)
         {
+            ux_message.Text = exception.ToString();
         }
     }
 }
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/UnhandledErrorView.Designer.cs
@@ -0,0 +1,76 @@
+๏ปฟnamespace MoMoney.Presentation.Views.Shell
+{
+    partial class UnhandledErrorView
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.ux_message = new System.Windows.Forms.TextBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.ux_message);
+            this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.groupBox1.Location = new System.Drawing.Point(0, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(709, 467);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            // 
+            // ux_message
+            // 
+            this.ux_message.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.ux_message.Location = new System.Drawing.Point(3, 18);
+            this.ux_message.Multiline = true;
+            this.ux_message.Name = "ux_message";
+            this.ux_message.ReadOnly = true;
+            this.ux_message.Size = new System.Drawing.Size(703, 446);
+            this.ux_message.TabIndex = 0;
+            // 
+            // UnhandledErrorView
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(709, 467);
+            this.Controls.Add(this.groupBox1);
+            this.Name = "UnhandledErrorView";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "UnhandledErrorView";
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox ux_message;
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/UnhandledErrorView.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/WelcomeScreen.cs
@@ -0,0 +1,46 @@
+using MoMoney.Presentation.Model.Menu.File.Commands;
+using MoMoney.Presentation.Resources;
+using MoMoney.Presentation.Views.core;
+
+namespace MoMoney.Presentation.Views.Shell
+{
+    public partial class WelcomeScreen : ApplicationDockedWindow, IGettingStartedView
+    {
+        readonly IShell shell;
+
+        public WelcomeScreen(IShell shell)
+        {
+            this.shell = shell;
+            InitializeComponent();
+            titled("Getting Started");
+            //base.BackgroundImage = ApplicationImages.Welcome;
+            //base.BackgroundImageLayout = ImageLayout.Center;
+        }
+
+        public void display()
+        {
+            ux_open_existing_file_button.will_be_shown_as(ApplicationImages.OpenExistingFile)
+                .when_hovered_over_will_show(ApplicationImages.OpenExistingFileSelected)
+                .will_execute<IOpenCommand>(() => true)
+                .with_tool_tip("Open Existing File", "Open an existing project.");
+
+            ux_create_new_file_button.will_be_shown_as(ApplicationImages.CreateNewFile)
+                .when_hovered_over_will_show(ApplicationImages.CreateNewFileSelected)
+                .will_execute<INewCommand>(() => true)
+                .with_tool_tip("Create New File", "Create a new project.");
+
+            //ux_company_details_button
+            //    .will_be_shown_as(ApplicationImages.CompanyDetails)
+            //    .when_hovered_over_will_show(ApplicationImages.CompanyDetailsSelected)
+            //    .will_execute<ICompanyTreeNode>(is_there_a_protocol_selected)
+            //    .with_tool_tip("Company Details", "Capture the company details.");
+
+            //ux_generate_report_button
+            //    .will_be_shown_as(ApplicationImages.GenerateReport)
+            //    .when_hovered_over_will_show(ApplicationImages.GenerateReportSelected)
+            //    .will_execute<IGenerateReportCommand>(is_there_a_protocol_selected)
+            //    .with_tool_tip("Generate Report", "Generate a printable report.");
+            shell.add(this);
+        }
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/WelcomeScreen.Designer.cs
@@ -0,0 +1,83 @@
+๏ปฟnamespace MoMoney.Presentation.Views.Shell
+{
+    partial class WelcomeScreen
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.ux_create_new_file_button = new System.Windows.Forms.Button();
+            this.ux_open_existing_file_button = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // ux_create_new_file_button
+            // 
+            this.ux_create_new_file_button.Anchor = System.Windows.Forms.AnchorStyles.None;
+            this.ux_create_new_file_button.Enabled = false;
+            this.ux_create_new_file_button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.ux_create_new_file_button.Location = new System.Drawing.Point(101, 97);
+            this.ux_create_new_file_button.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.ux_create_new_file_button.Name = "ux_create_new_file_button";
+            this.ux_create_new_file_button.Size = new System.Drawing.Size(100, 28);
+            this.ux_create_new_file_button.TabIndex = 0;
+            this.ux_create_new_file_button.Text = "Create New File";
+            this.ux_create_new_file_button.UseVisualStyleBackColor = true;
+            // 
+            // ux_open_existing_file_button
+            // 
+            this.ux_open_existing_file_button.Anchor = System.Windows.Forms.AnchorStyles.None;
+            this.ux_open_existing_file_button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.ux_open_existing_file_button.Location = new System.Drawing.Point(101, 164);
+            this.ux_open_existing_file_button.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.ux_open_existing_file_button.Name = "ux_open_existing_file_button";
+            this.ux_open_existing_file_button.Size = new System.Drawing.Size(100, 28);
+            this.ux_open_existing_file_button.TabIndex = 1;
+            this.ux_open_existing_file_button.Text = "Open Existing File";
+            this.ux_open_existing_file_button.UseVisualStyleBackColor = true;
+            // 
+            // WelcomeScreen
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.AutoSize = true;
+            this.AutoValidate = System.Windows.Forms.AutoValidate.Disable;
+            this.BackColor = System.Drawing.Color.WhiteSmoke;
+            this.ClientSize = new System.Drawing.Size(963, 609);
+            this.Controls.Add(this.ux_open_existing_file_button);
+            this.Controls.Add(this.ux_create_new_file_button);
+            this.DoubleBuffered = true;
+            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.Name = "WelcomeScreen";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button ux_create_new_file_button;
+        private System.Windows.Forms.Button ux_open_existing_file_button;
+
+    }
+}
\ No newline at end of file
trunk/product/MyMoney/Presentation/Views/Shell/WelcomeScreen.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
trunk/product/MyMoney/Testing/win.forms/Events.cs
@@ -32,6 +32,8 @@ namespace MoMoney.Testing.win.forms
         {
             void OnActivated(EventArgs e);
             void OnDeactivate(EventArgs e);
+            void OnClosed(EventArgs e);
+            void OnClosing(CancelEventArgs e);
         }
     }
 }
\ No newline at end of file
trunk/product/MyMoney/windows.ui/start_the_application.cs
@@ -21,7 +21,6 @@ namespace MoMoney.windows.ui
             {
                 this.log().error(e);
                 resolve.dependency_for<IEventAggregator>().publish(new unhandled_error_occurred(e));
-                //MessageBox.Show(e.ToString(), e.Message);
             }
         }
     }
trunk/product/MyMoney/windows.ui/wire_up_the_views_in_to_the.cs
@@ -29,6 +29,7 @@ namespace MoMoney.windows.ui
         {
             register.singleton<IShell, ApplicationShell>();
             //register.proxy(new SynchronizedViewProxyConfiguration<IShell>(), () => new ApplicationShell());
+            //register.proxy(new ShellConfiguration(), () => new ApplicationShell());
             register.singleton<the_application_context, the_application_context>();
             register.transient<IAboutApplicationView, AboutTheApplicationView>();
             register.transient<ISplashScreenView, SplashScreenView>();
@@ -43,6 +44,8 @@ namespace MoMoney.windows.ui
             register.transient<ICheckForUpdatesView, CheckForUpdatesView>();
             register.singleton<INotificationIconView, NotificationIconView>();
             register.transient<IStatusBarView, StatusBarView>();
+            register.transient<IUnhandledErrorView, UnhandledErrorView>();
+            register.transient<IGettingStartedView, WelcomeScreen>();
         }
     }
 
@@ -53,4 +56,19 @@ namespace MoMoney.windows.ui
             item.add_interceptor<SynchronizedInterceptor<T>>();
         }
     }
+
+    internal class ShellConfiguration : IConfiguration<IProxyBuilder<IShell>>
+    {
+        public void configure(IProxyBuilder<IShell> item)
+        {
+            IShell shell = item.add_interceptor<SynchronizedInterceptor<IShell>>().InterceptOn;
+            shell.add(null);
+            shell.add_to_main_menu(null);
+            shell.add_to_tool_bar(null);
+            shell.clear_menu_items();
+            shell.close_all_windows();
+            shell.close_the_active_window();
+            shell.status_bar();
+        }
+    }
 }
\ No newline at end of file
trunk/product/MyMoney/MyMoney.csproj
@@ -208,7 +208,7 @@
     <Compile Include="Infrastructure\Container\Windsor\configuration\SubclassesForm.cs" />
     <Compile Include="Infrastructure\Container\Windsor\WindsorContainerFactory.cs" />
     <Compile Include="Infrastructure\debugging\Launch.cs" />
-    <Compile Include="Infrastructure\eventing\event_aggregator.cs" />
+    <Compile Include="Infrastructure\eventing\EventAggregator.cs" />
     <Compile Include="Infrastructure\eventing\IEvent.cs" />
     <Compile Include="Infrastructure\eventing\IEventSubscriber.cs" />
     <Compile Include="Infrastructure\Extensions\threading_extensions.cs" />
@@ -279,16 +279,17 @@
     <Compile Include="Presentation\Model\interaction\INotification.cs" />
     <Compile Include="Presentation\Model\interaction\notification_message.cs" />
     <Compile Include="Presentation\Model\keyboard\shortcut_keys.cs" />
-    <Compile Include="Presentation\Model\keyboard\shortcut_key.cs" />
-    <Compile Include="Presentation\Model\Menu\File\Commands\close_project_command.cs" />
+    <Compile Include="Presentation\Model\keyboard\ShortcutKey.cs" />
+    <Compile Include="Presentation\Model\Menu\File\Commands\CloseProjectCommand.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\close_window_command.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\new_command_specs.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\SaveChangesCommand.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\save_as_command_specs.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\save_command_specs.cs" />
-    <Compile Include="Presentation\Model\Menu\menu_item_separator.cs" />
+    <Compile Include="Presentation\Model\Menu\MenuItemSeparator.cs" />
     <Compile Include="Presentation\Model\Menu\tool_bar_item_builder.cs" />
     <Compile Include="Presentation\Model\Menu\window\window_menu.cs" />
+    <Compile Include="Presentation\Model\messages\closing_project_event.cs" />
     <Compile Include="Presentation\Model\messages\closing_the_application.cs" />
     <Compile Include="Presentation\Model\messages\unhandled_error_occurred.cs" />
     <Compile Include="Presentation\Model\Navigation\branches\add_bill_payment_branch.cs" />
@@ -299,18 +300,18 @@
     <Compile Include="Presentation\Core\PresenterRegistry.cs" />
     <Compile Include="Presentation\Model\Menu\create.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\ExitCommand.cs" />
-    <Compile Include="Presentation\Model\Menu\File\Commands\new_command.cs" />
-    <Compile Include="Presentation\Model\Menu\File\Commands\open_command.cs" />
-    <Compile Include="Presentation\Model\Menu\File\Commands\open_command_specs.cs" />
+    <Compile Include="Presentation\Model\Menu\File\Commands\NewCommand.cs" />
+    <Compile Include="Presentation\Model\Menu\File\Commands\OpenCommand.cs" />
+    <Compile Include="Presentation\Model\Menu\File\Commands\OpenCommandSpecs.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\save_as_command.cs" />
     <Compile Include="Presentation\Model\Menu\File\Commands\save_command.cs" />
     <Compile Include="Presentation\Model\Menu\Help\commands\display_information_about_the_application.cs" />
-    <Compile Include="Presentation\Model\Menu\menu_item.cs" />
-    <Compile Include="Presentation\Model\Menu\menu_item_builder.cs" />
-    <Compile Include="Presentation\Model\Menu\sub_menu_registry.cs" />
+    <Compile Include="Presentation\Model\Menu\MenuItem.cs" />
+    <Compile Include="Presentation\Model\Menu\MenuItemBuilder.cs" />
+    <Compile Include="Presentation\Model\Menu\SubMenuRegistry.cs" />
     <Compile Include="Presentation\Model\Navigation\branches\add_new_bill_branch.cs" />
     <Compile Include="Presentation\Model\Navigation\IBranchVisitor.cs" />
-    <Compile Include="Presentation\Model\Navigation\navigation_tree_visitor.cs" />
+    <Compile Include="Presentation\Model\Navigation\NavigationTreeVisitor.cs" />
     <Compile Include="Presentation\Model\Navigation\navigation_tree_visitor_specs.cs" />
     <Compile Include="Presentation\Model\Navigation\tree_branch.cs" />
     <Compile Include="Presentation\Model\Navigation\tree_branch_specs.cs" />
@@ -322,13 +323,13 @@
     <Compile Include="Presentation\Model\reporting\report_binding_extensions.cs" />
     <Compile Include="Presentation\Model\reporting\report_binding_extensions_specs.cs" />
     <Compile Include="Presentation\Model\updates\ApplicationVersion.cs" />
-    <Compile Include="Presentation\Presenters\billing\add_bill_payment_presenter.cs" />
-    <Compile Include="Presentation\Presenters\add_company_presenter.cs" />
-    <Compile Include="Presentation\Presenters\add_company_presenter_specs.cs" />
+    <Compile Include="Presentation\Presenters\billing\AddBillPaymentPresenter.cs" />
+    <Compile Include="Presentation\Presenters\AddCompanyPresenter.cs" />
+    <Compile Include="Presentation\Presenters\AddCompanyPresenterSpecs.cs" />
     <Compile Include="Presentation\Presenters\billing\dto\add_new_bill_dto.cs" />
     <Compile Include="Presentation\Presenters\billing\dto\bill_information_dto.cs" />
     <Compile Include="Presentation\Presenters\billing\dto\register_new_company.cs" />
-    <Compile Include="Presentation\Presenters\billing\view_all_bills_presenter.cs" />
+    <Compile Include="Presentation\Presenters\billing\ViewAllBillsPresenter.cs" />
     <Compile Include="Presentation\Presenters\Commands\RestartCommand.cs" />
     <Compile Include="Presentation\Presenters\Commands\run_presenter_command.cs" />
     <Compile Include="Presentation\Presenters\Commands\run_the.cs" />
@@ -342,14 +343,14 @@
     <Compile Include="Presentation\Presenters\excel\ICell.cs" />
     <Compile Include="Presentation\Presenters\excel\ICellInterior.cs" />
     <Compile Include="Presentation\Presenters\excel\ICellVisitor.cs" />
-    <Compile Include="Presentation\Presenters\income\add_new_income_presenter.cs" />
-    <Compile Include="Presentation\Presenters\income\add_new_income_presenter_specs.cs" />
+    <Compile Include="Presentation\Presenters\income\AddNewIncomePresenter.cs" />
+    <Compile Include="Presentation\Presenters\income\AddNewIncomePresenterSpecs.cs" />
     <Compile Include="Presentation\Presenters\income\dto\income_information_dto.cs" />
     <Compile Include="Presentation\Presenters\income\dto\income_submission_dto.cs" />
     <Compile Include="Presentation\Presenters\income\dto\monthly_summary_dto.cs" />
-    <Compile Include="Presentation\Presenters\income\view_income_history_presenter.cs" />
+    <Compile Include="Presentation\Presenters\income\ViewIncomeHistoryPresenter.cs" />
     <Compile Include="Presentation\Presenters\Menu\Help\about_the_application_presenter.cs" />
-    <Compile Include="Presentation\Presenters\Menu\main_menu_presenter.cs" />
+    <Compile Include="Presentation\Presenters\Menu\MainMenuPresenter.cs" />
     <Compile Include="Presentation\Model\messages\new_project_opened.cs" />
     <Compile Include="Presentation\Model\messages\saved_changes_event.cs" />
     <Compile Include="Presentation\Model\messages\unsaved_changes_event.cs" />
@@ -367,7 +368,7 @@
     <Compile Include="Presentation\Presenters\Navigation\MainMenuPresenter.cs" />
     <Compile Include="Presentation\Presenters\Navigation\NavigationPresenter.cs" />
     <Compile Include="Presentation\Presenters\Navigation\NavigationPresenterSpecs.cs" />
-    <Compile Include="Presentation\Presenters\reporting\report_presenter.cs" />
+    <Compile Include="Presentation\Presenters\reporting\ReportPresenter.cs" />
     <Compile Include="Presentation\Presenters\Shell\LoadApplicationShellSpecs.cs" />
     <Compile Include="Presentation\Presenters\Shell\NotificationIconPresenterSpecs.cs" />
     <Compile Include="Presentation\Presenters\Shell\TaskTrayPresenter.cs" />
@@ -441,7 +442,7 @@
     <Compile Include="Presentation\Views\income\ViewAllIncome.Designer.cs">
       <DependentUpon>ViewAllIncome.cs</DependentUpon>
     </Compile>
-    <Compile Include="Presentation\Views\listbox_extensions.cs" />
+    <Compile Include="Presentation\Databindings\listbox_extensions.cs" />
     <Compile Include="Presentation\Views\Menu\ApplicationMenuHost.cs" />
     <Compile Include="Presentation\Views\Navigation\IMainMenuView.cs" />
     <Compile Include="Presentation\Views\Navigation\MainMenuView.cs">
@@ -470,6 +471,9 @@
     <Compile Include="Presentation\Views\billing\view_all_bills_report.Designer.cs">
       <DependentUpon>view_all_bills_report.cs</DependentUpon>
     </Compile>
+    <Compile Include="Presentation\Views\Shell\ApplicationShellSpecs.cs" />
+    <Compile Include="Presentation\Views\Shell\BitmapRegion.cs" />
+    <Compile Include="Presentation\Views\Shell\button_extensions.cs" />
     <Compile Include="Presentation\Views\Shell\IGettingStartedView.cs" />
     <Compile Include="Presentation\Views\Shell\INotificationIconView.cs" />
     <Compile Include="Presentation\Views\Shell\IShell.cs" />
@@ -479,7 +483,18 @@
     <Compile Include="Presentation\Views\Shell\StatusBarView.cs" />
     <Compile Include="Presentation\Views\Shell\TaskTrayMessage.cs" />
     <Compile Include="Presentation\Views\Shell\TitleBar.cs" />
-    <Compile Include="Presentation\Views\Shell\UnhandledErrorView.cs" />
+    <Compile Include="Presentation\Views\Shell\UnhandledErrorView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Presentation\Views\Shell\UnhandledErrorView.Designer.cs">
+      <DependentUpon>UnhandledErrorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Presentation\Views\Shell\WelcomeScreen.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Presentation\Views\Shell\WelcomeScreen.Designer.cs">
+      <DependentUpon>WelcomeScreen.cs</DependentUpon>
+    </Compile>
     <Compile Include="Presentation\Views\updates\CheckForUpdatesView.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -544,7 +559,7 @@
     <Compile Include="Presentation\Presenters\Commands\display_the_splash_screen.cs" />
     <Compile Include="Presentation\Core\IPresentationModule.cs" />
     <Compile Include="Presentation\Core\presenter_registry_extensions.cs" />
-    <Compile Include="Presentation\Model\Menu\File\file_menu.cs" />
+    <Compile Include="Presentation\Model\Menu\File\FileMenu.cs" />
     <Compile Include="Presentation\Model\Menu\Help\help_menu.cs" />
     <Compile Include="Utility\Core\ISpecification.cs" />
     <Compile Include="Utility\Core\Map.cs" />
@@ -619,7 +634,7 @@
     <Compile Include="Presentation\Core\application_controller.cs" />
     <Compile Include="Presentation\Core\IPresenter.cs" />
     <Compile Include="Infrastructure\Container\IDependencyRegistry.cs" />
-    <Compile Include="Presentation\Presenters\Menu\main_menu_presenter_specs.cs" />
+    <Compile Include="Presentation\Presenters\Menu\MainMenuPresenterSpecs.cs" />
     <Compile Include="Presentation\Presenters\Commands\LoadApplicationShell.cs" />
     <Compile Include="Presentation\Views\Menu\ApplicationMenuHostSpecs.cs" />
     <Compile Include="windows.ui\bootstrap.cs" />
@@ -673,6 +688,12 @@
       <DependentUpon>ApplicationShell.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="Presentation\Views\Shell\UnhandledErrorView.resx">
+      <DependentUpon>UnhandledErrorView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Presentation\Views\Shell\WelcomeScreen.resx">
+      <DependentUpon>WelcomeScreen.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Presentation\Views\Startup\SplashScreenView.resx">
       <DependentUpon>SplashScreenView.cs</DependentUpon>
     </EmbeddedResource>