34
34
using MonoDevelop.Ide.Codons;
35
using MonoDevelop.Core;
36
using MonoDevelop.Projects;
36
38
namespace MonoDevelop.Ide.Gui
38
40
public static class DisplayBindingService
40
static List<DisplayBindingCodon> displayBindings = new List<DisplayBindingCodon> ();
42
static DisplayBindingService ()
44
//FIXME: this ignores node ordering
45
AddinManager.AddExtensionNodeHandler ("/MonoDevelop/Ide/DisplayBindings", delegate(object sender, ExtensionNodeEventArgs args) {
46
DisplayBindingCodon displayBindingCodon = (DisplayBindingCodon)args.ExtensionNode;
47
switch (args.Change) {
48
case ExtensionChange.Add:
49
displayBindings.Add (displayBindingCodon);
51
case ExtensionChange.Remove:
52
displayBindings.Remove (displayBindingCodon);
42
static IEnumerable<T> GetBindings<T> ()
44
return AddinManager.GetExtensionObjects ("/MonoDevelop/Ide/DisplayBindings")
48
internal static IEnumerable<IDisplayBinding> GetDisplayBindings (FilePath filePath, string mimeType, Project ownerProject)
50
if (mimeType == null && !filePath.IsNullOrEmpty)
51
mimeType = DesktopService.GetMimeTypeForUri (filePath);
53
foreach (var b in GetBindings<IDisplayBinding> ()) {
54
if (b.CanHandle (filePath, mimeType, ownerProject))
59
public static IViewDisplayBinding GetDefaultViewBinding (FilePath filePath, string mimeType, Project ownerProject)
61
return GetDisplayBindings (filePath, mimeType, ownerProject).OfType<IViewDisplayBinding> ()
62
.FirstOrDefault (d => d.CanUseAsDefault);
65
public static IDisplayBinding GetDefaultBinding (FilePath filePath, string mimeType, Project ownerProject)
67
return GetDisplayBindings (filePath, mimeType, ownerProject).FirstOrDefault (d => d.CanUseAsDefault);
70
public static void AttachSubWindows (IWorkbenchWindow workbenchWindow)
72
foreach (var b in GetBindings<IAttachableDisplayBinding> ()) {
73
if (b.CanAttachTo (workbenchWindow.ViewContent))
74
workbenchWindow.AttachViewContent (b.CreateViewContent (workbenchWindow.ViewContent));
78
public static IEnumerable<FileViewer> GetFileViewers (FilePath filePath, Project ownerProject)
80
string mimeType = DesktopService.GetMimeTypeForUri (filePath);
81
var viewerIds = new HashSet<string> ();
83
foreach (var b in GetDisplayBindings (filePath, mimeType, ownerProject)) {
84
var vb = b as IViewDisplayBinding;
86
yield return new FileViewer (vb);
88
var eb = (IExternalDisplayBinding) b;
89
var app = eb.GetApplication (filePath, mimeType, ownerProject);
90
if (viewerIds.Add (app.Id))
91
yield return new FileViewer (app);
58
static IEnumerable<IDisplayBinding> RealDisplayBindings {
60
return displayBindings.Select (d => d.DisplayBinding).OfType<IDisplayBinding> ();
64
public static IDisplayBinding GetDefaultBindingForUri (string uri)
66
return GetDefaultBinding (uri, null);
69
public static IDisplayBinding GetDefaultBinding (string uri, string mimeType)
71
return RealDisplayBindings.FirstOrDefault (binding =>
72
binding.CanUseAsDefault && (
73
(uri != null && binding.CanCreateContentForUri (uri))
74
|| (mimeType != null && binding.CanCreateContentForMimeType (mimeType))));
77
public static IEnumerable<IDisplayBinding> GetBindingsForMimeType (string mimeType)
79
return RealDisplayBindings.Where (b => b.CanCreateContentForMimeType (mimeType));
82
public static void AttachSubWindows (IWorkbenchWindow workbenchWindow)
84
foreach (DisplayBindingCodon codon in displayBindings) {
85
IAttachableDisplayBinding binding = codon.DisplayBinding as IAttachableDisplayBinding;
86
if (binding != null && binding.CanAttachTo (workbenchWindow.ViewContent))
87
workbenchWindow.AttachViewContent (binding.CreateViewContent (workbenchWindow.ViewContent));
95
foreach (var app in DesktopService.GetApplications (filePath))
96
if (viewerIds.Add (app.Id))
97
yield return new FileViewer (app);
101
//dummy binding, anchor point for extension tree
102
class DefaultDisplayBinding : IViewDisplayBinding
104
public IViewContent CreateContent (FilePath fileName, string mimeType, Project ownerProject)
106
throw new InvalidOperationException ();
113
public bool CanHandle (FilePath fileName, string mimeType, Project ownerProject)
118
public bool CanUseAsDefault {
119
get { return false; }
b'\\ No newline at end of file'