/*
In App.xaml:
In the View:
DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using Autofac;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
using MahTweets.Core;
using MahTweets.Core.Interfaces;
using MahTweets.Core.Repositories;
using MahTweets.Core.Services;
using MahTweets.Core.UrlShorteners;
using MahTweets.Extensions.Foursquare;
using MahTweets.Extensions.Foursquare.ViewModels;
using MahTweets.Extensions.Twitpic;
using MahTweets.Extensions.Twitter;
using MahTweets.Extensions.Twitter.ViewModels;
using MahTweets.Extensions.YFrog;
using MahTweets.ViewModels;
using MahTweets.ViewModels.Setup;
using Microsoft.Phone.Shell;
namespace MahTweets
{
public class ViewModelLocator
{
private readonly AccountRepository _accountRepository = new AccountRepository();
private readonly ApplicationSettings _applicationSettings = new ApplicationSettings();
private readonly AvailableMicroblogs _availableMicroblogs = new AvailableMicroblogs();
private readonly AvailableStalkers _availableStalkers = new AvailableStalkers();
private readonly List _availableUploaders = new List();
private readonly ContactRepository _contactRepository = new ContactRepository();
private readonly SearchRepository _searchRepository = new SearchRepository();
private readonly StalkerRepository _stalkerRepository = new StalkerRepository();
private readonly ThreadSafeObservableCollection _statusManagers =
new ThreadSafeObservableCollection();
private readonly UrlShortenerRepository _urlShortenerRepository = new UrlShortenerRepository();
private IContainer _container;
private Feedback _feedback;
private IStatusService _statusManager;
///
/// Initializes a new instance of the ViewModelLocator class.
///
public ViewModelLocator()
{
Current = this;
}
public static ViewModelLocator Current { get; set; }
public NavigationService NavigationService { get; private set; }
public MainViewModel MainViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new MainViewModel(null, null, null, null, null, null, null, null, null, null, null, null, null)
: _container.Resolve();
}
}
public LocationViewModel LocationViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new LocationViewModel(null, null)
: _container.Resolve();
}
}
public StreamViewModel StreamViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new StreamViewModel(null, null)
: _container.Resolve();
}
}
public UrlShorteningSetupViewModel UrlShorteningSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new UrlShorteningSetupViewModel(null, null)
: _container.Resolve();
}
}
public AccountSetupViewModel AccountSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new AccountSetupViewModel(null, null, null, null, null, null, null)
: _container.Resolve();
}
}
public PushSetupViewModel PushSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new PushSetupViewModel(null, null)
: _container.Resolve();
}
}
public TrendsViewModel TrendsViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new TrendsViewModel(null, null)
: _container.Resolve();
}
}
public GeneralSetupViewModel GeneralSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new GeneralSetupViewModel(null, null)
: _container.Resolve();
}
}
public SettingsViewModel SettingsViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new SettingsViewModel(null, null, null)
: _container.Resolve();
}
}
public HomeViewModel HomeViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new HomeViewModel(null, null)
: _container.Resolve();
}
}
public CompositionViewModel CompositionViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new CompositionViewModel(null, null, null, null, null, null, null, null)
: _container.Resolve();
}
}
public BrowserViewModel BrowserViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new BrowserViewModel()
: _container.Resolve();
}
}
public AddColumnViewModel AddColumnViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new AddColumnViewModel(null, null, null)
: _container.Resolve();
}
}
public SearchViewModel SearchViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new SearchViewModel(null, null, null, null)
: _container.Resolve();
}
}
public TwitterSetupViewModel TwitterSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new TwitterSetupViewModel()
: _container.Resolve();
}
}
public ProfileViewModel ProfileViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new ProfileViewModel(null)
: _container.Resolve();
}
}
public SingleTweetViewModel SingleTweetViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new SingleTweetViewModel(null, null, null, null)
: _container.Resolve();
}
}
public FourSquareSetupViewModel FourSquareSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new FourSquareSetupViewModel()
: _container.Resolve();
}
}
/*public TumblrSetupViewModel TumblrSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new TumblrSetupViewModel()
: _container.Resolve();
}
}
public YammerSetupViewModel YammerSetupViewModel
{
get
{
return ViewModelBase.IsInDesignModeStatic
? new YammerSetupViewModel()
: _container.Resolve();
}
}*/
public Feedback Feedback
{
get { return _feedback; }
}
public void Initialise()
{
if (NavigationService != null)
return;
NavigationService = new NavigationService(((App) Application.Current).RootFrame);
if (ViewModelBase.IsInDesignModeStatic)
{
// Create design time view models
}
else
{
_container = ConfigureContainer();
IoC.Container = _container;
LocationService.Instance = _container.Resolve();
LocationService.Instance.AsyncGetLocation();
}
}
private void StatusManagerCreatedEventHandler(StatusManagerCreatedEvent e)
{
if (!_statusManagers.Contains(e.StatusService))
_statusManagers.Add(e.StatusService);
}
public static void Cleanup()
{
}
private IContainer ConfigureContainer()
{
Messenger.Default.Register(this, StatusManagerCreatedEventHandler);
_statusManager = new StatusService();
var containerBuilder = new ContainerBuilder();
//View Models
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType();
containerBuilder.RegisterType();
containerBuilder.RegisterType();
containerBuilder.RegisterType();
containerBuilder.RegisterType();
containerBuilder.RegisterType();
containerBuilder.RegisterType().InstancePerDependency();
//Setup ViewModels
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
containerBuilder.RegisterType().SingleInstance();
//Global stuff
containerBuilder.RegisterType().As().SingleInstance();
containerBuilder.RegisterInstance(_applicationSettings).As();
containerBuilder.RegisterInstance(_accountRepository);
containerBuilder.RegisterInstance(_stalkerRepository);
containerBuilder.RegisterInstance(_contactRepository);
containerBuilder.RegisterInstance(_availableMicroblogs);
containerBuilder.RegisterInstance(_availableStalkers);
containerBuilder.RegisterInstance(_searchRepository);
containerBuilder.RegisterInstance(_statusManager);
containerBuilder.RegisterInstance(_availableUploaders);
containerBuilder.RegisterInstance(_urlShortenerRepository);
containerBuilder.RegisterInstance(_statusManagers);
_availableUploaders.Add(new Twitpic(_accountRepository));
_availableUploaders.Add(new Yfrog(_accountRepository));
_urlShortenerRepository.Add(new Google());
_urlShortenerRepository.Add(new IsGd());
containerBuilder.RegisterType().AsSelf().As();
containerBuilder.RegisterType().AsSelf().As();
//containerBuilder.RegisterType().AsSelf().As();
//containerBuilder.RegisterType().AsSelf().As();
containerBuilder.RegisterModule(new TwitterModule());
containerBuilder.RegisterInstance(_feedback = new Feedback());
containerBuilder.RegisterInstance>(
t => (IKnowWhereYouAre) _container.Resolve(t));
containerBuilder.RegisterInstance>(t => (IMicroblog) _container.Resolve(t));
containerBuilder.RegisterInstance>(() =>
{
string uploaderName =
_applicationSettings.UploaderName;
if (String.IsNullOrEmpty(uploaderName))
uploaderName = "Twitpic";
return
_availableUploaders.Where(
un =>
un.Name.ToLower() ==
uploaderName.ToLower()).FirstOrDefault();
});
containerBuilder
.RegisterInstance(NavigationService)
.As();
if (_applicationSettings.RunBehindLockScreen)
PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;
return containerBuilder.Build();
}
}
}