#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
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.
 
 
 
 
 
 

269 lines
8.0 KiB

/*
* Created by SharpDevelop.
* User: Ciprian Khlud
* Date: 7/19/2014
* Time: 10:52 PM
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Templates;
using ICSharpCode.SharpDevelop.Widgets;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui
{
public class NewFileViewModel : ViewModelBase
{
#region Backing properties
private NewFileCategory _selectedCategory;
private string _searchFor;
private ObservableCollection<NewFileTemplate> _allTemplate;
private NewFileTemplate _selectedItem;
private string _fileName;
#endregion
public NewFileViewModel()
{
_allTemplate = new ObservableCollection<NewFileTemplate>();
Categories = new ObservableCollection<NewFileCategory>();
AllFileTemplates = new NewFileCategory("All");
Categories.Add(AllFileTemplates);
}
public NewFileCategory AllFileTemplates { get; set; }
public NewFileCategory SelectedCategory
{
get { return _selectedCategory; }
set
{
_selectedCategory = value;
OnPropertyChanged();
}
}
public ObservableCollection<NewFileTemplate> SelectedTemplates
{
get
{
UpdatedSelection();
return _allTemplate;
}
}
public void UpdatedSelection()
{
_allTemplate.Clear();
var selectedCategory = _selectedCategory;
if (selectedCategory == null) return;
var searchTokens = SearchFor.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in selectedCategory.Templates)
{
if(PassFilter(item, searchTokens))
_allTemplate.Add(item);
}
}
static bool PassFilter(NewFileTemplate template, string[] searchTokens)
{
if (searchTokens.Length == 0)
return true;
var result = TextMatchesSearchTokens(searchTokens, template.DisplayName);
var resultDescription = TextMatchesSearchTokens(searchTokens, template.Description);
var resultCategory = TextMatchesSearchTokens(searchTokens, template.CategoryDescription);
return result ||resultDescription || resultCategory;
}
static bool TextMatchesSearchTokens(string[] searchTokens, string textToSearch)
{
foreach (var searchToken in searchTokens)
{
if (textToSearch.IndexOf(searchToken, StringComparison.OrdinalIgnoreCase) >= 0)
return true;
}
return false;
}
public NewFileTemplate SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
OnPropertyChanged();
OnPropertyChanged("Description");
FileName = GenerateCurrentFileName();
}
}
public IProject Project
{
get;
set;
}
public DirectoryName BasePath
{
get;
set;
}
public bool AllowUntitledFiles
{
get;
set;
}
string GenerateCurrentFileName()
{
if(SelectedItem==null)
return string.Empty;
return SelectedItem.Template.SuggestFileName(BasePath);
}
internal static string GenerateValidClassOrNamespaceName(string className, bool allowDot)
{
if (className == null)
throw new ArgumentNullException("className");
className = className.Trim();
if (className.Length == 0)
return string.Empty;
var nameBuilder = new StringBuilder();
if (className[0] != '_' && !char.IsLetter(className, 0))
nameBuilder.Append('_');
for (int idx = 0; idx < className.Length; ++idx)
{
if (Char.IsLetterOrDigit(className[idx]) || className[idx] == '_')
{
nameBuilder.Append(className[idx]);
}
else if (className[idx] == '.' && allowDot)
{
nameBuilder.Append('.');
}
else
{
nameBuilder.Append('_');
}
}
return nameBuilder.ToString();
}
internal void InitializeTemplates(IEnumerable<TemplateCategory> templateCategories)
{
var categories = Categories;
foreach (var templateCategory in Sorted(templateCategories)) {
var cat = CreateCategory(templateCategory);
categories.Add(cat);
}
SelectedCategory = AllFileTemplates;
}
IEnumerable<TemplateCategory> Sorted(IEnumerable<TemplateCategory> templateCategories)
{
return templateCategories
.OrderByDescending(c => c.SortOrder)
.ThenBy(c => StringParser.Parse(c.DisplayName));
}
NewFileCategory CreateCategory(TemplateCategory templateCategory)
{
var category = new NewFileCategory(templateCategory.DisplayName);
foreach (var subcategory in Sorted(templateCategory.Subcategories))
{
var subnode = CreateCategory(subcategory);
category.Children.Add(subnode);
}
foreach (var template in templateCategory.Templates.OfType<FileTemplate>())
{
if (!template.IsVisible(Project))
continue;
var titem = new NewFileTemplate(template, category.DisplayName);
AllFileTemplates.Templates.Add(titem);
category.Templates.Add(titem);
}
return category;
}
internal FileTemplateResult BuildSelectedResult()
{
var selectedTemplate = SelectedItem;
var fileName = FileName;
var standardNamespace = "DefaultNamespace";
var localizedTypeDescriptor = selectedTemplate.Template.CreateCustomizationObject();
var options = new FileTemplateOptions
{
ClassName =
GenerateValidClassOrNamespaceName(Path.GetFileNameWithoutExtension(FileName), false),
FileName = Core.FileName.Create(fileName),
IsUntitled = AllowUntitledFiles,
Namespace = standardNamespace,
CustomizationObject = localizedTypeDescriptor,
Project = Project
};
var result = selectedTemplate.Template.Create(options);
if (result != null)
selectedTemplate.Template.RunActions(result);
return result;
}
public FileTemplateResult Result { get;set; }
public string SearchFor
{
get
{
if (string.IsNullOrEmpty(_searchFor))
_searchFor = string.Empty;
return _searchFor;
}
set
{
_searchFor = value;
OnPropertyChanged();
}
}
public string FileName
{
get { return _fileName; }
set
{
_fileName = value;
OnPropertyChanged();
}
}
public string Description
{
get
{
return SelectedItem == null
? string.Empty
: SelectedItem.Description;
}
set { }
}
public ObservableCollection<NewFileCategory> Categories { get; set; }
}
}