#region License
/**
* Ingenious MVC : An MVC framework for .NET 2.0
* Copyright (C) 2006, JDP Group
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: - Kent Boogaart (kentcb@internode.on.net)
*/
#endregion
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Ingenious.Mvc;
using Ingenious.Mvc.Configuration;
using Ingenious.Mvc.Configuration.Configurators;
using Ingenious.Mvc.Util;
using Ingenious.Mvc.Windows.Forms.Views;
namespace Ingenious.Mvc.Windows.Forms.ViewManagers{
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="T:WizardViewManager"]/*'/>
[Serializable]
[XmlCustomParser(typeof(WizardViewManagerXmlCustomParser))]
public class WizardViewManager : UserControlsViewManager, ICustomConfigurable
{
private Id<IView> _containerViewId;
private bool _showModal;
private IDictionary<Task, TaskInfo> _tasks;
private object _tasksLock;
private static readonly Log _log = Log.CreateForType(typeof(WizardViewManager));
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="P:ContainerViewId"]/*'/>
public Id<IView> ContainerViewId
{
get
{
return _containerViewId;
}
set
{
_containerViewId = value;
}
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="P:ShowModal"]/*'/>
public bool ShowModal
{
get
{
return _showModal;
}
set
{
_showModal = value;
}
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="M:.ctor(Ingenious.Mvc.Id`1,Ingenious.Mvc.TaskManager)"]/*'/>
public WizardViewManager(Id<IViewManager> id, TaskManager taskManager) : base(id, taskManager)
{
//listen for task started events so we can show the container view
taskManager.TaskStarted += new EventHandler<TaskEventArgs>(taskManager_TaskStarted);
//default container name
ContainerName = "container";
_tasks = new Dictionary<Task, TaskInfo>();
_tasksLock = new object();
_showModal = true;
_log.Verbose("Constructed WizardViewManager with ID '{0}'.", id);
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="M:GetUserControlContainer(Ingenious.Mvc.Task)"]/*'/>
protected override IUserControlContainer GetUserControlContainer(Task task)
{
_log.Verbose("Getting user control container for task with ID '{0}'.", task.Id);
IUserControlContainer retVal = null;
lock (_tasksLock)
{
TaskInfo taskInfo;
if (!_tasks.TryGetValue(task, out taskInfo))
{
taskInfo = new TaskInfo();
_tasks[task] = taskInfo;
}
retVal = taskInfo.FormView as IUserControlContainer;
if (retVal == null)
{
ExceptionHelper.ThrowIf(_containerViewId.IsEmpty, "GetUserControlContainer.containerViewIdNotSpecified", Id);
//create the container view
IView containerView = CreateView(task, _containerViewId);
//the view must implement IFormView
ExceptionHelper.ThrowIf(!(containerView is IFormView), "GetUserControlContainer.containerViewDoesNotImplementRequiredInterface", Id, _containerViewId, containerView.GetType().FullName, typeof(IFormView).FullName);
//the view must implement IUserControlContainer
ExceptionHelper.ThrowIf(!(containerView is IUserControlContainer), "GetUserControlContainer.containerViewDoesNotImplementRequiredInterface", Id, _containerViewId, containerView.GetType().FullName, typeof(IUserControlContainer).FullName);
retVal = (IUserControlContainer) containerView;
taskInfo.FormView = (IFormView) retVal;
}
}
return retVal;
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="M:GetContainerFormForTask(Ingenious.Mvc.Task)"]/*'/>
public IFormView GetContainerFormForTask(Task task)
{
ArgumentHelper.AssertNotNull(task, "task");
lock (_tasksLock)
{
if (_tasks.ContainsKey(task))
{
TaskInfo taskInfo = _tasks[task];
return taskInfo.FormView;
}
}
return null;
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="M:Ingenious.Mvc.Configuration.ICustomConfigurable.SetCustomConfiguration(System.Object)"]/*'/>
void ICustomConfigurable.SetCustomConfiguration(object customConfiguration)
{
ArgumentHelper.AssertNotNull(customConfiguration, "customConfiguration");
CustomConfiguration customConfig = customConfiguration as CustomConfiguration;
ExceptionHelper.ThrowIf(customConfig == null, "SetCustomConfiguration.incorrectType", typeof(CustomConfiguration).FullName, customConfiguration.GetType().FullName);
_containerViewId = customConfig.ContainerViewId;
if (customConfig.ContainerName != null)
{
ContainerName = customConfig.ContainerName;
}
if (customConfig.IsModal.HasValue)
{
_showModal = customConfig.IsModal.Value;
}
}
private void taskManager_TaskStarted(object sender, TaskEventArgs e)
{
lock (_tasksLock)
{
if (_tasks.ContainsKey(e.Task))
{
TaskInfo taskInfo = _tasks[e.Task];
if (!taskInfo.Shown)
{
taskInfo.Shown = true;
//now that the underlying task is started we can show the container view
taskInfo.FormView.Show(_showModal);
}
}
}
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="T:WizardViewManager+CustomConfiguration"]/*'/>
[Serializable]
public new sealed class CustomConfiguration
{
private Id<IView> _containerViewId;
private string _containerName;
private bool? _modal;
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="P:CustomConfiguration.ContainerViewId"]/*'/>
public Id<IView> ContainerViewId
{
get
{
return _containerViewId;
}
set
{
_containerViewId = value;
}
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="P:CustomConfiguration.ContainerName"]/*'/>
public string ContainerName
{
get
{
return _containerName;
}
set
{
_containerName = value;
}
}
/// <include file='WizardViewManager.doc.xml' path='/doc/member[@name="P:CustomConfiguration.IsModal"]/*'/>
public bool? IsModal
{
get
{
return _modal;
}
set
{
_modal = value;
}
}
}
[Serializable]
private sealed class TaskInfo
{
private IFormView _formView;
private bool _shown;
public IFormView FormView
{
get
{
return _formView;
}
set
{
_formView = value;
}
}
public bool Shown
{
get
{
return _shown;
}
set
{
_shown = value;
}
}
}
}
}
|