public IViewContent CreateContentForFile(OpenedFile file) { var codons = DisplayBindingService.GetCodonsPerFileName(file.FileName); DisplayBindingDescriptor bestMatch = null; double max = double.NegativeInfinity; const int BUFFER_LENGTH = 4 * 1024; using (var stream = file.OpenRead()) { string mime = "text/plain"; if (stream.Length > 0) { stream.Position = 0; mime = MimeTypeDetection.FindMimeType(new BinaryReader(stream).ReadBytes(BUFFER_LENGTH)); } foreach (var codon in codons) { stream.Position = 0; double value = codon.Binding.AutoDetectFileContent(file.FileName, stream, mime); if (value > max) { max = value; bestMatch = codon; } } } if (bestMatch == null) { throw new InvalidOperationException(); } return(bestMatch.Binding.CreateContentForFile(file)); }
static bool IsPrimaryBindingValidForFileName(DisplayBindingDescriptor binding, string filename) { if (!binding.IsSecondary && binding.CanOpenFile(filename)) { if (binding.Binding != null && binding.Binding.CanCreateContentForFile(filename)) { return(true); } } return(false); }
static DisplayBindingDescriptor AddExternalProcessDisplayBindingInternal(ExternalProcessDisplayBinding binding) { externalProcessDisplayBindings.Add(binding); DisplayBindingDescriptor descriptor = new DisplayBindingDescriptor(binding) { Id = binding.Id, Title = binding.Title }; bindings.Add(descriptor); return(descriptor); }
public static DisplayBindingDescriptor AddExternalProcessDisplayBinding(ExternalProcessDisplayBinding binding) { WorkbenchSingleton.AssertMainThread(); if (binding == null) { throw new ArgumentNullException("binding"); } DisplayBindingDescriptor descriptor = AddExternalProcessDisplayBindingInternal(binding); SaveExternalProcessDisplayBindings(); return(descriptor); }
/// <summary> /// Gets the primary display binding for the specified file name. /// </summary> public static IDisplayBinding GetBindingPerFileName(string filename) { WorkbenchSingleton.AssertMainThread(); if (FileUtility.IsUrl(filename)) { // The normal display binding dispatching code can't handle URLs (e.g. because it uses Path.GetExtension), // so we'll directly return the browser display binding. return(new BrowserDisplayBinding.BrowserDisplayBinding()); } DisplayBindingDescriptor codon = GetDefaultCodonPerFileName(filename); return(codon == null ? null : codon.Binding); }
public static void SetDefaultCodon(string extension, DisplayBindingDescriptor bindingDescriptor) { WorkbenchSingleton.AssertMainThread(); if (bindingDescriptor == null) { throw new ArgumentNullException("bindingDescriptor"); } if (extension == null) { throw new ArgumentNullException("extension"); } if (!extension.StartsWith(".", StringComparison.Ordinal)) { throw new ArgumentException("extension must start with '.'"); } displayBindingServiceProperties.Set("Default" + extension.ToLowerInvariant(), bindingDescriptor.Id); }
/// <summary> /// Gets the default primary display binding for the specified file name. /// </summary> public static DisplayBindingDescriptor GetDefaultCodonPerFileName(string filename) { WorkbenchSingleton.AssertMainThread(); string defaultCommandID = displayBindingServiceProperties.Get("Default" + Path.GetExtension(filename).ToLowerInvariant()) as string; if (!string.IsNullOrEmpty(defaultCommandID)) { foreach (DisplayBindingDescriptor binding in bindings) { if (binding.Id == defaultCommandID) { if (IsPrimaryBindingValidForFileName(binding, filename)) { return(binding); } } } } DisplayBindingDescriptor autoDetectDescriptor = null; foreach (DisplayBindingDescriptor binding in bindings) { if (IsPrimaryBindingValidForFileName(binding, filename)) { if (binding.Binding.IsPreferredBindingForFile(filename)) { return(binding); } else if (binding.Binding is AutoDetectDisplayBinding) { autoDetectDescriptor = binding; } } } return(autoDetectDescriptor); }