3 // A provider to display Mono.Addins extension models
6 // Lluis Sanchez Gual <lluis@novell.com>
8 // Copyright (c) 2007 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to deal
12 // in the Software without restriction, including without limitation the rights
13 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 // copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
17 // The above copyright notice and this permission notice shall be included in
18 // all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
32 using System.Diagnostics;
36 using System.Collections.Generic;
38 namespace MonkeyDoc.Providers
40 public class AddinsProvider : Provider
44 public AddinsProvider (string xmlModelFile)
48 if (!File.Exists (file))
49 throw new FileNotFoundException (String.Format ("The file `{0}' does not exist", file));
52 public override void PopulateTree (Tree tree)
54 string fileId = Path.GetFileNameWithoutExtension (file);
55 using (var f = File.OpenRead (file))
56 tree.HelpSource.Storage.Store (fileId, f);
58 XmlDocument doc = new XmlDocument ();
61 foreach (XmlElement addin in doc.SelectNodes ("Addins/Addin")) {
63 string addinId = addin.GetAttribute ("fullId");
64 Node newNode = tree.RootNode.CreateNode (addin.GetAttribute ("name"), "addin:" + fileId + "#" + addinId);
66 foreach (XmlElement node in addin.SelectNodes ("ExtensionPoint")) {
67 string target = "extension-point:" + fileId + "#" + addinId + "#" + node.GetAttribute ("path");
68 Node newExt = newNode.CreateNode (node.GetAttribute ("name"), target);
70 foreach (XmlElement en in node.SelectNodes ("ExtensionNode")) {
71 string nid = en.GetAttribute ("id");
72 string nname = en.GetAttribute ("name");
73 newExt.CreateNode (nname, "extension-node:" + fileId + "#" + addinId + "#" + nid);
79 public override void CloseTree (HelpSource hs, Tree tree)
84 public class AddinsHelpSource : HelpSource
86 public AddinsHelpSource (string base_file, bool create) : base (base_file, create)
90 internal protected const string AddinPrefix = "addin:";
91 internal protected const string ExtensionPrefix = "extension-point:";
92 internal protected const string ExtensionNodePrefix = "extension-node:";
94 public override bool CanHandleUrl (string url)
96 return url.StartsWith (AddinPrefix, StringComparison.OrdinalIgnoreCase)
97 || url.StartsWith (ExtensionPrefix, StringComparison.OrdinalIgnoreCase)
98 || url.StartsWith (ExtensionNodePrefix, StringComparison.OrdinalIgnoreCase);
101 protected override string UriPrefix {
107 public override DocumentType GetDocumentTypeForId (string id, out Dictionary<string, string> extraArgs)
109 extraArgs = new Dictionary<string, string> ();
110 var idParts = id.Split ('#');
111 extraArgs["FileID"] = idParts[0];
112 extraArgs["AddinID"] = idParts[1];
113 extraArgs["NodeID"] = idParts[2];
115 return DocumentType.AddinXml;
118 public override Node MatchNode (string url)
120 var prefix = new[] { AddinPrefix, ExtensionPrefix, ExtensionNodePrefix }.First (p => url.StartsWith (p, StringComparison.OrdinalIgnoreCase));
121 return base.MatchNode (prefix != null ? url.Substring (prefix.Length) : url);
124 public override Stream GetHelpStream (string id)
126 var idParts = id.Split ('#');
127 return base.GetHelpStream (idParts[0]);
130 public override Stream GetCachedHelpStream (string id)
132 var idParts = id.Split ('#');
133 return base.GetHelpStream (idParts[0]);