#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 Ingenious.Mvc.Configuration;
using Ingenious.Mvc.Util;
namespace Ingenious.Mvc.ViewManagers{
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="T:ViewManagerBase"]/*'/>
[Serializable]
public abstract class ViewManagerBase : IViewManager
{
[field: NonSerialized]
private IView _activeView;
private readonly Id<IViewManager> _id;
private readonly TaskManager _taskManager;
private static readonly Log _log = Log.CreateForType(typeof(ViewManagerBase));
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="P:Id"]/*'/>
public Id<IViewManager> Id
{
get
{
return _id;
}
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="P:ActiveView"]/*'/>
public IView ActiveView
{
get
{
return _activeView;
}
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="P:TaskManager"]/*'/>
protected TaskManager TaskManager
{
get
{
return _taskManager;
}
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="E:ViewActivated"]/*'/>
[field: NonSerialized]
public event EventHandler<ViewEventArgs> ViewActivated;
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="E:ViewDeactivated"]/*'/>
[field: NonSerialized]
public event EventHandler<ViewEventArgs> ViewDeactivated;
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:.ctor(Ingenious.Mvc.Id`1,Ingenious.Mvc.TaskManager)"]/*'/>
protected ViewManagerBase(Id<IViewManager> id, TaskManager taskManager)
{
ArgumentHelper.AssertNotEmpty(id, "id");
ArgumentHelper.AssertNotNull(taskManager, "taskManager");
_id = id;
_taskManager = taskManager;
ViewActivated += ViewManagerBase_ViewActivation;
ViewDeactivated += ViewManagerBase_ViewActivation;
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:Initialize()"]/*'/>
public virtual void Initialize()
{
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:GetViewInfo(Ingenious.Mvc.Task,Ingenious.Mvc.Id`1)"]/*'/>
protected static ViewInfo GetViewInfo(Task task, Id<IView> viewId)
{
ArgumentHelper.AssertNotEmpty(viewId, "viewId");
_log.Verbose("Getting view info for view with ID '{0}' and task with ID '{1}'.", viewId, task.Id);
ConfigurationInfo configurationInfo = task.Manager.ConfigurationInfo;
ExceptionHelper.ThrowIf(configurationInfo == null, "GetViewInfo.noConfiguration");
ViewInfo viewInfo = configurationInfo.ViewInfos[viewId];
if (viewInfo == null)
{
//we must be able to find the information about the view
_log.Error("Unable to find view info for view with ID '{0}' and task with ID '{1}'.", viewId, task.Id);
ExceptionHelper.Throw("GetViewInfo.viewNotFound", viewId);
}
return viewInfo;
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:CreateView(Ingenious.Mvc.Task,Ingenious.Mvc.Id`1)"]/*'/>
protected static IView CreateView(Task task, Id<IView> viewId)
{
ArgumentHelper.AssertNotNull(task, "task");
_log.Verbose("Creating instance of view with ID '{0}' for task with ID '{1}'.", viewId, task.Id);
ViewInfo viewInfo = GetViewInfo(task, viewId);
ConfigurationInfo configurationInfo = task.Manager.ConfigurationInfo;
//need to know the view type
ExceptionHelper.ThrowIf(viewInfo.Type == null, "CreateView.viewTypeNotFound", viewId);
if (viewInfo.ControllerInfo != null)
{
ExceptionHelper.ThrowIf(viewInfo.ControllerInfo.Type == null, "CreateView.controllerTypeNotFound", viewId, viewInfo.ControllerInfo.Id);
}
IView view = null;
try
{
IController controller = task.Manager.GetControllerForTask(task, viewInfo.ControllerInfo, configurationInfo.ControllerFactory);
view = (IView) configurationInfo.ViewFactory.Create(viewInfo, task, controller);
}
catch (Exception ex)
{
_log.Exception(ex);
ExceptionHelper.Throw("CreateView.viewFactoryFailed", ex, viewId);
}
ExceptionHelper.ThrowIf(view == null, "CreateView.viewFactoryFailed", viewId);
return view;
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:OnViewActivated(Ingenious.Mvc.IView)"]/*'/>
protected virtual void OnViewActivated(IView view)
{
EventHelper.Raise(ViewActivated, this, new ViewEventArgs(view));
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:OnViewDeactivated(Ingenious.Mvc.IView)"]/*'/>
protected virtual void OnViewDeactivated(IView view)
{
EventHelper.Raise(ViewDeactivated, this, new ViewEventArgs(view));
}
/// <include file='ViewManagerBase.doc.xml' path='/doc/member[@name="M:Activate(Ingenious.Mvc.Task,Ingenious.Mvc.Id`1,System.Object)"]/*'/>
public abstract IView Activate(Task task, Id<IView> viewId, object viewData);
private void ViewManagerBase_ViewActivation(object sender, ViewEventArgs e)
{
//keep track of the active view
_activeView = e.View;
}
}
}
|