You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
8.2 KiB
312 lines
8.2 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) |
|
|
|
using System; |
|
using System.Collections.Generic; |
|
using System.Collections.ObjectModel; |
|
using System.IO; |
|
using System.Windows.Input; |
|
|
|
namespace ICSharpCode.AspNet.Mvc |
|
{ |
|
public class AddMvcViewToProjectViewModel : ViewModelBase<AddMvcViewToProjectViewModel> |
|
{ |
|
IMvcViewFileGenerator viewGenerator; |
|
ISelectedMvcFolder selectedViewFolder; |
|
MvcViewFileName viewFileName = new MvcViewFileName(); |
|
bool closed; |
|
List<MvcViewEngineViewModel> viewEngines; |
|
MvcViewEngineViewModel selectedViewEngine; |
|
bool isStronglyTypedView; |
|
bool isContentPage; |
|
bool isSelectMasterPageViewOpen; |
|
MvcMasterPageFileName selectedMasterPage; |
|
string masterPageFile = String.Empty; |
|
|
|
MvcModelClassViewModelsForSelectedFolder modelClassesForSelectedFolder; |
|
|
|
public AddMvcViewToProjectViewModel(ISelectedMvcFolder selectedViewFolder) |
|
: this( |
|
selectedViewFolder, |
|
new MvcViewFileGenerator()) |
|
{ |
|
} |
|
|
|
public AddMvcViewToProjectViewModel( |
|
ISelectedMvcFolder selectedViewFolder, |
|
IMvcViewFileGenerator viewGenerator) |
|
{ |
|
this.selectedViewFolder = selectedViewFolder; |
|
this.viewGenerator = viewGenerator; |
|
this.viewFileName.Folder = selectedViewFolder.Path; |
|
this.ModelClassName = String.Empty; |
|
this.PrimaryContentPlaceHolderId = "Main"; |
|
this.MasterPages = new ObservableCollection<MvcMasterPageFileName>(); |
|
|
|
CreateModelClassesForSelectedFolder(); |
|
CreateCommands(); |
|
AddViewEngines(); |
|
SetDefaultMasterPage(); |
|
} |
|
|
|
void CreateModelClassesForSelectedFolder() |
|
{ |
|
modelClassesForSelectedFolder = new MvcModelClassViewModelsForSelectedFolder(selectedViewFolder); |
|
} |
|
|
|
void CreateCommands() |
|
{ |
|
AddMvcViewCommand = new DelegateCommand(param => AddMvcView(), param => CanAddMvcView()); |
|
OpenSelectMasterPageViewCommand = new DelegateCommand(param => OpenSelectMasterPageView()); |
|
CloseSelectMasterPageViewCommand = new DelegateCommand(param => CloseSelectMasterPageView()); |
|
SelectMasterPageCommand = new DelegateCommand(param => SelectMasterPage(), param => CanSelectMasterPage()); |
|
} |
|
|
|
public ICommand AddMvcViewCommand { get; private set; } |
|
public ICommand OpenSelectMasterPageViewCommand { get; private set; } |
|
public ICommand CloseSelectMasterPageViewCommand { get; private set; } |
|
public ICommand SelectMasterPageCommand { get; private set; } |
|
|
|
public string ViewName { |
|
get { return viewFileName.ViewName; } |
|
set { viewFileName.ViewName = value; } |
|
} |
|
|
|
public bool IsClosed { |
|
get { return closed; } |
|
set { |
|
closed = value; |
|
OnPropertyChanged(viewModel => viewModel.IsClosed); |
|
} |
|
} |
|
|
|
void AddViewEngines() |
|
{ |
|
viewEngines = new List<MvcViewEngineViewModel>(); |
|
AddAspxViewEngine(); |
|
AddRazorViewEngine(); |
|
SelectAspxViewEngine(); |
|
} |
|
|
|
void AddAspxViewEngine() |
|
{ |
|
var viewType = new MvcViewEngineViewModel("ASPX", MvcTextTemplateType.Aspx); |
|
AddViewEngine(viewType); |
|
} |
|
|
|
void AddRazorViewEngine() |
|
{ |
|
var viewType = new MvcViewEngineViewModel("Razor", MvcTextTemplateType.Razor); |
|
AddViewEngine(viewType); |
|
} |
|
|
|
void AddViewEngine(MvcViewEngineViewModel viewEngine) |
|
{ |
|
viewEngines.Add(viewEngine); |
|
} |
|
|
|
void SelectAspxViewEngine() |
|
{ |
|
SelectedViewEngine = viewEngines[0]; |
|
} |
|
|
|
void SetDefaultMasterPage() |
|
{ |
|
if (IsAspxViewEngineSelected) { |
|
MasterPageFile = "~/Views/Shared/Site.Master"; |
|
} else { |
|
MasterPageFile = String.Empty; |
|
} |
|
} |
|
|
|
public IEnumerable<MvcViewEngineViewModel> ViewEngines { |
|
get { return viewEngines; } |
|
} |
|
|
|
public MvcViewEngineViewModel SelectedViewEngine { |
|
get { return selectedViewEngine; } |
|
set { |
|
selectedViewEngine = value; |
|
viewFileName.TemplateType = selectedViewEngine.TemplateType; |
|
OnSelectedViewEngineChanged(); |
|
} |
|
} |
|
|
|
void OnSelectedViewEngineChanged() |
|
{ |
|
IsAspxViewEngineSelected = selectedViewEngine.TemplateType.IsAspx(); |
|
IsRazorViewEngineSelected = selectedViewEngine.TemplateType.IsRazor(); |
|
|
|
SetDefaultMasterPage(); |
|
|
|
OnPropertyChanged(viewModel => viewModel.IsAspxViewEngineSelected); |
|
OnPropertyChanged(viewModel => viewModel.IsRazorViewEngineSelected); |
|
OnPropertyChanged(viewModel => viewModel.MasterPageFile); |
|
} |
|
|
|
public bool IsRazorViewEngineSelected { get; private set; } |
|
public bool IsAspxViewEngineSelected { get; private set; } |
|
|
|
public bool IsContentPage { |
|
get { return isContentPage; } |
|
set { |
|
isContentPage = value; |
|
OnPropertyChanged(viewModel => viewModel.IsContentPage); |
|
} |
|
} |
|
|
|
public bool CanAddMvcView() |
|
{ |
|
return viewFileName.HasValidViewName(); |
|
} |
|
|
|
public void AddMvcView() |
|
{ |
|
GenerateMvcViewFile(); |
|
AddMvcViewFileToProject(); |
|
IsClosed = true; |
|
} |
|
|
|
void GenerateMvcViewFile() |
|
{ |
|
ConfigureMvcViewGenerator(); |
|
viewFileName.TemplateLanguage = GetTemplateLanguage(); |
|
viewGenerator.GenerateFile(viewFileName); |
|
} |
|
|
|
void ConfigureMvcViewGenerator() |
|
{ |
|
viewGenerator.IsContentPage = IsContentPage; |
|
viewGenerator.MasterPageFile = GetMasterPageFile(); |
|
viewGenerator.ModelClassName = GetModelClassName(); |
|
viewGenerator.PrimaryContentPlaceHolderId = GetPrimaryContentPlaceHolderId(); |
|
viewGenerator.Project = selectedViewFolder.Project; |
|
viewGenerator.TemplateLanguage = GetTemplateLanguage(); |
|
viewGenerator.TemplateType = selectedViewEngine.TemplateType; |
|
} |
|
|
|
string GetMasterPageFile() |
|
{ |
|
if (IsContentPage) { |
|
return MasterPageFile; |
|
} |
|
return String.Empty; |
|
} |
|
|
|
string GetModelClassName() |
|
{ |
|
if (IsStronglyTypedView) { |
|
if (SelectedModelClass != null) { |
|
return SelectedModelClass.FullName; |
|
} |
|
return ModelClassName.Trim(); |
|
} |
|
return String.Empty; |
|
} |
|
|
|
string GetPrimaryContentPlaceHolderId() |
|
{ |
|
if (IsContentPage) { |
|
return PrimaryContentPlaceHolderId; |
|
} |
|
return String.Empty; |
|
} |
|
|
|
MvcTextTemplateLanguage GetTemplateLanguage() |
|
{ |
|
return selectedViewFolder.GetTemplateLanguage(); |
|
} |
|
|
|
void AddMvcViewFileToProject() |
|
{ |
|
string fileName = viewFileName.GetFileName(); |
|
selectedViewFolder.AddFileToProject(fileName); |
|
} |
|
|
|
public bool IsPartialView { |
|
get { return viewFileName.IsPartialView; } |
|
set { viewFileName.IsPartialView = value; } |
|
} |
|
|
|
public bool IsStronglyTypedView { |
|
get { return isStronglyTypedView; } |
|
set { |
|
isStronglyTypedView = value; |
|
if (isStronglyTypedView) { |
|
modelClassesForSelectedFolder.GetModelClasses(); |
|
OnPropertyChanged(viewModel => viewModel.ModelClasses); |
|
} |
|
OnPropertyChanged(viewModel => viewModel.IsStronglyTypedView); |
|
} |
|
} |
|
|
|
public IEnumerable<MvcModelClassViewModel> ModelClasses { |
|
get { return modelClassesForSelectedFolder.ModelClasses; } |
|
} |
|
|
|
public MvcModelClassViewModel SelectedModelClass { get; set; } |
|
public string ModelClassName { get; set; } |
|
public string PrimaryContentPlaceHolderId { get; set; } |
|
|
|
public string MasterPageFile { |
|
get { return masterPageFile; } |
|
set { |
|
masterPageFile = value; |
|
OnPropertyChanged(viewModel => viewModel.MasterPageFile); |
|
} |
|
} |
|
|
|
public bool IsSelectMasterPageViewOpen { |
|
get { return isSelectMasterPageViewOpen; } |
|
set { |
|
isSelectMasterPageViewOpen = value; |
|
OnPropertyChanged(viewModel => viewModel.IsSelectMasterPageViewOpen); |
|
} |
|
} |
|
|
|
public void OpenSelectMasterPageView() |
|
{ |
|
UpdateMasterPages(); |
|
IsSelectMasterPageViewOpen = true; |
|
} |
|
|
|
void UpdateMasterPages() |
|
{ |
|
MasterPages.Clear(); |
|
foreach (MvcMasterPageFileName fileName in GetAspxMasterPageFileNames()) { |
|
MasterPages.Add(fileName); |
|
} |
|
} |
|
|
|
IEnumerable<MvcMasterPageFileName> GetAspxMasterPageFileNames() |
|
{ |
|
return selectedViewFolder.Project.GetAspxMasterPageFileNames(); |
|
} |
|
|
|
public void CloseSelectMasterPageView() |
|
{ |
|
IsSelectMasterPageViewOpen = false; |
|
} |
|
|
|
public ObservableCollection<MvcMasterPageFileName> MasterPages { get; private set; } |
|
|
|
public MvcMasterPageFileName SelectedMasterPage { |
|
get { return selectedMasterPage; } |
|
set { selectedMasterPage = value; } |
|
} |
|
|
|
public void SelectMasterPage() |
|
{ |
|
if (selectedMasterPage != null) { |
|
MasterPageFile = selectedMasterPage.VirtualPath; |
|
} |
|
IsSelectMasterPageViewOpen = false; |
|
} |
|
|
|
public bool CanSelectMasterPage() |
|
{ |
|
return selectedMasterPage != null; |
|
} |
|
} |
|
} |
|
|
|
|