public override XElement GetWidgetMarkup(ParameterList parameters, string label, HelpDefinition help, string bindingSourceName) { // TODO: config widget for optional values bool selectionRequired = parameters.GetParameter <bool>(RequiredParameterName); var searchToken = new MediaFileSearchToken(); string extensionStr = parameters.GetParameter <string>("FileExtensionFilter"); if (!extensionStr.IsNullOrEmpty()) { searchToken.Extensions = extensionStr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } searchToken.Folder = GetFolderPath(parameters.GetParameter <DataReference <IMediaFileFolder> >("MediaFileFolderReference")); searchToken.HideSubfolders = !parameters.GetParameter <bool>("IncludeSubfolders"); XElement selector = base.BuildBasicWidgetMarkup("DataReferenceTreeSelector", "Selected", label, help, bindingSourceName); selector.Add( new XAttribute("Handle", "Composite.Management.EmbeddableMediaSelectorDialog"), new XAttribute("SearchToken", searchToken.Serialize()), new XAttribute("DataType", TypeManager.SerializeType(typeof(IMediaFile))), new XAttribute("NullValueAllowed", (!selectionRequired)) ); return(selector); }
public override XElement GetWidgetMarkup(ParameterList parameters, string label, HelpDefinition help, string bindingSourceName) { var searchToken = new MediaFileSearchToken(); searchToken.MimeTypes = new string[] { MimeTypeInfo.Gif, MimeTypeInfo.Jpeg, MimeTypeInfo.Png, MimeTypeInfo.Bmp, MimeTypeInfo.Svg }; var folderReference = parameters.GetParameter <DataReference <IMediaFileFolder> >(MediaFileFolderReferenceParameterName); bool selectionRequired = parameters.GetParameter <bool>(RequiredParameterName); if (folderReference != null && folderReference.IsSet) { IMediaFileFolder folder; try { folder = folderReference.Data; if (folder != null) { searchToken.Folder = folder.Path; } } catch (Exception) { string reference = folderReference.Serialize() ?? string.Empty; LoggingService.LogError(LogTitle, "Failed to get media folder by referece: '{0}'".FormatWith(reference)); } } XElement selector = base.BuildBasicWidgetMarkup("DataReferenceTreeSelector", "Selected", label, help, bindingSourceName); selector.Add( new XAttribute("Handle", "Composite.Management.ImageSelectorDialog"), new XAttribute("SearchToken", searchToken.Serialize()), new XAttribute("DataType", TypeManager.SerializeType(typeof(IImageFile))), new XAttribute("NullValueAllowed", (!selectionRequired)) ); return(selector); }
public static Func <IMediaFile, bool> GetPredicate(SearchToken searchToken) { var predicates = new List <Func <IMediaFile, bool> >(); if (searchToken is MediaFileSearchToken) { MediaFileSearchToken mediaFileSearchToken = (MediaFileSearchToken)searchToken; if (mediaFileSearchToken.MimeTypes != null && mediaFileSearchToken.MimeTypes.Length > 0) { List <string> mimeTypes = new List <string>(mediaFileSearchToken.MimeTypes); predicates.Add(x => mimeTypes.Contains(x.MimeType)); } if (!string.IsNullOrEmpty(mediaFileSearchToken.Folder)) { if (mediaFileSearchToken.HideSubfolders) { predicates.Add(d => d.FolderPath == mediaFileSearchToken.Folder); } else { predicates.Add(d => d.FolderPath.StartsWith(mediaFileSearchToken.Folder)); } } if (mediaFileSearchToken.Extensions != null && mediaFileSearchToken.Extensions.Length > 0) { System.Linq.Expressions.ParameterExpression fileParameter = Expression.Parameter(typeof(IMediaFile), "file"); Expression body = null; foreach (string extension in mediaFileSearchToken.Extensions) { string suffix = extension.StartsWith(".") ? extension : "." + extension; // "file.FileName" Expression fileName = Expression.Property(fileParameter, typeof(IFile), "FileName"); // Building "file.FileName.EndsWith(suffix, StringComparison.OrdinalIgnoreCase)" MethodCallExpression predicate = Expression.Call(fileName, EndsWithMethodInfo, Expression.Constant(suffix), IgnoreCaseConstantExpression); if (body == null) { // file => file.FileName.EndsWith(extension, StringComparison.OrdinalIgnoreCase); body = predicate; } else { // body = (.....) || file.FileName.EndsWith(extension, StringComparison.OrdinalIgnoreCase; body = Expression.OrElse(body, predicate); } } predicates.Add(Expression.Lambda <Func <IMediaFile, bool> >(body, fileParameter).Compile()); } } if (predicates.Count == 0) { return(x => true); } Func <Func <IMediaFile, bool>, Func <IMediaFile, bool>, Func <IMediaFile, bool> > and = (f1, f2) => (t => f1(t) && f2(t)); Func <IMediaFile, bool> current = (x => true); foreach (Func <IMediaFile, bool> predicate in predicates) { current = and(predicate, current); } return(current); }