diff --git a/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs b/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs index 6f56780a3e..04205f6196 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs +++ b/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs @@ -27,11 +27,9 @@ namespace HtmlHelp2 using HtmlHelp2.Environment; using HtmlHelp2.ResourcesHelperClass; using MSHelpServices; - - - // TODO: detect the active language (CSharp, VB#, ...) to limit the results + + // TODO: if there are no DH results, implement Keyword search (index) - // TODO: insert some default entries (Homepage, Wiki, Community, ...) public class ShowDynamicHelpMenuCommand : AbstractMenuCommand @@ -46,10 +44,10 @@ namespace HtmlHelp2 public class HtmlHelp2DynamicHelpPad : AbstractPadContent { protected HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser; - private int internalIndex = 0; - private StringCollection dynamicHelpTerms = new StringCollection(); - private string debugPreElement = String.Empty; - private bool enableDebugInfo = false; + private StringCollection dynamicHelpTerms = new StringCollection(); + private string debugPreElement = String.Empty; + private bool enableDebugInfo = true; + private Dictionarylanguages = new Dictionary(); public override Control Control { @@ -73,6 +71,11 @@ namespace HtmlHelp2 PropertyPad.SelectedObjectChanged += new EventHandler(this.FormsDesignerSelectedObjectChanged); PropertyPad.SelectedGridItemChanged += new SelectedGridItemChangedEventHandler(this.FormsDesignerSelectedGridItemChanged); ProjectService.SolutionClosed += new EventHandler(this.SolutionClosed); + + // I needed to patch SharpDevelop's current project language because + // the .NET Framework SDK documents use other names + languages.Add("C#", "CSharp"); + languages.Add("VBNet", "VB"); } #region WebBrowser Scripting @@ -80,15 +83,29 @@ namespace HtmlHelp2 { if(this.dynamicHelpTerms.Count == 0) return; this.RemoveAllChildren(); - this.debugPreElement = String.Empty; + this.debugPreElement = String.Empty; + + string tempLanguage = String.Empty; + if(languages.ContainsKey(expectedLanguage)) + { + if(!languages.TryGetValue(expectedLanguage, out tempLanguage)) + { + tempLanguage = String.Empty; + } + } Cursor.Current = Cursors.WaitCursor; foreach(string currentHelpTerm in dynamicHelpTerms) { - this.CallDynamicHelp(currentHelpTerm, expectedLanguage, false); + this.CallDynamicHelp(currentHelpTerm, tempLanguage, false); } + dynamicHelpBrowser.BuildDefaultHelpEntries(); Cursor.Current = Cursors.Default; - if(this.enableDebugInfo) this.CreateDebugPre(); + + this.debugPreElement += String.Format("
Current project language: {0}", + (tempLanguage==String.Empty)?expectedLanguage:tempLanguage); + + if(this.enableDebugInfo) dynamicHelpBrowser.CreateDebugPre(this.debugPreElement); } private bool CallDynamicHelp(string searchTerm, string expectedLanguage, bool keywordSearch) @@ -114,201 +131,29 @@ namespace HtmlHelp2 List newTopics = this.SortTopics(topics); foreach(IHxTopic topic in newTopics) { - this.BuildNewChild(topic.Location, - topic.get_Title(HxTopicGetTitleType.HxTopicGetTOCTitle, - HxTopicGetTitleDefVal.HxTopicGetTitleFileName), - topic.URL); - } - } - return result; - } - - - private void RemoveAllChildren() - { - this.internalIndex = 0; - dynamicHelpBrowser.RemoveAllChildren(); - } - - private void BuildNewChild(string sectionName, string topicName, string topicUrl) - { - try - { - HtmlElementCollection children = dynamicHelpBrowser.Document.Body.GetElementsByTagName("span"); - - if(children.Count > 0) - { - foreach(HtmlElement elem in children) + if(expectedLanguage == String.Empty || topic.HasAttribute("DevLang", expectedLanguage)) { - if(elem.GetAttribute("className") == "section") - { - HtmlElement sectionBlock = elem.FirstChild.NextSibling; - HtmlElement contentSpan = sectionBlock.NextSibling.NextSibling; - - if(sectionBlock.TagName == "B" && sectionBlock.InnerText == sectionName && - contentSpan.TagName == "SPAN" && contentSpan.GetAttribute("className") == "content") - { - if(!this.DoesLinkExist(contentSpan, topicName, topicUrl)) - { - contentSpan.AppendChild(this.CreateNewLink(topicUrl, topicName)); - contentSpan.AppendChild(this.CreateABreak()); - } - - return; - } - } + this.BuildNewChild(topic.Location, + topic.get_Title(HxTopicGetTitleType.HxTopicGetTOCTitle, + HxTopicGetTitleDefVal.HxTopicGetTitleFileName), + topic.URL); } - - dynamicHelpBrowser.InsertHtmlElement(HtmlElementInsertionOrientation.BeforeEnd, - this.CreateABreak()); } - - HtmlElement linkContent = null; - HtmlElement htmlSection = this.CreateNewSection(sectionName, out linkContent); - dynamicHelpBrowser.InsertHtmlElement(HtmlElementInsertionOrientation.BeforeEnd, htmlSection); - linkContent.AppendChild(this.CreateNewLink(topicUrl, topicName)); - linkContent.AppendChild(this.CreateABreak()); - - this.internalIndex++; - } - catch(Exception ex) - { - LoggingService.Error("Help 2.0: cannot build node for dynamic help; " + ex.ToString()); } + return result; } - private HtmlElement CreateNewSection(string sectionName, out HtmlElement linkNode) - { - HtmlElement span = null; - linkNode = null; - - try - { - span = dynamicHelpBrowser.CreateHtmlElement("span"); - span.SetAttribute("className", "section"); - - HtmlElement img = dynamicHelpBrowser.CreateHtmlElement("img"); - img.Style = "width:16px;height:16px;margin-right:5px"; - img.Id = String.Format("image_{0}", this.internalIndex.ToString()); - img.SetAttribute("src", "OpenBook.png"); - span.AppendChild(img); - - HtmlElement b = dynamicHelpBrowser.CreateHtmlElement("b"); - b.InnerText = sectionName; - b.Style = "cursor:pointer"; - b.Id = this.internalIndex.ToString(); - b.Click += new HtmlElementEventHandler(this.OnSectionClick); - span.AppendChild(b); - - span.AppendChild(this.CreateABreak()); - - HtmlElement content = dynamicHelpBrowser.CreateHtmlElement("span"); - content.Id = String.Format("content_{0}", this.internalIndex.ToString()); - content.SetAttribute("className", "content"); - span.AppendChild(content); - - linkNode = content; - } - catch {} - - return span; - } - - private HtmlElement CreateNewLink(string topicUrl, string topicName) - { - HtmlElement span = null; - - try - { - span = dynamicHelpBrowser.CreateHtmlElement("a"); - span.InnerText = topicName; - span.SetAttribute("src", topicUrl); - span.SetAttribute("className", "link"); - span.SetAttribute("title", topicName); - span.Click += new HtmlElementEventHandler(OnLinkClick); - span.MouseOver += new HtmlElementEventHandler(OnMouseOver); - span.MouseLeave += new HtmlElementEventHandler(OnMouseOut); - } - catch {} - - return span; - } - - private HtmlElement CreateABreak() + private void BuildNewChild(string sectionName, string topicName, string topicUrl) { - HtmlElement br = null; - - try - { - br = dynamicHelpBrowser.CreateHtmlElement("br"); - } - catch {} - - return br; + dynamicHelpBrowser.BuildNewChild(sectionName, topicName, topicUrl); } - private bool DoesLinkExist(HtmlElement parentNode, string topicName, string topicUrl) + private void RemoveAllChildren() { - try - { - HtmlElementCollection allLinks = parentNode.GetElementsByTagName("a"); - if(allLinks.Count > 0) - { - foreach(HtmlElement link in allLinks) - { - if(String.Compare(topicName, link.InnerText) == 0 && - String.Compare(topicUrl, link.GetAttribute("src")) == 0) - { - return true; - } - } - } - } - catch { } - - return false; + dynamicHelpBrowser.RemoveAllChildren(); } #endregion - private void OnMouseOver(object sender, HtmlElementEventArgs e) - { - try - { - StatusBarService.SetMessage(((HtmlElement)sender).GetAttribute("src")); - } - catch {} - } - - private void OnMouseOut(object sender, HtmlElementEventArgs e) - { - StatusBarService.SetMessage(""); - } - - private void OnSectionClick(object sender, HtmlElementEventArgs e) - { - try - { - string sectionId = ((HtmlElement)sender).Id; - object[] objArray = new object[1]; - objArray[0] = (object)sectionId; - dynamicHelpBrowser.Document.InvokeScript("ExpandCollapse", objArray); - } - catch(Exception ex) - { - LoggingService.Error("Help 2.0: cannot run script; " + ex.ToString()); - } - } - - private void OnLinkClick(object sender, HtmlElementEventArgs e) - { - try - { - string url = ((HtmlElement)sender).GetAttribute("src"); - if(url != null && url != String.Empty) ShowHelpBrowser.OpenHelpView(url); - } - catch {} - } - #region Taken from DefinitionView.cs private void UpdateTick(object sender, ParserUpdateStepEventArgs e) { @@ -344,7 +189,9 @@ namespace HtmlHelp2 this.AddToStringCollection(0, types.ResolvedClass.FullyQualifiedName); } - WorkbenchSingleton.SafeThreadAsyncCall(this, "BuildDynamicHelpList", ""); + WorkbenchSingleton.SafeThreadAsyncCall(this, + "BuildDynamicHelpList", + ProjectService.CurrentProject.Language); } private ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e) @@ -397,28 +244,9 @@ namespace HtmlHelp2 } this.AddToStringCollection(myObject.FullName); - WorkbenchSingleton.SafeThreadAsyncCall(this, "BuildDynamicHelpList", ""); - } - #endregion - - #region DebugInfo - private void CreateDebugPre() - { - if(this.debugPreElement == String.Empty) return; - - try - { - dynamicHelpBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, - this.CreateABreak()); - dynamicHelpBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, - this.CreateABreak()); - - HtmlElement pre = dynamicHelpBrowser.CreateHtmlElement("pre"); - pre.InnerHtml = "--- Dynamic Help Debug ---
" + this.debugPreElement; - - dynamicHelpBrowser.InsertHtmlElement(HtmlElementInsertionOrientation.BeforeEnd, pre); - } - catch {} + WorkbenchSingleton.SafeThreadAsyncCall(this, + "BuildDynamicHelpList", + ProjectService.CurrentProject.Language); } #endregion @@ -495,34 +323,13 @@ namespace HtmlHelp2 { WebBrowser axWebBrowser = new WebBrowser(); ToolStrip dynamicHelpToolbar = new ToolStrip(); + int internalIndex = 0; string[] toolbarButtons = new string[] { "${res:AddIns.HtmlHelp2.Contents}", "${res:AddIns.HtmlHelp2.Index}", "${res:AddIns.HtmlHelp2.Search}" }; - public HtmlDocument Document - { - get { return axWebBrowser.Document; } - } - - public void RemoveAllChildren() - { - axWebBrowser.Document.Body.InnerHtml = ""; - } - - public HtmlElement CreateHtmlElement(string elementName) - { - HtmlElement newElement = axWebBrowser.Document.CreateElement(elementName); - return newElement; - } - - public void InsertHtmlElement(HtmlElementInsertionOrientation insertWhere, HtmlElement insertWhat) - { - axWebBrowser.Document.Body.InsertAdjacentElement(insertWhere, insertWhat); - } - - public void RedrawContent() { for(int i = 0; i < toolbarButtons.Length; i++) @@ -610,6 +417,242 @@ namespace HtmlHelp2 private void NamespaceReloaded(object sender, EventArgs e) { this.LoadDynamicHelpPage(); + this.RemoveAllChildren(); + this.BuildDefaultHelpEntries(); + } + #endregion + + #region WebBrowser Scripting + public void BuildNewChild(string sectionName, string topicName, string topicUrl) + { + try + { + HtmlElementCollection children = axWebBrowser.Document.Body.GetElementsByTagName("span"); + + if(children.Count > 0) + { + foreach(HtmlElement elem in children) + { + if(elem.GetAttribute("className") == "section") + { + HtmlElement sectionBlock = elem.FirstChild.NextSibling; + HtmlElement contentSpan = sectionBlock.NextSibling.NextSibling; + + if(sectionBlock.TagName == "B" && sectionBlock.InnerText == sectionName && + contentSpan.TagName == "SPAN" && contentSpan.GetAttribute("className") == "content") + { + if(!this.DoesLinkExist(contentSpan, topicName, topicUrl)) + { + contentSpan.AppendChild(this.CreateNewLink(topicUrl, topicName)); + contentSpan.AppendChild(this.CreateABreak()); + } + + return; + } + } + } + + axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, + this.CreateABreak()); + } + + HtmlElement linkContent = null; + HtmlElement htmlSection = this.CreateNewSection(sectionName, out linkContent); + axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, + htmlSection); + linkContent.AppendChild(this.CreateNewLink(topicUrl, topicName)); + linkContent.AppendChild(this.CreateABreak()); + + this.internalIndex++; + } + catch(Exception ex) + { + LoggingService.Error("Help 2.0: cannot build node for dynamic help; " + ex.ToString()); + } + } + + private HtmlElement CreateNewSection(string sectionName, out HtmlElement linkNode) + { + HtmlElement span = null; + linkNode = null; + + try + { + span = axWebBrowser.Document.CreateElement("span"); + span.SetAttribute("className", "section"); + + HtmlElement img = axWebBrowser.Document.CreateElement("img"); + img.Style = "width:16px;height:16px;margin-right:5px"; + img.Id = String.Format("image_{0}", this.internalIndex.ToString()); + img.SetAttribute("src", "OpenBook.png"); + span.AppendChild(img); + + HtmlElement b = axWebBrowser.Document.CreateElement("b"); + b.InnerText = sectionName; + b.Style = "cursor:pointer"; + b.Id = this.internalIndex.ToString(); + b.Click += new HtmlElementEventHandler(this.OnSectionClick); + span.AppendChild(b); + + span.AppendChild(this.CreateABreak()); + + HtmlElement content = axWebBrowser.Document.CreateElement("span"); + content.Id = String.Format("content_{0}", this.internalIndex.ToString()); + content.SetAttribute("className", "content"); + span.AppendChild(content); + + linkNode = content; + } + catch {} + + return span; + } + + private HtmlElement CreateNewLink(string topicUrl, string topicName) + { + HtmlElement span = null; + + try + { + span = axWebBrowser.Document.CreateElement("a"); + span.InnerText = topicName; + span.SetAttribute("src", topicUrl); + span.SetAttribute("className", "link"); + span.SetAttribute("title", topicName); + span.Click += new HtmlElementEventHandler(OnLinkClick); + span.MouseOver += new HtmlElementEventHandler(OnMouseOver); + span.MouseLeave += new HtmlElementEventHandler(OnMouseOut); + } + catch {} + + return span; + } + + private HtmlElement CreateABreak() + { + HtmlElement br = null; + + try + { + br = axWebBrowser.Document.CreateElement("br"); + } + catch {} + + return br; + } + + private bool DoesLinkExist(HtmlElement parentNode, string topicName, string topicUrl) + { + try + { + HtmlElementCollection allLinks = parentNode.GetElementsByTagName("a"); + if(allLinks.Count > 0) + { + foreach(HtmlElement link in allLinks) + { + if(String.Compare(topicName, link.InnerText) == 0 && + String.Compare(topicUrl, link.GetAttribute("src")) == 0) + { + return true; + } + } + } + } + catch { } + + return false; + } + + private void OnMouseOver(object sender, HtmlElementEventArgs e) + { + try + { + StatusBarService.SetMessage(((HtmlElement)sender).GetAttribute("src")); + } + catch {} + } + + private void OnMouseOut(object sender, HtmlElementEventArgs e) + { + StatusBarService.SetMessage(""); + } + + private void OnSectionClick(object sender, HtmlElementEventArgs e) + { + try + { + string sectionId = ((HtmlElement)sender).Id; + object[] objArray = new object[1]; + objArray[0] = (object)sectionId; + axWebBrowser.Document.InvokeScript("ExpandCollapse", objArray); + } + catch(Exception ex) + { + LoggingService.Error("Help 2.0: cannot run script; " + ex.ToString()); + } + } + + private void OnLinkClick(object sender, HtmlElementEventArgs e) + { + try + { + string url = ((HtmlElement)sender).GetAttribute("src"); + if(url != null && url != String.Empty) ShowHelpBrowser.OpenHelpView(url); + } + catch {} + } + + + public void RemoveAllChildren() + { + axWebBrowser.Document.Body.InnerHtml = ""; + this.internalIndex = 0; + } + + public void BuildDefaultHelpEntries() + { + try + { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(String.Format("{0}\\DynamicHelpDefaultEntries.xml", + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))); + + XmlNodeList sectionNodes = xmldoc.SelectNodes("/defaultentries/section[@name]"); + foreach(XmlNode sectionNode in sectionNodes) + { + XmlNodeList urlNodes = sectionNode.SelectNodes("url[@name and text()!=\"\"]"); + foreach(XmlNode urlNode in urlNodes) + { + string sectionName = sectionNode.Attributes.GetNamedItem("name").InnerText; + string url = urlNode.InnerText; + string id = urlNode.Attributes.GetNamedItem("name").InnerText; + this.BuildNewChild(sectionName, id, url); + } + } + } + catch { /* I don't care about the results */ } + } + #endregion + + #region DebugInfo + public void CreateDebugPre(string debugInformation) + { + if(debugInformation == String.Empty) return; + + try + { + axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, + this.CreateABreak()); + axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, + this.CreateABreak()); + + HtmlElement pre = axWebBrowser.Document.CreateElement("pre"); + pre.InnerHtml = "--- Dynamic Help Debug ---
" + debugInformation; + + axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, + pre); + } + catch {} } #endregion } diff --git a/src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Service.cs b/src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Service.cs index 5acf021090..19c81ea30b 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Service.cs +++ b/src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Service.cs @@ -284,6 +284,7 @@ namespace HtmlHelp2.Environment try { topics = ((IHxIndex)dynamicHelp).GetTopicsFromString(searchTerm, 0); + LoggingService.Info("Help 2.0: Dynamic Help successfully called"); } catch { @@ -302,6 +303,7 @@ namespace HtmlHelp2.Environment try { topics = GetIndex(currentSelectedFilterQuery).GetTopicsFromString(searchTerm, 0); + LoggingService.Info("Help 2.0: Keyword search successfully called"); } catch {